ΓDocsInteractiveNet

17 · 安全模型与审计

目标:明确 Ainet 的信任边界、已实现的控制、已知缺口与渗透测试清单。 不是“已通过安全认证”的声明;发布前仍需外部审计。

17.1 信任边界

User / App
  │  token (shared secret)
  ▼
Coordinator ── NDJSON/TCP + optional mTLS ──▶ Cell Worker
  │                              │
  │                              ├─ EffectBus: LLM / HTTP / shell / human
  │                              └─ cell state;effects 委托 coordinator ledger
  ▼
Audit (hash) / Budget ledger

假设:

  • cell 集群与 flow 调度器都支持 mTLS(--tls-cert/--tls-key/--tls-ca)。
  • 共享 secret 由部署者分发;不暴露给 Agent。
  • Agent 产生的文本/工具参数是不可信数据,不是指令。
  • Worker 执行受信代码(我们的 runtime + 受控 adapter);用户自定义规则未来进 WASM。

17.2 已实现的控制

控制 实现 测试
mTLS(cell + flow) rustls 双向证书;server/client 均由同一 CA 签发 mtls_cell_cluster_round_trip、mtls_flow_scheduler_round_trip
Transport token 每个 RPC 检查共享 token token_is_enforced_for_cells
per-cell capability v1:<run>:<epoch>:<HMAC>;worker spawn 校验 MAC;deliver/snapshot/remove 精确匹配 hmac_capabilities_are_verified、capability_is_enforced_and_revocable
撤销 revoke 增加 epoch + SetCapability;旧 cap 立即失效 cluster_revoke_updates_capability_and_keeps_running
远程消息幂等 (run,id) + (run,channel) seq/dedupe/gap duplicate_envelopes_are_dropped、channel_sequence_rejects_gaps_and_dedupes_old
effect 幂等 worker 委托 coordinator;run:cell:op:input_hash ledger + NDJSON;--run-id/--effect-ledger effect_cache_prevents_duplicate_calls、effect_ledger_reuses_results_across_coordinator_restarts
shell allowlist 只允许 echo/printf(默认);argv 数组,无 shell 拼接 shell_effect_runs_allowlisted_command、..._rejects_unlisted_command
HTTP 出站 allowlist AIN_HTTP_ALLOW 逗号前缀;with_allowlist http_effect_respects_allowlist
预算/队列上限 token/$/steps;with_queue_limit + per-destination with_cell_queue_limit 背压 budget_exceeded、queue_limit_applies_backpressure、cell_queue_limit_applies_backpressure
审计哈希 audit_hash = sha256(events) hmac... 测试断言非空
迁移/故障 last-ack failover;不会静默丢状态(at-least-once) killing_a_node...、...rejoined

17.3 威胁与缓解

T1 越权调用 cell / 伪造消息

  • 控制:token + per-cell HMAC capability + deliver 精确匹配。
  • 残余:持有 client 证书与 secret 的内部人可伪造;证书/secret 的签发与轮换仍需 KMS。
  • 渗透测试:篡改 capability、重放旧 cap、跨 run 复用。

T2 Prompt injection 诱导 Agent 调用工具/外泄

  • 控制:端口即能力——Agent 只能沿已连接的 capability 端口发消息;没有全局工具表;shell/HTTP 有 allowlist。
  • 残余:Agent 可能把敏感数据发给已授权的 LLM/HTTP 端点;需要数据分级/策略 cell。
  • 建议:敏感数据打 provenance 标签;出口策略检查;人工审批 gate。

T3 SSRF / 任意 HTTP

  • 控制:AIN_HTTP_ALLOW 前缀 allowlist;默认空 = 不限制(开发)。
  • 残余:生产必须设置 allowlist;前缀匹配可被相似域名绕过(如 https://api.example.com.evil)。
  • 改进:URL 解析后按 host/scheme/port 精确匹配,禁止私网 IP(需保留 localhost 测试模式)。

T4 Shell 注入

  • 控制:只执行 allowlist 命令;参数用 argv 数组,不经过 shell;默认只有 echo/printf。
  • 残余:允许的命令若支持危险参数(如 printf 格式化)仍可能滥用;生产应使用专用工具而非 shell。

T5 Worker 被攻陷

  • 控制:token/HMAC、mTLS、审计、预算;worker 只持有自己 cell 的状态。
  • 残余:被攻陷 worker 可伪造 ack/结果;mTLS 只证明身份,不保证行为正确;v1 没有拜占庭容错。
  • 改进:结果签名、复制执行/校验、WASM 沙箱。

T6 DoS / 资源耗尽

  • 控制:queue_limit + cell_queue_limit 背压;预算/step 上限;shell/HTTP 超时(部分)。
  • 残余:有 per-destination 队列 credit,但无 per-cell in-flight/CPU/内存配额;LLM 长尾仍可能占满 worker。

T7 审计篡改

  • 控制:audit_hash 可对外锚定;--save-audit 落盘。
  • 残余:无 per-event hash chain/签名;本地文件可被改。

17.4 未实现 / 发布前必须补

  • 密码学 capability 的密钥管理:secret 目前在 CLI/环境变量;需要 KMS/Vault 轮换。
  • effect 事务窗口:provider 调用成功、ledger 尚未落盘时崩溃,重启后可能重复调用;需要 provider 幂等键/outbox。
  • SSRF 精确策略:host/port/IP 解析 + 私网拒绝。
  • WASM 沙箱:用户自定义 behavior/规则尚未执行在沙箱中。
  • Prompt injection 策略 cell:数据/指令分离、出口审查、人工 gate。
  • 租户隔离/配额:共享集群下没有硬隔离。
  • 渗透测试:越权、cap 重放、SSRF、shell、DoS。

17.5 发布前安全清单

  • token + HMAC capability + revoke
  • shell allowlist(argv、无 shell)
  • HTTP allowlist hook
  • queue/budget 上限
  • 审计 hash
  • mTLS(cell 集群 + flow 调度器;见 docs/23-mtls.md)
  • 私网 IP / host 精确 allowlist
  • 持久化 effect 幂等(coordinator ledger;见 docs/22-durable-effects.md)
  • effect 调用与 ledger 写入的原子性(provider idempotency key/outbox)
  • 内部自动化安全 smoke(docs/24-security-testing.md、scripts/security-smoke.sh)
  • 外部渗透测试
  • 租户配额
  • 安全文档对外发布

在 GitHub 编辑本文