← Back to Feed CACHED · 2026-06-30 15:05:08 · CACHE_KEY CVE-2025-13947
CVE-2025-13947 · CWE-346 · Disclosed 2025-12-03

A flaw was found in WebKitGTK

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

A web page hands you a fake business card and you accidentally hand back your tax returns

WebKitGTK before 2.50.3 fails to verify that drag operations originate from outside the browser. A malicious page can attach arbitrary file:// URLs to its own drag source, and when the user drops that source onto a drop target (the page itself, or another app), the receiving target gets the *contents* of files the user account can read — not just the URLs. The class is CWE-346 (Origin Validation Error): WebKit treated an in-browser drag as a trusted local drag. The chain is unauthenticated and network-reachable, but it is hard-gated by user gesture (drag-and-drop) and only affects Linux/BSD desktops running WebKitGTK or WPE WebKit — Epiphany, GNOME Web, Geary's web view (not exploitable there — no JS in email), the GNOME help viewer, document viewers, Evolution previews, and anything embedding WebKitGTK as a widget. Apple WebKit on macOS/iOS is unaffected.

Vendor's HIGH (7.4) rating reflects worst-case C:H (read any file the user can read — SSH keys, ~/.aws/credentials, browser cookies, GPG keyrings) with scope change. That's directionally fair for a single-user Linux workstation but overstates fleet risk: AV:N is technically correct yet the chain requires the victim to actively drag a page element. Most enterprise fleets are Windows/macOS where this code path doesn't exist. We land at MEDIUM — the file-disclosure outcome is real and ugly on the boxes that *do* run WebKitGTK, but the user-gesture gate plus narrow desktop footprint takes the urgency down.

"Browser sandbox bug that exfiltrates files only if a user drags an attacker-controlled element onto a drop target. Real, not urgent."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Victim loads attacker page in a WebKitGTK browser

User opens a malicious URL in Epiphany / GNOME Web / any WebKitGTK-based app (help viewer, document preview, embedded webview in an Electron-like GTK app). No auth required; page can be third-party loaded via iframe or ad network on a compromised site.
Conditions required:
  • Target is running Linux/BSD with WebKitGTK < 2.50.3 or WPE WebKit < 2.50.3
  • User browses to attacker-controlled or compromised page
Where this breaks in practice:
  • Enterprise fleets are overwhelmingly Windows/macOS — WebKitGTK is a sub-1% browser footprint
  • Even on Linux, Firefox and Chromium dominate desktop share — Epiphany is niche
  • Corporate web proxies and DNS filtering block known-bad domains
Detection/coverage: Standard web proxy / SWG telemetry; no signature for this specific bug.
STEP 02

Page stages a draggable element with attacker-chosen file:// URLs

Attacker JS calls dataTransfer.setData('text/uri-list', 'file:///home/victim/.ssh/id_rsa') (or ~/.aws/credentials, /etc/passwd, browser cookie DB, etc.) on a draggable DOM element. WebKitGTK does not enforce that file URLs in drag data originate from a user-initiated external drag — origin validation is missing (CWE-346). The page can stage any path the user account can read.
Conditions required:
  • JavaScript execution enabled (default)
  • Page knows or guesses target file paths — $HOME paths are predictable
Where this breaks in practice:
  • Attacker needs to know plausible paths; uncommon paths require recon
  • AppArmor/Snap-confined WebKitGTK browsers (Ubuntu Snap of Epiphany, Flatpak GNOME Web) have filesystem restrictions limiting reachable paths
Detection/coverage: Not visible at network layer; would require host-level WebKitGTK telemetry that doesn't ship by default.
STEP 03

User performs a drag-and-drop gesture on the page

Victim drags the staged element — often disguised as a 'drag this icon to your desktop to install' or 'drag the file here to upload' UI trick — onto a drop target. The drop target can be (a) another DOM element on the same page that reads dataTransfer.files, exfiltrating file *contents* to attacker JS, or (b) a different application window that accepts file drops.
Conditions required:
  • User performs a deliberate mouse-drag gesture
  • Page convincingly social-engineers the drag (CAPTCHA puzzle, slider widget, drag-to-confirm UX)
