fix(mcp): audit approved ssh execution path
This commit is contained in:
@@ -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 仍直接呼叫 provider,MCP 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。
|
||||
|
||||
Reference in New Issue
Block a user