https://rust-lang.github.io/rfcs/3128-io-safety.html
Rust标准库几乎提供了IO安全性,但不完整。如果通过FromRawFd::from_raw_fd
获取到IO句柄,这被标记为unsafe,通过这种方式阻止用户使用一个不安全的IO句柄。但这里有一个漏洞,AsRawFd
/IntoRawFd
,很多函数接受这样的一个trait来做IO操作。
pub fn do_some_io<FD: AsRawFd>(input: &FD) -> io::Result<()> {
some_syscall(input.as_raw_fd())
}
带来的问题就是可以访问任意IO资源,可能是一个错误的IO资源。
在一个特殊场景,违反IO安全性,甚至会导致违反内存安全性,例如通过memfd_create创建的匿名fd,然后被mmap使用,整个逻辑都被包装起来,不让其他的代码直接访问这个fd。如果这里没有IO安全性,任意代码都可以访问这里的fd,直接对fd进行write和ftruncate,那么就会破环内存安全性。