FR-111 證據自動分類套件資安掃描 — arc 收口 SUMMARY

給誰看:決策者排修正順序時、下一任首腦接主專案接線棒時、任何想知道「這支套件掃出什麼」的人。細節在各棒報告與跨 arc 總表,本頁只收斂。

🔴 一頁看完

這支套件的風險集中在「待刪的舊 Drive 線」,不在現行的新批次線。 五棒 41 檔 7,849 行掃完,8 條資安發現裡有 4 條(含唯一的高風險)全落在舊 Drive 線的四支讀取端點——那條線已標 legacy(CM-1868)、前端入口已拿掉、後端路由仍掛著。刪 api/routing.py:40-56 三支路由,四條一次消失。 FR-107 寫的新批次線把舊線踩過的坑全避開了:十五支端點守門無漏、清單強制帶範圍、審核結果塞不進別人的東西、背景執行緒身分帶得完整、資料庫隔離讀寫都擋。

最該先處理的一條(第 108 項,高):舊線的「預覽證據檔」網址填任何一個 Google 雲端硬碟檔案編號,系統就拿客戶授權的鑰匙把檔案抓回來——只驗登入,不驗檔案屬於誰;主專案向 Google 申請的是完整硬碟權限(auth/drive),所以射程是客戶整個雲端硬碟。

五棒結果

棒 卡 範圍 面板 淨新增 報告
E1 容器執行鏈 CM-1947 7 檔 1,476 行 verified,3 候選 9 票全投,三條皆 2:1 3 條(102 中/103 低/104 低) scan-E1
E2 批次分類主幹 CM-1948 2 檔 1,900 行 verified,9 票全投,1 通過越界(CM-1634 重複)2 駁回 範圍內零;人工 106 低+§3.2 25 scan-E2
E3 舊 Drive 線 CM-1949 4 檔 1,781 行 verified,18 票全投,4 通過全 3:0 4 條(108 高/109/110/111 中)+§3.2 26 scan-E3
E4 設定與插件殼 CM-1950 16 檔 1,850 行 verified,3 票全投,唯一候選 0:3 駁回 零;人工 §3.2 27 scan-E4
E5 邊界層 CM-1951 12 檔 842 行 verified,18 票全投,4 通過全越界=E3 重複 零 scan-E5

五棒面板全部完整跑完、零漏投、研究員零派回;每棒 HIGH/MEDIUM 首腦逐條開檔核對,無改判。

八條資安發現(登記跨 arc 總表 §3.1)

# 嚴重 白話 在哪 怎麼修
108 🔴 高 舊線預覽端點填任何雲端硬碟檔案編號就能讀,射程客戶整個硬碟 evidence_classification_service.py:709 加「run 參與者」守門並比對檔案屬於該 run;或刪路由
109 中 舊線查結果/報表不驗專案成員,查無 DB 還退回直接讀 Drive 同檔 :666 起連帶五支 同上
110 中 Drive 搜尋條件字串拼接沒跳脫(未實測) evidence_drive_ops.py:52、:76 parent_id 進查詢前驗字元集
111 中 舊線 job 列表與單一狀態端點不驗專案,登記簿記憶體 dict 不分租戶 evidence_classification_service.py:575、route :79-90 加守門+登記簿加租戶過濾;或刪路由
102 中 證據檔內文可以對 AI 下指令、左右它判符合哪些合規項目 docker/container_entrypoint.py:374 容器端資料與指令分開;宿主收結果驗信心值/欄位/筆數
103 低 AI 金鑰走 docker run 命令列,同機任何帳號 ps 看得到;容器 stderr 原文落地、專案成員可讀 classifier_container_runner.py:154 改 --env-file 或 -e KEY 不帶值
104 低 容器無記憶體/CPU/處理程序上限,逾時殺不掉 同檔 :186 加 --memory/--pids-limit;給 --name,逾時 docker kill
106 低 刪整批後判定結果/容器紀錄/含檔名的清單永久留在後端主機工作目錄 evidence_batch_service.py:1417-1427 purge/delete_batch 末尾 rmtree 整個 run 目錄

現況(對照 docs/security-report/M07-evidence-classification.md):108/109/110/111 隨舊 Drive 線退場拆除(M07-1~4,CM-2222);102 已修(M07-5,CM-2225);103 已修(M07-7,CM-2193/CM-2223);104 已修(M07-8,CM-2227);106 已修(M07-6,CM-2227)。功能 bug:25 失敗原文入庫=M07-10、27 預設廠商型號不讀=M07-9,兩者為非資安缺陷、尚未修;26 正解匯入驗證隨舊線評估機制退役(M07-11)。

103/104 的前提:出貨落地版後端容器刻意沒裝 docker(docker/production/Dockerfile:66-71,D4 定案「落地版分類功能降級停用」),分類在落地版根本啟動不了,這兩條只影響開發環境與未來直接裝在有 docker 主機上的部署——面板因此評輕微。

