Replies: 1 comment
|
这份报告的定位是对的,而且我想指出一件可能比 WSL 本身更重要的事:这不是一个 WSL 特有的洞,它是一整类洞在 WSL 上的实例,而同一类的另一个实例上周已经在这个社区被独立报出来过了。 一、先给读到这帖的人一条现在就能做的你把 # /etc/wsl.conf
[interop]
enabled=false
appendWindowsPath=false然后 之所以说"正确层次":interop 是 WSL 自己的 binfmt 转发机制,关掉它的开关在 WSL 手里,不在 DSH 手里。DSH 侧的任何缓解都是在猜黑名单——你自己在建议 1 里也点到了这个问题("deny 已知 Windows 可执行文件"),而 代价要说清:关掉之后你在这个发行版里就调不了 Windows 程序了。对专门跑 agent 的 WSL 实例这通常无所谓;对日常开发的主力发行版会很难受。所以更实际的做法是给 agent 单开一个发行版( 二、这一类的名字:沙箱管的是系统调用,管不了"委托给一个不在沙箱里的执行者"你写了一句很准的话:
把它一般化就是:bwrap / Seatbelt 这类沙箱约束的是"这个进程自己能做什么"。当进程把工作委托给一个沙箱外的执行者时,它自己一个越权系统调用都没发出——所以沙箱没有任何理由报警。 而这不是 WSL 独有的。同一个社区里有另一份独立的报告,形状一模一样,只是换了操作系统:
两份报告并排看,共同点非常清楚:
所以修法也是同一个形状:沙箱策略必须显式处理"通往沙箱外执行者的通道",而不只是文件和路径。你建议的第 1 条(屏蔽 interop 转发)和 #4503 需要的(限制 socket 连接)是同一条原则的两个实例。 我建议你把这个交叉引用加进原帖——两个平台上各有一份独立复现的报告,比任何单份都更能说明"沙箱模型漏了一整个维度",而不是"WSL 有个 bug"。你已经引了 #817 和 #451,#4503 值得加上,因为它是唯一一份不同操作系统、同一类原理的。 三、关于你的建议 3,我有保留意见
这条在用户审批的意义上是合理的(人来看一眼)。但如果实现成"让模型判断这次调用安不安全",那就是错的层次——在这个威胁模型里,被 prompt injection 诱导的正是模型本身,让它审批自己是没有边界可言的。你原文里"恶意/被 prompt injection 诱导的 agent"这句已经说明你清楚这一点,我写在这里是怕后面的讨论跑偏。 另外 argv[0] 匹配本身也容易被绕( 边界与利益相关我们不修 DSH 自家组件—— 利益相关:我维护 pi2dsh(Pi 生态兼容层)。这条不推销,而且是原则性的:我们生态里有"让第二个模型逐次审批工具调用"的插件,在这类帖子上推它是根本性的错误建议——攻击者就是模型,再加一个模型不构成边界。这条口径我在 #250 / #4503 / #4384 都写过,这里第四次。 (另:你把 PoC 里真正破坏性的那部分留作私下提供、公开版只留可自证的最小写入,这个处理方式很得体。) |
Uh oh!
There was an error while loading. Please reload this page.
[Security] WSL2 interop 通道完全穿透 workspace-write 沙箱:bwrap 只读挂载对 Windows 侧进程无效(含 PoC)
English abstract
On WSL2 (Ubuntu), the DSH
workspace-writesandbox is fully bypassable through the WSL interop mechanism. The Linux sandbox uses bwrap (--ro-bind / /) which makes/mnt/c,/mnt/dread-only from the Linux side — but invokingpowershell.exe/cmd.exethrough WSL interop spawns a native Windows process that does NOT pass through the bwrap mount namespace, and runs with the full privileges of the current Windows user. This lets a sandboxed agent read/write/delete arbitrary files on all Windows drives with zero approval. Verified on0.1.0-rc.7(latest): a sandboxed agent deleted 26.8 GB of files onD:viaRemove-Itemwithout any approval prompt.复现环境
0.1.0-rc.7(当前最新版,2026-08-18 实测)workspace-writepowershell.exeinterop漏洞描述
DSH 在 Linux 上用 bwrap 实现沙箱(
dsh-sandbox-local):问题:WSL2 的 interop 机制(
/init拦截powershell.exe/cmd.exe/wsl.exe等 Windows 可执行文件的调用)会启动一个 Windows 原生进程。该进程:POWER-LR\Drazor)身份运行bwrap 的
--ro-bind / /让 Linux 侧看到/mnt/c、/mnt/d只读,制造了"沙箱生效"的假象——但 interop 是文档和实现上的盲区,沙箱对这条通道零防护。PoC(已在 workspace-write 沙箱内实测成功)
同样适用于
cmd.exe、wscript.exe、任意.exe(interop 会把 Windows 可执行文件交给 Windows 侧执行)。影响
workspace-write的安全承诺在 WSL 下不成立:宣称"只能写工作区",实际可读写删除 Windows 用户全部文件、改注册表、执行任意程序--host 0.0.0.0("would expose remote code execution to the network"),却内置了一条不受沙箱约束的 interop RCE 通道Remove-Item不走回收站无法恢复)建议修复方向
/usr/lib/wsl/lib(interop 转发依赖)或在 bwrap profile 中 deny 已知 Windows 可执行文件(powershell.exe、cmd.exe、wsl.exe等),使沙箱内无法启动 Windows 进程/etc/wsl.conf的[interop] enabled=false,未禁用时对 interop 调用强制走审批或直接拒绝.exe/.bat/.cmd)的调用强制要求审批(类似 Windows ACL runner 的做法)docs/subsystems/sandbox.md的Enforcement is a reported fact段落补充 WSL interop 的 partial-enforcement 说明,明确该场景下workspace-write不提供 Windows 侧隔离参考
备注
Remove-Item -Recurse -Force),无审批All reactions