# REPRO-2026-00309: PipeWire sandbox escape via malicious library loading in PulseAudio compatibility layer ## Summary Status: published Severity: high CVSS: Unknown CWE: Unknown Type: security Confidence: high ## Identifiers REPRO ID: REPRO-2026-00309 CVE: CVE-2026-5674 ## Package Name: Unknown Ecosystem: Unknown Affected: Unknown Fixed: Unknown ## Root Cause # Root Cause Analysis — CVE-2026-5674 (PipeWire PulseAudio-compatibility sandbox escape) ## Summary PipeWire's PulseAudio compatibility daemon (`pipewire-pulse`) implements the PulseAudio native protocol `LOAD_MODULE` command. The request handler only checks the `pulse.allow-module-loading` server property (default: `true`) and then loads any of the built-in PulseAudio compatibility modules with fully attacker-controlled arguments. One of those modules, `module-ladspa-sink`, forwards the attacker-supplied `plugin=` argument to PipeWire's filter-chain LADSPA loader, which calls `dlopen()` on the value verbatim when it is an absolute path. Because Flatpak-style sandboxes deliberately expose the PulseAudio unix socket to sandboxed applications, an attacker confined in a bubblewrap/Flatpak sandbox can make the out-of-sandbox `pipewire-pulse` daemon `dlopen()` an attacker-controlled shared library, executing its ELF constructors in the daemon process and thereby escaping the sandbox. ## Impact - Package/component affected: `pipewire` / `pipewire-pulse` (`libpipewire-module-protocol-pulse`, pulse `module-ladspa-sink`/`module-ladspa-source`, SPA filter-graph LADSPA plugin). - Affected versions: verified on PipeWire 1.6.2 (Ubuntu 26.04, `1.6.2-1ubuntu1.1`). The Debian security tracker lists every release as vulnerable (bullseye 0.3.19 through sid 1.6.8); no upstream fix exists at the time of this run. - Risk level and consequences: Important (CVSS 8.8 per Amazon ALAS). Any sandboxed application with access to the PulseAudio socket (default for audio-playing Flatpaks) can execute arbitrary code in the user's unsandboxed `pipewire-pulse` session daemon, i.e. a full sandbox escape with the daemon's privileges. ## Impact Parity - Disclosed/claimed maximum impact: sandbox escape — arbitrary code execution outside the sandbox (bubblewrap/Flatpak-style namespace sandbox) via the PulseAudio compatibility layer. - Reproduced impact from this run: attacker-controlled code executed in the host-side `pipewire-pulse` daemon from a client confined in a real bubblewrap sandbox with separate mount and user namespaces. Proof: the loaded library's constructor wrote fresh markers (`CVE-2026-5674-PWNED pid= uid=1000 comm=pipewire-pulse`) into a host-only oracle directory that the sandboxed client could neither see nor write. - Parity: `full`. - Not demonstrated: nothing material — a constructor can contain arbitrary code; the marker write is representative attacker-controlled code execution in the daemon. ## Root Cause 1. `src/modules/module-protocol-pulse/pulse-server.c` — `do_load_module()` (line 5051) handles `COMMAND_LOAD_MODULE` from the PulseAudio native protocol. Its only guard is `if (!impl->defs.allow_module_loading) return -EACCES;`. The property defaults to true (`/usr/share/pipewire/pipewire-pulse.conf`: `#pulse.allow-module-loading = true`). 2. `src/modules/module-protocol-pulse/modules/module-ladspa-sink.c` — the registered pulse module `module-ladspa-sink` accepts `plugin=` and `label=` arguments and builds a filter.graph node `{ type = ladspa plugin = "" label = "