• chevron_right

      Christian Hergert: Recent Developments Part II

      news.movim.eu / PlanetGnome • 15:10 • 1 minute

    Earlier this year as I drift abroad in France, I made a new abstraction over Avahi and systemd-resolved. It is called librebonjour and I wrote about it here .

    It’s nice in that I no longer need to build Avahi to get GObject bindings to essentially call a D-Bus interface. It’s also nice to not have to care as an application developer if the system is configured with Avahi or systemd-resolved. Though, the systemd-resolved abstraction was lacking a bit compared to Avahi due to missing features.

    When you are browsing for services using Avahi, you can be notified automatically of changes. This doesn’t quite work the same in systemd-resolved. Librebonjour had to set a timer and poll occasionally for updates and compare old-to-new sets to notify the application. Not very ideal.

    When looking at a recent systemd checkout, I noticed that it already had support for the notification over its varlink interface. A handfull of commits later to hoist a few things and handle client disconnections/isolation properly and I can have the feature for librebonjour too.

    One more dependency I can cut out of my system (there will be many more coming, I assure you, as GNOME is heavy with cruft).

    • chevron_right

      Christian Hergert: Recent Developments Part I

      news.movim.eu / PlanetGnome • 15:00 • 2 minutes

    I’ve been working on a bunch of things across the Linux puzzle for a product I want to build. Here is an overview of a few of those things.

    LibMKS at 120hz

    I wanted to get my virtual machines to 120hz so that I can start testing product features inside of VMs. In fact, I actually like doing development with virtual machines over say, trying to shove all your development tooling in a sysext which, at least to me, feels like square-peg/round-hole territory.

    To get this working, a few things needed improvements.

    Qemu

    Qemu has a dbus display backend where it can send you DMABUF FD. But it doesn’t really handle any sort of sync and that becomes a problem as you crank up the frame rate. Additionally, it just defaulted to 75hz with no mechanism to override it.

    So I have some patches which provide a new D-Bus interface which can be implemented by LibMKS. It provides something more like a Vulkan swap-chain as well as API to set the refresh rate. While this isn’t a mapping 1:1 of what a wayland protocol might do for frame rate, it does match more what the emulated graphics device expects, so it is probably fine for now and clearly an huge improvement.

    A big change in the new API is that we will register all the DMABUF up front, and then tell the client just to switch to another DMABUF along with damage rectangles. Of course, I also had to make Qemu start collecting damage rectangles correctly.

    Linux

    With those changes in place, I kept seeing damage being full-frame. The next part of the stack that can break is thus the Linux kernel virtio graphics driver. Damage rectangles come in as properties on the drm plane being submitted. So it turns out that in two places some short circuiting was preventing that from working right.

    After fixing all that (and the corresponding LibMKS side) I have decent graphics performance in a VM.

    Since I continue to be floating precariously abroad, this is my notice of such patches. If you are interested in seeing these upstream and work in either of those communities, feel free to crib them, improve them, and submit them upstream. I’m happy locally patching my software given the copious amount of free time I have so there is little incentive for me to collaborate with corporations.

    Combined with the LibMKS merge request !53 I can have both minimal damage rectangles all the way to host GPU scanout as well as drag windows around in the guest quite fast.

    • chevron_right

      Michael Catanzaro: Introduction to Injection Vulnerabilities (and Script Worlds!)

      news.movim.eu / PlanetGnome • 19 hours ago • 8 minutes

    Injection vulnerabilities, like cross-site scripting (XSS) or command injection, occur when we fail to properly encode untrusted output when inserting it into a trusted context. Before injecting uncontrolled or untrusted data, it’s essential to encode, escape, or quote the data to prevent it from breaking out of its intended context.

    Some security folks previously used to like to talk about “input sanitization.” In practice, input sanitization is hopeless. Instead, nowadays we do the opposite and think about “output encoding.” When you inject untrusted data into a new context, assume the data is always malicious, and encode, escape, or quote it to make it safe for use in that context. Let’s look at some examples.

    Pango Markup Injection

    Here’s a low-stakes example of Pango markup injection:

    markup = g_strdup_printf ("<b>%s</b>,
                              my_user_provided_data);
    gtk_label_set_markup (GTK_LABEL (label), markup);

    The untrusted data is not escaped and may decide to inject its own Pango markup, or break out of any markup that you used yourself. For example, if the data is </b><span foreground="blue" size="x-large">Hello world!</span><b> then it can decide to be blue and extra large instead of the intended bold. That’s not especially serious and probably not likely to be a security issue, but surely it’s an unintended bug. If you’re injecting an uncontrolled string into a Pango markup context, like a GtkLabel, then use g_markup_escape_text() first. (Pango markup can do other interesting things like hide characters or capitalize them. I’m not sufficiently creative to claim that’s definitely a security problem, but perhaps attackers will be more clever than me.)

    A real-world example: in this GNOME Shell issue report , the title of a desktop notification is able to use Pango markup to manipulate its own formatting. (At least, probably , because the issue report is unconfirmed. Looks plausible, though!)

    Unix Shell Command Injection

    Another good example is the Evince command injection vulnerability from a few months ago , where a malicious filesystem path is able to trick Evince/Atril/Xreader into executing arbitrary code. Evince expects the path of a file to open to be something like /home/foo/hello.pdf , but a malicious PDF instead provides the evil input --gtk-module=/home/foo/evil.so /home/foo/hello.pdf . If not quoted properly, we have a command injection vulnerability where --gtk-module is interpreted as a command line flag rather than as a path:

    Incorrect: /usr/bin/evince --named-dest= --gtk-module=/home/foo/evil.so /home/foo/hello.pdf

    Correct: /usr/bin/evince --named-dest=' --gtk-module=/home/foo/evil.so /home/foo/hello.pdf'

    If you’re constructing a Unix command line, as in the Evince example above, then use g_shell_quote() . Failure to do so is ruinous. (But beware: this isn’t necessarily safe if you’re using an actual Unix shell .)

    XSS for Desktop App Developers

    With that primer out of the way, let’s consider what happens when you inject untrusted content into HTML (or CSS, or JavaScript).

    I used to think XSS matters only for websites, and is surely not something that desktop app developers need to know about, right? Wrong, as I discovered five years ago when, to my surprise, Prakash (@1lastBr3ath) reported that websites could inject scripts into Epiphany’s new tab page (about:overview) via malicious page titles . This on its own is not especially serious, but it’s surely not supposed to be possible.

    If your desktop app uses WebKitGTK or another web engine, you probably do need to think carefully about XSS. For example, before injecting untrusted data into HTML, we need to HTML-encode it, which Epiphany didn’t do anywhere. In the simplest case, that looks like this:

    char *
    ephy_encode_for_html_entity (const char *input)
    {
      GString *str = g_string_new (input);
    
      g_string_replace (str, "&", "&amp;", 0);
      g_string_replace (str, "<", "&lt;", 0);
      g_string_replace (str, ">", "&gt;", 0);
      g_string_replace (str, "\"", "&quot;", 0);
      g_string_replace (str, "'", "&#x27;", 0);
      g_string_replace (str, "/", "&#x2F;", 0);
    
      return g_string_free_and_steal (str);
    }

    Simply replace the few dangerous characters with HTML entities, and you’re good to go. That doesn’t work for HTML attributes, though, where the rules are slightly different. And it definitely doesn’t work for CSS or JavaScript. Carefully review the OWASP Cross Site Scripting Preventing Cheat Sheet to understand what you can and cannot do.

    Recent XSS Bugs in Epiphany

    Anyway, back to the old about:overview bug report. Turns out, Epiphany had many similar vulnerabilities. I attempted to fix them all , but in fact, I had missed a spot. In this old commit , I recognized that a URL is untrusted data that must be encoded before I inject the URL into the error message. But I treated the error message of the GError returned by WebKit as if it’s trusted and does not need to be encoded. In fact, the error message itself may contain a URL! Oops. Fernando Munoz recently noticed and reported several example URLs that could inject content into Epiphany error pages. I’m unable to share my favorite example URL here on WordPress, because WordPress is sanitizing it (yes, that is indeed ironic, considering my above recommendation to not do that). But the result of the injection looks like this:

    So an evil URL can mess up the Epiphany network error page. That’s not particularly serious, but Fernando found a second injection that is much worse , an XSS vulnerability in Epiphany’s autofill implementation. Here, selector is an untrusted DOM element ID provided by the web page itself. Notice that no output encoding is performed before the untrusted value is injected into the JavaScript command:

      page_id = webkit_web_view_get_page_id (WEBKIT_WEB_VIEW (view));
      world_name = ephy_embed_shell_get_guid (ephy_embed_shell_get_default ());
      script = g_strdup_printf ("EphyAutofill.fill(%lu, '%s', %i);",
                                page_id,
                                selector,
                                fill_choice);
    
      webkit_web_view_evaluate_javascript (WEBKIT_WEB_VIEW (view),
                                           script,
                                           -1,
                                           world_name,
                                           NULL,
                                           view->cancellable,
                                           autofill_cb,
                                           NULL);

    Because the untrusted data here is already used as a quoted data value, one of very few cases where it is safe to inject untrusted data into JavaScript , this would actually have been safe if only Epiphany had JavaScript-encoded the value first, following the OWASP rules for JavaScript encoding : “Encode all characters using the Unicode \uXXXX encoding format, where XXXX represents the hexadecimal Unicode code point. For example, A becomes \u0041 . All alphanumeric characters (letters A to Z, a to z, and digits 0 to 9) remain unencoded.” But Epiphany did not do so. (I got confused by the OWASP rules and didn’t realize how easy it was to make this safe, so I fixed it in a more complicated way instead, by removing the need for injecting the form ID .)

    So how bad is this mistake? In Fernando’s example, the ID of the evil form element is "a'); alert('XSS in private world'); var _=('" , allowing the malicious website to run any script it wants. That might not seem so serious, because websites don’t need to exploit any vulnerabilities to execute JavaScript… right?

    Script Worlds

    Websites are only supposed to be able to execute JavaScript in the default script world. Think of a script world as basically just a big namespace for all of your JavaScript: the default world is what the website itself uses, but desktop applications can create their own private script worlds in order to run their own scripts. In a private script world, you can manipulate the page’s DOM as usual, but you have a separate environment for executing JavaScript code, so you don’t have to worry about name clashes or scripts conflicting with each other. Also, website scripts cannot access your scripts.

    In practice, web browsers inject their own scripts into every web page in order to implement various browser features. Epiphany uses a script to find the best web app icon for a web page, for example. These scripts use a private script world that websites should never themselves have access to. But in this XSS attack on Epiphany’s form autofill implementation, the malicious website has managed to execute its script in the private script world. Now it can access whatever internal web browser features are available in that script world.

    Unfortunately, there’s one more relevant Epiphany feature implemented using scripts: the password manager. Epiphany’s password manager is necessarily exposed to its private script world because Epiphany needs to execute JavaScript code in the web page in order to autofill passwords. Although there were no relevant bugs in Epiphany’s password autofill code (which is totally unrelated to its vulnerable generic form autofill feature), this did not matter: if an XSS bug in any Epiphany feature can be abused to execute code in Epiphany’s private script world, that code can access the password manager and exfiltrate all the user’s saved Epiphany passwords for every website. (At least, probably , because I have not set up an attack website to test this. But I don’t see why it wouldn’t work!) So that’s pretty serious.

    Conclusion

    I requested a CVE for the autofill vulnerability earlier today, but nowadays CVE requests usually take a couple of weeks, so I don’t have one yet. It is fixed in Epiphany 50.6 and 49.9. If you don’t have those versions yet, don’t panic. To be exploited, you have to manually trigger form autofill by right clicking on a form and then selecting either “Autofill Personal Fields” or “Fill This Field,” so that makes it much less scary. Even more fortunately, users probably won’t ever do that, because selecting either option always causes Epiphany to reject all further mouse input, becoming unusable . Nobody has reported this bug before, so it seems safe to conclude zero people are using Epiphany’s form autofill feature!

    • chevron_right

      Tobias Bernard: GUADEC 2026 in A Coruña

      news.movim.eu / PlanetGnome • 2 days ago • 3 minutes

    It’s already a month since we were in Spain for GUADEC and I still haven’t gotten around to writing something, so before I completely forget here are a few quick impressions and photos!

    Local-First

    Similar to last year, my main focus was on local-first, since that’s what I’ve mostly been working on recently. Julian and I gave a talk about Reflection and the p2panda-gobject bindings , and more generally plans for making local-first sync part of the GNOME developer platform.

    Julian showing off p2panda-gobject during the BoF on Sunday

    We also had a local-first BoF to discuss system integration on Sunday, and a p2panda-goject workshop on Monday where we prototyped the Migrations app Jakub designed. Both were really well-attended, and it was super cool to see people starting to prototype their own little experiments that sync, including a collaborative Snake game, and a collaborative drawing app.

    Blackboard at the local-first BoF with some notes on the Contacts and Sync portals

    Our current thinking around system integration is that we wan to have two separate portals: one for Contacts, which would just manage P2P identities (so apps don’t have to each have their own identity system and contacts management), and a second one that actually syncs data on behalf of apps using a system API. For the former there is already a relatively detailed plan (see the talk linked above), and this will be prototyped as part of a p2panda NLnet grant.

    This entire area is of course still experimental so all plans are subject to change, but it’s exciting to see things get more and more concrete over the past year.

    Talks

    Some of my favorite talks:

    • Session Save/Restore by Adrian Vovk: Really cool to see the progress in this area, but also incredible how many moving parts are involved in getting this to just work ™ . Kudos to Adrian and everyone else who’s helping to push this forward!
    • Foundation Annual General Meeting by Allan Day: Really clear and concise overview of where the Foundation is at, what changes have been made to make it more financially sustainable, and what challenges still persist. The fellowship in particular is a very nice, tangible new thing and at least to me a sign that some things have changed for the better. I found this framing particularly interesting: the Foundation is a corporation, and the AGM is a meeting for “shareholders”, i.e. people who invest their time (rather than their money) in the Foundation, to assess whether the investment is well managed.
    • The Future of Boxes by Felipe Borges: I’m very happy to see Boxes revived and modernized, it’s a secret gem of our app ecosystem. Kudos to Felipe for his work on this!
    • A Brief History of Graphs by Sjoerd Stendahl: Very nice talk, and a great success story for how programs focused on the third-party app ecosystem like Circle can help to bring people into the community.
    • GNOME OS Mobile lightning talk by Aberrahim Kitouni: Between this and the Mobile BoF it was very nice to see more people across the community pushing towards making mobile an official part of the GNOME release process.
    Great to see new generations making old wisdoms their own :)

    City and Venue

    The logistics of constantly going back and forth between the Rialta dorms, the University building, and the city center made the social side of the conference more difficult than in other years, especially because public transit stopped relatively early in the evening. As usual, the smart move would probably have been to stay in the city center, but that only goes so far if everyone else is staying at the official accommodation, which is far away. More generally, the A Coruña city center was cute, but other parts of the city felt really car-centric and not very fun to be in.

    The view from the hill was pretty cool though :)

    Meta

    I found it a bit sad that once again, we didn’t manage to use the fact that so many people were together in person to make progress on resolving the conflicts of the past few years. I didn’t see it as my responsibility to take care of this, and I assume everyone else felt the same way. But here’s an idea for next year: An official “Conflict Resolution BoF”, chaired by a trained mediator.

    If there’s any interest I’d be happy to co-organize something like this, but I wouldn’t want to be solely responsible for it.

    More Photos

    Local-first workshop on Monday Philipp at the Design BoF The Mobile BoF People hacking at the university Traditional GUADEC dinner

    See you next year!

    • chevron_right

      Felipe Borges: Decoupling Boxes from the OS Release Cycle

      news.movim.eu / PlanetGnome • 2 days ago • 3 minutes

    Earlier this month, I published a post about the future of Boxes where I detailed the huge technical rewrite I have been doing, porting to GTK4, Libadwaita, and replacing our SPICE display widget with Libmks. Today, I want to share a structural decision that aligns with that vision and sets up the project for long-term health/sustainability.

    I have formally submitted a proposal to remove Boxes from the core-developer-tools set in gnome-build-meta and transition it towards becoming an independent application (with the ultimate goal of applying for GNOME Circle once all criteria are met).

    I want to dive into why I am making this move, what it means for users and maintainers, and why I believe this is the right path forward.

    There is No Drama Here

    First off, let’s get this out of the way: there is zero drama between Boxes and the GNOME project.

    Boxes continues to be built by the same core set of contributors, fully committed to the GNOME Human Interface Guidelines (HIG) and deeply integrated into our ecosystem. We aren’t stepping away from GNOME. We are simply right-sizing how Boxes is categorized, distributed, and maintained.

    Why Boxes Shouldn’t Be “Core” (and Why Versioning with the OS is Outdated)

    The desktop Linux landscape is shifting toward image-based operating systems with atomic updates and immutability. In this model, the underlying operating system provides a slim, reliable base, while applications live on top and update independently at their own pace.

    Tying a complex application like Boxes to the biannual GNOME release schedule is not useful anymore. It forces us to hold back features and bug fixes for months just to align with the OS cadence, when users should simply get updates when they are ready and stable.

    Furthermore, virtualization isn’t an essential utility that needs to be pre-installed on every single user’s machine by default. Boxes fits much better as a targeted application users explicitly choose to install when they need it.

    Flathub-First: Moving Fast and Ending Distribution Bottlenecks

    As a maintainer, maintaining separate code paths and stable branches for dozens of traditional distribution packages is simply not sustainable long-term. I can no longer afford to maintain multiple stable branches. Moving forward, I am simplifying maintenance down to one stable branch and one development/nightly branch. To make this sustainable, Flathub is our primary and only officially supported distribution method.

    By bundling the virtualization stack in our Flatpak, we ensure that users get a much more tested, consistent, and working virtualization backend regardless of what operating system they are running.

    Moving out of Core allows us to heavily discourage downstreams from individually packaging Boxes. Instead, distros should defer their users to the official Flatpak on Flathub . If you are filing bug reports or seeking support, the Flathub build will be the baseline.

    Branding and Infrastructure Changes

    To reflect this independent status, a few logistical changes are happening alongside this move. We are dropping “GNOME” from the user-facing app branding. Going forward, it will simply be named “Boxes”,  and we will soon be moving to a new website domain (which is currently being finalized). Importantly, our Flatpak application ID will remain org.gnome.Boxes for full continuity and compatibility. This means existing installations, user settings, and Flatpak configurations won’t break, and users won’t need to reinstall anything.

    What’s Next?

    This change gives us the flexibility to release updates whenever features are ready, iterate faster, and dramatically reduce maintainer burnout, all while delivering a more reliable and consistent user experience via Flathub. Once we settle into this new cadence and finalize our transition, we plan to apply for GNOME Circle .

    To set clear expectations on timing: since Boxes currently uses GTK3 in its stable releases, we will soon submit an application for GNOME Circle review following our GTK4/Libadwaita rewrite.

    If the Circle application is approved before the GNOME 52 Alpha deadline, the plan is to proceed with the removal from core-developer-tools and transition to Circle in time for the GNOME 52 release in March 2027.

    For distribution maintainers wondering about upcoming distro releases: distros targeting GNOME 51 can continue to package the GNOME 50 release of Boxes, which will remain supported for the standard lifecycle of that release. If everything goes according to plan, GNOME 52 won’t include Boxes in the core set anymore. At this point, please don’t package Boxes anymore.

    • chevron_right

      Hylke Bons: Icon for Metamorphosis

      news.movim.eu / PlanetGnome • 3 days ago

    Icon for Metamorphosis

    Week 29

    This week's icon is for Deimos Hall 's project:
    Metamorphosis : "Edit metadata"

    Check out all weekly app icons created so far in the gallery and follow my icon creation adventures as they happen (including sketches) on the Fediverse .

    Need icons?

    I love designing icons and am happy to contribute them free of charge when your project is Free and Open Source . Funded by community sponsors (every little helps!).

    • chevron_right

      Engagement Team: Engagement team introduction blog post

      news.movim.eu / PlanetGnome • 3 days ago • 1 minute

    Hello all! It’s my first blog ever, so please bear with me.

    Recently I’ve been active in Engagement team and helping out with the reboot. Hopefully you noticed our social media accounts are a tad more lively!

    Part of the reboot process was dropping all the unrelated activities the team accumulated over the years, like events and such, with the goal on focusing on social media purely. There’s still work to do, but since we started doing weekly meetings (Monday 16:00 CEST, if you’re interested please see our meeting pad !) progress has been steady.

    But we need your help in this! Engagement team is quite small, and to properly expand our activities onto other social media we need more contributors. Do you know how to edit images, create graphics? We need YOU for Instagram! Do you know how to make videos (short form or long form)? Our YouTube and TikTok are waiting for you! And let’s not forget that we always welcome new ideas for posts or people sharing their posts on social media for us to boost.

    Currently platforms we’re on include:
    – Fediverse
    – Bsky
    – Reddit

    We want to (potentially! nothing here is set in stone!) also expand on:
    – Facebook
    – TikTok
    – Instagram
    – Improve our LinkedIn
    – Improve our YouTube

    But this is currently out of reach for us due to not having enough volunteers. We welcome everyone who wants to make world think better about GNOME!

    To help developers in reaching us we introduced new labels:

    – Newsworthy, for when you want us to share something on social media
    – Team: Engagement, for when you want to summon us to discuss something.

    We also have an „Engagement Materials” label, when you have some assets for us to use.

    Interested? Visit us in #engagement:gnome.org and #socials:gnome.org Matrix rooms.


    Written by Victoria Niedzielska. Thanks to other Engagement team members for proofreading the blog post!

    • chevron_right

      Felipe Borges: Help us test the upcoming GNOME 51 release for Fedora 45!

      news.movim.eu / PlanetGnome • 4 days ago

    Most of GNOME 51 is now packaged for Fedora 45. Starting today and running through the end of the week, we will be running our traditional Fedora Test Day for GNOME . If you are a Fedora user, you can help us find last-minute integration issues and iron out what’s going to become the stable Fedora 45 release.

    You can either boot the latest Fedora 45 image (nightly) in a virtual machine or update an existing test setup. Follow our guided test matrix , try out different features, and record your results. Even testing for 15 minutes and reporting a single issue makes a huge difference.

    Visit https://fedoraproject.org/wiki/Test_Day:2026-08-17_GNOME_51_Desktop for more info. You can join the Fedora Workstation Matrix chat channel if you have more questions.

    • chevron_right

      Martin Pitt: Syncing Gmail with mbsync using OAuth2

      news.movim.eu / PlanetGnome • 5 days ago

    I wholeheartedly dislike GMail (ethically, technically, and UX), and for my personal email I have always run my own server. But for work email I don’t have a choice. I am using isync/mbsync to make it usable for me and mutt. Until now I’ve used a Google app password to authenticate, but they are a security nightmare. OAuth2 is a better way. Sadly the interwebs have only scarce, outdated, or buggy recipes, so I finally spent the better part of an afternoon and moved OAuth2.