Skip to content

Linux AppImage bundles no GIO TLS backend — all HTTPS fails, surfacing as an attestation error #804

Description

@jordan-bravo

I ran the AppImage of v3.3.4 on NixOS (with appimage-run) and Maple started up but when I tried to log in it threw an error. Using a LLM to troubleshoot, I was able to get it running.

(The details below were written with an LLM)

Summary

The Linux AppImage ships GLib, libsoup3 and WebKitGTK but no glib-networking GIO module (libgiognutls.so). Without it GIO has no TLS backend, so every HTTPS request from the webview fails. The first one users hit is the attestation fetch, so it surfaces as:

Couldn't process attestation document: Load failed

Load failed is WebKit's generic fetch() network error, not an attestation problem.

Observed on 3.3.4. Not distro-specific (see root cause) — I verified on NixOS 26.11 / GNOME.

Reproduce

// tlsprobe.c — cc -o tlsprobe tlsprobe.c -ldl
#include <dlfcn.h>
#include <stdio.h>
int main(void){
  void *h = dlopen("libgio-2.0.so.0", RTLD_NOW|RTLD_GLOBAL);
  void* (*get_default)(void)   = dlsym(h,"g_tls_backend_get_default");
  int   (*supports_tls)(void*) = dlsym(h,"g_tls_backend_supports_tls");
  void *b = get_default();
  printf("supports_tls=%s\n", (b && supports_tls(b)) ? "YES" : "NO");
}
./Maple_3.3.4_amd64.AppImage --appimage-extract
AD=$PWD/squashfs-root
GIO_EXTRA_MODULES="$AD/" LD_LIBRARY_PATH="$AD/usr/lib" ./tlsprobe   # => NO

That is exactly the environment AppRun constructs. Adding GIO_MODULE_DIR=<any glib-networking>/lib/gio/modules flips it to YES, and login then succeeds.

Root cause

  1. No GIO module is bundled: find squashfs-root -name 'libgiognutls.so' returns nothing.
  2. The bundled GLib's compiled-in module directory is a build-host store path, /nix/store/f7rc…-glib-2.86.3/lib/gio/modules — absent on other distros, and empty even on NixOS since glib-networking is a separate derivation.
  3. apprun-hooks/linuxdeploy-plugin-gtk.sh overwrites GIO_EXTRA_MODULES with the AppDir root, which contains no modules — discarding any host value that would have pointed at glib-networking.

Underlying gap: repair_linux_appdir_runtime_closure (scripts/ci/_common.sh:3364) closes over DT_NEEDED. GIO modules are dlopened, so they are invisible to it by construction. grep -rni 'gio.module\|glib-networking' scripts/ returns nothing on master.

Suggested fix

In prepare_linux_appdir_for_appimage (scripts/ci/_common.sh:3579):

  • Copy ${glib-networking}/lib/gio/modules/libgiognutls.so into ${appdir}/usr/lib/gio/modules/, before repair_linux_appdir_runtime_closure, so its DT_NEEDED on gnutls/p11-kit/tasn1 is closed over automatically. All three are already bundled, so the marginal cost is one .so.
  • Run gio-querymodules on that directory so giomodule.cache matches.
  • export GIO_MODULE_DIR="${APPDIR}/usr/lib/gio/modules" from maple-webkitgtk.sh (scripts/ci/_common.sh:3143). That hook is sourced last in AppRun, after the GTK plugin clobbers GIO_EXTRA_MODULES, so it wins.

glib-networking is already in linuxTauriPackages (flake.nix:207), so the path is available to the build.

Two smaller asks:

  • Verify TLS on the packaged artifact. A verify_linux_appdir_tls_backend alongside the existing verify_linux_appdir_* calls would have caught this at build time, and covers the whole dlopen-ed-plugin class rather than this one module.
  • Distinguish network failures from attestation failures in that error path. The current message sends you straight to attestation/PCR code for what is a transport error.

Why this was not caught

flake.nix:547 sets GIO_MODULE_DIR=${pkgs.glib-networking}/lib/gio/modules for the dev shell, so just desktop-dev always has a working TLS backend. Only the packaged AppImage lacks one — which is the argument for checking the artifact rather than the dev environment.

Worth confirming whether the .deb/.rpm are affected; if they rely on system libraries they are probably fine, which would explain why this went unnoticed.

Workaround

GIO_MODULE_DIR=/path/to/glib-networking/lib/gio/modules ./Maple_3.3.4_amd64.AppImage

On NixOS, via appimage-run, with the directory resolved from the host's GIO_EXTRA_MODULES.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions