日前,Rust编程语言的维护者修复了一个编号为 CVE-2022-21658的高危漏洞,该漏洞让攻击者可以从易受攻击的系统删除文件和目录。该漏洞影响Rust 1.0.0到Rust 1.58.0,近期发布的Rust 1.58.1版本已修复了该漏洞。
Rust编程语言维护者发布的安全公告称:“Rust安全响应工作组已接到通知,获悉 std::fs::remove_dir_all标准库函数易受启用符号链接跟随的竞态条件攻击(CWE-363)。攻击者可以利用这个安全问题,欺骗特权程序删除攻击者原本无法访问或删除的文件和目录。” 安全公告指出std::fs::remove_dir_all已经含有防范递归删除符号链接的机制,但它们并没有正确实施。
“遗憾的是,该检查机制在标准库中未正确实施,导致了TOCTOU(Time-of-check Time-of-use)竞态条件。标准库不是告诉系统别跟随符号链接,而是先检查它要删除的东西是不是符号链接,否则它将继续递归删除目录。这暴露了竞态条件:攻击者可以创建一个目录,并在检查和实际删除之间将该目录换成符号链接。虽然这种攻击在首次尝试时可能不会得逞,但在试验中能够在几秒钟内可靠地执行这种攻击。” Rust 维护者表示。
攻击者利用该漏洞的原理是:假设对系统拥有非特权访问权限的攻击者想要删除一个名为sensitive/的系统目录,但他没有操作权限,就可以利用该漏洞,找到一个特权程序来删除其有权访问的目录(名为temp/),创建从temp/foo到sensitive/的符号链接,等待上述特权程序删除foo/。特权程序将跟随从temp/foo到ensitive/的符号链接,同时递归删除,从而导致sensitive/被删除。
参考链接:
https://securityaffairs.co/wordpress/127135/security/rust-programming-language-flaw.html