[Bug] workspace-write 下所有命令 0xC0000142 失败 / Windows ACL 沙箱环境变量泄漏 #8130
Replies: 1 comment
|
Root cause for the workspace-write Same symptom: every command under
Subsystem matters: a probe compiled with Suggested one-line fix (keeping confinement intact): setTokenDefaultDaclGrant(api, restrictedToken, worldSid);Verified in memory: FWIW the env var does leak into the confined child here too, and both the CLI ( Second, possibly separate observation from the same machine: inside a confined Happy to run any probe you want on this machine (Windows 11 build 26100, Electron desktop app, non-admin user, High IL host). Locally I currently work around the first issue with a length-neutral 52-byte in-place patch of |
Uh oh!
There was an error while loading. Please reload this page.
BUG-REPORT-workspace-write-0xC0000142.md
缺陷报告:
workspace-write下所有命令以0xC0000142失败(Windows 桌面版)E:\deepseekharnessE:\deepseekharness\version=44.0.0@deepseek-ai/dsh-subprocess、@deepseek-ai/dsh-subprocess-local、@deepseek-ai/dsh-sandbox-windows-acl1. 摘要
在文件策略为
workspace-write时,任何命令工具调用(pwsh/bash类)都会失败,表现为:3221225794=0xC0000142=STATUS_DLL_INIT_FAILED(Windows 进程加载器初始化失败)。同一会话切到
danger-full-access后同一命令立即恢复正常。因此故障被限定在沙箱子进程创建链路上,与具体命令无关。2. 复现步骤
workspace-write。echo hello。(no output)+ 退出码3221225794。补充观察:
echo hello成功,之后全部失败)。echo hello、cmd /c "echo hi"、whoami结果一致。3. 已确认的根因(因果链)
3.1 DSH 运行时自身带着
ELECTRON_RUN_AS_NODE=1桌面宿主
dsh-desktop-host以 Node 模式启动 DSH 运行时,并在其环境中注入该变量。安装包内可见(app.asar内dsh/node_modules/@deepseek-ai/dsh-desktop-host/lib/index.js):因此 harness 主进程的
process.env里始终存在ELECTRON_RUN_AS_NODE=1。3.2 子进程环境由
scrubbedParentEnv()派生,且不过滤该变量@deepseek-ai/dsh-subprocess/lib/index.js:ELECTRON_RUN_AS_NODE既不是凭据型名字(不含KEY/PASSWORD/SECRET/TOKEN),也不以DSH_开头,因此被原样转发给每个子进程。3.3 沙箱目标进程因此继承该变量(实测)
用探针(经沙箱运行器启动的目标进程自行打印环境)得到:
{"electron":"1","dshRunner":null,"tmp":"<session private temp>","temp":"<session private temp>","execPath":"E:\\deepseekharness\\DeepSeek Harness.exe"}即:被沙箱启动的目标进程,其环境里带着
ELECTRON_RUN_AS_NODE=1。3.4 该组合在受限令牌下必然崩溃(对照实验)
隔离实验(同一脚本、同一命令,唯一差别是运行器环境里是否含该变量):
ELECTRON_RUN_AS_NODE0x0,命令正常执行ELECTRON_RUN_AS_NODE=1(值0、node同样触发)0xC0000142,零输出同时确认:
DeepSeek Harness.exe+ELECTRON_RUN_AS_NODE=1)作为 Electron 子进程启动是可行的(-e、--version、普通脚本均返回 0)——因此问题不在「Electron 能否启动」,而在受限令牌下该变量导致的加载器初始化失败。CREATE_NO_WINDOW(Node 的windowsHide: true)不是原因:开关该选项结果相同(两种都0xC0000142)。3.5 与沙箱文档已记录的边界一致
@deepseek-ai/dsh-sandbox-windows-acl的 README 已明确记录同类失败模式:本报告是同一失败码的另一条触发路径,且触发条件是环境变量而不是创建标志。
4. 建议修复(上游)
在源码层修,任选其一:
在
scrubbedParentEnv()中显式排除(最直接、语义最清晰):或把它并入敏感名模式(注意不要削弱现有
KEY|这一项,否则DEEPSEEK_API_KEY之类会泄漏给子进程):或在沙箱运行器启动目标前,从目标环境块中删除该变量(在
targetEnvironment()内,语义上最贴近沙箱边界)。附带建议:桌面宿主注入
ELECTRON_RUN_AS_NODE时应视为内部机制变量,与DSH_*同级处理,避免其进入任何子进程环境。5. 为什么报告者没有就地修补安装包
安装包内的代码位于
resources/app.asar。任何文件内容的长度变化都会移动其后的所有偏移,必须重建整个归档并更新头部;而 Electron 会校验 asar 头部的完整性哈希。实测该构建里所有可安全插入的位置都比所需改动更短(例:环境函数出口行 53 字节,而delete+return最少需要约 85 字节),因此在安装包层面无法做长度中性的修补。故该修复应由源码层完成。6. 影响面
workspace-write/read-only等受限模式)danger-full-access才能继续工作,实质上绕过了文件沙箱——安全影响不可忽视。7. 附:报告者的环境
E:\HuaweiMoveData\...,与驱动器无关,C:盘同样复现)WRITE_RESTRICTED受限令牌version=44.0.0;npx 缓存中的 CLI 为@deepseek-ai/dsh@0.1.5-rc.3All reactions