Where this breaks in practice:
  • No drag = no exploit. Drive-by drive-by is impossible
  • Headless / kiosk / scripted sessions don't drag
  • Users on touch-only devices rarely drag in this pattern
Detection/coverage: No realistic detection at scale — looks like normal user input.
STEP 04

File contents land in attacker-controlled context

If the drop target is the page itself, JS exfiltrates contents via fetch() to an attacker C2. If the target is another local app, the contents flow into that app's document — useful for chained social engineering or local pivot but less direct. Sensitive payoffs: SSH private keys → lateral movement; browser cookies → session hijack of corporate SSO; cloud credential files → cloud account takeover.
Conditions required:
  • Outbound HTTPS to attacker domain not blocked
  • Target file is readable by the desktop user account
Where this breaks in practice:
  • Egress filtering / SWG inspecting TLS will see anomalous large POSTs
  • Files owned by other users or root (/etc/shadow) are out of reach
  • Hardware security keys make stolen SSH keys less useful
Detection/coverage: DLP on egress can flag credential-shaped strings; EDR on Linux endpoints (CrowdStrike, SentinelOne) sees the browser making outbound POST but won't flag absent signature.
03 · Intelligence Metadata

The supporting signals.

CVECVE-2025-13947 — origin validation in WebKitGTK drag-and-drop
CWECWE-346 — Origin Validation Error
AffectedWebKitGTK and WPE WebKit < 2.50.3 (Linux/BSD only; Apple WebKit unaffected)
Fixed in2.50.3 (released 2025-12-09). Distro backports: RHEL via RHSA-2025:23742, Debian/Ubuntu tracking in webkit2gtk source package
Vendor CVSS7.4 HIGHAV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N — file read at host scope, requires user interaction
EPSS0.00277 (~0.3%) — low predicted exploitation in the next 30 days; consistent with niche target population
KEVNot listed by CISA as of 2026-06-30
In-the-wildNo public reports of active exploitation; no campaign attribution
PoCNo weaponized PoC published; technical writeup by Michael Catanzaro (GNOME / Red Hat) on blogs.gnome.org describes the mechanism in enough detail to reproduce
ExposureWebKitGTK desktop share is sub-1% of enterprise endpoints. Primary exposure: Linux developer workstations running Epiphany/GNOME Web, GNOME Help, Evolution, and Flatpak-bundled WebKitGTK apps
Disclosed2025-12-03 (advisory), fix and public disclosure 2025-12-09 (WSA-2025-0009/0010)
Reported byWebKitGTK security team / GNOME — researcher not publicly named in WSA
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to MEDIUM (5.8/10)

The single most decisive factor is the user-gesture gate: exploitation requires the victim to perform a deliberate drag-and-drop on attacker-staged content, eliminating drive-by mass exploitation. Combined with WebKitGTK's sub-1% enterprise endpoint footprint (Linux desktops only, niche even within Linux), the chain's realistic exposure population does not justify HIGH.

HIGH technical mechanism and fix version
HIGH platform scope (Linux/BSD desktop only)
MEDIUM deployment footprint estimate in target environment
MEDIUM exploitation likelihood — low but credible against high-value Linux engineering workstations

Why this verdict

  • User interaction is a hard gateUI:R here is not 'click a link', it is 'perform a multi-step drag-and-drop'. Phishing pages routinely get clicks; getting deliberate drags is materially harder.
  • Footprint is narrow — affected component runs on Linux/BSD desktops only. Windows and macOS endpoints (the bulk of a 10k-host enterprise) are unaffected. Even on Linux, Firefox/Chromium dominate; Epiphany and other WebKitGTK browsers are a minority.
  • Sandbox containment helps — Flatpak and Snap packaging of GNOME Web restrict the readable filesystem, reducing realistic payoff against the most common install vectors.
  • Role multiplier: developer workstations with SSH keys, ~/.aws/credentials, kubeconfigs, and signing keys are the realistic worst-case role. Blast radius for a single dev box compromise is local-to-host, with credential-driven lateral pivot possible — but the affected component (a browser, not a domain controller / hypervisor / IdP / CA / PAM) does not sit in a high-value-role catalog slot. Chain ends in user-context credential theft, not domain takeover or fleet compromise. Role floor: MEDIUM.
  • No KEV, low EPSS (0.3%), no public PoC — risk surface is theoretical-plus, not under active campaign pressure.
  • Vendor 7.4 baseline is fair for a single-user view — we apply a friction-and-footprint discount of roughly 1.6 points to land at 5.8 MEDIUM, reflecting fleet-level reality rather than worst-case per-host.

