2025年4月2日,北京时间,Go官方团队迅速推出了一项关键更新。该更新的主要任务是解决一个潜在的安全隐患。若此漏洞被不法之徒所利用,将大大便利攻击者的行为。现在,让我们一起来揭示这起事件的真相。
高危漏洞出现
2025年4月2日,Go官方团队并未有所懈怠,他们同时推出了Go 1.24.2和Go 1.23.8两个新版本。在这轮更新中,他们实施了一系列关键的优化措施,尤其是针对net/http包中的一个极为严重的安全缺陷进行了修复——即HTTP请求的走私问题,该问题的编号为CVE-2025-22871。若不对此漏洞进行修补,攻击者便有机可乘,从而给服务器的安全构成严重威胁。
漏洞威胁解析
这个 HTTP 请求的漏洞非常严重,攻击者可以利用它绕过安全措施,发起非法的请求。打个比喻,这就好比小偷发现了一扇未上锁的门,可以随意出入。他们通过这个漏洞,可以进行恶意请求注入、实施缓存投毒,甚至盗取数据。一旦数据被窃取,企业和个人的隐私信息就会完全暴露。一些网络购物网站一旦数据不幸被不法分子窃取,消费者的账户资料、购买历史等私密信息就可能遭遇泄露的危机。
GET / HTTP/1.1
Transfer-Encoding: chunked
5n // 非法分块行(仅 LF 结尾)
Hello
0rnr
什么是 HTTP 请求走私
总的来说,HTTP请求走私是一种攻击手段。攻击者通过构建异常的HTTP请求,利用服务器和代理在处理这些请求时产生的差异来实施破坏。这种情况就像两个人对同一句话有不同的解读,而攻击者正是利用了这种解读上的差异。在 Go 语言的 net/http 库里,当处理分块传输编码的请求时,如果分块数据以换行符 n 结尾,而不是常规的回车换行符 rn,就可能出现问题;一些代理或服务器可能会对这些数据进行错误的解读,从而引发请求走私的情况。
恶意请求示例
在漏洞被修复之前,有些服务器可能会错误地将数字5识别为有效的数据块,这样的错误处理可能会导致后续数据被恶意篡改。这就像是一个原本应该正确执行的指令因为格式上的小失误而被错误执行,结果被不法分子所利用。不过,在Go 1.24.2版本修复之后,它变得更加谨慎,会坚决拒绝这种请求,并且直接显示错误信息,这样就不会给攻击者留下任何可利用的机会。
修复内容揭秘
Go 1.24.2 版本对 net/http 包进行了更新,加入了更为严格的分块编码审核机制。具体而言,该机制要求每个分块的大小描述行必须以回车符和换行符的组合作为结束标志。如果分块大小描述行只以换行符作为结束,没有回车符,系统会显示错误提示,指出“分块大小描述行以裸露的换行符作为结尾”。其次,必须坚决杜绝使用非法的CR符号。一旦在分块行中发现多余的回车符,系统便会激活“分块行存在无效CR”的警报。这样的措施旨在防止攻击者制造异常数据。我们必须依照RFC 9112规范行事,确保每个分块请求的解析步骤都严格遵守HTTP规范,以防止在解析阶段出现任何误解。
if bytes.IndexByte(p, 'r') != len(p)-2 {
return errors.New("invalid chunked line")
}
p = p[:len(p)-2] // 移除 CRLF,仅处理合法数据
开发者应对建议
go get golang.org/dl/go1.24.2
go1.24.2 download
Go 1.24.2 版本是一个重要的安全补丁,开发者们应当尽快进行更新。如果不及时更新,服务可能会遭受恶意攻击者的攻击,他们可能会利用请求走私的漏洞进行非法侵入。如果你的业务依赖于 HTTP 分块传输编码,以下建议可供参考:首先,务必将系统升级到 Go 1.24.2,这是最基础的操作。其次,审查反向代理的配置,确保其遵循RFC标准。然后,对异常请求实施监控,旨在防范潜在的攻击活动。
大家对自家项目在处理这一漏洞时的表现有何看法?不妨在评论区发表你的见解。同时,别忘了给这篇文章点个赞,并转发出去,让更多的开发者能够注意到这个至关重要的安全更新。
发表评论