The Linux help browser will read your `~/.ssh/` if you let a webpage hand it a poisoned manual page
yelp-xsl is the XSLT stylesheet package that drives Yelp, the GNOME desktop help viewer. This CVE is the CSP-policy half of the same family as CVE-2025-3155 — the stylesheets emit help-document HTML with a Content Security Policy permissive enough to allow inline scripting and external resource loads, so a crafted Mallard .page file can execute JavaScript inside the help viewer's WebKit context and reach file://, ghelp:///proc/self/cwd/... and similar URIs. The result is arbitrary file read in the context of the desktop user. Affected: yelp and yelp-xsl < 42.3 on GNOME-based distributions (Fedora, RHEL 8/9, Ubuntu 22.04/24.04, Debian 11/12 prior to backport).
Vendor scored this HIGH 7.1 with AV:L / S:C / C:H. The scope-changed confidentiality call is fair *for the affected component itself* — a help viewer that can read ~/.ssh/id_ed25519 is unambiguously out of bounds. But for a defender prioritizing 10,000 hosts, HIGH is overcalled: Yelp is a GNOME desktop component, not a server package; it requires a victim sitting at a Linux GUI to be tricked into opening a .page file (or visiting a site that abuses xdg-open/ghelp://). On a typical enterprise fleet this is a sub-1% population, no lateral movement, no RCE.
4 steps from start to impact.
Attacker crafts malicious Mallard .page
.page file containing SVG/XInclude payload plus inline JavaScript. The yelp-xsl stylesheets pass the SVG block through unchanged and the rendered output's CSP allows inline script execution. Public PoCs from the CVE-2025-3155 disclosure (parrot409 gist) are directly adaptable.- Knowledge of victim's distro/yelp version
- Ability to deliver a file or URL to the victim
- No weaponized exploit kit observed in the wild for this CVE
- Victim must be on a GNOME desktop — not Windows, macOS, KDE, server
Delivery via drive-by download + ghelp:// handler
.page to ~/Downloads, then a follow-on link or redirect invokes ghelp:///proc/self/cwd/Downloads/exploit.page. The GNOME URL handler launches Yelp to render it. Alternative vectors: email attachment, USB drop, package masquerading as a manual.- GNOME desktop session
- Default
ghelp://scheme handler bound to Yelp - Browser that doesn't strip the auto-download
- Most browsers prompt on novel scheme handlers
- Enterprise endpoints often disable
xdg-openredirection or remove Yelp entirely on hardened images - macOS/Windows fleet — vast majority of corporate endpoints — are unaffected
yelp execution with a child WebKit process touching ~/.ssh/.CSP allows inline JS — exfiltration begins
XMLHttpRequest/fetch against file:// and ghelp:// URIs to read SSH keys, browser cookies, GPG keys, .aws/credentials, kerberos tickets in /tmp/krb5cc_*.- yelp-xsl < 42.3
- User has readable secrets on disk
- AppArmor/SELinux confinement of yelp on RHEL/Ubuntu blocks some paths
- Flatpak'd Yelp is sandboxed via portals and largely defangs the read primitive
/home/*/.ssh/ reads by yelp PID. Falco rules for credential file access by non-shell processes.Egress stolen material to attacker C2
- Outbound HTTPS allowed from workstation
- DLP / TLS-inspecting proxy on egress catches large
~/.ssh/posts to first-seen domains
The supporting signals.
| In-the-wild status | No KEV listing. No active exploitation evidence as of 2026-06-30. Companion bug CVE-2025-3155 had PoC but no campaigns. |
|---|---|
| Proof-of-concept | No public PoC for *this* CVE ID yet, but parrot409's CVE-2025-3155 gist is structurally identical and trivially retargeted. |
| EPSS | Not yet scored (disclosed 2026-06-29). Comparable yelp CVEs sit at <1% percentile — local-vector desktop bugs do not score high. |
| KEV | Not listed. Unlikely to be — CISA KEV prioritizes server-side and remotely exploitable issues. |
| CVSS vector | AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N — local attack vector, scope-changed confidentiality only. The UI:N claim is generous; in practice a desktop user has to either open a file or be in a session where ghelp:// is auto-handled. |
| Affected versions | yelp and yelp-xsl prior to 42.3. Confirmed: Fedora 38–40, RHEL 8/9, Ubuntu 22.04/24.04, Debian 11/12 pre-backport. |
| Fixed versions | yelp-xsl 42.3 upstream. Distro backports: track dnf updateinfo (RHSA pending), apt-get changelog yelp-xsl (USN pending). |
| Exposure data | Not applicable — local-only. Shodan/Censys/GreyNoise: zero relevance. Internal scanning population = Linux desktops with GNOME (typically 1–5% of an enterprise fleet). |
| Disclosure | 2026-06-29 via Red Hat Bugzilla / GNOME GitLab. |
| Reporter | Continuation of the yelp-xsl hardening work following parrot409's 2025 disclosures; specific reporter not yet attributed in public advisories. |
noisgate verdict.
Downgraded from vendor HIGH 7.1 to MEDIUM 5.4 because the decisive factor is deployment role: Yelp is a GNOME *desktop help viewer*, never installed on servers, and absent from Windows/macOS endpoints — the affected population on a typical enterprise fleet is single-digit percent with no lateral or fleet-wide blast radius. Confidentiality loss is real but capped at the desktop user's own readable files.
Why this verdict
- Local vector, desktop component:
AV:Lplus a GNOME-only package means the reachable population on a Windows-majority enterprise is a small minority of hosts. - Role multiplier — workstation only: Yelp runs on (a) developer/admin Linux desktops and (b) end-user Linux desktops. It is not present on servers, hypervisors, IdPs, CAs, or any high-value role component. No deployment role exists where this bug yields fleet-scale, identity-scale, or supply-chain blast radius. Floor stays at MEDIUM.
- Friction — user interaction in practice: Despite
UI:Nin the vector, exploitation depends on a victim either opening a.pagefile or visiting a site that successfully invokesghelp://. Modern browsers prompt on novel scheme handlers, neutering the drive-by path on most builds. - Mitigations exist in the ecosystem: Flatpak'd Yelp is portal-sandboxed; SELinux/AppArmor confinement on RHEL/Ubuntu restricts some of the readable paths even pre-patch.
Why not higher?
Not HIGH because the blast radius is bounded to the desktop user's own files — no SYSTEM/root, no lateral movement primitive, and no high-value-role deployment of Yelp exists. KEV-absent and no observed exploitation. The vendor's S:C / C:H framing is technically correct for the component, but ignores fleet-level reachability.
Why not lower?
Not LOW because the primitive is arbitrary file read as the desktop user, which on a developer or admin workstation directly yields SSH keys, cloud credentials, and browser session tokens — a credible pivot input even if the bug itself doesn't pivot. A patched MEDIUM is correct; treating it as LOW would let admin Linux desktops linger unpatched.
What to do — in priority order.
- Patch to yelp-xsl 42.3 / distro backport — This is a MEDIUM verdict — no noisgate mitigation SLA applies; ride the standard 365-day remediation window but pull it forward for any admin / developer Linux desktop in the next monthly maintenance cycle. Use
dnf upgrade yelp yelp-xsl/apt-get install --only-upgrade yelp yelp-xsl. - Remove Yelp from server and kiosk images — If yelp ships in your gold image but the role never needs a help viewer (servers, build agents, CI runners), uninstall it:
dnf remove yelp yelp-xslorapt-get purge yelp yelp-xsl. Eliminates the attack surface entirely on those roles. - Unbind ghelp:// scheme handler on managed desktops — Until patched, edit
/usr/share/applications/yelp.desktopto drop thex-scheme-handler/ghelpMimeType, or override per-user withxdg-mime default <noop>.desktop x-scheme-handler/ghelp. Kills the drive-by delivery path. - Enforce Flatpak Yelp where feasible — Flatpak'd Yelp uses xdg-document-portal and cannot freely read
~/.ssh/— the primitive becomes far less useful. Roll Flatpak Yelp via Ansible/Salt to developer workstations as a hardening upgrade. - Audit egress for first-seen-domain HTTPS POSTs from desktops — Standard DLP / Zscaler / Netskope rules will catch the exfiltration leg even if the read primitive fires. Tune for credential-file-sized POSTs from non-browser processes.
- WAF / IDS at the network edge — this is a local desktop bug, no network signature to match.
- Patching the kernel or libxml2 — the bug is in yelp-xsl stylesheets and the CSP they emit, not in any underlying library.
- Disabling JavaScript globally in WebKit — Yelp instantiates its own WebKit view; browser-level JS prefs don't apply.
- MFA / conditional access — does not interrupt a local file-read primitive against files the user already owns.
Crowdsourced verification payload.
Run on each Linux endpoint as any user (no root required) — e.g. bash check-cve-2026-13601.sh. Pushes via Ansible/Salt across the GNOME-desktop subset of your fleet. Exits 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN (yelp not installed → not in scope).
#!/usr/bin/env bash
# noisgate check: CVE-2026-13601 — yelp-xsl permissive CSP
# Exit codes: 0=PATCHED 1=VULNERABLE 2=UNKNOWN/N-A
set -u
FIXED="42.3"
ver_ge() {
# returns 0 if $1 >= $2 by dpkg/rpm semantics
printf '%s\n%s\n' "$2" "$1" | sort -V -C
}
get_ver() {
local pkg="$1"
if command -v rpm >/dev/null 2>&1 && rpm -q "$pkg" >/dev/null 2>&1; then
rpm -q --qf '%{VERSION}\n' "$pkg" | head -n1
return
fi
if command -v dpkg-query >/dev/null 2>&1 && dpkg-query -W -f='${Version}\n' "$pkg" 2>/dev/null | grep -q .; then
dpkg-query -W -f='${Version}\n' "$pkg" | sed 's/[-+~].*$//'
return
fi
if command -v flatpak >/dev/null 2>&1 && flatpak info org.gnome.Yelp >/dev/null 2>&1; then
flatpak info org.gnome.Yelp 2>/dev/null | awk -F': ' '/Version/{print $2; exit}'
return
fi
echo ""
}
YELP_VER=$(get_ver yelp)
XSL_VER=$(get_ver yelp-xsl)
if [ -z "$YELP_VER" ] && [ -z "$XSL_VER" ]; then
echo "UNKNOWN: yelp / yelp-xsl not installed — host not in scope"
exit 2
fi
VULN=0
for pair in "yelp:$YELP_VER" "yelp-xsl:$XSL_VER"; do
pkg="${pair%%:*}"; v="${pair##*:}"
[ -z "$v" ] && continue
if ver_ge "$v" "$FIXED"; then
echo "OK: $pkg $v >= $FIXED"
else
echo "VULNERABLE: $pkg $v < $FIXED"
VULN=1
fi
done
[ "$VULN" -eq 1 ] && { echo "VULNERABLE"; exit 1; }
echo "PATCHED"
exit 0
If you remember one thing.
yelp is only on GNOME desktops — likely <5% of your hosts), uninstall it from servers and kiosks where it never belonged, and ship the yelp-xsl 42.3 backport from your distro. Skip the all-hands emergency; this is hygiene, not a fire.Sources
- Michael Catanzaro — CVE-2025-3155 yelp arbitrary file read (parent disclosure)
- parrot409 PoC gist for the yelp-xsl exploit class
- Red Hat advisory RHSA-2025:7569 (yelp / yelp-xsl)
- Ubuntu USN-7447-1: Yelp vulnerability
- Debian security tracker — yelp-xsl source package
- Phoronix coverage of the yelp file-read class
- Tenable plugin 237353 — RHEL 8 yelp / yelp-xsl
- CISA Vulnerability Summary Bulletins (week of June 15, 2026)
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.