今天早些时候,Rust安全响应工作组发布了一个与fs::remove_dir_all 标准库函数有关的安全通告。该小组被告知,这个函数有可能受到Race Condition Enabling Link Following(CWE-363)的攻击。
了解std::fs::remove_dir_all 漏洞
remove_dir_all 将一个路径作为参数,并在删除所有内容后,在这个路径上删除一个目录。例如,你会这样使用这个函数。
use std::fs;
fn main() -> std::io::Result<()> {
fs::remove_dir_all("/home/to-delete")?;
Ok(())
}
根据官方文档,该函数不跟踪符号链接,如果它看到符号链接,就简单地将其删除。然而,正如安全顾问所发现的,这一行为的实现是不正确的。来自Rust官方博客的文章:
[......]该检查在标准库中实现得不正确,导致了TOCTOU(检查时间-使用时间)的竞赛条件。标准库没有告诉系统不要跟踪符号链接,而是首先检查它要删除的东西是否是一个符号链接,否则,它将继续递归地删除该目录。这就暴露了一个竞赛条件:攻击者可以在检查和实际删除之间创建一个目录,并用一个符号链接替换它。虽然这种攻击在第一次尝试时可能不会成功,但在我们的实验中,我们能够在几秒钟内可靠地执行它。
Rust 1.0.0到Rust 1.58.0都受到这个漏洞的影响。Rust团队将在今天晚些时候发布Rust 1.58.1,其中将包括对该漏洞的缓解措施。为了减轻影响,Rust团队建议大家尽早更新到Rust 1.58.1。
DeepSource对此做了什么
我们已经在我们的Rust分析器中添加了一个新的问题来检测这个漏洞 -RS-S1002。如果你使用的是有漏洞的Rust版本,DeepSource会在检测到时显示你在代码中使用这个方法的位置。对于所有通过拉动请求提出的新修改,DeepSource将提醒是否在有漏洞的Rust版本上使用这种方法。
如果你是DeepSource用户,并且在你的项目上激活了Rust分析器,我们已经在你的项目上重新触发了分析。在DeepSource上打开你的资源库的问题标签。如果我们在你的代码中检测到这个问题,你就可以在安全类别中看到它。