本卡屬 FR-187(母卡 CM-3711),第 3 批 F2:加密金鑰遷移與容器啟動讀設定(主系統 repo
compliance-manager-be,4 檔/約 753 行)。只掃不修。工作坊會用.claude/workshop-prompts/dispatch-<本卡號>.md當開場 prompt 直接啟動掃描,小弟不必自己打指令。
用 Claude Code 官方 claude-security plugin 掃「加密金鑰遷移與容器啟動讀設定」這一塊,找出資安問題,寫成 PM 與新手工程師都看得懂的報告。只找問題、不修問題,修是另外開卡的事。
三組舊加密金鑰(Drive、檢測工具、AI)合併成一把 APP_ENCRYPTION_KEY,migrate_encryption_keys.py 在升級時把資料庫裡的密文換成新鑰匙加密;加上容器啟動時怎麼讀記憶體裡的設定檔。
換鑰匙這支腳本會以超級管理員身分改全部客戶的密文,寫錯會把整合憑證全部弄壞或以明文留下。啟動讀設定那段如果找不到加密設定就退回別處讀,就繞過了設定檔加密的整套保護。
背景:這一輪掃的是 2026-11-01(FR-172 開案)到 11-09 之間主專案與 jedi-remote-agent 新寫或大改的程式(FR-171/172/178/179/180/181/182),這些程式都沒掃過。
scripts/migrate_encryption_keys.py
infra/system_config/config_secret_crypto.py
config/config_loader.py
docker/production/entrypoint.sh
檔數 4、約 753 行。驗檔數:git -C <工作目錄> ls-files -- scripts/migrate_encryption_keys.py infra/system_config/config_secret_crypto.py config/config_loader.py docker/production/entrypoint.sh | wc -l 應為 4。scope 外的檔不要讀,除非下面「重點看什麼」明寫「只追這幾行」;越界的發現首腦驗收時會挑掉。
首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單,行號以 2026-11-09 的主線為準,對不上就以內容為準。工具不會照這份走,掃完後你要自己逐條對一遍:工具沒報的,開檔看一眼,寫「人工查過:成立/不成立/為什麼」。
migrate_encryption_keys.py:舊鑰匙從命令列參數(--old-*-key,ps 看得到)還是環境變數帶入;docker/init/entrypoint.sh:134 怎麼呼叫它(只追這一段);_scrub(:200)遮 psql 錯誤回顯是否完整。build_apply_sql(:180-197):值用隨機 tag 的 dollar quote 包起來;SET LOCAL app.is_super_admin='t' 繞過 RLS(每個客戶只能看自己資料的隔離機制)——確認只在 init 容器、只在這個交易裡。rekey_token(:107-116):新鑰匙解得開就當「已是新的」;舊鑰匙都解不開的列標 bad,can_apply 遇到 bad 是整批不套還是跳過。config_secret_crypto.py 改讀 APP_ENCRYPTION_KEY:沒設時是「警告後明文落庫」(core/app_factory.py 那行 warning,fernet_crypto.py 同一個鍵)。正式安裝有沒有可能走到明文模式而沒人發現。config_loader.py 新增的 36 行:讀 /run/guidant/guidant.env,不存在時退回哪裡(會不會退回磁碟上的舊明碼檔)。docker/production/entrypoint.sh:改成非 root 後還做什麼;合併信任庫(CA)的來源,能不能被可寫的掛載點塞進一張假 CA。FR-077(2026-09)掃過 jedi-remote-agent 與主系統接線的舊版,FR-086 掃過檔案上傳下載,FR-177(2026-11-05~07)掃過 Agent 本體;結論在主系統 repo docs/features/security-scan-consolidated/README.md,只是參照,沒有經過本棒的三人投票。另外,infra/cloud_integration/crypto/fernet_crypto.py 不放進本棒:2026-09-25 已完整掃過(run CLAUDE-SECURITY-20260925-053527),之後只改一行(換環境變數名)。