Bug:Windows ACL 沙箱在其缓存的私有临时目录被回收后永久失效 #5477
Replies: 2 comments
|
在 逐点确认(master 行号)
一个结构对照: agentless 路径天然免疫, 恰好证明修法方向
家族背景: 这是同一轴的第 5 个成员"外部 OS 临时目录清理打断运行中的 dsh" 此前已有 4 报: #3190/#3203(spill 目录被外部删除 → spillAll openSync/writeSync 无 try/catch → uncaughtException 整进程死)、#5175(Linux usrquota 配额满同款)、#5332(Windows 侧 8325 个孤儿 dsh-subprocess-* 目录堆积 20GB)。#5477 是新机制: 前 4 报是"写入/清理路径没抗外部删除", 这报是"跨 provider 生命周期缓存的外部路径句柄, 复用时从不验活"。共同教训值得固化成一条审计规则: 任何持有 其它
|
|
补一个重要的家族修正——#5477 是 #3203 的第二次独立报告, 同一缺陷, 不是新机制(我上一条回复的家族归类有误, 以此为准): #3203(MMiao79, 2026-08-18, rc.7 源码)报的正是这个 bug: 修正后的家族全景("外部 temp 清理打断运行中 dsh", 崩坏侧 3 机制 + 堆积侧):
上一条里"#3203 是 spill 路径"的说法错误, 抱歉——spill 路径是 #3190/#5175。机制 B 现在有两份独立报告 + 两份同形补丁背书, 修复优先级应该更高了: 这是纯可用性 + 误导性报错 + 跨两版未修, 而补丁极小且无兼容面。若走 PR, 建议在补丁里顺带引用 #3203/#5477 两份报告。 |
Uh oh!
There was an error while loading. Please reload this page.
摘要
Windows ACL 沙箱 provider(
@deepseek-ai/dsh-sandbox-local)会为每个活跃的(sessionId, workspaceRoot)组合创建一个随机私有临时目录并缓存在内存中。之后每次workspace-write调用都会返回这个缓存条目,却不检查该目录是否仍然存在。只要操作系统在provider 存活期间回收了这个目录(存储感知 / 磁盘清理 / 杀软都可能),那么每一条
workspace-write命令——因此实际上等于所有命令——都会失败,直到 DSH 进程重启。失败时是安全关闭(fail-closed)的:沙箱层拒绝在无沙箱的情况下运行命令,所以这是一个
可用性缺陷,而非沙箱逃逸。
环境
@deepseek-ai/dsh-sandbox-local、@deepseek-ai/dsh-sandbox、@deepseek-ai/dsh-sandbox-windows-acl—0.1.1-rc.2复现步骤
workspace-write命令(这会物化一次临时授权)。C:\Users\<user>\AppData\Local\Temp\dsh-RW1t41—— 这正是存储感知对过期
%TEMP%条目所做的事。workspace-write命令。此后每条命令都会失败,直到 DSH 重启。
观察到的报错
每次重试出现的都是同一个目录名——证明是过期缓存,而非新建目录。
根因
@deepseek-ai/dsh-sandbox-local/lib/index.js中的materializeAclGrant():缓存里的
capability.dir随后作为--temp传给运行器,而运行器一上来就校验它(
@deepseek-ai/dsh-sandbox-windows-acl/lib/runner.js),目录被删掉后就会失败。建议修复
在复用缓存能力(capability)之前,先检查它的目录是否仍然存在;若已不存在,丢弃这个过期
条目并继续往下重建。
existsSync在该文件顶部已经 import,grant.dispose()也是本函数自身错误处理路径里已经在用的清理调用。
验证
node --check通过(exit 0)。existsSync、capability.dir、grant.dispose()、以及this.tempCapabilities(一个Map)都齐全且一致。All reactions