SunEditor <= 2.47.10 Sanitizer Bypass XSS (CVE-2026-59167)
Detects exploitation attempts and vulnerable-component presence for CVE-2026-59167, a critical (CVSS 10.0) cross-site scripting (CWE-79) vulnerability in the SunEditor npm rich-text WYSIWYG editor at versions <= 2.47.10. A flaw in SunEditor's HTML sanitizer allows attacker-controlled markup (crafted event-handler attributes, obfuscated javascript: URIs, malformed tags, and mutation-XSS payloads) to bypass filtering and execute arbitrary JavaScript in the victim's browser context. Because SunEditor content is frequently stored and re-rendered, exploitation can result in stored XSS, session/token theft, and account takeover. Detection focuses on web-request payloads carrying XSS vectors targeting SunEditor endpoints, dangerous sanitizer-bypass patterns in stored content, and inventory of vulnerable suneditor package versions in build/deploy telemetry.
Vulnerability Intelligence
Public PoCAffected Software
- Vendor
- npm
- Product
- suneditor
- Versions
- <= 2.47.10
Weakness (CWE)
Timeline
- Disclosed
- September 24, 2026
References & Proof of Concept
- PoChttps://github.com/advisories/GHSA-6rf4-v2fh-m6p4
- https://github.com/JiHong88/suneditor/security/advisories/GHSA-6rf4-v2fh-m6p4
- https://nvd.nist.gov/vuln/detail/CVE-2026-59167
- https://github.com/JiHong88/suneditor/issues/1646
- https://github.com/JiHong88/suneditor/commit/a94ace269c7102bfb6de58a27a6547bc4eb09045
- https://github.com/JiHong88/suneditor/releases/tag/2.47.11
CVSS
What is CVE-2026-59167 SunEditor <= 2.47.10 Sanitizer Bypass XSS (CVE-2026-59167)?
SunEditor <= 2.47.10 Sanitizer Bypass XSS (CVE-2026-59167) (CVE-2026-59167) maps to the Initial Access tactic — the adversary is trying to get into your network in MITRE ATT&CK.
This page provides production-ready detection logic for SunEditor <= 2.47.10 Sanitizer Bypass XSS (CVE-2026-59167), covering the data sources and telemetry it touches: Azure App Service HTTP logs, IIS W3C logs, WAF logs. The queries below are rated critical severity at medium confidence, and ship for 7 SIEM platforms — KQL, SPL, Elastic, QRadar, Sumo, YARA-L, LogScale.
MITRE ATT&CK
- Tactic
- Initial Access
let xssPatterns = dynamic(["onerror=","onload=","onmouseover=","onfocus=","onpointer","javascript:","<script","<svg","<img","srcdoc=","formaction=","data:text/html","<iframe","onanimationstart"]);
union isfuzzy=true
(
AppServiceHTTPLogs
| extend RawUri = tostring(CsUriStem), Query = tostring(CsUriQuery), UA = tostring(UserAgent)
),
(
W3CIISLog
| extend RawUri = tostring(csUriStem), Query = tostring(csUriQuery), UA = tostring(csUserAgent)
)
| extend Decoded = tolower(url_decode(strcat(RawUri, "?", Query)))
| where Decoded has_any ("suneditor","se-wrapper","sun-editor-editable","/editor","/post","/comment","/content")
| where Decoded has_any (xssPatterns)
| project TimeGenerated, RawUri, Query, UA, Decoded
| sort by TimeGenerated desc Flags HTTP requests to editor/content endpoints that carry SunEditor identifiers together with XSS sanitizer-bypass tokens, indicating attempted exploitation of CVE-2026-59167 via IIS/App Service web logs.
Data Sources
Required Tables
False Positives
- Security scanners and DAST tools (Burp, OWASP ZAP, Nessus) probing editor fields with benign XSS strings
- Legitimate documentation or CMS pages that discuss XSS payloads as content
- Penetration test engagements against the SunEditor-backed application
Sigma rule & cross-platform mapping
The detection logic for SunEditor <= 2.47.10 Sanitizer Bypass XSS (CVE-2026-59167) (CVE-2026-59167) above is provided in a vendor-neutral
form so you can deploy it on any SIEM. The same logic is shipped here as native
KQL (Microsoft Sentinel / Defender), SPL (Splunk), Elastic (Elastic Security (EQL)), QRadar (IBM QRadar (AQL)), Sumo (Sumo Logic CSE), YARA-L (Google Chronicle / SecOps), LogScale (CrowdStrike LogScale (CQL)) queries. In Sigma terms, this detection targets the
following logsource:
logsource:
product: azure Browse the community-maintained Sigma rules for this technique:
Platform-specific guides for CVE-2026-59167
References (6)
- https://github.com/JiHong88/suneditor/security/advisories/GHSA-6rf4-v2fh-m6p4
- https://nvd.nist.gov/vuln/detail/CVE-2026-59167
- https://github.com/JiHong88/suneditor/issues/1646
- https://github.com/JiHong88/suneditor/commit/a94ace269c7102bfb6de58a27a6547bc4eb09045
- https://github.com/JiHong88/suneditor/releases/tag/2.47.11
- https://github.com/advisories/GHSA-6rf4-v2fh-m6p4
Testing Methodology
Validate this detection against 3 adversary techniques from Atomic Red Team. Each test below lists the behaviour to exercise and the telemetry you should expect to see. Executable commands and cleanup steps are available with Pro.
- Test 1SunEditor onerror handler injection
Expected signal: Web access log entry to /editor/save containing onerror= and an img tag targeting a SunEditor route.
- Test 2SunEditor SVG/animation mXSS payload
Expected signal: HTTP request to /comment with url-encoded <svg ... onanimationstart= payload.
- Test 3Vulnerable suneditor package install detection
Expected signal: Process/command-line event showing npm install [email protected] and package.json version 2.47.10.
Response Playbook
Triage
- Confirm the affected application embeds SunEditor and determine the installed version via package-lock.json / node_modules/suneditor/package.json; anything <= 2.47.10 is vulnerable.
- Decode the flagged request payload and determine whether it is a live exploit attempt (weaponized handler/JS execution) versus a benign scanner or content string.
- Identify the target endpoint (comment, post, profile, article body) and whether SunEditor output is persisted and re-rendered to other users, indicating stored XSS blast radius.
- Check whether the payload executed by correlating with browser/CSP violation reports or downstream anomalous authenticated sessions from victim accounts.
Containment
- Upgrade SunEditor to 2.47.11 (or later) which fixes the sanitizer bypass, and redeploy the affected application.
- As an interim mitigation, enforce a strict Content-Security-Policy (no unsafe-inline, no inline event handlers) and add server-side output sanitization (DOMPurify) on all stored SunEditor content, plus a WAF rule blocking the XSS bypass tokens.
- Quarantine and re-sanitize any stored content records created during the exposure window to remove persisted payloads.
Evidence Collection
- Preserve raw web/WAF access logs containing the payload, including full request body, headers, source IP and user-agent.
- Export the stored database records (content fields) containing suspected injected markup with created/modified timestamps and author identity.
- Capture the deployed SunEditor version artifacts (package-lock.json, bundled JS hashes) proving the vulnerable version was in production.
Escalation Criteria
- ! Escalate to incident response if stored payloads were served to other authenticated users or if session/token theft or account takeover is observed.
- ! Escalate to application owners and change management to expedite the 2.47.11 upgrade if the vulnerable component is confirmed in a customer-facing production system.
Investigation Guide
Forensic Artifacts
- >
Web server / WAF access logs with the encoded payload - >
Application database content fields holding persisted markup - >
Deployed suneditor package version in node_modules / package-lock.json - >
CSP violation reports and browser error telemetry - >
Outbound requests to attacker collection endpoints originating from victim sessions
Tuning Guidance
Baseline known DAST scanner source IPs and CI/QA automation and exclude them, or tag them separately. Restrict URL/content matching to the specific routes that render SunEditor output to cut noise. If server-side DOMPurify sanitization is deployed, downgrade payload-only matches without evidence of execution to informational and prioritize alerts where a persisted record was later served to a different authenticated user.
Hunting Queries
Hunt for SunEditor endpoints receiving XSS sanitizer-bypass payloads across web logs to find CVE-2026-59167 exploitation clusters.
AppServiceHTTPLogs | extend d = tolower(url_decode(strcat(CsUriStem,"?",CsUriQuery))) | where d has "suneditor" and d has_any ("onerror=","javascript:","<svg","srcdoc=","formaction=","onpointer") | summarize count() by ClientIp=CsHost, bin(TimeGenerated,1h) index=web (sourcetype=iis OR sourcetype=access_combined) | eval d=lower(urldecode(_raw)) | where match(d,"suneditor") AND match(d,"onerror=|javascript:|<svg|srcdoc=|formaction=|onpointer") | stats count by src_ip Atomic Red Team Tests
Submit a crafted img tag with an onerror handler through a SunEditor-backed content endpoint to simulate the sanitizer bypass.
Command
curl -sk -X POST 'https://lab.internal/editor/save' -H 'Content-Type: application/json' -d '{"content":"<img src=x onerror=alert(document.domain)>"}' Cleanup
curl -sk -X POST 'https://lab.internal/editor/delete' -d '{"content":"testxss"}' || true Expected Telemetry
Web access log entry to /editor/save containing onerror= and an img tag targeting a SunEditor route.
Expected Detection
kql/spl web-log rule fires on suneditor endpoint + onerror= XSS token.
Send an SVG mutation-XSS payload leveraging onanimationstart to bypass the SunEditor sanitizer.
Command
curl -sk -X POST 'https://lab.internal/comment' --data-urlencode 'body=<svg><style>@keyframes x{}</style><a onanimationstart=alert(1) style=animation-name:x></a></svg>' Cleanup
echo 'remove lab comment record via admin API' Expected Telemetry
HTTP request to /comment with url-encoded <svg ... onanimationstart= payload.
Expected Detection
Detection matches suneditor/comment endpoint with onanimationstart bypass token.
Install the vulnerable SunEditor version on a lab build host to exercise inventory/version detection.
Command
npm install [email protected] --no-save && node -e "console.log(require('suneditor/package.json').version)" Cleanup
npm uninstall suneditor --no-save || true Expected Telemetry
Process/command-line event showing npm install [email protected] and package.json version 2.47.10.
Expected Detection
CrowdStrike CQL / build-host inventory rule flags suneditor <= 2.47.10 as vulnerable to CVE-2026-59167.