Replies: 3 comments
|
合理,但这个报错确实容易让人误解。它不是字符串匹配,是权限层级判断。 DSH 的沙箱权限只有三档,升级只允许"严格变宽"(源码 const WIDER_MODES = {
"read-only": ["workspace-write", "danger-full-access"],
"workspace-write": ["danger-full-access"]
};
// 请求的档位必须在当前档位的"更宽"列表里,否则直接拒绝:
if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode)) throw new Error(...);
建议官方把报错改得更友好。现在的提示只说 "not strictly wider",用户看到"字符串一样却不执行"会懵。可以改成类似:
这样用户一眼就懂,而不是去怀疑是不是权限判断有 bug。 如果要改,位置很明确:
|
|
是的,就是这个意思,“danger-full-access 已经是最高档,没有"比它更宽"的权限。” 升级只允许"严格变宽" 就走不通,这就是一个明显的bug嘛! |
|
两位说的其实各对一半:规则本身合理,但把「同档」和「更窄」判成同一件事,是实打实的缺陷。 看 if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode as SandboxMode)) {
throw new Error(`sandbox escalation to \"${mode}\" is not strictly wider than this call's current \"${effectiveMode}\" mode`)
}函数上方的注释写明了这是有意的:非加宽请求「throws ... and nothing has run」,整个调用直接失败,而且不会弹给人确认。 问题在于这一个条件同时吃掉了两种语义完全不同的请求:
第一种 fail-closed 是对的。第二种不是提权:把你已经持有的权限「授予」你,加宽的幅度是零,不存在任何可被利用的越权面。硬失败在这里没有换来任何安全收益,代价却是楼主截图里那个 所以我认为这是 bug,但不是「权限判断写错了」,而是把 no-op 归进了 violation 分支。修法也不必动 // 同档 = 空操作:什么都没加宽,按当前档继续执行即可
if (mode === effectiveMode) return effectiveMode
if (!(WIDER_MODES[effectiveMode] ?? []).includes(mode as SandboxMode)) {
throw new Error(/* ... 仍然是更窄/不自洽请求的报错 ... */)
}这样「严格加宽」对真正的提权路径依然成立( @xydt-tanshanshan 提的两处文案改进依然值得做,但我会把它们当作补充而不是替代:靠报错文案和 schema description 去劝模型「已经是最高权限时别传这个参数」,是在用提示词治一个可以在代码里根治的问题 —— 模型偶尔多传一个参数是常态,而一个空操作不该让整条命令失败。 |
Uh oh!
There was an error while loading. Please reload this page.
提示“Error: sandbox escalation to "danger-full-access" is not strictly wider than this call's current "danger-full-access" mode”
这合理吗? 字符串都能完全匹配你跟我说权限不匹配不予执行??
All reactions