本卡屬 FR-188(母卡 CM-3728),修 FR-187 資安掃描發現的 #242、#243、#244、#247、#248(皆低,3:0)。嚴重度:低×5。發現原文、檔名行號、面板票數在
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 裝在客戶機器上,要假設它可能被控制,主系統收它的回報時不能全信。
#242:Agent 送來的錯誤日誌,message 不是字串(陣列或物件)時跳過 8KB 截斷、整包存進 agent_logs。
#243:事件去重鍵直接拼 Agent 自報的 at 與 job_id,長度格式不限,存 Redis 24 小時;換個 at 就能無限送,灌滿 Redis 影響其他 Agent。
#244:主控台稽核紀錄的「操作者」是 Agent 自報的,主系統直接換成那個帳號身分寫稽核,還查真實暱稱——能以主系統任何管理員的名義寫「某人在主控台做了某事」(只限它自己租戶)。
#247:一家公司的 Agent 自己要求更新時,_rebatch 在該 Agent 租戶身分下算「下一批是第幾批」,但每分鐘排程用系統身分、只依批次號分組不分租戶 → 被排進另一家公司那次推送的同一批,讓對方的分批升級卡住或被自動暫停(資安修正版推不出去)。
#248:Agent 上傳升級紀錄只限單檔 10MB、不限份數,換工單編號就多存一份,job_id 只過格式白名單、不檢查這台是否真被派過 → 塞滿主機硬碟。
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/domain/support/service/agent_log_domain_service.py:60-67 只對 str 截斷
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/app/remote_agent/service/agent_event_dispatcher.py:92/119 去重鍵組法與 set(ex=)
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/core/plugins/_agent_console_audit.py:98-102 actor 直接當操作者
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/app/product_update/service/agent_rollout_service.py:448-466/483 _advance_group 分組、_rebatch 算批次
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/core/plugins/_agent_console_update.py:90 tenant_context
/Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be/app/product_update/service/agent_update_event_handlers.py:183-186/236-249 _row lock_or_create、_save_log
行號以 2026-11-09 主線為準,對不上就以內容為準。
str() 再套 message_max 截斷;或非字串直接丟並記一筆警告。parse 時要求 at 是 ISO 時間、長度 ≤64,job_id 走既有 clean_job_id/_JOB_ID_RE 同一套白名單;不合格回 400。actor 要跟主控台登入票核對(票由主系統發,票裡的使用者才算數);核不到就記成 agent:<uid> 而不是那個帳號,且不去查真實暱稱。先查主控台票目前怎麼發、事件有沒有帶票(jedi-remote-agent agent_ticket_service.py);需要協定加欄位就停下回寫問首腦,不自己改協定套件。_rebatch 的 base 改在系統身分下算,或 _advance_group 分組鍵加 tenant_id(擇一,回寫說明)。_save_log 只收「這台確實被派過的升級工單」——查 rollout 表該 Agent 有沒有這個 job_id 的推送紀錄;沒有就 404。另加每台每工單只留最新一份(覆蓋舊的)。agent_rollout_service.py 702 行、接近上限:#247 的改動若超過十幾行,抽成小 helper 檔。test/test_fr167_agent_rollout.py、test/test_fr172_product_update_history_logs.py 等相關檔。