本卡屬 FR-188(母卡 CM-3728),修 FR-187 資安掃描發現的 #241(中,FR-187 A1、A2 兩棒各 3:0)。嚴重度:中。發現原文、檔名行號、面板票數在 docs/features/FR-187-2611-post-fr172-security-scan/reports/(工作坊工作區 compliance-manager-be/.worktrees/CM-3711/ 裡,主線還沒合;總表 docs/features/security-scan-consolidated/README.md §3.1 同樣在那裡)。Stage 未排,由排批的人決定(見下方「排批注意」)。

問題是什麼(白話)

管理員在「遠端 Agent → 工具帳密」設給 Agent 的檢測工具帳密(SSH、LDAP、SonarQube 等),真正存放的地方是 Agent 端,但送過去的途中會經過主系統資料庫:長輪詢通道下主系統不能直接推給 Agent,只能先寫一列進 compliance.agent_requests(信箱),等 Agent 來拿。

問題:①寫進信箱時 payload 是明文帳密;②Agent 收走、回報 done 之後,payload 不清;③沒有任何程式刪這張表。資料庫備份或匯出一流出去,所有設過的受檢主機帳密都在裡面。違反 .claude/rules/security/secrets.md「解密後的帳密只留記憶體:派工單不含明文」。

為什麼不能「只放記憶體不進資料庫」:主系統跑多個 gunicorn worker,管理員送帳密的請求與 Agent 的長輪詢常落在不同 worker,記憶體不共用。所以要進資料庫,但進之前加密、用完清空。

在哪裡

/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/app/remote_agent/service/agent_request_service.py:200-207  _new_row:payload=dict(payload) 原樣寫入
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/app/remote_agent/service/agent_request_service.py:217-232  reply:只改 status/result,不清 payload
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/infra/remote_agent/command_sources_impl.py:28-37  requests_for:交給 Agent 時讀 r.payload
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/infra/remote_agent/repository/agent_request_repo_impl.py:49-70  transition/expire_due:只改狀態
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/infra/remote_agent/agent_credential_client.py:33/42  帳密從這裡進 ask(credentials_set)
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/infra/cloud_integration/crypto/fernet_crypto.py  既有加密工具,APP_ENCRYPTION_KEY(reuse)

行號以 2026-11-09 主線為準,對不上就以內容為準。

怎麼修

要寫測試

手測