近日,安全研究人员最近发现并披露了流行的 Rust 项目(例如 Axum、Salvo 和 conduit-hyper )中的多个漏洞,产生这些漏洞的根源是没有在使用 Hyper 库时对 HTTP 请求设置适当的限制。
Hyper 是一个非常流行的低级 HTTP 库,用 Rust 编写。该库不是功能齐全的 HTTP 服务器或客户端,但它包含了用于响应请求、解析请求主体和生成正确 HTTP 响应的方法,因此可以用作实现这些功能的“构建块”,是 Rust 最流行的 HTTP 库之一。
安全公司 JFrog 发现,包含 Hyper 的项目(如 Axum、Salvo 和 conduit-hyper)容易受到为利用这些漏洞而精心设计的 HTTP 请求引起的拒绝服务 (DoS) 攻击。
研究人员发现的问题在于 body::to_bytes,这是一个将请求或响应主体复制到单个字节缓冲区的函数。该函数读取数据块,并可以创建一个具有足够空间的 Vector 来满足请求正文的预期长度。但是 Vector 的大小来自直接传递给 Rust 内存分配器的“Content-Length”标头,因此如果它太大,分配器就会崩溃进而使进程崩溃。
据 JFrog 称,上面三个项目已经修复了他们的代码,但还有数量不详的、其他易受攻击的项目尚未做出回应。目前,Rust 的包存储库 crates.io 中列出的 2,579 个项目依赖于 Hyper,下载量已超过 6700 万次。
JFrog 安全研究高级主管 Shachar Menashe 表示:使用 Hyper 时缺乏大小限制是一个非常严重的问题,攻击者可以很容易地利用它让 HTTP 客户端和服务器崩溃。
这个问题实际上之前也出现过。在 2014 年和2015 年,Hyper 的开发人员修复了因接收到过大请求标头而导致的 DoS 漏洞。去年,在 GitHub 上的相关问题的帖子中,Rust 开发人员 Michal Varner 建议采用合并警告机制。
参考链接:
https://jfrog.com/blog/watch-out-for-dos-when-using-rusts-popular-hyper-package/
https://www.theregister.com/2023/01/06/flaws_rust_projects_ddos/