fix(mcp): audit approved ssh execution path
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 1m5s
CD Pipeline / build-and-deploy (push) Successful in 3m45s
CD Pipeline / post-deploy-checks (push) Successful in 1m20s

This commit is contained in:
Your Name
2026-05-06 16:34:39 +08:00
parent fcf93aac11
commit a7a9ba996d
3 changed files with 132 additions and 2 deletions

View File

@@ -3792,3 +3792,36 @@ ALTER TABLE awooop_mcp_gateway_audit
- 套用後確認 `tool_id_not_null=false`
- 同輪已修正 `.gitea/workflows/run-migration.yml`:平常仍優先使用 `MIGRATION_DATABASE_URL` 限權帳號;只有 PostgreSQL 明確回報 `must be owner of table` 時,才以 `DATABASE_URL` table owner 連線重試,且不輸出任何連線串。
- 後續仍需獨立檢討 DB ownership 模型:`awoooi_migrator` 目前可新增部分 schema但不能 ALTER 由 `awoooi` 擁有的既有表owner fallback 是營運修補,不是長期最終治理模型。
---
## 2026-05-06台北— Approved SSH execution 納入 MCP durable audit
**觸發**AwoooP / AI 自動化飛輪整合盤點指出 production 多條 MCP caller 仍直接呼叫 providerMCP Gateway 尚未成為真正 choke point。最危險的是已批准後的 SSH 實際執行路徑,因為它會改動主機或容器狀態。
### 已修正
| 範圍 | 結果 |
|------|------|
| `approval_execution.py` | SSH_HOST approved execution 改用 `AuditedMCPToolProvider(SSHProvider())` 包裝,不再裸呼叫 `SSHProvider.execute()` |
| 稽核上下文 | 注入 `_mcp_audit``session_id=approval:{approval_id}``incident_id``agent_role=approval_executor``flywheel_node=execute` |
| 遷移標記 | 追加 `gateway_path=legacy_direct_provider`,明確標示這仍是舊 direct provider path供後續 Gateway strangler 收斂 |
| 回歸測試 | 新增 `test_approval_execution_mcp_audit.py`,驗證 provider 實際收到的參數已移除 `_mcp_audit`,但 audit subsystem 可取得完整上下文 |
### 驗證
```text
pytest apps/api/tests/test_approval_execution_mcp_audit.py apps/api/tests/test_approval_execution_retry.py apps/api/tests/test_mcp_credential_isolation.py apps/api/tests/test_mcp_tool_result_compat.py -q
# 45 passed
py_compile apps/api/src/services/approval_execution.py apps/api/tests/test_approval_execution_mcp_audit.py
# 通過
ruff check apps/api/tests/test_approval_execution_mcp_audit.py
# All checks passed
```
### 注意
- 本次是「先補 durable audit + legacy 標記」,不是直接硬切 MCP Gateway enforcement原因是 AwoooP project / agent / grant contract 尚未覆蓋所有 legacy 修復路徑,硬切會中斷現有 approved execution。
- 下一步應將 `decision_manager.py``pre_decision_investigator.py``post_execution_verifier.py``callback_dispatcher.py` 的 direct MCP caller 逐步套同一種可追蹤 wrapper最後再切到 `McpGateway.call()` enforcement。