开源组件安全: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-LengthTransfer-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

攻击流程:

  1. 前端服务器(如ELB)会忽略Transfer-Encoding : chunked(因为空格不符合RFC标准)
  2. ELB使用Content-Length解析,认为是一个完整请求
  3. 后端Netty服务器优先解析Transfer-Encoding(尽管有空格)
  4. Netty将请求拆分为两个请求,导致请求走私

3. 漏洞影响

3.1 直接危害

  • 会话劫持: 获取用户会话凭证和标识符
  • 身份伪装: 绕过认证机制,获得未授权访问
  • 敏感信息泄露: 获取PII、金融数据等敏感信息
  • 业务破坏: 干扰正常业务逻辑和系统配置

3.2 潜在风险

  • 绕过WAF和其他安全控制
  • 缓存投毒攻击
  • 权限提升
  • 服务器端请求伪造(SSRF)

4. 修复方案

4.1 官方修复

Netty在4.1.42.Final版本中修复了该漏洞:

修复思路:

  1. 识别TE[space]: field value为错误标头或自定义标头
  2. 两种处理方式选择:
    • 像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版本,可考虑以下临时方案:

  1. 前端代理配置:

    • 在前端服务器(如Nginx、ELB)上严格校验HTTP头格式
    • 拒绝包含非法空格的请求
  2. 应用层防护:

    • 实现自定义过滤器检查HTTP头格式
    • 对可疑请求进行拦截
  3. 网络层防护:

    • 配置WAF规则检测和阻断HTTP走私攻击模式
    • 监控异常请求模式

6. 参考资源

  1. NVD漏洞详情
  2. GitHub Issue讨论
  3. GitHub修复PR
  4. 修复提交
  5. RFC 7230标准

7. 总结

CVE-2019-16869暴露了Netty在HTTP头处理上的严格性问题,通过精心构造的包含空格的HTTP头,攻击者可实施请求走私攻击。该漏洞的修复强调了严格遵循RFC标准的重要性,特别是在处理网络协议时的细节问题。对于使用Netty的开发者和运维人员,应及时升级到修复版本或实施适当的缓解措施,以确保系统安全。

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头时存在缺陷: 关键问题 : 将空格与冒号( : )同等处理 允许头字段名与冒号之间存在空格(如 Transfer-Encoding : chunked ) 不符合RFC 7230标准规范 2.3 攻击场景示例 攻击请求 : 攻击流程 : 前端服务器(如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)响应码 代码变更 : 关键修改 : 增加了 isDecodingRequest() 条件检查 仅在解码请求时处理空格情况 对不符合RFC标准的header返回400错误 4.2 修复验证 发送包含空格的头字段请求: 预期结果 : Netty应返回400 Bad Request响应 或正确处理为自定义header而不导致请求走私 5. 缓解措施 如果无法立即升级Netty版本,可考虑以下临时方案: 前端代理配置 : 在前端服务器(如Nginx、ELB)上严格校验HTTP头格式 拒绝包含非法空格的请求 应用层防护 : 实现自定义过滤器检查HTTP头格式 对可疑请求进行拦截 网络层防护 : 配置WAF规则检测和阻断HTTP走私攻击模式 监控异常请求模式 6. 参考资源 NVD漏洞详情 GitHub Issue讨论 GitHub修复PR 修复提交 RFC 7230标准 7. 总结 CVE-2019-16869暴露了Netty在HTTP头处理上的严格性问题,通过精心构造的包含空格的HTTP头,攻击者可实施请求走私攻击。该漏洞的修复强调了严格遵循RFC标准的重要性,特别是在处理网络协议时的细节问题。对于使用Netty的开发者和运维人员,应及时升级到修复版本或实施适当的缓解措施,以确保系统安全。