給誰看:決策者排修正順序時、下一任首腦接主專案接線棒時、任何想知道「這支套件掃出什麼」的人。細節在各棒報告與跨 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 首腦逐條開檔核對,無改判。
| # | 嚴重 | 白話 | 在哪 | 怎麼修 |
|---|---|---|---|---|
| 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 六個套件不鎖版本無雜湊(供應鏈,未開卡)。
§3.4 原本那條「容器紀錄遮蔽只靠字串比對、docker 白名單擋不擋得住繞過」——E1 補查後用詞更正:遮的是參數位置不是字串比對(「base64/拆段遮不到」不成立)、白名單擋得住;真正的缺口在另一邊:遮蔽只處理命令列那行,容器印到畫面的內容原文落地、再上傳客戶硬碟、專案成員可讀(併入第 103 項影響面)。
apply=False 全套件盤點(§5):本套件 0 命中,建立端點逐欄手取、結構上打不到,已標「已查」。
app/system_config/service/ai_provider_key_resolver.py(199 行)與 adapter core/plugins/evidence_classification.py:149-203,套件側只答得了「沒把鑰匙露出去」。主專案接線 5 檔約 1,300 行另棒,開卡時解析鏈與 adapter 要放同棒。api/routing.py:40-56 三支一次消 108~111 四條;留則四條各補守門。docker/requirements.txt 不鎖版本要不要開卡(供應鏈,流程面修法)。feature/review,未 push)盤點開卡 920a621b;E1 1cf9195e/驗收 fc9f8414;E2 b5f44a48/5213942b;E3 0c413f57/55af4472;E4 8ed2cdcf/4e4b952e;E5 39aafc7a/5c4d195c;收尾見本檔 commit。套件 repo 無異動(只掃不修)。
docs/features/FR-111-2609-evidence-classification-security-scan/(README 有切棒表/剔除清單/11 條開卡錨點)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、§7docs/features/FR-075-2609-jedi-package-security-audit/handoff/security-scan-STATE.md 111 那組列CLAUDE-SECURITY-20260918-131102(E1)、20260919-020549(E2)、20260919-052449(E3)、20260919-072959(E4)、20260919-090510(E5)