Windows递归删除目录时如何防范TOCTTOU漏洞?
Windows平台递归删除目录的TOCTTOU漏洞与加固方案
当目录递归删除算法采用如下伪代码实现时,会存在**检查时间到使用时间(TOCTTOU)**漏洞:
function removeRecursively(dirname) { for filename in dirname { if isDir(dirname + "/" + filename) removeRecursively(dirname + "/" + filename); else unlink(dirname + "/" + filename); } unlink(dirname); }
假设isDir对符号链接返回false,漏洞核心在于:攻击者可在isDir返回true后,修改dirname或filename的指向,让路径dirname + "/" + filename中的某个组件变为符号链接,诱使程序删除攻击者指定位置的文件。
Unix平台的修复方案
类Unix系统可通过基于文件描述符的操作规避TOCTTOU问题,修复后的伪代码如下:
function removeRecursively(dirname) { removeContents(open(dirname, O_NOFOLLOW)); unlink(dirname); } function removeContents(dirfd) { dirstream = fdopendir(dirfd); while (filename = readdir(dirstream)) { entryfd = openat(dirfd, filename, O_NOFOLLOW); if isDir(entryfd) removeContents(entryfd); unlinkat(dirfd, filename); } }
注:上述伪代码省略了诸多细节,请勿针对代码细节提出批评。
Windows平台的疑问与待解决问题
CVE-2022-21658的易受攻击性
Windows下通常仅管理员权限进程可创建符号链接,但开启开发者模式后普通用户也具备该权限。这是否意味着开启开发者模式的Windows主机易受CVE-2022-21658攻击?若存在例外情况请告知。
修复方案的困境
目前暂未找到Windows平台下可行的修复方案:
- 虽有资料表明Windows存在
openat的等效实现,且无需fdopendir(Windows无独立“目录流”概念),但Windows缺少通过目录句柄而非路径字符串获取目录项的函数,现有FindFirstFile*和FindNextFile*均基于路径,无法规避TOCTTOU问题。 - 同时也未找到Windows下等效于
unlinkat的函数。
内容的提问来源于stack exchange,提问作者Brian Bi
相关产品推荐
相关产品推荐

