Files
nix-config/hardening/tests/wechat-runtime.md
T
ryan4yin | 二花 818965a11f feat(nixpak): unify desktop app sandboxes (#491)
* refactor(nixpak): unify desktop app sandboxes

Move common GUI, portal, and network policy into reusable modules and migrate browsers plus Zoom/WeChat/QQ/Telegram to the same boundary.

Assisted-by: DeepSeek Harness (deepseek-flash)
2026-10-31 22:27:58 +08:00

3.7 KiB

WeChat nested runtime verification

WeChat 4.1.13.26 built and opened a Weixin X11 window with a disposable profile. The final candidate was /nix/store/6wr94i7da0674k9hzs23fk2nr1ih4i3f-nixpak-wechat-4.1.13.26. The existing AppImage extraction, FHS runtime, X11 and fcitx settings remain in hardening/bwraps/wechat.nix; the new nixpak wrapper adds an outer boundary.

The live extracted WeChat binary had three PID namespace identifiers, NoNewPrivs: 1, Seccomp: 0, a network namespace different from the host, and /.flatpak-info identifying com.tencent.WeChat. Its device view contained standard synthetic devices, dri, and the four explicit NVIDIA nodes; no raw camera, USB or block devices. This smoke test does not establish an internal renderer sandbox guarantee.

A sentinel in the disposable Documents/WeChat_Data/home was readable at WeChat's remapped HOME. Its xwechat_files link retained the absolute target Documents/WeChat_Data/xwechat_files, which remains bound inside both layers. The final launcher also rejected a separate disposable layout containing a real home/xwechat_files directory, exited 1, and preserved its sentinel and contents. It will not silently migrate an unexpected existing layout.

Compatibility changes

As with Zoom, the wrapper preserves the outer /.flatpak-info file explicitly: the FHS automatic root mount loop only propagates directories. The inner --dev-bind /dev /dev inherits the outer filtered devices. The original inner network setting inherits pasta's isolated outer namespace, including its private loopback.

The original inner /home reset hides the shared desktop base's XDG mounts. WeChat therefore exposes its existing backing tree to the outer sandbox and keeps the original FHS HOME mapping. It supplies XDG_DOCUMENTS_DIR and a coreutils-only PATH for the pre-FHS mkdir/link commands. Xauthority is rebound after the inner HOME reset when present.

The first run aborted in libdbus because no machine ID was available. The WeChat policy supplies a synthetic app-specific ID rather than the host ID. Login/device identity continuity with an existing account remains untested. No credentials or real profile were used for this test.

Historical constraint

Commit 0c7e43a2 removed nixpaks/wechat-uos.nix. Its previous TODO said the FHS runtime was problematic inside another sandbox, but supplied no failure log. That old module also disabled X11 and set QT_QPA_PLATFORM=kcb, despite its xcb-only comment. Commit 28dee277 subsequently changed the AppImage wrapper from Wayland to xcb and added fcitx environment settings. These records do not prove the original failure's cause. Current runtime testing establishes that retaining FHS inside nixpak is feasible with the explicit compatibility changes above.

Repeat safely

Use the same disposable-home command as Zoom, with WeChat's output and executable, and additionally set XDG_DOCUMENTS_DIR="$wechat_probe_dir/Documents". Prepare Documents/WeChat_Data/home and Documents/WeChat_Data/xwechat_files beneath that disposable home before launching. The smoke test stops before QR login and uses no account. Inspect the exact test PID through /proc while the timeout is active; verify that its window and processes disappear after timeout.

Pending manual checks: existing account persistence, QR/login, fcitx input, notifications/tray, portal file chooser and selected-file access, downloads, voice/video calls, camera/screencast portal support and clipboard workflows. Camera and ScreenCast methods are explicit grants; raw capture devices and the host PipeWire socket are not exposed. X11 retains its display trust limitations, so portal permission does not imply all capture requires portal consent.