TOCTOU(Time-of-Check to Time-of-Use)漏洞 是一种典型的竞争条件(Race Condition)安全问题,通常发生在系统对某个资源进行状态检查(Check)之后,到实际使用(Use)之间的时间差中。攻击者可以在这个时间窗口内修改资源的状态,从而导致系统在不安全的条件下执行操作。
TOCTOU 漏洞通常存在于如下的操作流程中:
攻击者如果能在检查和使用之间修改资源(如替换为符号链接、其他文件等),就可能造成:
以 Unix 系统中对文件权限检查为例:
if (access("/tmp/data.txt", W_OK) != 0) {
printf("没有写权限\n");
exit(1);
}
fd = open("/tmp/data.txt", O_WRONLY);
write(fd, "hello", 5);
问题:攻击者在
access()检查权限后,到open()打开文件之前,将/tmp/data.txt替换成符号链接指向/etc/passwd。
这样 open() 就会打开 /etc/passwd 并写入,造成破坏。
/tmp 中的文件)| 方法 | 描述 |
|---|---|
| 使用原子操作 | 使用如 open(O_CREAT|O_EXCL) 直接打开并创建,避免检查与使用分离 |
| 限制临时目录权限 | 临时文件应使用私有目录,如 /tmp/myapp-uid/ |
| 使用文件描述符进行操作 | 检查和使用统一使用 fd,避免路径被替换 |
使用 O_NOFOLLOW 防止符号链接攻击 |
防止打开符号链接文件 |
| 避免信任不安全路径 | 不在 /tmp 等公共目录存放敏感文件 |
| 加锁机制 | 使用 flock 等文件锁机制防止并发访问 |
组件:crontab 程序
漏洞描述:crontab 在设置计划任务时,先检查临时文件路径权限,然后再使用 open() 读取。攻击者可以在检查和使用之间替换为符号链接至 /etc/shadow 等敏感文件,从而提升权限。
影响系统:多个早期 Linux 发行版
漏洞危害:本地权限提升,可能获取 root 权限
参考链接:https://nvd.nist.gov/vuln/detail/CVE-2003-0213
TOCTOU 是一种非常隐蔽且危险的漏洞,常常出现在不注意原子操作的系统调用中,尤其在对文件或资源的权限检查过程中,开发者应始终保持“检查即使用”的原则,防止攻击者利用时间差篡改资源状态。
💡 安全开发中,应避免
access()+open()类组合,而采用具备原子性的接口,如openat()搭配O_NOFOLLOW等参数。