Why not higher?

HIGH would require either active exploitation in the wild, KEV listing, a weaponized public PoC reducing the gesture barrier (e.g., a clickjacking/drag-jacking framework integrating this), or evidence that WebKitGTK is a non-trivial share of your endpoint estate. None of those conditions hold today. The user-gesture requirement is also stronger than typical UI:R clicks.

Why not lower?

LOW or IGNORE would be wrong because the outcome (C:H arbitrary file read in user context) is genuinely severe on affected hosts — SSH private keys and cloud credentials end careers. The bug is real, fixed, and any Linux developer workstation in scope deserves the patch within the standard window. Drag-jacking is a known social-engineering technique with real precedent; this is not theoretical.

05 · Compensating Control

What to do — in priority order.

  1. Inventory WebKitGTK exposure — Run dpkg -l | grep -i webkit2gtk (Debian/Ubuntu) or rpm -qa | grep -i webkitgtk (RHEL/Fedora) across Linux fleet; identify hosts running Epiphany, GNOME Web, Evolution, Geary, or Flatpak apps bundling WebKitGTK. Complete within the noisgate mitigation SLA — n/a for MEDIUM, treat as triage input for the 365-day remediation window.
  2. Push WebKitGTK 2.50.3+ via distro channels — Apply RHSA-2025:23742 on RHEL/derivatives; apt upgrade webkit2gtk on Debian/Ubuntu once backport lands; flatpak update for Flatpak-bundled WebKit apps. This is the actual fix — no workaround beats the patch. Target completion within the noisgate remediation SLA of 365 days, prioritized earlier for developer workstations holding production credentials.
  3. Restrict WebKitGTK browsers via app allowlist — If your Linux endpoint management (Ansible, Puppet, Intune-for-Linux, JAMF Connect) supports app allowlisting, remove Epiphany / GNOME Web from developer images unless explicitly justified. Most Linux developers already use Firefox or Chromium.
  4. Egress DLP rules on credential-shaped POSTs from browsers — Tune SWG / DLP to flag outbound HTTPS POSTs from browser processes containing BEGIN OPENSSH PRIVATE KEY, aws_access_key_id, AKIA[0-9A-Z]{16}, kubeconfig YAML markers. Catches not just this CVE but the broader credential-exfil class.
  5. Move developer secrets out of plaintext dotfiles — Migrate SSH keys to hardware tokens (YubiKey, Secure Enclave on Macs that run a Linux VM), AWS credentials to short-lived SSO tokens via aws sso login, kubeconfigs to ephemeral OIDC flows. Reduces payoff of any file-read primitive, not just this CVE.
What doesn't work
  • Network IPS signatures — the exploit is fully in-browser DOM/JS; there is no network signature distinct from normal HTTPS browsing.
  • Disabling JavaScript globally — technically works but breaks the modern web; users will whitelist sites and reintroduce risk.
  • MFA on corporate SSO — useful for stolen session cookies but does not help if the attacker reads SSH private keys or cloud credential files that bypass SSO entirely.
  • EDR alone — Linux EDR (CrowdStrike Falcon, SentinelOne) will see the browser process reading files it always reads (its own cache, configs) and an outbound HTTPS POST. Nothing here trips a generic EDR rule without a CVE-specific signature.
06 · Verification

Crowdsourced verification payload.

