SV.TOCTOU.FILE_ACCESS
文件访问中的 TOCTOU 争用
诸如 access、chown、chgrp 以及 chmod 等操作文件名的函数可能容易发生检查时间使用时间 (TOCTOU) 错误。TOCTOU 错误是指资源的状态可能在软件检查它的时间以及使用它的时间之间变化的情况。时间流逝将导致检查无效,并可能在资源处于无法预料的状态时导致无效操作。
如果攻击者可以在检查时间和使用时间之间改变对象的状态,则可能发生 TOCTOU 错误,该错误通常发生在共享资源上,比如文件、内存以及多线程程序中的变量。
以下函数容易遭受此类攻击:
- acct
- access
- chmod
- lchown
- chown
- fopen
- fdopen
- freopen
- fchmod
- fchown
- chdir
- chgrp
- creat
- open
- pathconf
- opendir
- lstat
- stat
- rename
- link
- lchown
SV.TOCTOU.FILE_ACCESS 检查器会标记出可能出现 TOCTOU 错误的函数调用。
漏洞与风险
该漏洞的一个典型实例是在打开文件之前,使用系统调用来检查当前进程是否具有打开文件的权限。使用该方式的进程可以在进行检查的时间以及实际打开文件的时间之间被暂停。当进程暂停时,另一个进程可能更改与名称相关联的文件。
通常该情况牵涉到那些支持文件的符号链接的操作系统。例如,使用符号链接操纵密码文件的字符串含义将允许攻击者获得指向任意位置的虚假入口。在某个案例中,在目标用户目录中创建了 .rhosts 文件,从而允许攻击者以该用户的身份进行远程登录。
该漏洞可能允许恶意用户获得对未授权资源的访问权限,并获得进行变更、删除文件以及获得提升的权限。
缓解与预防
避免使用将文件名作为参数的函数和系统调用,使用那些以文件句柄或文件描述符作为参数的调用。如果操作系统分配了文件句柄或描述符,则其无法像文件名一样通过符号链接来轻易操纵。
如果您需要在函数中指定文件名
- 将语句执行的有效 gid 和 uid 设置为当前用户和组的 gid 和 uid
- 限制资源检查和资源使用之间的时间间隔
- 在使用调用之后检查资源,确保采取相应的操作
- 使用环境性锁定机制来保护资源