Skip to main content

rhukster dom-sanitizer CVE-2026-103686

| EUVDEUVD-2026-90847 LOW
Cross-site Scripting (XSS) (CWE-79)
2026-10-01 VulDB GHSA-qjw9-86r9-fqqc
2.0
CVSS 4.0 · Vendor: VulDB
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Craft markup with javascript:/data: in action/cite/poster/src attribute
  2. Delivery
    Submit to app using dom-sanitizer ≤1.0.15
  3. Exploit
    Sanitizer passes payload (only href checked)
  4. Execution
    Stored/reflected into page served to victim
  5. Persist
    Victim views page and submits form
  6. Impact
    Script executes in victim browser context

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires that a host application uses rhukster/dom-sanitizer ≤1.0.15 to sanitize untrusted HTML AND relies on it to block dangerous URL schemes. The specific gap is that DOMSanitizer::isDangerousUrl() only scheme-validated href and xlink:href, so a javascript: or non-image data: URI placed in any other allow-listed URL-bearing attribute (action, cite, poster, src, srcset, background) bypassed the check - the headline case being a form action, which yields a complete submittable form since form/button/input/type are all allow-listed. Limiting factors: the attacker needs the privilege to submit content that passes through the sanitizer (PR:L), and a victim must interact (UI:P) - typically viewing the stored content and submitting the crafted form for the payload to fire. Applications not using this library, or not depending on its URL-scheme filtering, are unaffected.

Impact

The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:L/UI:P) scores 5.1 (medium), and the E:P modifier plus the input's POC signal align - a proof-of-concept exists (published in the GHSA-mrpv-6x26-mf6c advisory) but there is no public exploit identified in the sense of active exploitation, and this CVE is not in CISA KEV. No EPSS score is provided. The signals are internally consistent: this is a genuine but modest-impact flaw, not a high-CVSS/low-real-risk mismatch nor a KEV-grade priority. The core caveat is architectural: dom-sanitizer is a security control (an HTML/DOM sanitizer), so a bypass is only exploitable to the extent that a downstream application relies on this library to neutralize untrusted content - the impact is entirely dependent on host-application context, which the CVE does not and cannot enumerate. Attack vector is network and complexity is low, but exploitation requires that attacker-supplied markup actually flows through DOMSanitizer and is later rendered/submitted by a victim (UI:P), bounding real-world severity to the medium range the vendor assigned.

Exploit ScenarioDerived

An attacker submits content containing a URL-bearing attribute other than a hyperlink - most notably a complete, submittable <form action="javascript:..."> - to an application that uses dom-sanitizer ≤1.0.15 to clean user input. Because isDangerousUrl() only scheme-checked href/xlink:href, the javascript:/data: payload survives sanitization and executes in a victim's browser when the stored content is viewed and the form is submitted. A proof-of-concept is published in the vendor's GitHub security advisory.

