1. 11 year old unsoundness bugs found in Rust borrow checker (github.com)
Rust 借用检查器发现存在长达 11 年的不安全性漏洞 (Unsoundness Bug)
概述
Rust 团队近期发现了一个存在于借用检查器(Borrow Checker)中的不安全性漏洞。该漏洞虽然在逻辑上属于严重级别,但由于已存在 11 年且难以被偶然触发,目前的优先级被定为 P-high。
技术细节
该漏洞涉及 Rust 类型系统未能正确拦截某些违反生命周期的行为。
漏洞表现: 在提供的示例代码中,程序尝试在一个生命周期结束后的栈内存上保留引用。
- 程序创建了一个局部变量
l(String)。 - 通过一个自定义结构体
Q<T>将该变量的引用存入其中。 - 在
Q<T>的Drop实现中,该引用被移动到了一个全局静态变量KEPT中。 - 预期结果: 编译器应拒绝编译,因为引用的生命周期已结束。
- 实际结果: 程序通过编译并运行,但在访问该内存时会导致内存不安全。使用 AddressSanitizer (ASan) 运行时,会触发
stack-use-after-scope错误,因为程序正在访问已经失效的栈内存。
严重性与影响
- 优先级: 该问题被评定为
P-high。若该漏洞是新发现的,其优先级将是P-critical。由于它已存在 11 年未被发现,说明其触发条件非常苛刻。 - 利用难度: 该漏洞在实际开发中极难被意外触发。要实现内存不安全,通常需要编写具有特定行为的恶意
Drop实现。 - 影响范围: 该漏洞存在于当前的 Rust nightly 版本以及至少 1.85.0 的 stable 版本中。
团队应对措施
Rust Types Team 将修复类型系统中的所有不安全性视为核心任务,并正在通过以下项目构建更稳固的基础,以减少未知风险:
- 下一代 Trait Solver (Next-generation trait solver)
- Region Constraint 重构 (Region constraint rework)
- Project Zero(旨在消除所有类型系统中的不安全性)