- 主题:请教个关于文件保护的问题
如果遇到一种需求,需要判断文件大小,如果太大就删除,
常见做法是
open file 或者stat file
读取size
if 超过阈值
unlink file
但是看到一个资料说这个存在TOCTOU风险,怎么改写才安全?
Opening a UNIX file and unlinking it later creates a race condition.
By replacing the named open file with another file or symbolic link, an attacker can cause unlink() to be applied to the wrong file.
This problem can be avoided with proper permissions on the file’s containing directories.
--
FROM 218.66.91.*
你的程序运行环境需要考虑这种攻击吗?
【 在 b0207191 的大作中提到: 】
: 如果遇到一种需求,需要判断文件大小,如果太大就删除,
: 常见做法是
: open file 或者stat file
: ...................
--
FROM 115.171.245.*
如果需要考虑,从安全角度,或者说防御式编程,要如何重写这段代码
【 在 jimmycmh 的大作中提到: 】
你的程序运行环境需要考虑这种攻击吗?
【 在 b0207191 的大作中提到: 】
: 如果遇到一种需求,需要判断文件大小,如果太大就删除,
: 常见做法是
: open file 或者stat file
: ...................
--
FROM 218.66.91.*
没有需求就创造需求,那是浪费
实际上,由于linux上文件操作没有事务,没有原子操作,stat与unlink之间不可避免地会被攻击者插入symlink,从写代码角度看无解
但可以使用一些非代码的方法,比如控制文件夹权限不允许其他人rename symlink之类的,如果攻击者攻破了权限系统,那也是白搭
【 在 b0207191 的大作中提到: 】
: 如果需要考虑,从安全角度,或者说防御式编程,要如何重写这段代码
: 你的程序运行环境需要考虑这种攻击吗?
--
FROM 115.171.46.*
维基上有一些,机翻一下:
防止 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.*