@minonl/dia 0.0.0-stage → 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +253 -2
- package/bin/dia.js +5 -0
- package/dist/cli.js +7408 -0
- package/docs/acp-integration.md +136 -0
- package/docs/architecture.md +166 -0
- package/docs/cli.md +117 -0
- package/docs/dependency-registry.md +105 -0
- package/docs/deps.jsonl +7 -0
- package/docs/ecosystem-integration.md +155 -0
- package/docs/ecosystem-positioning.md +95 -0
- package/docs/entrypoints.md +83 -0
- package/docs/evolution-process.md +298 -0
- package/docs/history/framework-bootstrap.md +109 -0
- package/docs/host-control-surface.md +213 -0
- package/docs/index.md +80 -0
- package/docs/kit-install.md +339 -0
- package/docs/migrations/kb-golden.md +32 -0
- package/docs/migrations/llm-migration.md +49 -0
- package/docs/migrations/no-python.md +52 -0
- package/docs/migrations/yan-agent-current.md +52 -0
- package/docs/migrations/yan-agent-next.md +168 -0
- package/docs/migrations/yan-kb-parity.md +159 -0
- package/docs/migrations/yan-kb.md +120 -0
- package/docs/model-baseline-sidecar.md +220 -0
- package/docs/model-behavior.md +229 -0
- package/docs/monorepo.md +83 -0
- package/docs/overview.md +126 -0
- package/docs/patching.md +91 -0
- package/docs/persona-install.md +264 -0
- package/docs/platforms/index.md +66 -0
- package/docs/platforms/registry.json +54 -0
- package/docs/pricing.md +43 -0
- package/docs/proposals.md +76 -0
- package/docs/research/benchmarks-survey.md +96 -0
- package/docs/research/collaboration-theory.md +85 -0
- package/docs/research/dsh-superagent.md +97 -0
- package/docs/research/frameworks-survey-2.md +75 -0
- package/docs/research/h0/report.md +135 -0
- package/docs/research/h0/sample.json +34 -0
- package/docs/research/model-boundary-patterns.md +99 -0
- package/docs/research/opencode-session-scoping.md +84 -0
- package/docs/review/reuse-review.md +105 -0
- package/docs/review/verification-2026-10-28.md +49 -0
- package/docs/security/audits/2026-11-04.json +44 -0
- package/docs/security/credentials.md +95 -0
- package/docs/security/public-release.md +108 -0
- package/docs/security-sandbox.md +157 -0
- package/docs/status.md +157 -0
- package/docs/team-automation.md +169 -0
- package/docs/team.md +112 -0
- package/docs/versioning.md +226 -0
- package/docs/vision.md +161 -0
- package/package.json +45 -4
- package/packages/job/README.md +98 -0
- package/packages/job/bin/dia-job +1283 -0
- package/packages/job/config.example +5 -0
- package/packages/job/install.sh +37 -0
- package/packages/job/lib/config.sh +18 -0
- package/packages/job/lib/json.mjs +130 -0
- package/packages/job/lib/policy.sh +103 -0
- package/packages/job/package.json +10 -0
- package/packages/job/shim/yan-task +24 -0
- package/packages/job/tests/bootstrap.test.sh +115 -0
- package/packages/job/tests/install.test.sh +30 -0
- package/packages/job/tests/linux.test.sh +130 -0
- package/packages/job/tests/p2.test.sh +46 -0
- package/packages/job/tests/policy.test.sh +38 -0
- package/packages/wt/bin/dia-wt +1148 -0
- package/packages/wt/tests/check.test.sh +126 -0
- package/packages/wt/tests/clean.test.sh +126 -0
- package/packages/wt/tests/prune-merged.test.sh +169 -0
- package/packages/wt/tests/route.test.sh +112 -0
- package/packages/wt/tests/scope.test.sh +69 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# 复用评审(REUSE REVIEW)— 2026-10-28
|
|
2
|
+
|
|
3
|
+
> 触发:用户指出"思考过程有很多拿来主义,没有验证就决定复用"。
|
|
4
|
+
> 本文是**评审材料**,不是结论文档;裁决需团队评审(人 + 独立复核)后写入。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 规矩(先立后评)
|
|
9
|
+
|
|
10
|
+
任何外部能力(库/插件/协议/别人的引擎)默认是**假设**。进入主路径前必须有 REUSE ADR:
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
主张:我们要复用它做什么
|
|
14
|
+
证据级:A 源码/官方文档 / B 官方博客 / C 第三方 / D 传闻
|
|
15
|
+
本地探测:命令 + 原始输出(没跑就写"未验证")
|
|
16
|
+
失败模式:它坏了/变了/弃用了,我们怎么办
|
|
17
|
+
耦合代价:版本、许可证、维护者数量、退出成本
|
|
18
|
+
裁决:adopt / adapt / reject / defer(defer 必须写复查日期)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**闸门**:没有本地探测 → 只能 `defer`,不许进主路径。
|
|
22
|
+
**角色**:点子(选项)→ 爪子(probe)→ 炸毛(失败模式)→ 秤(复现)→ 大波(裁决)→ 人(批准)。
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. 本轮 probe 结果(可复现)
|
|
27
|
+
|
|
28
|
+
| # | 主张 | 命令 | 结果 | 证据级 |
|
|
29
|
+
|---|---|---|---|---|
|
|
30
|
+
| P1 | 抽 yan watchdog 引擎 | `cp -R watchdog /tmp && node --test test/*.test.js` | **失败**:硬编码 `~/Library/Application Support/yan-agent`、包名 `@example/dsh-watchdog`;`license` 字段缺失 | A |
|
|
31
|
+
| P2 | 生成 dsh bundle | 造 `~/.dsh/profiles/dia-probe/{package.json,cordis.patch.yml}` → `dsh --profile dia-probe --dump-config` | **通过**:patch 被正确组合(`dia-probe` 出现 5 次) | A |
|
|
32
|
+
| P3 | acpx 当 ACP 客户端 | `npm view acpx version license`;`npx -y acpx@0.21.1 --help` | **可用**:`0.21.1` / MIT;有 `--agent`、`--permission-policy`、`--non-interactive-permissions` | A |
|
|
33
|
+
| P4 | dsh ACP 端到端 | 查包 | 包存在(2 个),**未跑通 stdio 会话** | B |
|
|
34
|
+
| P5 | opencode 插件机制 | `opencode plugin list` | 可用;本地已有 `yan-oc-guard.ts`,其注释记录:**`permission.hook("evaluate")` 返回值不生效**,只能观测 | A |
|
|
35
|
+
| P6 | SKILL.md 跨家 | `ls ~/.agents/skills` | 目录存在(yan 的 skills),**未验证** opencode/dsh 实际发现 | C |
|
|
36
|
+
| P7 | 沙箱能力 | `sandbox-exec` 手工实验 | 网络阻断、写外拒绝、symlink 逃逸拒绝,均通过 | A |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 3. 裁决矩阵
|
|
41
|
+
|
|
42
|
+
| # | 复用项 | 证据 | Probe | 裁决 | 理由 / 复查 |
|
|
43
|
+
|---|---|---|---|---|---|
|
|
44
|
+
| R1 | dsh 文件沙箱 | A | —(README 明确只文件) | **adapt** | 只在 dsh 内复用;独立 CLI 需自带 wrapper(已实测 seatbelt) |
|
|
45
|
+
| R2a | yan watchdog 引擎(法律) | A | P1:**license 字段缺失** | **defer** | 无许可证不得复用;需作者补 license;复查 2026-11-04 |
|
|
46
|
+
| R2b | yan watchdog 引擎(工程) | A | P1:硬编码路径/包名 | **defer** | 解耦约 3 行 patch + 测试可移植;判据:patch 后跑通全部测试 |
|
|
47
|
+
| R3 | acpx(ACP 客户端) | A | P3 通过 | **adopt-with-constraints** | 只能由 `dia run` 启动;版本写死 v0.21.1;禁止不可信 `--cwd/--agent`;pre-1.0 |
|
|
48
|
+
| R4 | dsh bundle 生成 | A | P2 通过(仅组合) | **adopt(待运行时复验)** | 需再跑一次真实 profile 启动;否则只是"声明被组合" |
|
|
49
|
+
| R5 | opencode 观测插件 | A | P5 部分 | **adopt-as-observer** | 只做审计/观测(1 行 audit 为判据);拦截另立议题 |
|
|
50
|
+
| R6 | SKILL.md 跨家 | C | P6 未完成 | **defer** | 需在 opencode/dsh 各跑一次发现;复查 2026-11-04 |
|
|
51
|
+
| R7 | dsh ACP 端到端 | B | P4 未跑 | **defer** | 需要一次 stdio 会话(指纹/工具列表) |
|
|
52
|
+
| R8 | "无可执行插件 ABI" | C | — | **working assumption** | AgentPlugins/everyharness 存在但 <40★;季度复核 |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 4. 评审要回答的问题(给炸毛/秤)
|
|
57
|
+
|
|
58
|
+
1. R1 的"adapt"是否掩盖了"独立 CLI 根本没有沙箱"这个事实?我们是否应该直接拒绝非 dsh 场景的高危执行?
|
|
59
|
+
2. R2 的 defer 是否等于"永远不做"?如果 watchdog 解耦成本 > 重写成本,是否应该只抄 `engine.js` 的判定函数(约 500 行)而不是整包?
|
|
60
|
+
3. R3 采用 acpx 是否违反"零依赖"?它是外部可执行而非库,是否可接受?版本 pin 策略是什么?
|
|
61
|
+
4. R5 的 opencode 观测插件对我们的价值是什么?如果只能观测不能拦,是否值得做?
|
|
62
|
+
5. R6 如果 SKILL.md 只在部分宿主被发现,我们的包格式是否要改成"每个宿主一份 skills"?
|
|
63
|
+
6. 有没有被漏掉的复用项?(例如 `ticktick`/`cc-switch`/`rulesync`)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 6. defer 生命周期(评审后新增)
|
|
68
|
+
|
|
69
|
+
每条 defer 必须写:`revive_by`(日期)+ 一条命令级判据 + 负责人;**30 天未复活自动转 rejected**。
|
|
70
|
+
当前:
|
|
71
|
+
|
|
72
|
+
| 项 | revive_by | 复活判据 | 负责人 |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| R2a | 2026-11-04 | `package.json` 出现 license 字段 | 我 |
|
|
75
|
+
| R2b | 2026-11-04 | patch 路径后 `node --test` 全绿 | 我 |
|
|
76
|
+
| R6 | 2026-11-04 | opencode/dsh 各发现一次 `.agents/skills` 里的 SKILL.md | 我 |
|
|
77
|
+
| R7 | 2026-11-04 | `acpx exec --agent <dsh>` 跑通一次非交互会话 | 我 |
|
|
78
|
+
|
|
79
|
+
## 5. 评审记录(2026-10-28,独立复核)
|
|
80
|
+
|
|
81
|
+
**误报一条**:复核称"文档不存在"——因为它在 dabo 仓库目录执行 `ls`。实际文件在 `dia` 仓库,已提交 `cbf83b5`。
|
|
82
|
+
→ 流程修正:**评审必须声明仓库路径 + commit hash,并在结论里贴 `git -C <repo> ls-files` 输出。**
|
|
83
|
+
|
|
84
|
+
**接受的批评与修订**:
|
|
85
|
+
|
|
86
|
+
| # | 批评 | 修订 |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| 1 | R2 把"无 license(法律阻断)"和"硬编码路径(工程成本)"混成一个 defer | 拆成 **R2a 法律**(无 license → 不可复用,除非作者补 license)与 **R2b 工程**(路径/包名解耦,约 3 行 patch) |
|
|
89
|
+
| 2 | 4 条 defer 没有负责人/到期/复活条件 = 僵尸状态 | 新增 **defer 生命周期**:`revive_by` + 命令级判据 + 负责人;30 天未复活自动 `rejected` |
|
|
90
|
+
| 3 | R3 的 acpx 会形成**审计黑洞**(子进程继承权限,绕过 gate),且无 lockfile | R3 改为 **adopt-with-constraints**:只能由 `dia run` 启动(否则不计审计);版本写死;禁止把不可信输入拼进 `--cwd`/`--agent` |
|
|
91
|
+
| 4 | R4 只验证 `--dump-config`,没验证运行时加载 | 增加 probe:真实 `dsh --profile` 启动一次,确认 patch 生效(不只是组合) |
|
|
92
|
+
| 5 | R5 方向错:`permission.evaluate` 不生效只影响"拦截",不影响"观测" | R5 改为 **adopt-as-observer**:只要能写出 1 行 audit 即可;拦截另立议题 |
|
|
93
|
+
| 6 | R1 把"一条路径有隔离"表述成"有隔离" | 新增 **覆盖率表述**:`sandbox: dsh ✓ / CLI ✗(无隔离)`;doctor 必须显式输出 `sandbox: none`,不许沉默 |
|
|
94
|
+
| 7 | "推翻率 >20% 健康"会 Goodhart | 改为**配对指标**:`有效推翻 / (有效推翻 + 误报)`;单看推翻率不采纳(详见 evolution-process §4) |
|
|
95
|
+
| 8 | 信任度/意图漂移没有公式与事件 | 指标必须绑定事件与公式,否则不进表 |
|
|
96
|
+
|
|
97
|
+
**最致命的 3 条(接受)**:
|
|
98
|
+
1. R3 的审计黑洞(外部执行体绕过 gate);
|
|
99
|
+
2. R1 的沙箱表述失实;
|
|
100
|
+
3. defer 没有复活判据 = 假 pending。
|
|
101
|
+
|
|
102
|
+
- **可以进主路径**:R3(外部工具)、R4。
|
|
103
|
+
- **必须 defer**:R2、R5、R6、R7。
|
|
104
|
+
- **已有能力但要限定范围**:R1(仅 dsh 内)。
|
|
105
|
+
- **反面教材**:P5 的 `yan-oc-guard` 注释——"文档说能拦,实测返回值不生效";这正是本地探测的价值。
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# 独立验证报告 — 2026-10-28(pilot)
|
|
2
|
+
|
|
3
|
+
> 验证者:独立子 agent(只读仓库,不共享实现者上下文)。
|
|
4
|
+
> 结论:**26 项测试全绿,但发现 10 个问题,其中 2 个严重。**
|
|
5
|
+
|
|
6
|
+
## A. 三态结论
|
|
7
|
+
|
|
8
|
+
| # | 主张 | 结论 |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| 1 | 单元测试全绿 | 通过(26 pass) |
|
|
11
|
+
| 2 | build + version | 通过 |
|
|
12
|
+
| 3 | smoke | 通过 |
|
|
13
|
+
| 4 | E2E Node/Bun | 通过(9 段) |
|
|
14
|
+
| 5 | 审计对账 + gap | 通过 |
|
|
15
|
+
| 6 | 冻结四码 | 通过 |
|
|
16
|
+
| 7 | resume 卡片 | 通过 |
|
|
17
|
+
| 8 | 采集只读 | 通过(有保留:opencode WAL 无法归因) |
|
|
18
|
+
| 9 | 文档存在/链接/YAML | **不通过**(断引用、文档与实现不一致) |
|
|
19
|
+
| 10 | 静态安全 | 通过(但测试有盲区) |
|
|
20
|
+
|
|
21
|
+
## B. 发现并已修的问题
|
|
22
|
+
|
|
23
|
+
| # | 问题 | 修复 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| P1 | **冻结 fail-open**:`freeze.json` 损坏时 `status()` 返回未冻结,一行 JSON 即可解除闸口 | 改为 fail-closed:解析失败 → `frozen:true` + reason;新增测试 |
|
|
26
|
+
| P2 | **resume 跨会话泄漏**:使用全局快照,A 会话的 cwd 会出现在 B 会话 | 快照按 session 校验,不匹配则忽略;新增测试 |
|
|
27
|
+
| P7 | 对账 `n >= expected` 可被多余行掩盖 | 改为精确相等,新增 `extra` 字段;新增测试 |
|
|
28
|
+
| P10 | 已存在的 `freeze.json` 权限可能残留 644 | 写入后强制 `chmod 600` |
|
|
29
|
+
| P5 | 静态测试不递归、未覆盖 `execFileSync` | 递归遍历 + 断言仅允许 `execFileSync("git"` |
|
|
30
|
+
| P6 | 死测试 `tests/run.sh`(0 tests)与 `__pycache__` | 删除 |
|
|
31
|
+
|
|
32
|
+
**测试数:26 → 29 全绿。**
|
|
33
|
+
|
|
34
|
+
## C. 尚未修(已记录)
|
|
35
|
+
|
|
36
|
+
| # | 问题 | 处理 |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| P3 | docs 多次提到 `doctor`,但命令不存在 | 文档已标"待实现";实现后再改回 |
|
|
39
|
+
| P4 | docs 声称"快照打包 session 文件",实际只写元数据 | 文档已改为现状;`VACUUM INTO`/WAL 处理待实现 |
|
|
40
|
+
| P8 | `docs/research/system-survey.md`、`hypotheses.md` 在 dia 仓库不存在 | 改为外部引用(dabo-agent 仓库) |
|
|
41
|
+
| P9 | README 说公开 npm,但 `private: true` | README 已注明"发布前需移除" |
|
|
42
|
+
| — | opencode 真实源只读无法归因(WAL 变化) | 待 opencode 空闲时复测,或改用 `immutable=1` |
|
|
43
|
+
|
|
44
|
+
## D. 团队指标(第一条数据)
|
|
45
|
+
|
|
46
|
+
- 独立验证发现的问题:**10 个**;
|
|
47
|
+
- 其中实现者测试未覆盖的严重问题:**2 个**(P1/P2);
|
|
48
|
+
- 独立验证发现率:本轮 **100%**(因为实现者自测全绿,问题全部来自独立验证)。
|
|
49
|
+
- 结论:**"实现者 ≠ 验证者"这条规则应立即固化为门禁。**
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"verdict": "blocked",
|
|
3
|
+
"scope": "working tree (pre-public redaction)",
|
|
4
|
+
"findings": [
|
|
5
|
+
{
|
|
6
|
+
"id": "TREE-01",
|
|
7
|
+
"severity": "P1",
|
|
8
|
+
"area": "tree",
|
|
9
|
+
"evidence": "公司名与内部域名出现在 docs/overview.md、docs/vision.md、experiments/*、packages/wt/{bin,tests}、docs/research/h0/*",
|
|
10
|
+
"fix": "已全部替换为通用占位:工作域 / example.com / example-repo / example-user / example-service"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"id": "TREE-02",
|
|
14
|
+
"severity": "P2",
|
|
15
|
+
"area": "docs",
|
|
16
|
+
"evidence": "research/h0 样本含工作域任务名(业务知识)",
|
|
17
|
+
"fix": "任务名改为示例名(example-service / example-repo);其余保留为方法论样例"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "PKG-01",
|
|
21
|
+
"severity": "P3",
|
|
22
|
+
"area": "package",
|
|
23
|
+
"evidence": "dist 无 source map;npm 包 files 仅 bin/dist/packages/docs/README",
|
|
24
|
+
"fix": "无需处理"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "HIST-01",
|
|
28
|
+
"severity": "P1",
|
|
29
|
+
"area": "history",
|
|
30
|
+
"evidence": "git log -S 命中 3 个历史提交仍含内部域名/公司名",
|
|
31
|
+
"fix": "未处理:需要重建历史(孤儿提交)并向 GitHub 申请 GC"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"checks": {
|
|
35
|
+
"tree_redaction": "pass",
|
|
36
|
+
"tests": "287 tests / 40 files pass",
|
|
37
|
+
"credentials_scan": "pass(无 token/私钥/真实邮箱;命中的 PRIVATE KEY 为正则定义)",
|
|
38
|
+
"sourcemaps": "pass(无)",
|
|
39
|
+
"metadata": "pass(description 为通用描述,topics 为空)"
|
|
40
|
+
},
|
|
41
|
+
"history_clean": false,
|
|
42
|
+
"public_ready": false,
|
|
43
|
+
"note": "本报告为自查(非独立审核);按 public-release.md §1-8,公开前仍需独立 dia-security pass + 历史重建"
|
|
44
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# 凭据管理(现状 + 调研待办)
|
|
2
|
+
|
|
3
|
+
> 2026-11-03。**待调研**,不是方案定稿。触发:bw CLI 已用于入库,但"按账号分组"决定放行粒度,
|
|
4
|
+
> 个人 vault 内容过多、风险集中;需要找更合适的用法或替代。
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. 现状
|
|
9
|
+
|
|
10
|
+
| 项 | 现状 |
|
|
11
|
+
|---|---|
|
|
12
|
+
| 存储 | `~/.env.leyan`(网关 key)、`~/.env.leyan-tokens`(脚本凭据),600 明文 |
|
|
13
|
+
| 入库 | Bitwarden(`bw` CLI) |
|
|
14
|
+
| 使用 | `dia env list/check/run`:白名单键 → 子进程环境;不回显、`--redact`、密钥不进 argv |
|
|
15
|
+
| 约束 | 明文文件**不是**机密性边界(同一 OS 用户下的 agent 可读),只是"防误入 repo/日志/备份" |
|
|
16
|
+
|
|
17
|
+
## 2. 问题(为什么要继续找办法)
|
|
18
|
+
|
|
19
|
+
1. **放行粒度 = 账号 / collection 分组**:bw 的访问控制跟着账号走,没法对"某个 agent、某次任务"单独授权。
|
|
20
|
+
2. **爆炸半径大**:个人 vault 内容多,一次解锁等于全量暴露;agent 拿到的会话能读到的远多于它需要的。
|
|
21
|
+
3. **无调用审计**:bw 侧看不到"哪个任务取了哪个键",dia 侧只看得到注入动作。
|
|
22
|
+
4. **解锁即长期有效**:`bw unlock` 的 session 是令牌,落在环境里就有泄漏面。
|
|
23
|
+
|
|
24
|
+
## 3. 硬约束(不能破)
|
|
25
|
+
|
|
26
|
+
- 凭据值不进 repo / 日志 / 截图 / URL / argv;只走白名单键注入。
|
|
27
|
+
- 每个任务只能拿它声明的键;越权即失败(显式,不静默回退)。
|
|
28
|
+
- 取用要可审计:谁、什么时候、拿了哪个键(不记值)。
|
|
29
|
+
- 失效要大声:缺键 / 解锁失败 → 非 0 退出并给修复命令。
|
|
30
|
+
|
|
31
|
+
## 4. 候选方向(待调研,未选型)
|
|
32
|
+
|
|
33
|
+
| 方向 | 要点 | 待验证 |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| bw 会话收敛 | 只在 `dia env run` 进程内 unlock,子进程退出即失效;按 collection 拆个人/工作 | `bw unlock --raw` 生命周期;是否支持按项读取 |
|
|
36
|
+
| OS 级隔离 | macOS Keychain / Linux Secret Service,按条目授权 | 跨平台一致性;agent 进程的访问控制粒度 |
|
|
37
|
+
| 分级密钥库 | 敏感域(家庭库)独立 vault / 独立 passphrase | 与 §3 审计线的组合 |
|
|
38
|
+
| 引用而非值 | SOPS / age / Infisical / Vault:配置里只放引用,运行时解析 | 离线可用性、CI 场景、轮换成本 |
|
|
39
|
+
| 短时令牌 | 临时 STS / 短 TTL token 替代长期 key | 各上游是否支持;失败重试策略 |
|
|
40
|
+
|
|
41
|
+
## 5. 调研清单(下一步)
|
|
42
|
+
|
|
43
|
+
1. 读 bw CLI 官方文档 + 社区实践:session 生命周期、`--raw`、组织/collection 权限模型。
|
|
44
|
+
2. 对照开源方案(Infisical、Vault、SOPS/age)在"单机 + agent"场景的最小可用形态。
|
|
45
|
+
3. 找公开的 agent 凭据实践(最小权限、短时凭据、审计)作为判据参考。
|
|
46
|
+
4. 产出一页选型对比 + 一个能跑的 POC 判据(例:`dia env run` 只拿到声明的 2 个键,未声明的键读取失败且有审计行)。
|
|
47
|
+
|
|
48
|
+
> 结论落地前,继续沿用现有 `dia env` 白名单注入;**不要在调研期引入第二套凭据路径**。
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 6. 调研摘要(2026-11-04)
|
|
53
|
+
|
|
54
|
+
> 来源:Bitwarden 官方 CLI 文档、trustless 的两篇 bw 自动化笔记、awesomecli 的 agent 指南、社区实践。结论只取可验证的行为约定。
|
|
55
|
+
|
|
56
|
+
**关键事实(会决定方案)**
|
|
57
|
+
|
|
58
|
+
1. **`BW_SESSION` 是 bearer 凭据**:拿到它就等于拿到该账号可见的全部 vault;只能放环境变量,**不能进 argv**(`ps`/`/proc/<pid>/cmdline` 同用户可读)。
|
|
59
|
+
2. **每次 `bw unlock` 会让之前所有 session key 失效**——多个任务各自 unlock 会互相踢掉。这条直接否掉"每个 task 自己解锁"。
|
|
60
|
+
3. `bw lock` 只锁不解登;`bw logout` 才结束身份。无人值守脚本结束应 `lock`(共享机用 `logout`)。
|
|
61
|
+
4. `bw serve` 等于把 vault 能力开成常驻本地服务,只在完全可控的机器上用。
|
|
62
|
+
5. 官方提供 `--passwordenv` / `--passwordfile`;API key 登录可给自动化独立身份与轮换周期,避免用人的主密码。
|
|
63
|
+
|
|
64
|
+
**对我们问题的直接含义**
|
|
65
|
+
|
|
66
|
+
- "按账号分组"不是实现问题,是 bw 的访问模型:**会话粒度 = 账号**。要任务级最小权限,必须自己做 broker,而不是给 agent 一个 `bw` 会话。
|
|
67
|
+
- 因此候选方向收敛为:**单 broker 进程持有唯一 session**(它负责 unlock/lock、按请求只返回声明的键),agent 侧永远拿不到 `BW_SESSION`。
|
|
68
|
+
- 这也解释了为什么"每次放行靠账号分组"体验差:粒度根本不在 bw 这一层。
|
|
69
|
+
- 备选(成本从低到高):短时令牌优先于长期 key;敏感域独立 vault;引用式(SOPS/age/Vault)只在 CI/无交互场景更合适。
|
|
70
|
+
|
|
71
|
+
**POC(2026-11-04 已实现,含常驻 broker)**
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
dia env bw unlock [--passwordfile P] # session 落 0600,不回显
|
|
75
|
+
dia env bw status # unauthenticated/locked/unlocked
|
|
76
|
+
dia env bw run --map DB_PASS=db-item -- <cmd…>
|
|
77
|
+
dia env bw lock # 同时清本地 session
|
|
78
|
+
dia env bw serve # 常驻 broker(unix socket 0600)
|
|
79
|
+
dia env bw get --item db --task t-1 # 走 broker,写审计行
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
实现约束:`BW_SESSION` 只存在于 bw 子进程环境;映射外的键一律不注入;任一条取不到 → 不执行命令(fail-closed)。
|
|
83
|
+
|
|
84
|
+
**审计**:`bw.jsonl` 记录每次取用(含失败);`DIA_BW_AUDIT_CHAIN=1` 时成功取用同时写入主审计链(`tool=bw`,只记键名)。
|
|
85
|
+
|
|
86
|
+
**与 `dia env run` 合并**:`dia env run --bw KEY=item -- <cmd…>`,白名单键与 vault 映射一起注入;子进程永远看不到 `BW_SESSION`。
|
|
87
|
+
|
|
88
|
+
**常驻化**:`packaging/launchd/` 有 broker 的 launchd 模板(RunAtLoad + KeepAlive);前置是先 `dia env bw unlock`。
|
|
89
|
+
|
|
90
|
+
**判据(POC 验收)**
|
|
91
|
+
|
|
92
|
+
1. agent 进程环境里**没有** `BW_SESSION`;
|
|
93
|
+
2. 只能取到任务声明的 N 个键,未声明的键请求即失败(fail-closed,非空返回);
|
|
94
|
+
3. 同一时刻起 3 个任务不会互相踢掉会话(单 broker 持有);
|
|
95
|
+
4. 每次取用留一行审计(谁/哪个任务/哪个键,不含值)。
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# dia Public Release Gate
|
|
2
|
+
|
|
3
|
+
> 状态:**BLOCKED until audit**(2026-10-30)
|
|
4
|
+
>
|
|
5
|
+
> 2026-11-04 更正:**发 npm 不需要仓库公开**(Trusted Publishing 对私有仓可用);只有 **provenance** 需要公开仓。
|
|
6
|
+
> 所以「发 npm」与「转公开」不是同一道门:私有仓可先发不带 provenance 的版本,公开后再补 provenance。
|
|
7
|
+
> 适用:把 `minonl/dia` 从 private 改为 public 之前。任何一项失败都不得公开。
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 1. 硬门禁
|
|
12
|
+
|
|
13
|
+
| # | 项 | 通过条件 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| 1 | 当前树脱敏 | 无凭据、PII、公司/内部域名、家目录、内部仓库链接、业务知识 |
|
|
16
|
+
| 2 | Git 历史清洁 | 所有 ref 可达历史扫描通过;旧敏感对象不可达;tags/releases 已清理 |
|
|
17
|
+
| 3 | GitHub 元数据 | 仓库描述、topics、Actions 日志、releases、issues/PR、wiki 无内部信息 |
|
|
18
|
+
| 4 | 配置 | provider/baseURL/token 全部走 env 或通用占位符,无硬编码 |
|
|
19
|
+
| 4b | 运行时 | 无 Python 依赖;`packages/job` 的 JSON 层迁到 Node/Bun(见 `docs/migrations/no-python.md`) |
|
|
20
|
+
| 5 | 打包 | `private` 仅在 audit 通过后移除;lockfile/registry 无私有源;无 source map 泄漏 |
|
|
21
|
+
| 6 | 文档 | 内部迁移文档移出 public 仓或脱敏;示例全部通用化 |
|
|
22
|
+
| 7 | 政策文件 | `LICENSE`、`SECURITY.md`、漏洞报告渠道就绪 |
|
|
23
|
+
| 8 | 独立审核 | `dia-security` agent 出 `pass` 报告 + 人工签字;自签无效 |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## 2. 安全审核 agent
|
|
28
|
+
|
|
29
|
+
定义:`team/agents/dia-security.md`。只读、不得改文件、不得执行写操作。
|
|
30
|
+
|
|
31
|
+
输出必须是 JSON:
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"verdict": "pass|blocked|unknown",
|
|
36
|
+
"scope": "commit/tag",
|
|
37
|
+
"findings": [
|
|
38
|
+
{"id": "...", "severity": "P0|P1|P2|P3", "area": "tree|history|metadata|config|package|docs", "evidence": "...", "fix": "..."}
|
|
39
|
+
],
|
|
40
|
+
"history_clean": true,
|
|
41
|
+
"public_ready": false
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
规则:
|
|
46
|
+
|
|
47
|
+
- 任一 P0/P1 → `blocked`;
|
|
48
|
+
- 无法扫描(缺工具/权限/历史不完整)→ `unknown`,不得算通过;
|
|
49
|
+
- 发现即记录证据文件 `docs/security/audits/<date>.json`(不含 secret 原文)。
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. 扫描清单(通用模式)
|
|
54
|
+
|
|
55
|
+
> 文档不写具体公司词;审核时用内部词表,不把词表提交进 public 仓。
|
|
56
|
+
|
|
57
|
+
### 3.1 当前树
|
|
58
|
+
|
|
59
|
+
- 凭据形态:API key/token/私钥/`.env`/`opencode.db`/`session*.jsonl`
|
|
60
|
+
- 内部标识:公司名、内部域名、内部仓库 URL、工号、组织 ID
|
|
61
|
+
- 个人信息:`/Users/<name>`、`/home/<name>`、邮箱、手机号
|
|
62
|
+
- 业务知识:工作域规则、客户/商品/组织数据、内部项目名
|
|
63
|
+
- 配置:硬编码 provider/baseURL/token;测试夹具中的真实值
|
|
64
|
+
|
|
65
|
+
### 3.2 Git 历史
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
git rev-list --all --count
|
|
69
|
+
git log --all --oneline
|
|
70
|
+
git log --all -p | <scanner>
|
|
71
|
+
git rev-list --all --objects | <object-scanner>
|
|
72
|
+
git tag -l
|
|
73
|
+
git for-each-ref
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
- 旧敏感 commit 必须不可达(重建历史或 filter-repo);
|
|
77
|
+
- force push 后仍需向 GitHub Support 申请 GC/purge,避免缓存对象;
|
|
78
|
+
- 检查 tags/releases/annotations,不只 branch。
|
|
79
|
+
|
|
80
|
+
### 3.3 GitHub 元数据
|
|
81
|
+
|
|
82
|
+
- repo description/topics
|
|
83
|
+
- Actions run logs 与 artifacts
|
|
84
|
+
- Releases / tags / packages
|
|
85
|
+
- Issues / PR / wiki / discussions
|
|
86
|
+
- Deploy keys / webhooks / collaborators(公开前最小化)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 4. 公开顺序
|
|
91
|
+
|
|
92
|
+
1. 当前树脱敏 + 测试全绿;
|
|
93
|
+
2. 重建/过滤历史;本地 `git grep` + 全历史扫描通过;
|
|
94
|
+
3. 安全审核 agent 出报告;人工复核签字;
|
|
95
|
+
4. force push + 申请 GitHub GC;
|
|
96
|
+
5. 再扫一次远端 HEAD 与 tags;
|
|
97
|
+
6. 最后才把 visibility 改为 public。
|
|
98
|
+
|
|
99
|
+
任何一步发现敏感项:回到 1,不跳过。
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 5. 当前状态
|
|
104
|
+
|
|
105
|
+
- `dia` 历史已于 2026-10-30 重建为单提交(当前仓库继续追加干净提交);
|
|
106
|
+
- 2026-11-04:当前树脱敏完成(工作域/内部域名/项目名 → 通用占位),287 tests 全绿;见 `audits/2026-11-04.json`;
|
|
107
|
+
- 仍待完成:历史重建(3 个提交含内部名)、独立审核报告;
|
|
108
|
+
- 因此**当前不得转 public**。
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# Sandbox 细化设计(dia)
|
|
2
|
+
|
|
3
|
+
> 日期 2026-10-28。依据:dsh 本机源码实测、Hermes/Pi 取证、[/tmp/dia-sbx 实验]。
|
|
4
|
+
> 结论先行:**dia 不自建策略引擎**——复用 yan `dsh-watchdog` 的规则引擎;dia 只补它缺的三块:
|
|
5
|
+
> **网络默认关、状态目录保护、fail-closed 断言**。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 三家对照(都实测/源码级)
|
|
10
|
+
|
|
11
|
+
| 维度 | dsh | Hermes | Pi | **dia 目标** |
|
|
12
|
+
|---|---|---|---|---|
|
|
13
|
+
| 文件隔离 | seatbelt / bwrap / landlock / win ACL,**fail-closed** | local 无;Docker 有 | 无内建;示例扩展 | 复用 dsh |
|
|
14
|
+
| 网络 | **不在 seam 词汇里**(原文:no network/process/syscall/credential restrictions) | local 不限;Docker 默认有网 | 扩展白名单;失败静默降级 | **dia 自建 offline profile** |
|
|
15
|
+
| 进程/凭据 | 不管 | 不管(env 靠猜名字 → CVE-2026-9368) | 扩展同进程同权限 | env 白名单 + 明确不做进程隔离 |
|
|
16
|
+
| 审批对象 | — | 命令字符串 | 原始字符串,执行前还会被改写 | **argv hash 冻结** |
|
|
17
|
+
| 策略位置 | 部署配置 | 配置文件(`~/.hermes/config.yaml` 硬拒写) | 工作区内可写(被约束方可改) | 数据根只读 |
|
|
18
|
+
| 失败模式 | fail-closed(`SANDBOX_UNAVAILABLE`) | 双路径绕过 | **fail-open**(不支持就裸跑) | fail-closed + 显式逃生口 |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 2. 威胁模型
|
|
23
|
+
|
|
24
|
+
| # | 威胁 | 现状 | 对策层 |
|
|
25
|
+
|---|---|---|---|
|
|
26
|
+
| T1 | 写工作区外(含 symlink 逃逸) | dsh 可挡(实测 seatbelt 解析真实路径) | OS 文件 |
|
|
27
|
+
| T2 | 出网外传(curl/git/webhook/DNS) | **dsh 不管** | dia offline profile |
|
|
28
|
+
| T3 | 读凭据(`~/.ssh`、`**/.env*`) | watchdog 红线可挡;dsh 文件模式可挡 | 策略 + OS |
|
|
29
|
+
| T4 | 篡改安全状态(audit/freeze/policy) | 无保护 | OS 只读 + 位置隔离 |
|
|
30
|
+
| T5 | 审批面 ≠ 执行面 | 三家都出过 | argv hash 冻结 |
|
|
31
|
+
| T6 | 第二执行路径(code tool/MCP/插件) | Hermes/Pi 都栽在这 | 单 seam 原则 |
|
|
32
|
+
| T7 | 审计缺失/可改 | 部分有 | append-only + 对账 |
|
|
33
|
+
| T8 | 凭据进子进程 env | Hermes CVE | env 白名单 |
|
|
34
|
+
|
|
35
|
+
**明确不做**:进程可见性隔离、内核级 syscall 过滤、多用户隔离、容器编排。这些交给容器/microVM;文档必须写明。
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 3. 执行 seam(唯一入口)
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
所有工具调用
|
|
43
|
+
├─ 在 dsh 内:dsh tool dispatch → watchdog pre-execute(决策/记账)→ dsh sandbox(文件)
|
|
44
|
+
└─ 在 CLI/脚本:dia run → freeze 闸口 → dia policy(watchdog engine)→ OS wrapper → 子进程
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**单 seam 硬规则**:
|
|
48
|
+
|
|
49
|
+
1. 任何"直接 spawn 子进程"的工具都属于违例(Hermes 的 `execute_code` 就是反例)。
|
|
50
|
+
2. MCP/插件新增的执行能力必须先过同一 Policy 接口,否则注册被拒(测试断言)。
|
|
51
|
+
3. `dia run` 是脚本侧唯一入口;绕过它的执行不在审计范围内——**文档与 doctor 都要标出来**。
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## 4. 策略模型
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
# ~/.local/state/dia/policy.yaml(600,agent 不可写)
|
|
59
|
+
file:
|
|
60
|
+
mode: read-only # read-only | workspace-write | full(默认 read-only)
|
|
61
|
+
workspace: session-cwd # 每会话一个根,不支持额外可写根(对齐 dsh)
|
|
62
|
+
network:
|
|
63
|
+
mode: off # off | allowlist | on(默认 off)
|
|
64
|
+
allowlist: [] # 域名;经代理,非直连
|
|
65
|
+
env:
|
|
66
|
+
mode: allowlist # 只透传显式声明的变量
|
|
67
|
+
allow: [PATH, HOME, LANG, TMPDIR]
|
|
68
|
+
approval:
|
|
69
|
+
freeze_argv_hash: true # 批准时冻结,执行前校验
|
|
70
|
+
unattended: deny # cron/webhook 无人值守默认拒绝
|
|
71
|
+
redline:
|
|
72
|
+
paths: ["~/.ssh/**", "~/.aws/**", "**/.env*", "**/*.pem"]
|
|
73
|
+
commands: ["rm -rf /", "mkfs*", "dd of=/dev/*"]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**优先级**:session 只能**收紧**,不能放宽部署默认;项目级规则同样只收紧。
|
|
77
|
+
策略文件在数据根,agent 的沙箱必须对它**只读**(否则就是 Pi 的坑:被约束方能改策略)。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 5. OS 包装(本机实测)
|
|
82
|
+
|
|
83
|
+
| 平台 | 文件 | 网络 | 实测 |
|
|
84
|
+
|---|---|---|---|
|
|
85
|
+
| macOS | `sandbox-exec` profile(deny file-write* + allow subpath workspace/tmp) | `(deny network*)` | 写外拒、symlink 逃逸拒、curl 000 |
|
|
86
|
+
| Linux | bwrap / landlock-run(复用 dsh 后端) | `unshare -n` 或 bwrap `--unshare-net` | 未验证(无 Linux 机器) |
|
|
87
|
+
| 都没有 | **拒绝高危执行**(exit 30 + degraded_reason) | 同上 | 待实现 |
|
|
88
|
+
|
|
89
|
+
实测命令与结果:
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
sandbox-exec -p '(version 1)(deny network*)(allow default)' curl https://example.com → 000
|
|
93
|
+
sandbox-exec -p '(deny file-write*)(allow file-write* (subpath "/tmp/dia-sbx")) ...' → 外部 Operation not permitted
|
|
94
|
+
通过 symlink 写外部 → 拒绝
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 6. 状态保护
|
|
100
|
+
|
|
101
|
+
| 状态 | 位置 | 保护 |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| audit | `~/.local/share/dia/audit/` | append-only;沙箱只读 |
|
|
104
|
+
| freeze | `~/.local/state/dia/freeze.json` | 600;沙箱只读;guard 在沙箱外 |
|
|
105
|
+
| policy | `~/.local/state/dia/policy.yaml` | 只读;哈希校验 |
|
|
106
|
+
| calls | `~/.local/share/dia/runtime/` | append-only |
|
|
107
|
+
|
|
108
|
+
**断言**:`workspace-write` 模式下,尝试写上述路径必须失败(测试用例;待实现)
|
|
109
|
+
`danger-full-access` 模式下 dia 必须**拒绝启动**(否则状态可被篡改)。
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## 7. 审批与逃生口
|
|
114
|
+
|
|
115
|
+
- 审批时冻结:`argv + cwd + env 白名单 + wrapper` 的 hash;执行前重算,不一致即拒绝(T5)。
|
|
116
|
+
- 审批展示的内容必须逐字节等于执行内容;禁止审批后改写 input(Pi/Hermes 都栽过)。
|
|
117
|
+
- 逃生口只有两个:`--full-access`(需 `--i-am-human` + 记录 + 高 risk)和 waiver(限时/限任务)。
|
|
118
|
+
- **hardline 地板**:`rm -rf /`、写裸设备、fork bomb 连 `--full-access` 都拒绝(抄 Hermes)。
|
|
119
|
+
- 无人值守(launchd/cron):默认 `deny`,必须有显式 `allow_unattended: true`。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 8. 与 watchdog 的关系(复用,不重写)
|
|
124
|
+
|
|
125
|
+
| 能力 | 归属 |
|
|
126
|
+
|---|---|
|
|
127
|
+
| 路径/程序/命令判定、红线、五层规则 | **yan `dsh-watchdog`**(已有 23 个测试) |
|
|
128
|
+
| 审计格式(脱敏、按天滚动) | watchdog 的 `audit-YYYY-MM-DD.jsonl`;dia 读取并对账 |
|
|
129
|
+
| 网络 offline profile | **dia 新增**(watchdog 没有) |
|
|
130
|
+
| 状态目录只读断言 | **dia 新增** |
|
|
131
|
+
| freeze / guard / resume | **dia 新增**(watchdog 无冻结态) |
|
|
132
|
+
| 统一 seam 断言(禁止第二路径) | **dia 新增**(静态检查 + 运行时断言) |
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 9. 测试矩阵(可执行)
|
|
137
|
+
|
|
138
|
+
| # | 用例 | 期望 | 状态 |
|
|
139
|
+
|---|---|---|---|
|
|
140
|
+
| S1 | 写工作区外 | exit≠0 / Operation not permitted | ✅ 手工实测 |
|
|
141
|
+
| S2 | symlink 逃逸 | 拒绝 | ✅ 手工实测 |
|
|
142
|
+
| S3 | offline 下 curl | 失败(000/连接拒绝) | ✅ 手工实测 |
|
|
143
|
+
| S4 | 写 audit/freeze 目录 | 拒绝 | ⏳ 待实现 |
|
|
144
|
+
| S5 | 未知 sandbox 模式 | 拒绝执行(fail-closed) | ⏳ |
|
|
145
|
+
| S6 | 审批后改 argv | 拒绝(hash 不符) | ⏳ |
|
|
146
|
+
| S7 | 沙箱不可用 + 高危命令 | exit 30,不裸跑 | ⏳ |
|
|
147
|
+
| S8 | 子进程 env 含 token | 被剥离 | ⏳ |
|
|
148
|
+
| S9 | 绕过 `dia run` 直接执行 | doctor 报覆盖率缺口 | ⏳ |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 10. 诚实边界(写进文档与 doctor)
|
|
153
|
+
|
|
154
|
+
1. 同 OS 用户下,agent 若拿到 `bash` 且不在沙箱内,能改任何文件——**语言与权限位都不是边界**。
|
|
155
|
+
2. dsh sandbox 只约束文件;网络必须 dia 自己关,关不掉就拒绝,不许"降级放行"。
|
|
156
|
+
3. 进程可见性、syscall、凭据内存隔离不做;需要请上容器/microVM(Hermes 的 Docker 旗标清单可抄)。
|
|
157
|
+
4. 审计只覆盖经过 seam 的调用;"全覆盖"在单机同用户条件下是**不可证明**的,只能对账。
|