Cloudanix VulnDB

CVE-2025-11966

None

Vert.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

Next patch cycle SSVC: Track

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

  1. Obtain write access to a directory served by StaticHandler
  2. Create a file or folder whose name contains HTML/JavaScript payload
  3. Trigger a request to the directory listing endpoint
  4. 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