CVE-2023-34062
High · 7.5CVSS
7.5
EPSS
1.1%
Published
Nov 15, 2023
CISA due date
—
Cloudanix analysis
A flaw in a common web server component could allow an unauthorized person to read sensitive files from the server by sending a specially crafted web request.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Data Exposure
- Component
- Library
- Class
- Path Traversal
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The vulnerability is a path traversal flaw in the Reactor Netty HTTP Server. An unauthenticated, remote attacker can send a specially crafted HTTP request containing URL-encoded traversal sequences (e.g., '..%2f'). The server fails to properly sanitize this input when serving static files, allowing the attacker to navigate outside of the intended web root directory and read arbitrary files on the server's filesystem, constrained only by the file permissions of the running process.
Why it matters to the business
Exploitation of this vulnerability can lead to the exfiltration of sensitive data, such as application source code, configuration files containing credentials, and other proprietary business information. This data breach could result in significant financial loss, regulatory penalties, reputational damage, and a loss of customer trust. Stolen credentials could also serve as a foothold for attackers to move laterally within the network, escalating the security incident.
How an attack unfolds
An unauthenticated attacker identifies a web application using a vulnerable version of Reactor Netty that is configured to serve static files. The attacker then crafts an HTTP GET request with a URL containing path traversal sequences, like '..%2f'. When the vulnerable server receives this request, it incorrectly processes the path, allowing access to files outside the designated static resource directory. The attacker can systematically probe for and retrieve sensitive files, such as '/etc/passwd' or application credentials, which are then returned in the HTTP response, effectively exfiltrating them.
How to fix it
To remediate this vulnerability, developers should upgrade the Reactor Netty library to a patched version. For applications on the 1.1.x release train, upgrade to version 1.1.13 or later. For applications on the 1.0.x release train, upgrade to version 1.0.39 or later. If an immediate upgrade is not feasible, consider disabling the static resource serving feature in Reactor Netty or implementing a Web Application Firewall (WAF) with rules to block path traversal attack patterns.
How to confirm the fix worked
To validate the fix, first confirm that the project's dependencies have been updated to a non-vulnerable version of Reactor Netty (1.1.13+ or 1.0.39+) by inspecting build files (e.g., pom.xml, build.gradle) or using a Software Composition Analysis (SCA) tool. For active testing in a safe, non-production environment, send a request with a traversal payload (e.g., `curl http://<host>/<static-path>/..%2f..%2f..%2fetc/passwd`). A patched system should respond with an error (e.g., 404 Not Found), not the contents of the file.
Typical attack path
- The attacker identifies a public-facing web server running an application built with a vulnerable version of Reactor Netty.
- The attacker confirms the application is configured to serve static resources from the filesystem.
- The attacker crafts a malicious HTTP request containing path traversal sequences in the URL to target a sensitive file.
- The attacker sends the request to the server.
- The vulnerable server processes the request, bypasses the directory restrictions, and returns the contents of the targeted file.
- The attacker receives the sensitive file and may use the information to launch further attacks.
How to detect it
Monitor web server and load balancer access logs for HTTP requests containing URL-encoded path traversal sequences in the URI. Suspicious indicators include patterns like '..%2f', '%2e%2e%2f', '..%5c', and their double-encoded variants. Successful exploitation may be indicated by a 200 OK status code in response to such a request, particularly if the request targets known sensitive system or configuration files (e.g., '/etc/passwd', 'application.properties', '.env').
- ..%2f
- %2e%2e%2f
- ..%5c
- %2e%2e%5c
- ..\
- %2e%2e/
- ../
What your security team should do
- Use a Software Composition Analysis (SCA) tool to identify all applications using vulnerable versions of Reactor Netty and prioritize them for immediate patching.
- Deploy or update Web Application Firewall (WAF) rules to detect and block requests containing path traversal sequences like '../', '..%2f', and '..%5c' as a compensating control.
- Review web server configurations to determine which applications serve static resources via Reactor Netty, as they are the ones at risk.
The record
In Reactor Netty HTTP Server, versions 1.1.x prior to 1.1.13 and versions 1.0.x prior to 1.0.39, a malicious user can send a request using a specially crafted URL that can lead to a directory traversal attack. Specifically, an application is vulnerable if Reactor Netty HTTP Server is configured to serve static resources.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Maven | io.projectreactor.netty:reactor-netty-http | 1.0.0 | 1.0.39 |
| Maven | io.projectreactor.netty:reactor-netty-http | 1.1.0 | 1.1.13 |
| Chainguard | elasticsearch-8 | 0 | 8.12.1-r0 |
| Chainguard | elasticsearch-8-bitnami | 0 | 8.12.1-r0 |
| Chainguard | elasticsearch-8-config | 0 | 8.12.1-r0 |
| Chainguard | elasticsearch-8-iamguarded | 0 | 8.12.1-r0 |
| Chainguard | elasticsearch-config | 0 | 8.12.1-r0 |
| Chainguard | trino | 0 | 433-r1 |
| Chainguard | trino-config | 0 | 433-r1 |
| Chainguard | trino-oci-entrypoint | 0 | 433-r1 |
| Chainguard | trino-plugin-accumulo | 0 | 433-r1 |
| Chainguard | trino-plugin-ai-functions | 0 | 433-r1 |
| Chainguard | trino-plugin-atop | 0 | 433-r1 |
| Chainguard | trino-plugin-bigquery | 0 | 433-r1 |
| Chainguard | trino-plugin-blackhole | 0 | 433-r1 |
| Chainguard | trino-plugin-cassandra | 0 | 433-r1 |
| Chainguard | trino-plugin-clickhouse | 0 | 433-r1 |
| Chainguard | trino-plugin-delta-lake | 0 | 433-r1 |
| Chainguard | trino-plugin-druid | 0 | 433-r1 |
| Chainguard | trino-plugin-duckdb | 0 | 433-r1 |
| Chainguard | trino-plugin-elasticsearch | 0 | 433-r1 |
| Chainguard | trino-plugin-example-http | 0 | 433-r1 |
| Chainguard | trino-plugin-exasol | 0 | 433-r1 |
| Chainguard | trino-plugin-exchange-filesystem | 0 | 433-r1 |
| Chainguard | trino-plugin-exchange-hdfs | 0 | 433-r1 |
| Chainguard | trino-plugin-faker | 0 | 433-r1 |
| Chainguard | trino-plugin-functions-python | 0 | 433-r1 |
| Chainguard | trino-plugin-geospatial | 0 | 433-r1 |
| Chainguard | trino-plugin-google-sheets | 0 | 433-r1 |
| Chainguard | trino-plugin-hive | 0 | 433-r1 |
| Chainguard | trino-plugin-http-event-listener | 0 | 433-r1 |
| Chainguard | trino-plugin-http-server-event-listener | 0 | 433-r1 |
| Chainguard | trino-plugin-hudi | 0 | 433-r1 |
| Chainguard | trino-plugin-iceberg | 0 | 433-r1 |
| Chainguard | trino-plugin-ignite | 0 | 433-r1 |
| Chainguard | trino-plugin-jmx | 0 | 433-r1 |
| Chainguard | trino-plugin-kafka | 0 | 433-r1 |
| Chainguard | trino-plugin-kafka-event-listener | 0 | 433-r1 |
| Chainguard | trino-plugin-kinesis | 0 | 433-r1 |
| Chainguard | trino-plugin-kudu | 0 | 433-r1 |
| Chainguard | trino-plugin-lakehouse | 0 | 433-r1 |
| Chainguard | trino-plugin-ldap-group-provider | 0 | 433-r1 |
| Chainguard | trino-plugin-local-file | 0 | 433-r1 |
| Chainguard | trino-plugin-loki | 0 | 433-r1 |
| Chainguard | trino-plugin-mariadb | 0 | 433-r1 |
| Chainguard | trino-plugin-memory | 0 | 433-r1 |
| Chainguard | trino-plugin-ml | 0 | 433-r1 |
| Chainguard | trino-plugin-mongodb | 0 | 433-r1 |
| Chainguard | trino-plugin-mysql | 0 | 433-r1 |
| Chainguard | trino-plugin-mysql-event-listener | 0 | 433-r1 |
| Chainguard | trino-plugin-opa | 0 | 433-r1 |
| Chainguard | trino-plugin-openlineage | 0 | 433-r1 |
| Chainguard | trino-plugin-opensearch | 0 | 433-r1 |
| Chainguard | trino-plugin-oracle | 0 | 433-r1 |
| Chainguard | trino-plugin-password-authenticators | 0 | 433-r1 |
| Chainguard | trino-plugin-phoenix5 | 0 | 433-r1 |
| Chainguard | trino-plugin-pinot | 0 | 433-r1 |
| Chainguard | trino-plugin-postgresql | 0 | 433-r1 |
| Chainguard | trino-plugin-prometheus | 0 | 433-r1 |
| Chainguard | trino-plugin-ranger | 0 | 433-r1 |
| Chainguard | trino-plugin-raptor-legacy | 0 | 433-r1 |
| Chainguard | trino-plugin-redis | 0 | 433-r1 |
| Chainguard | trino-plugin-redshift | 0 | 433-r1 |
| Chainguard | trino-plugin-resource-group-managers | 0 | 433-r1 |
| Chainguard | trino-plugin-session-property-managers | 0 | 433-r1 |
| Chainguard | trino-plugin-singlestore | 0 | 433-r1 |
| Chainguard | trino-plugin-snowflake | 0 | 433-r1 |
| Chainguard | trino-plugin-spooling-filesystem | 0 | 433-r1 |
| Chainguard | trino-plugin-sqlserver | 0 | 433-r1 |
| Chainguard | trino-plugin-teradata-functions | 0 | 433-r1 |
| Chainguard | trino-plugin-thrift | 0 | 433-r1 |
| Chainguard | trino-plugin-tpcds | 0 | 433-r1 |
| Chainguard | trino-plugin-tpch | 0 | 433-r1 |
| Chainguard | trino-plugin-vertica | 0 | 433-r1 |
| Wolfi | trino | 0 | 433-r1 |
| Wolfi | trino-config | 0 | 433-r1 |
| Wolfi | trino-oci-entrypoint | 0 | 433-r1 |
| Wolfi | trino-plugin-accumulo | 0 | 433-r1 |
| Wolfi | trino-plugin-ai-functions | 0 | 433-r1 |
| Wolfi | trino-plugin-atop | 0 | 433-r1 |
| Wolfi | trino-plugin-bigquery | 0 | 433-r1 |
| Wolfi | trino-plugin-blackhole | 0 | 433-r1 |
| Wolfi | trino-plugin-cassandra | 0 | 433-r1 |
| Wolfi | trino-plugin-clickhouse | 0 | 433-r1 |
| Wolfi | trino-plugin-delta-lake | 0 | 433-r1 |
| Wolfi | trino-plugin-druid | 0 | 433-r1 |
| Wolfi | trino-plugin-duckdb | 0 | 433-r1 |
| Wolfi | trino-plugin-elasticsearch | 0 | 433-r1 |
| Wolfi | trino-plugin-example-http | 0 | 433-r1 |
| Wolfi | trino-plugin-exasol | 0 | 433-r1 |
| Wolfi | trino-plugin-exchange-filesystem | 0 | 433-r1 |
| Wolfi | trino-plugin-exchange-hdfs | 0 | 433-r1 |
| Wolfi | trino-plugin-faker | 0 | 433-r1 |
| Wolfi | trino-plugin-functions-python | 0 | 433-r1 |
| Wolfi | trino-plugin-geospatial | 0 | 433-r1 |
| Wolfi | trino-plugin-google-sheets | 0 | 433-r1 |
| Wolfi | trino-plugin-hive | 0 | 433-r1 |
| Wolfi | trino-plugin-http-event-listener | 0 | 433-r1 |
| Wolfi | trino-plugin-http-server-event-listener | 0 | 433-r1 |
| Wolfi | trino-plugin-hudi | 0 | 433-r1 |
| Wolfi | trino-plugin-iceberg | 0 | 433-r1 |
| Wolfi | trino-plugin-ignite | 0 | 433-r1 |
| Wolfi | trino-plugin-jmx | 0 | 433-r1 |
| Wolfi | trino-plugin-kafka | 0 | 433-r1 |
| Wolfi | trino-plugin-kafka-event-listener | 0 | 433-r1 |
| Wolfi | trino-plugin-kinesis | 0 | 433-r1 |
| Wolfi | trino-plugin-kudu | 0 | 433-r1 |
| Wolfi | trino-plugin-lakehouse | 0 | 433-r1 |
| Wolfi | trino-plugin-ldap-group-provider | 0 | 433-r1 |
| Wolfi | trino-plugin-local-file | 0 | 433-r1 |
| Wolfi | trino-plugin-loki | 0 | 433-r1 |
| Wolfi | trino-plugin-mariadb | 0 | 433-r1 |
| Wolfi | trino-plugin-memory | 0 | 433-r1 |
| Wolfi | trino-plugin-ml | 0 | 433-r1 |
| Wolfi | trino-plugin-mongodb | 0 | 433-r1 |
| Wolfi | trino-plugin-mysql | 0 | 433-r1 |
| Wolfi | trino-plugin-mysql-event-listener | 0 | 433-r1 |
| Wolfi | trino-plugin-opa | 0 | 433-r1 |
| Wolfi | trino-plugin-openlineage | 0 | 433-r1 |
| Wolfi | trino-plugin-opensearch | 0 | 433-r1 |
| Wolfi | trino-plugin-oracle | 0 | 433-r1 |
| Wolfi | trino-plugin-password-authenticators | 0 | 433-r1 |
| Wolfi | trino-plugin-phoenix5 | 0 | 433-r1 |
| Wolfi | trino-plugin-pinot | 0 | 433-r1 |
| Wolfi | trino-plugin-postgresql | 0 | 433-r1 |
| Wolfi | trino-plugin-prometheus | 0 | 433-r1 |
| Wolfi | trino-plugin-ranger | 0 | 433-r1 |
| Wolfi | trino-plugin-raptor-legacy | 0 | 433-r1 |
| Wolfi | trino-plugin-redis | 0 | 433-r1 |
| Wolfi | trino-plugin-redshift | 0 | 433-r1 |
| Wolfi | trino-plugin-resource-group-managers | 0 | 433-r1 |
| Wolfi | trino-plugin-session-property-managers | 0 | 433-r1 |
| Wolfi | trino-plugin-singlestore | 0 | 433-r1 |
| Wolfi | trino-plugin-snowflake | 0 | 433-r1 |
| Wolfi | trino-plugin-spooling-filesystem | 0 | 433-r1 |
| Wolfi | trino-plugin-sqlserver | 0 | 433-r1 |
| Wolfi | trino-plugin-teradata-functions | 0 | 433-r1 |
| Wolfi | trino-plugin-thrift | 0 | 433-r1 |
| Wolfi | trino-plugin-tpcds | 0 | 433-r1 |
| Wolfi | trino-plugin-tpch | 0 | 433-r1 |
| Wolfi | trino-plugin-vertica | 0 | 433-r1 |
| maven | io.projectreactor.netty/reactor-netty | 1.0.0 | 1.0.39 |
| maven | io.projectreactor.netty/reactor-netty | 1.1.0 | 1.1.13 |
| maven | io.projectreactor.netty/reactor-netty-http | 1.0.0 | 1.0.39 |
| maven | io.projectreactor.netty/reactor-netty-http | 1.1.0 | 1.1.13 |
Related vulnerabilities
- CVE-2025-22227 In some specific scenarios with chained redirects, Reactor Netty HTTP client leaks… Also affects io.projectreactor.netty:reactor-netty-http
- CVE-2025-54988 Critical XXE in Apache Tika (tika-parser-pdf-module) in Apache Tika 1.13 through and… Also affects elasticsearch-8
- CVE-2025-48924 Apache Commons Lang is vulnerable to Uncontrolled Recursion when processing long inputs Also affects elasticsearch-8
- CVE-2025-25193 Denial of Service attack on windows app using Netty Also affects elasticsearch-8
- CVE-2024-12539 Elasticsearch Incorrect Authorization vulnerability Also affects elasticsearch-8
- CVE-2024-47535 Netty is an asynchronous event-driven network application framework for rapid development… Also affects elasticsearch-8
- CVE-2024-7254 protobuf-java has potential Denial of Service issue Also affects elasticsearch-8
- CVE-2024-37280 A flaw was discovered in Elasticsearch, affecting document ingestion when an index… Also affects elasticsearch-8