维基上有一些,机翻一下:
防止 TOCTOU
尽管概念简单,但 TOCTOU 竞争条件很难避免和消除。一种通用技术是使用错误处理而不是预检查,在 EAFP 的哲学下——“请求宽恕比请求许可更容易”而不是 LBYL——“三思而后行”——在这种情况下没有检查,如果假设不成立,则返回一个错误信号。[9]
在文件系统 TOCTOU 竞争条件的上下文中,根本的挑战是确保文件系统不能在两次系统调用之间更改。access2004 年,公布了一个不可能的结果,表明在使用 UNIX和文件系统调用时,没有可移植的、确定性的技术来避免 TOCTOU 竞争条件open。[10]
由于这种不可能的结果,研究人员提出了用于跟踪文件描述符和确保正确性的库。[11]
研究界提出的另一种解决方案是让 UNIX 系统在文件系统或操作系统内核中采用事务处理。事务为操作系统提供并发控制抽象,可用于防止 TOCTOU 竞争。虽然还没有生产 UNIX 内核采用事务,但已经为 Linux 开发了概念验证研究原型,包括 Valor 文件系统[12]和 TxOS 内核。[13] Microsoft Windows已将事务添加到其NTFS文件系统,[14]但 Microsoft 不鼓励使用它们,并表示它们可能会在未来版本的 Windows 中删除。[15]
文件锁定是防止单个文件竞争条件的常用技术,但它没有扩展到文件系统命名空间和其他元数据,锁定也不能很好地与网络文件系统一起工作,并且不能防止 TOCTOU 竞争条件。
对于 setuid 二进制文件,一个可能的解决方案是使用seteuid()系统调用来更改有效用户,然后执行open(). setuid()操作系统之间的差异可能会产生问题。[16]
【 在 jimmycmh 的大作中提到: 】
: 没有需求就创造需求,那是浪费
: 实际上,由于linux上文件操作没有事务,没有原子操作,stat与unlink之间不可避免地会被攻击者插入symlink,从写代码角度看无解
: 但可以使用一些非代码的方法,比如控制文件夹权限不允许其他人rename symlink之类的,如果攻击者攻破了权限系统,那也是白搭
: ...................
--
FROM 221.218.163.*