Rust修补可被删除文件及目录的安全漏洞

知名程序语言Rust上周修补了一个允许黑客径自删除文件与目录的安全漏洞CVE-2022-21658,建议所有用户升级到Rust 1.58.1,特别是那些预期所开发的程序可于特权环境中执行,或是其它高风险的开发者。

该安全漏洞存在于std::fs::remove_dir_all函数中,可能造成Race Condition Enabling Link Following缺陷。该缺陷意味着程序在访问文件或目录之前先检查了它们的状态,因而产生了竞争条件,让黑客得以在程序访问之前以连接来取代该文件,最后访问到错误的文件。

Rust解释,想象一名黑客拥有访问系统的非特权权限,并企图删除一个需要特权才能执行的系统目录sensitive/,倘若std::fs::remove_dir_all可跟随符号连接,黑客将能找到一个可移除temp/目录的特权程序,再创建sensitive/与temp/foo之间的符号连接,并等待特权程序删除foo/。由于特权程序可跟随temp/foo到sensitive/之间的连接,使得sensitive/也随之被删除。

事实上,std::fs::remove_dir_all针对上述现象也部署了保护机制,但因没有妥善地实施检查,依旧形成了竞争条件,黑客只要创建一个目录,并在检查与实际删除之间的空档以符号连接取代它,就能展开攻击。

该漏洞波及Rust 1.0.0至Rust 1.58.0,Rust呼吁开发者应尽快升级到Rust 1.58.1,此外,有鉴于macOS 10.10以前的版本或REDOX等系统,缺乏可用来缓解相关攻击的APIs,就算工具链已修补也依然存在风险。