[Bug 报告] Windows 沙箱的 read-only 边界比宣传的更弱:受限令牌限制列表常驻 Everyone/登录 SID,read-only 仍可写世界可写目录 #949
truelove-dreamer
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
摘要
Windows 上的沙箱后端(
dsh-sandbox-windows-acl)用 WRITE_RESTRICTED 受限令牌做文件写入限制,但受限令牌 pass-2 访问检查的语义是"任一限制 SID 命中即放行",而两个模式(read-only / workspace-write)的限制列表都常驻Everyone(S-1-1-0)与登录会话 SID。因此:FILE_ALL_ACCESS(read-only 下落到 worldSid);fs-sandbox文件围栏的语义(read-only = 拒绝一切写,dsh-fs-sandbox/lib/index.js:161)直接矛盾——同一个"read-only"标签,两套边界。证据(代码与行号)
代码根:
node_modules/@deepseek-ai/(0.1.0-rc.6 构建产物)限制列表构成 —
dsh-sandbox-windows-acl/lib/types-CNjZgO4h.js:1196-1202read-only 与 workspace-write 都包含
logonSid与known.world(Everyone)。作者自认该语义 — 同文件
:1354-1359注释原文:即受限检查会继承"其他限制 SID"(Everyone、登录 SID)的环境写 ACE。作者为关闭 Public 树逃逸而专门从列表剔除 INTERACTIVE/LOCAL 的行为,也只有在"任一命中"语义下才有意义。
默认 DACL 授予 Everyone 全权 — 同文件
:1493+:1140setTokenDefaultDaclGrant(api, restrictedToken, this.tempWriteSidPtr ?? this.writeSidPtr ?? worldSid)—— read-only 下两者均 undefined,落到worldSid;setEntriesInAclW(..., buildExplicitAccess(sidPtr, 1, FILE_ALL_ACCESS), ...)把 EveryoneFILE_ALL_ACCESS合并进令牌默认 DACL。受限进程新建对象默认 DACL = Everyone 全权(:1122注释亦承认)。fs 围栏语义相反 —
dsh-fs-sandbox/lib/index.js:161:read-only 对一切写抛FS_SANDBOX_DENIED。复现步骤
DSH_PERMISSION_MODE=read-only),或任意模式;C:\Windows\Temp类世界可写位置,或用户自建的共享目录);Set-Content/New-Item):FS_SANDBOX_DENIED拒绝。两个工具对同一权限标签给出不同边界。影响
%TEMP%派生目录之外的意外位置),其他本地用户可读取/篡改;建议修复(供讨论)
setTokenDefaultDaclGrant(或改为最小权限默认 DACL);fs-sandbox围栏与 shell runner 对同一模式给出同一边界(或明确文档化差异);附注
FAILS CLOSED);workspace-write 的能力 SID 设计本身合理。All reactions