开源组件安全:netty 组件风险分析及修复详解
字数 1637 2025-08-20 18:17:59
Netty HTTP请求走私漏洞(CVE-2019-16869)深度分析与修复指南
1. 漏洞概述
CVE编号: CVE-2019-16869
漏洞类型: HTTP请求走私(HTTP Request Smuggling)
影响组件: io.netty:netty (所有版本)
发现者: OPPO子午互联网安全实验室
严重性: 高危
漏洞描述: Netty错误地处理了HTTP标头中冒号前的空格(如Transfer-Encoding : chunked),导致可能被利用进行HTTP请求走私攻击,绕过安全控制,未经授权访问敏感数据。
2. 漏洞原理深度解析
2.1 HTTP请求走私基础
HTTP请求走私漏洞的核心原因是前端服务器和后端服务器在处理HTTP请求头时存在差异,导致请求被错误解析。具体表现为:
- Content-Length和Transfer-Encoding头的处理不一致
- 请求可能被错误地分割或合并
- 导致安全边界被绕过
2.2 Netty特定实现问题
在Netty 4.1.42.Final之前版本中,splitHeader方法处理HTTP头时存在缺陷:
for (nameEnd = nameStart; nameEnd < length; nameEnd ++) {
char ch = sb.charAt(nameEnd);
if (ch == ':' || Character.isWhitespace(ch)) {
break;
}
}
关键问题:
- 将空格与冒号(
:)同等处理 - 允许头字段名与冒号之间存在空格(如
Transfer-Encoding : chunked) - 不符合RFC 7230标准规范
2.3 攻击场景示例
攻击请求:
POST /getusers HTTP/1.1
Host: www.backend.com
Content-Length: 64
Transfer-Encoding : chunked
0
GET /hacker HTTP/1.1
Host: www.hacker.com
hacker: hacker
攻击流程:
- 前端服务器(如ELB)会忽略
Transfer-Encoding : chunked(因为空格不符合RFC标准) - ELB使用
Content-Length解析,认为是一个完整请求 - 后端Netty服务器优先解析
Transfer-Encoding(尽管有空格) - Netty将请求拆分为两个请求,导致请求走私
3. 漏洞影响
3.1 直接危害
- 会话劫持: 获取用户会话凭证和标识符
- 身份伪装: 绕过认证机制,获得未授权访问
- 敏感信息泄露: 获取PII、金融数据等敏感信息
- 业务破坏: 干扰正常业务逻辑和系统配置
3.2 潜在风险
- 绕过WAF和其他安全控制
- 缓存投毒攻击
- 权限提升
- 服务器端请求伪造(SSRF)
4. 修复方案
4.1 官方修复
Netty在4.1.42.Final版本中修复了该漏洞:
修复思路:
- 识别
TE[space]: field value为错误标头或自定义标头 - 两种处理方式选择:
- 像ELB一样根据header分离请求CL并转发整个header
- 识别为不正确header,返回400(Bad Request)响应码
代码变更:
for (nameEnd = nameStart; nameEnd < length; nameEnd ++) {
char ch = sb.charAt(nameEnd);
if (ch == ':' || (isDecodingRequest() && Character.isWhitespace(ch))) {
break;
}
}
关键修改:
- 增加了
isDecodingRequest()条件检查 - 仅在解码请求时处理空格情况
- 对不符合RFC标准的header返回400错误
4.2 修复验证
发送包含空格的头字段请求:
Transfer-Encoding : chunked
预期结果:
- Netty应返回400 Bad Request响应
- 或正确处理为自定义header而不导致请求走私
5. 缓解措施
如果无法立即升级Netty版本,可考虑以下临时方案:
-
前端代理配置:
- 在前端服务器(如Nginx、ELB)上严格校验HTTP头格式
- 拒绝包含非法空格的请求
-
应用层防护:
- 实现自定义过滤器检查HTTP头格式
- 对可疑请求进行拦截
-
网络层防护:
- 配置WAF规则检测和阻断HTTP走私攻击模式
- 监控异常请求模式
6. 参考资源
7. 总结
CVE-2019-16869暴露了Netty在HTTP头处理上的严格性问题,通过精心构造的包含空格的HTTP头,攻击者可实施请求走私攻击。该漏洞的修复强调了严格遵循RFC标准的重要性,特别是在处理网络协议时的细节问题。对于使用Netty的开发者和运维人员,应及时升级到修复版本或实施适当的缓解措施,以确保系统安全。