← Back to Feed CACHED · 2026-06-29 18:57:28 · CACHE_KEY CVE-2026-13601
CVE-2026-13601 · CWE-693 · Disclosed 2026-06-29

A flaw was found in Yelp due to an overly permissive Content Security Policy

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Local GNOME desktop bug. Real, but it's a workstation help-viewer flaw — not a fleet emergency."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Attacker crafts malicious Mallard .page

Attacker authors a .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.
Conditions required:
  • Knowledge of victim's distro/yelp version
  • Ability to deliver a file or URL to the victim
Where this breaks in practice:
  • No weaponized exploit kit observed in the wild for this CVE
  • Victim must be on a GNOME desktop — not Windows, macOS, KDE, server
Detection/coverage: No public Snort/Suricata signatures. File hash IOCs do not exist yet.
STEP 02

Delivery via drive-by download + ghelp:// handler

Browser auto-downloads the .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.
Conditions required:
  • GNOME desktop session
  • Default ghelp:// scheme handler bound to Yelp
  • Browser that doesn't strip the auto-download
Where this breaks in practice:
  • Most browsers prompt on novel scheme handlers
  • Enterprise endpoints often disable xdg-open redirection or remove Yelp entirely on hardened images
  • macOS/Windows fleet — vast majority of corporate endpoints — are unaffected
Detection/coverage: EDR on Linux endpoints (CrowdStrike Falcon for Linux, SentinelOne) can flag yelp execution with a child WebKit process touching ~/.ssh/.
STEP 03

CSP allows inline JS — exfiltration begins

Rendered help page executes attacker JS under the permissive CSP. The script uses XMLHttpRequest/fetch against file:// and ghelp:// URIs to read SSH keys, browser cookies, GPG keys, .aws/credentials, kerberos tickets in /tmp/krb5cc_*.
Conditions required:
  • yelp-xsl < 42.3
  • User has readable secrets on disk
Where this breaks in practice:
  • AppArmor/SELinux confinement of yelp on RHEL/Ubuntu blocks some paths
  • Flatpak'd Yelp is sandboxed via portals and largely defangs the read primitive
Detection/coverage: auditd on /home/*/.ssh/ reads by yelp PID. Falco rules for credential file access by non-shell processes.
STEP 04

Egress stolen material to attacker C2

Same JS posts the read content to attacker-controlled HTTPS endpoint. No persistence, no privilege escalation — strictly confidentiality loss for files the desktop user can already read.
Conditions required:
  • Outbound HTTPS allowed from workstation
Where this breaks in practice:
  • DLP / TLS-inspecting proxy on egress catches large ~/.ssh/ posts to first-seen domains
Detection/coverage: Standard egress anomaly detection; Zscaler/Netskope first-seen domain rules.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo KEV listing. No active exploitation evidence as of 2026-06-30. Companion bug CVE-2025-3155 had PoC but no campaigns.
Proof-of-conceptNo public PoC for *this* CVE ID yet, but parrot409's CVE-2025-3155 gist is structurally identical and trivially retargeted.
EPSSNot yet scored (disclosed 2026-06-29). Comparable yelp CVEs sit at <1% percentile — local-vector desktop bugs do not score high.
KEVNot listed. Unlikely to be — CISA KEV prioritizes server-side and remotely exploitable issues.
CVSS vectorAV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:Nlocal 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 versionsyelp 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 versionsyelp-xsl 42.3 upstream. Distro backports: track dnf updateinfo (RHSA pending), apt-get changelog yelp-xsl (USN pending).
Exposure dataNot applicable — local-only. Shodan/Censys/GreyNoise: zero relevance. Internal scanning population = Linux desktops with GNOME (typically 1–5% of an enterprise fleet).
Disclosure2026-06-29 via Red Hat Bugzilla / GNOME GitLab.
ReporterContinuation of the yelp-xsl hardening work following parrot409's 2025 disclosures; specific reporter not yet attributed in public advisories.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.4/10)

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.

HIGH Affected version range and patch availability
HIGH Exploit class — direct lineage from CVE-2025-3155
MEDIUM In-the-wild signal — too new to have telemetry

Why this verdict

  • Local vector, desktop component: AV:L plus 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:N in the vector, exploitation depends on a victim either opening a .page file or visiting a site that successfully invokes ghelp://. 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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-xsl or apt-get purge yelp yelp-xsl. Eliminates the attack surface entirely on those roles.
  3. Unbind ghelp:// scheme handler on managed desktops — Until patched, edit /usr/share/applications/yelp.desktop to drop the x-scheme-handler/ghelp MimeType, or override per-user with xdg-mime default <noop>.desktop x-scheme-handler/ghelp. Kills the drive-by delivery path.
  4. 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.
  5. 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.
What doesn't work
  • 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.
06 · Verification

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).

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: don't drop everything for this one. The noisgate mitigation SLA for MEDIUM is none — go straight to the noisgate remediation SLA of ≤ 365 days, but pull it forward to your next monthly Linux desktop patch cycle for any developer or sysadmin workstation, because those hosts hold SSH keys and cloud credentials that *would* matter if read. Scope the fleet first (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

  1. Michael Catanzaro — CVE-2025-3155 yelp arbitrary file read (parent disclosure)
  2. parrot409 PoC gist for the yelp-xsl exploit class
  3. Red Hat advisory RHSA-2025:7569 (yelp / yelp-xsl)
  4. Ubuntu USN-7447-1: Yelp vulnerability
  5. Debian security tracker — yelp-xsl source package
  6. Phoronix coverage of the yelp file-read class
  7. Tenable plugin 237353 — RHEL 8 yelp / yelp-xsl
  8. CISA Vulnerability Summary Bulletins (week of June 15, 2026)
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.