Vulnerability-wiki

TOCTOU 漏洞(Time-of-Check to Time-of-Use)

TOCTOU(Time-of-Check to Time-of-Use)漏洞 是一种典型的竞争条件(Race Condition)安全问题,通常发生在系统对某个资源进行状态检查(Check)之后,到实际使用(Use)之间的时间差中。攻击者可以在这个时间窗口内修改资源的状态,从而导致系统在不安全的条件下执行操作。


原理解析

TOCTOU 漏洞通常存在于如下的操作流程中:

  1. 检查资源状态(Check)
    • 例如判断文件是否存在、是否是符号链接、是否有权限等。
  2. 资源使用(Use)
    • 实际打开文件、写入文件、执行系统调用等。

攻击者如果能在检查和使用之间修改资源(如替换为符号链接、其他文件等),就可能造成:


漏洞示意

以 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 并写入,造成破坏。


典型利用条件


危害影响


防御方法

方法 描述
使用原子操作 使用如 open(O_CREAT|O_EXCL) 直接打开并创建,避免检查与使用分离
限制临时目录权限 临时文件应使用私有目录,如 /tmp/myapp-uid/
使用文件描述符进行操作 检查和使用统一使用 fd,避免路径被替换
使用 O_NOFOLLOW 防止符号链接攻击 防止打开符号链接文件
避免信任不安全路径 不在 /tmp 等公共目录存放敏感文件
加锁机制 使用 flock 等文件锁机制防止并发访问

现实案例:CVE-2003-0213 - crontab TOCTOU 权限提升漏洞

组件crontab 程序
漏洞描述crontab 在设置计划任务时,先检查临时文件路径权限,然后再使用 open() 读取。攻击者可以在检查和使用之间替换为符号链接至 /etc/shadow 等敏感文件,从而提升权限。
影响系统:多个早期 Linux 发行版
漏洞危害:本地权限提升,可能获取 root 权限

参考链接:https://nvd.nist.gov/vuln/detail/CVE-2003-0213


总结

TOCTOU 是一种非常隐蔽且危险的漏洞,常常出现在不注意原子操作的系统调用中,尤其在对文件或资源的权限检查过程中,开发者应始终保持“检查即使用”的原则,防止攻击者利用时间差篡改资源状态。

💡 安全开发中,应避免 access() + open() 类组合,而采用具备原子性的接口,如 openat() 搭配 O_NOFOLLOW 等参数。