feat(permission): 新增第三种强制力 partial —— DSH 如实自报,不再冒充 native
# 问题
审计发现 DSH 自报 mode_enforcement=native,而实测它的 Landlock 沙箱受内核 ABI
版本限制、拦截覆盖不完整(PLAN.md L5 自己写的就是 dsh = Landlock partial)。
只有 native / advisory 两个取值时,这个平台无论标哪个都是在说假话:
- 标 native → 人会以为 plan 档是硬保证,把它当安全边界依赖;
- 标 advisory → 又低估了它(确实在拦),而「平台无法强制」会让模型
在本可依赖的边界上过度保守。
多一个取值比多说一句假话便宜。
# 改动
- Go models:EnforcementPartial = "partial",ValidEnforcement 接受它;
NormalizeEnforcement 对显式自报值一律原样保留(partial 降级到任一极端都是假话),
未知值仍然 fail-closed 到 advisory。
- 三桥共用 lib/permission-mode.js(逐字节同源):ENFORCE_PARTIAL +
modeBriefing 三态措辞。partial 版必须同时做到两件事:
说清「覆盖不完整」,并收回 native 那句「都会被平台拦下」的承诺
—— 否则模型会以为越界一定被拦,于是不必自己小心。
- 前端 PermissionChip:三个点形区分(实心 / 靶心 / 空心)+ 三套 tooltip 文案;
认不出的强制力按 advisory(与后端同方向)。
- DSH 插件心跳改报 partial。
- 顺带修正活跃 DSH 会话的历史快照:那批 native 是插件当时的**误报**,
不是能力变化,因此把 status<>'archived' 的 dsh 会话改为 partial;
归档会话按设计保留(不重写已结束的历史)。改前已 sqlite3 .backup 备份。
# 验证
- agents.mode_enforcement:dsh 由 native 变为 partial(心跳生效)
- Go 全量、三桥插件 320/362/409、前端 196 全绿(新增 PermissionChip 11 例)
- 三桥共用模块同源校验通过
- 关键判据:partial 的措辞与 native/advisory 两两不同,且不含「无法强制」
This commit is contained in:
@ -443,9 +443,15 @@ export function apply(ctx: any, config: PluginConfig): void {
|
||||
|
||||
async function beat(): Promise<void> {
|
||||
const body: Record<string, unknown> = {};
|
||||
// DSH 有真沙箱(read-only / workspace-write / danger-full-access),
|
||||
// 档位在这里是被强制执行的,不是 advisory。
|
||||
body.mode_enforcement = 'native';
|
||||
// DSH 有真沙箱(read-only / workspace-write / danger-full-access),但它对
|
||||
// 档位的拦截**覆盖不完整**:Landlock 受内核 ABI 版本限制,部分路径与系统
|
||||
// 调用未被约束(PLAN.md L5 实测结论:dsh = Landlock partial)。
|
||||
//
|
||||
// 因此报 partial 而不是 native。两个极端都是在说假话:
|
||||
// - native:人会以为 plan 档是硬保证,把它当安全边界依赖;
|
||||
// - advisory:又低估了它(确实在拦),而「平台无法强制」会让模型
|
||||
// 在本可依赖的边界上过度保守。
|
||||
body.mode_enforcement = 'partial';
|
||||
const [entries, models] = await Promise.all([collectSessions(), collectModels()]);
|
||||
if (entries) {
|
||||
body.platform_sessions = snapshotDshSessions(entries, (id) => mailDrivenSessions.has(id));
|
||||
|
||||
Reference in New Issue
Block a user