Run on each Linux endpoint as an unprivileged user. Invoke ./check-cve-2025-13947.sh directly — no root required. Reports VULNERABLE if any installed WebKitGTK/WPE WebKit is below 2.50.3, PATCHED if all installed copies are at or above the fix, UNKNOWN if no WebKitGTK packages are present.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-cve-2025-13947.sh
# noisgate verification for CVE-2025-13947 (WebKitGTK drag-and-drop file disclosure)
# Exit codes: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN

set -u
FIX_VERSION="2.50.3"
FOUND_ANY=0
VULN=0

ver_lt() {
  # returns 0 if $1 < $2
  [ "$1" = "$2" ] && return 1
  printf '%s\n%s\n' "$1" "$2" | sort -V -C
}

check_pkg() {
  local name="$1" ver="$2"
  FOUND_ANY=1
  if ver_lt "$ver" "$FIX_VERSION"; then
    echo "VULNERABLE: $name $ver (< $FIX_VERSION)"
    VULN=1
  else
    echo "OK:         $name $ver (>= $FIX_VERSION)"
  fi
}

# Debian / Ubuntu
if command -v dpkg-query >/dev/null 2>&1; then
  while IFS='|' read -r name ver status; do
    [ -z "$name" ] && continue
    echo "$status" | grep -q '^ii' || continue
    # Strip Debian epoch and revision for comparison
    ver_clean=$(echo "$ver" | sed -E 's/^[0-9]+://' | sed -E 's/-[^-]+$//')
    check_pkg "$name" "$ver_clean"
  done < <(dpkg-query -W -f='${Package}|${Version}|${db:Status-Abbrev}\n' \
           'webkit2gtk*' 'libwebkit2gtk*' 'wpewebkit*' 'libwpewebkit*' 2>/dev/null)
fi

# RHEL / Fedora / openSUSE
if command -v rpm >/dev/null 2>&1; then
  while IFS=' ' read -r name ver; do
    [ -z "$name" ] && continue
    check_pkg "$name" "$ver"
  done < <(rpm -qa --qf '%{NAME} %{VERSION}\n' \
           | grep -Ei '^(webkit2gtk|webkitgtk|wpewebkit)')
fi

# Flatpak runtimes (org.gnome.Platform bundles WebKitGTK)
if command -v flatpak >/dev/null 2>&1; then
  flatpak list --columns=application,version 2>/dev/null \
    | grep -iE 'webkit|epiphany|gnome-web' \
    | while read -r line; do
        echo "INFO: Flatpak entry — verify WebKitGTK version inside runtime: $line"
        FOUND_ANY=1
      done
fi

if [ "$FOUND_ANY" -eq 0 ]; then
  echo "UNKNOWN: no WebKitGTK / WPE WebKit packages detected on this host"
  exit 2
fi

if [ "$VULN" -eq 1 ]; then
  echo "RESULT: VULNERABLE — upgrade to WebKitGTK/WPE WebKit >= $FIX_VERSION"
  exit 1
fi

echo "RESULT: PATCHED"
exit 0
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: inventory your Linux endpoint estate for WebKitGTK and WPE WebKit using the verification script — this is almost entirely a developer-workstation problem, not a server or Windows/macOS problem. Because the reassessed verdict is MEDIUM, there is no noisgate mitigation SLA — skip the temporary-block step and go straight to the noisgate remediation SLA of ≤ 365 days to push WebKitGTK ≥ 2.50.3 via distro updates (RHSA-2025:23742, Debian/Ubuntu webkit2gtk backports, flatpak update). Prioritize hosts where engineers keep cloud credentials, SSH keys, or signing keys in plaintext dotfiles — patch those within 30 days as a self-imposed sprint, not because the SLA forces it. Do not lose sleep over this one; do not let it sit untracked for a year either.

Sources

  1. NVD — CVE-2025-13947
  2. WebKitGTK Security Advisory WSA-2025-0009
  3. WebKitGTK Security Advisory WSA-2025-0010
  4. Michael Catanzaro — Significant Drag and Drop Vulnerability in WebKitGTK
  5. Red Hat Security Advisory RHSA-2025:23742
  6. Debian security tracker — webkit2gtk
  7. Repology — webkitgtk vulnerabilities
  8. CWE-346 — Origin Validation Error
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.