You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:20:04