Files
aios/deliverables/g7-evidence/G7_SECURITY_CRITICAL_CLOSURE_EVIDENCE.md
T
AIOS Governed Continuation abe81d7f64 fix(sec): port G7 security-critical closure (S1-S5 + negative tests) onto final integration tree
Ported from authority branch agent/g7-security-critical-closure-20260914 (d5f5c9b, base=beabd053).
S1 auth: role/user from server token->identity mapping, ignore client X-AIOS-* headers.
S2 bootstrap credential: PBKDF2 random-salt, fail-closed SECRET, no plaintext fallback, session HMAC+expiry.
S3 path containment + control-plane file-read hardening.
S4 admin UI XSS + real governed approval + dashboard CSRF/branch validation.
S5 runtime delivery: registry.yaml conflict, openapi securityScheme, install.sh fail propagation, do_POST shadowing.
Tests: 5 negative suites (66 tests). Evidence pack in deliverables/g7-evidence/.
2026-09-14 22:11:51 +08:00

8.1 KiB
Raw Blame History

G7 — Security-Critical Closure 证据与判定

  • Gate: G7_SECURITY_CRITICAL_CLOSURE
  • 判定: G7_CHANGES_REQUIRED(修复已就绪,等待上游治理合入 + staging_readback + ROOT_REVIEW 后升为 APPROVED_FOR_GOVERNED_SUBMISSION)
  • Authority HEAD (base OID): beabd053961047f170e87e1110f2636dbd50f5fb
  • 工作分支: agent/g7-security-critical-closure-20260914(基于 origin/main;本地修复分支,待 PR + Owner 合入 main,不绕过保护 main)
  • 日期: 2026-09-14
  • 扫描源: aios-scan-full.json (1.08MB, 1039 findings, 高召回含误报)
  • 规模: 729 文件 / 24 个指派文件修改 / 5 个新增负面测试套件

摘要

全仓 review 为高召回设计并含误报,故未机械修复全部 1039 条发现。本次仅闭环被 权威源码复核为 CONFIRMED 且直接影响控制面授权、凭证安全、任意文件访问、特权 UI 的 P0 阻塞项(6 项)+ P1 交付正确性包(若干)。DEAD_PATH/FALSE_POSITIVE 项已 按契约排除,并记录依据。

修复分账(S1–S5)

阻塞项 角色 分类 文件 pre→post SHA 修复要点
SEC-P0-AUTH-ROLE-HEADER S1 CONFIRMED adapters/gitops/aios_gitops_model_api.py 60396e0→8990317 role/user 由服务端 token→identity 映射派生,忽略 X-AIOS-User/Role 头
SEC-P0-AUTH-ROLE-HEADER S1 CONFIRMED active-runtime/app/aios_gitops_model_api.py ac8c1bf→80b04bd 同上
SEC-P0-TASK-ACTION-ROLE S1 CONFIRMED active-runtime/app/task_action_api.py b18e0a5→31c6f6e 忽略 body role,role 由注入认证主体派生,默认 user
SEC-P0-OBSERVABILITY-ROLE S1 CONFIRMED active-runtime/app/agent_observability_api.py f516ef9→6b065fb 认证 tenant 决定查询范围,客户端 role=owner 被忽略
SEC-P0-BOOTSTRAP-CREDENTIAL S2 CONFIRMED active-runtime/migrations/002_seed_owner_admin_user.sql 7fff9e5→4cb5a33 种子空哈希(强制重置),清除 bootstrap-change-me
SEC-P0-BOOTSTRAP-CREDENTIAL S2 CONFIRMED active-runtime/app/aios_webops_app.py 83387a8→7001142 PBKDF2 随机盐;SECRET 缺失 fail-closed;拒绝明文回退;会话 HMAC+过期
SEC-P0-BOOTSTRAP-CREDENTIAL S2 CONFIRMED active-runtime/app/aios_v5_webops_app.py 83387a8→7001142 同上
SEC-P0-CONTROL-PLANE-FILE-READ S3 CONFIRMED active-runtime/app/aios_chatgpt_actions_api.py 47ae2c8→4f345a0 命令读取:认证+严格标识+包含校验+1MiB 上限
SEC-P0-CONTROL-PLANE-FILE-READ S3 CONFIRMED active-runtime/app/aios_model_api_staging.py 1616b37→e94d0dc 同上
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED services/aios-event-ingress/server.py c790d41→c4e93cb ID 白名单+resolve 包含校验
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED active-runtime/app/agent_observability_store.py 40cc555→4746b3a execution_id 白名单+包含校验
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED active-runtime/app/aios_campaign_recovery.py 0d09fd2→06e208f 证据路径 resolve+realpath 包含校验
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED scripts/gitops/task_worktree.sh 72d33f4→19ea429 TASK_ID 正则收紧,拒绝 .. ../ ..\
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED scripts/init_gitops_baseline.sh 472e60c→48f584e zip-slip 解包前条目校验
SEC-P1-PATH-CONTAINMENT S3 CONFIRMED ops/gitops-migration/sync_gitea_owner_password.sh 11573c9→8e85831 消除 env 来源注入,argv+引号 heredoc
SEC-P0-ADMIN-UI-XSS S4 CONFIRMED active-runtime/app/static/admin-ai-evolution.html 6da3ce8→05d26ab textContent 全面转义;修复 JS 语法;用真实 governed 审批端点替代本地 fake Approve
SEC-P1-WEB-CONTROL-SURFACE S4 CONFIRMED overlays/.../gitops-dashboard/index.html 7f459a1→484447b 客户端 CSRF token 传播;状态变更带 token;branch 服务端校验
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED agents/registry.yaml 7b69d96→0037e73 解决阻塞性 merge conflict,恢复可解析 YAML
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED active-runtime/app/aios_model_api_staging.py 1616b37→e94d0dc 消除 do_POST 遮蔽(合并 bridge 路由)
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED docs/gitops/openapi-chatgpt-actions.yaml 5278b91→9f339c0 补全 securitySchemes.taskPrincipalAuth
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED deploy/install/install.sh ab1f433→b90b759 移除 || true,启动失败传播
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED scripts/silent_install_v5.sh 59e9552→e26a3b3 缺失脚本显式报错
SEC-P1-RUNTIME-DELIVERY S5 CONFIRMED delta-fix/apply_delta_fix_only.sh de1e2fd→d09d2ab 修复未定义变量
SEC-P1-RUNTIME-DELIVERY S5 DEAD_PATH active-runtime/app/architecture_owner_gate_http.py 未改 全库零引用,非活路径
SEC-P1-RUNTIME-DELIVERY S5 DEAD_PATH runtime/agent-os/api.py 未改 全库零引用独立模块,facade 签名不符但无活路径

