【Web实战】浅谈Reactor Netty HTTP Server目录穿越漏洞(CVE-2023-34062)
字数 1083 2025-08-10 08:28:40
Reactor Netty HTTP Server 目录穿越漏洞(CVE-2023-34062) 分析与防护指南
一、漏洞概述
CVE-2023-34062是Spring官方披露的Reactor Netty HTTP Server中的一个目录遍历漏洞。该漏洞存在于特定版本中,当服务器配置用于提供静态资源时,攻击者可以通过构造特殊URL触发目录遍历攻击,从而访问系统上的敏感文件。
二、受影响版本
- Reactor Netty 1.1.x系列:1.1.0至1.1.12
- Reactor Netty 1.0.x系列:1.0.0至1.0.38
- 更旧的不再支持的版本
三、漏洞原理分析
3.1 Reactor Netty HTTP Server简介
Reactor Netty提供了易于使用和配置的HttpServer,隐藏了创建HTTP服务器所需的大部分Netty功能,是用于构建响应式、非阻塞HTTP服务器的一部分。
基本使用示例:
DisposableServer server = HttpServer.create().port(8080)
.route(routes -> {
routes.get("/hello", (request, response) ->
response.sendString(Mono.just("Hello, World!")));
}).bindNow();
server.onDispose().block();
3.2 静态资源服务配置方式
Reactor Netty HTTP Server提供两种静态资源服务方式:
-
file方法:映射单个文件
Path file = Paths.get("/tmp/test.txt"); routes.file("/hello", file); -
directory方法:映射整个目录(存在漏洞)
Path dir = Paths.get("/tmp"); routes.directory("/tmp", dir);
3.3 漏洞根源分析
漏洞存在于DefaultHttpServerRoutes#directory方法的实现中:
-
请求URI处理流程:
- 获取请求URI并去除指定前缀
- 将相对路径拼接到静态资源目录路径上
- 检查路径可读性后返回文件内容
-
关键问题:
- 未对URI中的
../等目录遍历符号进行过滤或规范化处理 - 直接拼接路径导致可以跳出限制目录
- 未对URI中的
漏洞利用示例:
访问URL: /tmp/../../etc/passwd
处理过程:
1. 去除前缀/tmp → 得到../../etc/passwd
2. 拼接路径: /tmp + ../../etc/passwd → /etc/passwd
3. 返回/etc/passwd文件内容
四、漏洞复现
4.1 环境搭建
- 使用受影响版本(如1.0.35):
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-http</artifactId>
<version>1.0.35</version>
</dependency>
- 漏洞代码示例:
public static void main(String[] args) {
Path file = Paths.get("/tmp");
DisposableServer server = HttpServer.create().port(8080)
.route(routes -> {
routes.directory("/tmp", file);
}).bindNow();
server.onDispose().block();
}
4.2 漏洞验证
访问以下URL尝试读取系统文件:
http://localhost:8080/tmp/../../etc/passwd
五、修复方案
5.1 官方修复
在修复版本(1.0.39+/1.1.13+)中:
-
添加路径规范化处理:
Path p = directory.resolve(prefix).normalize(); if (!p.startsWith(directory)) { return resp.sendNotFound(); } -
关键改进:
- 使用
normalize()方法解析.和.. - 检查规范化后路径是否仍在限制目录内
- 使用
5.2 升级指南
修改pom.xml使用安全版本:
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-http</artifactId>
<version>1.0.39</version> <!-- 或1.1.13+ -->
</dependency>
六、防护建议
- 及时升级到安全版本
- 如果无法立即升级,可考虑:
- 使用前置代理进行路径过滤
- 实现自定义路由检查逻辑
- 限制静态资源目录权限
- 避免在生产环境使用不受支持的旧版本
七、总结
CVE-2023-34062漏洞源于Reactor Netty HTTP Server在处理静态资源目录时未对路径进行充分验证,导致目录遍历风险。开发者应确保使用安全版本,并在配置静态资源服务时注意安全边界检查。