Monitor Track and reassess. Why: LOW severity (CVSS 0.1-3.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Oct 01, 2026

Cross-site scripting in rhukster/dom-sanitizer through 1.0.15 lets an attacker who can submit HTML that the library sanitizes slip script-capable URLs into attributes the filter never checked - form action, cite, poster, src, srcset, and background - because DOMSanitizer::isDangerousUrl() only scheme-validated href and xlink:href. The headline case is a form action="javascript:..." that survives end-to-end as a complete, submittable form (form, button/input and type are all allow-listed), firing when a victim views the stored content and interacts with it. Publicly available exploit code exists (published alongside the GHSA-mrpv-6x26-mf6c advisory); there is no confirmed active exploitation and this CVE is not in CISA KEV. Vendor-released patch: 1.0.16.

RemediationAI

Upgrade rhukster/dom-sanitizer to 1.0.16 (vendor-released patch; the fix commit is 4623b565d060bc02ca5a07d8c8241fe28e2edfda, release tag https://github.com/rhukster/dom-sanitizer/releases/tag/1.0.16) and redeploy - via Composer this is typically composer require rhukster/dom-sanitizer:^1.0.16 followed by a dependency update. Consult the advisory at https://github.com/rhukster/dom-sanitizer/security/advisories/GHSA-mrpv-6x26-mf6c for confirmation and the referenced patch diff for the exact code-level change. If upgrading immediately is not possible, compensating controls: (1) add a post-serialization output pass that strips or rewrites any URL-bearing attribute value whose scheme is javascript: or a non-image data: MIME across the full attribute set (href, xlink:href, action, cite, poster, src, srcset, background) and re-splits srcset candidates - this duplicates the library's intended logic and risks drifting from the official fix; (2) tighten the element allow-list so form/action (and any other URL-bearing attribute carriers) cannot be emitted from sanitized untrusted content, accepting the functional loss of embedded forms; (3) restrict who may submit HTML that passes through the sanitizer to trusted/authenticated editors only, and encode untrusted fields as plain text rather than markup, which reduces the attack surface but does not fix the underlying filter gap; and (4) apply output encoding at render time as a defense-in-depth layer, noting it may alter intended rich-content rendering. No vendor-released workaround beyond the version upgrade is documented in the available data.

Affected VersionsENISA

dom-sanitizer 1.0.12
dom-sanitizer 1.0.9
dom-sanitizer 1.0.10
dom-sanitizer 1.0.0
dom-sanitizer 1.0.7
dom-sanitizer 1.0.11
dom-sanitizer 1.0.3
dom-sanitizer 1.0.6
dom-sanitizer 1.0.13
dom-sanitizer 1.0.5
dom-sanitizer 1.0.15
dom-sanitizer 1.0.1
dom-sanitizer 1.0.14
dom-sanitizer 1.0.2
dom-sanitizer 1.0.4
dom-sanitizer 1.0.8

Affected Packages

euvd dom_sanitizer no fix

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

rhukster/dom-sanitizer is a PHP allow-list HTML sanitizer (PHP DOM extension based) intended to neutralize untrusted HTML before it is stored or rendered. CVE-2026-103686 is CWE-79 (improper neutralization of input during web page generation), rooted in an incomplete sanitization policy rather than a parsing bug: the guard DOMSanitizer::isDangerousUrl() was gated on href/xlink:href only (see the pre-patch check if (!in_array(strtolower($attr_name), ['href', 'xlink:href']))), while the element/attribute allow-list admits many more URL-bearing attributes - action, cite, poster, src, srcset, background. A javascript: or a script-capable data: MIME (e.g. data:text/html;base64,...) placed in any of those attributes therefore bypassed scheme validation entirely. The data: case cannot be judged by substring matching because Base64 encoding hides markers like onload or <script>; the fixed policy is scheme-level, allowing only inert image types through. The patch also hardens the post-serialization regex constants (JAVASCRIPT_ATTR, SNEAKY_ONLOAD, SNEAKY_DATA_URL) to cover the full URL attribute set and, for srcset, splits comma-separated candidates so a scheme hidden in a later candidate is still judged individually. The advisories GHSA-mrpv-6x26-mf6c (this issue) and GHSA-wcj2-r6vg-rm97 (the earlier data: heuristic bypass) are referenced in the fix comments.

Know when PHP gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (VulDB) PRIMARY 2.0 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N/E:P
vuln.today AI 5.4 MEDIUM

Authenticated content submitter (PR:L) injects script that runs in another user's browser (S:C, UI:R required); XSS yields limited confidentiality and integrity, no availability impact.

3.1 AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (VulDB).

CVSS VectorVendor: VulDB

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
Low
User Interaction
Passive
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

3
Severity Changed
Oct 01, 2026 - 14:22 NVD
MEDIUM LOW
CVSS changed
Oct 01, 2026 - 14:22 NVD
5.1 (MEDIUM) 2.0 (LOW)
CVE Published
Oct 01, 2026 - 13:45 cve.org
MEDIUM 5.1

DescriptionCVE.org

A flaw has been found in rhukster dom-sanitizer up to 1.0.15. Impacted is the function DOMSanitizer::isDangerousUrl of the file src/DOMSanitizer.php of the component URL Validation. This manipulation causes cross site scripting. It is possible to initiate the attack remotely. The exploit has been published and may be used. Upgrading to version 1.0.16 is recommended to address this issue. Patch name: 4623b565d060bc02ca5a07d8c8241fe28e2edfda. It is suggested to upgrade the affected component.

Threat Intelligence Overview

EPSS Score
0.4%
Top 72% exploitable
Prevalence
Low
niche open-source PHP sanitization library, limited deployment footprint
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity LOW
CISA KEV No
Public POC Yes
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
LOW severity (CVSS 0.1-3.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Low
Technical Impact
Partial

Priority Score

30
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +10
PoC: +20
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

More in PHP

View all
CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2012-1823 CRITICAL POC
9.8 May 11

sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not

CVE-2016-1555 CRITICAL POC
9.8 Apr 21

(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear

CVE-2018-11138 CRITICAL POC
9.8 May 31

The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by

CVE-2024-11680 CRITICAL POC
9.8 Nov 26

ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C

CVE-2025-49113 CRITICAL POC
9.9 Jun 02

Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au

CVE-2017-9841 CRITICAL POC
9.8 Jun 27

Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c

CVE-2025-0108 HIGH POC
8.8 Feb 12

Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers

CVE-2021-25298 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2021-25296 HIGH POC
8.8 Feb 15

Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re

CVE-2013-4983 CRITICAL POC
10.0 Sep 10

The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows

CVE-2023-6553 CRITICAL POC
9.8 Dec 15

The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy