Rust 标准库中的漏洞

由于 std::fs::remove_dir_all() 函数中的竞争条件,Rust 标准库中已发现一个漏洞 (CVE-2022-21658)。如果使用此功能删除特权应用程序中的临时文件,攻击者可以删除通常无权删除的任意系统文件和目录。

该漏洞是由于在递归删除目录之前不正确地执行检查符号链接而导致的。 remove_dir_all() 首先检查文件是否是符号链接,而不是阻止跟踪符号链接。如果定义了链接,则将其作为文件删除,如果是目录,则调用递归内容删除操作。问题在于检查和删除操作开始之间存在轻微的延迟。

当检查已经进行,但枚举目录进行删除的操作尚未开始时,攻击者可以用带有符号链接的临时文件替换该目录。如果在正确的时间命中,remove_dir_all() 函数会将符号链接视为目录并开始删除链接指向的内容。尽管攻击的成功取决于所选择的替换目录时间的准确性,并且不太可能第一次击中正确的时刻,但在实验过程中,研究人员能够在执行漏洞后实现可重复的成功攻击。几秒钟。

从 1.0.0 到 1.58.0(含)的所有 Rust 版本都会受到影响。该问题目前已以补丁形式得到解决(该修复将包含在 1.58.1 版本中,预计在几个小时内发布)。您可以在以下页面上监控发行版中漏洞的消除情况:Debian、RHEL、SUSE、Fedora、Ubuntu、Arch、FreeBSD。建议所有以提升权限运行并使用remove_dir_all函数的Rust程序用户紧急将Rust更新到版本1.58.1。有趣的是,发布的补丁并没有解决所有系统上的问题;例如,在 REDOX OS 和 macOS 10.10 (Yosemite) 之前的版本中,由于缺少 O_NOFOLLOW 标志,该漏洞没有被阻止,该标志会禁用以下符号链接。

来源: opennet.ru

添加评论