四條功能 bug(§3.2):25 分類失敗原文入庫前端可讀/26 正解匯入零內容驗證/27 設定的「預設廠商/型號」寫入但分類時不讀(設 OpenAI 還是跑 Anthropic)/另 E1 記 docker/requirements.txt 六個套件不鎖版本無雜湊(供應鏈,未開卡)。

跨 arc 總表的更正

§3.4 原本那條「容器紀錄遮蔽只靠字串比對、docker 白名單擋不擋得住繞過」——E1 補查後用詞更正:遮的是參數位置不是字串比對(「base64/拆段遮不到」不成立)、白名單擋得住;真正的缺口在另一邊:遮蔽只處理命令列那行,容器印到畫面的內容原文落地、再上傳客戶硬碟、專案成員可讀(併入第 103 項影響面)。

apply=False 全套件盤點(§5):本套件 0 命中,建立端點逐欄手取、結構上打不到,已標「已查」。

這份結果可信到什麼程度

  • 「這 8 條存在嗎」:可信。五棒面板全完整、每條首腦開檔核對行號與內容。E5 那組完全獨立的研究員與檢查員在不知道 E3 存在下重現了同樣四條,反證 E3 可信。
  • 「只有這 8 條嗎」:不能這樣說。低強度單研究員跑法、卡片重點多數靠 runner 人工核(未經投票);E2/E4 零發現是「工具只從守門一個角度看+人工照卡片七項走」,卡片沒想到的角度沒查到。全程沒打過任何端點、沒起過容器、沒連過 Google,全是讀碼推論;第 110 的注入是否被 Google 查詢剖析器吃下未實測。
  • 答不了的:金鑰解析鏈本體「租戶→ROOT 原廠鑰→環境變數」在主專案 app/system_config/service/ai_provider_key_resolver.py(199 行)與 adapter core/plugins/evidence_classification.py:149-203,套件側只答得了「沒把鑰匙露出去」。主專案接線 5 檔約 1,300 行另棒,開卡時解析鏈與 adapter 要放同棒。

等決策者裁(掃描收口當時;2026-10-01 同步:第 1 項已裁刪舊線並拆除,其餘隨問題總表統一處理完畢)

  1. 舊 Drive 線是刪路由還是補守門——刪 api/routing.py:40-56 三支一次消 108~111 四條;留則四條各補守門。
  2. 第 102「證據內文對 AI 下指令」算不算資安題——修法是技術的,但要先定「AI 分類結果要不要當半可信」。
  3. D4「落地版分類功能停用」是否維持——維持則 103/104 只影響開發環境;解除則要先修。
  4. docker/requirements.txt 不鎖版本要不要開卡(供應鏈,流程面修法)。
  5. 主專案接線棒要不要排(5 檔約 1,300 行,金鑰解析鏈本體在那)。

流程教訓(已記 STATE 與 memory)

  • 每棒 ≤2,000 行含接縫檔的判準五棒實證有效:E1~E4 零重試零中斷。
  • 行數比檔數準:E2 2 檔 1,900 行 155 分鐘 > E1 7 檔 1,476 行 135 分鐘。
  • 本體小但接縫發散的棒,先把接縫事實查好寫進卡:E5 本體 842 行卻跑 5h32m,研究員追出範圍去主專案全庫搜呼叫者、被停滯偵測砍五次——再切小沒用,因為接縫是整個主專案呼叫鏈。
  • runner 掃完就停不交付四件:E1/E2/E3 連三棒(全計畫第九~十一次),prompt 寫「E1 漏了被退回過」沒用;改成「掃完直接接著做四件、不要停下來等」並點名前例作法後 E4/E5 一次做齊。
  • 零發現棒的價值在人工核:E2/E4/E5 工具零發現,真正產出(第 106、§3.2 25~27、影響面補記)全來自 runner 照卡片重點逐項開檔。

commits(BE repo,branch feature/review,未 push)

盤點開卡 920a621b;E1 1cf9195e/驗收 fc9f8414;E2 b5f44a48/5213942b;E3 0c413f57/55af4472;E4 8ed2cdcf/4e4b952e;E5 39aafc7a/5c4d195c;收尾見本檔 commit。套件 repo 無異動(只掃不修)。

座標

  • 本 arc:docs/features/FR-111-2609-evidence-classification-security-scan/(README 有切棒表/剔除清單/11 條開卡錨點)
  • 跨 arc 總表:docs/features/security-scan-consolidated/README.md §0.5 已掃完 17 支、§1 第 62~66 輪、§3.1 第 102~104/106/108~111、§3.2 第 25~27、§3.4、§7
  • 共用 STATE:docs/features/FR-075-2609-jedi-package-security-audit/handoff/security-scan-STATE.md 111 那組列
  • Notion:盤點卡 CM-1945、母卡 CM-1946、子卡 CM-1947~1951
  • 掃描產物:套件 repo CLAUDE-SECURITY-20260918-131102(E1)、20260919-020549(E2)、20260919-052449(E3)、20260919-072959(E4)、20260919-090510(E5)