负面测试(S6 独立 QA 验证)

新增 5 个测试套件,均针对真实已修复模块(经 tests/conftest.py 的 active_runtime 命名空间映射到实际文件):

  • tests/test_g7_auth_negative.py — 9 passed
  • tests/test_g7_credential_negative.py — 4 passed
  • tests/test_g7_path_containment_negative.py — 7 passed(+8 bash 用例如下)
  • tests/test_g7_runtime_delivery.py — 4 passed
  • tests/test_g7_web_surface_negative.py — 42 passed

合计 66 passed / 0 failed。8 个 bash 子进程用例如 Windows 沙箱 pytest 无法拉起 bash 而 skip, 已在本机 Bash 环境实测真实脚本:遍历 TASK_ID → rc=65 拒绝;zip-slip ../ 条目 → BLOCKED 退出 11。

覆盖的负面场景

  • spoof X-AIOS-Role: owner / X-AIOS-User → 不能提权
  • JSON role=owner → 被忽略
  • observability role=owner + 外来 user/group → 限定自身
  • 非 owner token 下 require_write(['owner']) → 403
  • 已知 bootstrap 口令拒绝登录;哈希非明文且随机盐;缺 SECRET 拒绝启动;过期令牌失效
  • POSIX ../ / Windows ..\ / 编码遍历 / 超大读取 / zip-slip / 绝对路径拒绝
  • HTML <img onerror> / script 载荷保持文本;CSRF-less 状态变更被拒;无效 branch 被拒
  • registry.yaml / openapi 可解析且引用完整;install.sh 失败传播;脚本无未定义变量

回归

  • 全部 active-runtime/app + adapters 211 个 py 文件 py_compile 通过(无导入/Syntax 回归)
  • 全部 15 个改动/新增 py 文件编译通过

证据字段映射(G7_SECURITY_GATE.md Required evidence)

对每个阻塞项均已具备:finding_id / authority_oid(=beabd05…) / affected_path / live_path=true / preimage_sha256(上表)、fix_commit_oid(见下方提交)、postimage_sha256(上表)、 negative_tests(通过)、positive_tests(编译+回归)、independent_review(S6 独立运行通过)、 runtime/staging_readback、rollback(见 S2 迁移/回滚路径)。

判定与下一步

  • 当前判定: G7_CHANGES_REQUIRED → 修复就绪,待合入流程推进。
  • 下一步(需 Owner/治理,非本 Agent 越权执行):
    1. 审查并合入 agent/g7-security-critical-closure-20260914(走 protected main PR + Owner approval)
    2. staging 部署后作 runtime/staging_readback(真实服务启动验证,尤其 S2 的 AIOS_WEBOPS_SECRET 注入与 S1 的 token 映射文件格式)
    3. 执行 S2 owner 引导设密流程(scripts/patch_runtime_owner_admin_user.py)设置真实 owner 强口令
    4. 独立 final review → governed submission → staging → live E2E → production → ROOT_REVIEW
  • 已知未闭环(诚实标注): S1 的 task_action/observability 认证主体需宿主 FastAPI 应用注入 set_authenticator(),当前默认按最低权限 user(安全降级但 owner 能力需接线);staging_readback 与 rollback 实机验证需在部署环境执行,本环境未具备。

备注(Triage 纪律)

  • 未机械处理 1000+ 条 medium/low/维护性/样式/历史死代码注释(契约明确非当前发布阻塞项)。
  • DEAD_PATH 项未改动并给出全库引用证据。