🐳 第八章 设计自己的Harness
📄 一句话概括

预设能决定装哪些件,决定不了能踩多大范围——把两者混为一谈,等于把刹车装在方向盘上。

📝 本节和前面几节的关系

8.3.6 的失败路径里,最要紧的是权限那一条;这一节专门讲清预设与权限的边界。

一、实测三次改动,看谁说了算

三次一比就清楚了:管范围的那一件,根本不在预设里。

二、权限是【成对】的

三档枚举长这样:

每一档都是沙箱档位与审批策略的固定搭配(4.5.1)。

为什么要成对?因为三个自由开关有 8 种组合,一半是自相矛盾的;枚举只剩 3 种,每一种都自洽。

三、预设与权限,各管什么

两者的关系是:预设决定你手里有哪些工具,权限决定这些工具最远能碰到哪。

四、为什么必须分开

如果预设能改权限,等于会话给自己发通行证:

一个预设只要在里面写一句【我允许全盘访问】,整套边界就没了。

所以本课把它放在宿主层:每会话一份的装配清单,无权改动进程级的策略。

五、动手 Demo:为什么预设不是权限系统

把本章实测的三次改动横过来看:

rows = [("预设内部", "塞 sandbox-policy", "宿主层没动"),
        ("宿主层", "改 read-only", "6 行生效"),
        ("宿主层", "permission 三档", "沙箱与审批成对")]
for a, b, c in rows:
    print("  %-8s %-18s %s" % (a, b, c))
print("  预设管装配, 不管权限")

实跑输出:

--------------------------------------------------------------------
为什么预设不是权限系统
--------------------------------------------------------------------
  把本章实测的三次改动横过来看:

  在哪一层改     改的是什么                      实测 diff
  --------------------------------------------------------------------
  预设内部       塞一条 sandbox-policy           宿主层那条**没动**
  宿主层         sandbox-policy 改 read-only     6 行,生效
  宿主层         permission 三档枚举             枚举本身是成对配好的
  --------------------------------------------------------------------

  权限的三档是 `read-only+ask`/`workspace-write+ask`/
  `danger-full-access+never`——**沙箱与审批成对写死**(4.5.1)。

  预设能决定【装哪些件】,决定不了【能踩多大范围】。
  **把两者混为一谈,等于把刹车装在方向盘上。**

管范围的那一件,根本不在预设里——这是从 dump 里数出来的事实,不是设计口号。 三档枚举的意义在于成对:3 种自洽搭配,好过 8 种一半矛盾的开关组合。 预设若能改权限,就等于会话给自己发通行证。

30 秒实验

  1. 在你自己的树里找 sandbox-policy、approval、permission 三件,看它们在不在预设里。
  2. 试着在预设内部加一条权限相关的件,dump 一下看宿主层变没变。
  3. 记住判据:管能力的是预设,管范围的是宿主。

常见误区

  1. 错误:在预设里写一条权限配置就能提权。——纠正:实测无效——树里两条并存,宿主层那条一个字没动。
  2. 错误:沙箱档位和审批策略可以各自随便配。——纠正:它们是成对的——三档枚举的意义就是不给乱配留空间。
  3. 错误:预设是【我的】,我喜欢怎么配都行。——纠正:预设是会话级的,权限是进程级的——层次差一级,权力也差一级。
自测三问(点开对答案) 1. 预设能决定什么、不能决定什么? —— 能决定**装哪些件、人格、暴露哪些工具**;不能决定**沙箱范围和要不要问人**——后两者在宿主层。 2. 权限三档为什么必须成对? —— 因为**三个自由开关有 8 种组合、一半自相矛盾**;成对枚举只剩 3 种,每一种都自洽。 3. 在预设里塞 sandbox-policy 的实测结果是? —— 树里**两条并存**,宿主层那条**没动**——所以预设不是权限系统。

相关笔记