CVE-2025-11966
NoneVert.x-Web vulnerable to Stored Cross-site Scripting in directory listings via file names
CVSS
—
EPSS
0.3%
Published
Oct 22, 2025
CISA due date
—
Cloudanix analysis
A web server component fails to safely display folder contents, letting attackers trick visitors' browsers into running malicious code simply by viewing a directory listing.
- Exploitation
- Remote Authenticated
- Attacker needs
- Low Privilege
- Complexity
- Low
- Impact
- Other
- Component
- Web Framework
- Class
- XSS
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
In StaticHandlerImpl#sendDirectoryListing, file and directory names are inserted unescaped into href, title, link text, and template placeholders under the text/html branch, enabling arbitrary HTML/JavaScript injection when directory listings are rendered.
Why it matters to the business
Organizations using affected Vert.x web versions risk client-side script execution against users who browse directory listings, which can lead to credential theft, session hijacking, or unauthorized actions within the application context; the issue has been public for over a year with no known ransomware use but remains exploitable until patched.
How an attack unfolds
An attacker with write access to a served directory creates a file or subdirectory whose name contains HTML or JavaScript payloads; when a victim requests the directory listing page, the handler embeds the unescaped name into the generated HTML, causing the browser to execute the injected code.
How to fix it
Upgrade vert-x3/vertx-web to the version containing commit 188938cb128d55e5897f51ad0b1be283f993a824 or eclipse-vertx/vert.x to the version containing commit 81278bc4041d01225ace17944a0f4397ba6ba22f; disable directory listings where feasible until the update is applied.
How to confirm the fix worked
Confirm the presence of the fixed commits in the deployed StaticHandlerImpl.java, re-test directory listings with filenames containing angle brackets and script tags to verify escaping, and review release notes for the referenced commits.
Typical attack path
- Obtain write access to a directory served by StaticHandler
- Create a file or folder whose name contains HTML/JavaScript payload
- Trigger a request to the directory listing endpoint
- Victim browser parses and executes the injected script from the rendered page
How to detect it
Review web access logs for requests to directory listing paths; search application or proxy logs for filenames containing HTML tags, script elements, or encoded angle brackets; inspect rendered HTML responses for unescaped file names in anchor or list elements.
- file names containing <script
- directory listing responses with unescaped href or title attributes
- HTTP requests to paths ending in / that return HTML containing raw angle brackets from filenames
What your security team should do
- Apply the listed commits or newer releases immediately
- Audit all deployments for enabled directory listings and restrict where possible
- Add automated scanning for unescaped template variables in custom handlers
- Monitor for new downstream dependents that may still ship vulnerable versions
The record
- In the `StaticHandlerImpl#sendDirectoryListing(...)` method under the `text/html` branch, file and directory names are directly embedded into the `href`, `title`, and link text without proper HTML escaping. - As a result, in environments where an attacker can control file names, injecting HTML/JavaScript is possible. Simply accessing the directory listing page will trigger an XSS. - Affected Code: - File: `vertx-web/src/main/java/io/vertx/ext/web/handler/impl/StaticHandlerImpl.java` - Lines: - 709–713: `normalizedDir` is constructed without escaping - 714–731: `<li><a ...>` elements insert file names directly into attributes and body without escaping - 744: parent directory name construction - 746–751: `{directory}`, `{parent}`, and `{files}` are inserted into the HTML template without escaping
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Maven | io.vertx:vertx-web | 0 | 4.5.22 |
| Maven | io.vertx:vertx-web | 5.0.0 | 5.0.5 |
| Chainguard | apache-pulsar | 0 | 4.1.1-r2 |
| Chainguard | apache-pulsar-compat | 0 | 4.1.1-r2 |
| Chainguard | apicurio-registry | 0 | 3.1.2-r0 |
| Chainguard | apicurio-registry-nginx-config | 0 | 3.1.2-r0 |
| Chainguard | apicurio-registry-ui | 0 | 3.1.2-r0 |
| Chainguard | kafka-strimzi-compat | 0 | 0.48.0-r1 |
| Chainguard | kafka_exporter-strimzi-compat | 0 | 0.48.0-r1 |
| Chainguard | keycloak-26.2-compat | 0 | 26.2.5-r6 |
| Chainguard | keycloak-26.3-compat | 0 | 26.3.5-r3 |
| Chainguard | keycloak-26.3-iamguarded-compat | 0 | 26.3.5-r7 |
| Chainguard | keycloak-26.4 | 0 | 26.4.7-r0 |
| Chainguard | keycloak-26.4-compat | 0 | 26.4.2-r2 |
| Chainguard | keycloak-26.4-iamguarded-compat | 0 | 26.4.7-r0 |
| Chainguard | keycloak-26.4-operator | 0 | 26.4.7-r0 |
| Chainguard | keycloak-26.4-operator-compat | 0 | 26.4.2-r2 |
| Chainguard | keycloak-fips-26.3-operator-compat | 0 | 26.3.5-r4 |
| Chainguard | keycloak-fips-26.4 | 0 | 26.4.7-r12 |
| Chainguard | keycloak-fips-26.4-iamguarded-fips | 0 | 26.4.7-r0 |
| Chainguard | keycloak-fips-26.4-operator | 0 | 26.4.7-r4 |
| Chainguard | keycloak-fips-26.4-operator-compat | 0 | 26.4.4-r1 |
| Chainguard | prometheus-jmx-exporter-strimzi-compat | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-cluster-operator | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-agent | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-agent-3 | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-base | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-init | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-thirdparty-libs | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-kafka-thirdparty-libs-cc | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-mirror-maker-agent | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-topic-operator | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-tracing-agent | 0 | 0.48.0-r1 |
| Chainguard | strimzi-kafka-operator-user-operator | 0 | 0.48.0-r1 |
| Wolfi | apache-pulsar | 0 | 4.1.1-r2 |
| Wolfi | apache-pulsar-compat | 0 | 4.1.1-r2 |
| Wolfi | apicurio-registry | 0 | 3.1.2-r0 |
| Wolfi | apicurio-registry-nginx-config | 0 | 3.1.2-r0 |
| Wolfi | apicurio-registry-ui | 0 | 3.1.2-r0 |
| Wolfi | kafka-strimzi-compat | 0 | 0.48.0-r1 |
| Wolfi | kafka_exporter-strimzi-compat | 0 | 0.48.0-r1 |
| Wolfi | keycloak-26.3-compat | 0 | 26.3.5-r3 |
| Wolfi | keycloak-26.3-iamguarded-compat | 0 | 26.3.5-r7 |
| Wolfi | keycloak-26.4 | 0 | 26.4.7-r0 |
| Wolfi | keycloak-26.4-compat | 0 | 26.4.2-r2 |
| Wolfi | keycloak-26.4-iamguarded-compat | 0 | 26.4.7-r0 |
| Wolfi | keycloak-26.4-operator | 0 | 26.4.7-r0 |
| Wolfi | keycloak-26.4-operator-compat | 0 | 26.4.2-r2 |
| Wolfi | prometheus-jmx-exporter-strimzi-compat | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-cluster-operator | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-agent | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-agent-3 | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-base | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-init | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-thirdparty-libs | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-kafka-thirdparty-libs-cc | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-mirror-maker-agent | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-topic-operator | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-tracing-agent | 0 | 0.48.0-r1 |
| Wolfi | strimzi-kafka-operator-user-operator | 0 | 0.48.0-r1 |
| maven | io.vertx/vertx-web | 5.0.0 | 5.0.5 |
Related vulnerabilities
- CVE-2025-11965 Vert.x-Web Access Control Flaw in StaticHandler’s Hidden File Protection for Files Under… Also affects io.vertx:vertx-web
- CVE-2025-33042 Improper Control of Generation of Code ('Code Injection') vulnerability in Apache Avro… Also affects apache-pulsar
- CVE-2026-1002 The Vert.x Web static handler component cache can be manipulated to deny the access to… Also affects apache-pulsar
- CVE-2025-68161 Apache Log4j does not verify the TLS hostname in its Socket Appender Also affects apache-pulsar
- CVE-2024-29371 In jose4j before 0.9.6, an attacker can cause a Denial-of-Service (DoS) condition by… Also affects apache-pulsar
- CVE-2025-67735 Netty has a CRLF Injection vulnerability in io.netty.handler.codec.http.HttpRequestEncoder Also affects apache-pulsar
- CVE-2025-12383 Eclipse Jersey has a Race Condition Also affects apache-pulsar
- CVE-2025-58056 Netty vulnerable to request smuggling due to incorrect parsing of chunk extensions Also affects apache-pulsar