本卡屬 module_frame 資安掃描母案(見母卡),第 B5 棒。只掃不修。範圍 3 檔/1376 行。盤點檔:docs/features/FR-113-2609-oscal-host-wiring-security-scan/module-frame-scan-inventory.md

這一棒在做什麼(白話)

掃「範本的控制項清單,可以下載成 Excel、填好再上傳回來」這條功能的 3 支檔、1,376 行。一共 6 個網址入口:下載空白範本、下載匯出檔、上傳填好的檔、驗證上傳的檔、驗證資料、存檔。找出誰能打這些入口、打了能改到誰的範本,產出一份報告。只找問題、不修問題。

🔴 為什麼這一棒排全批第一順位

兩個訊號疊在一起,是這批裡最強的:

重點看什麼

**最重要的一件事:路由層已經有角色權限檢查了,但那不能回答「這份範本是不是你家的」。**盤點時已經抽查過,module_frame_template_import_route.py 的 6 個入口都掛了 @jwt_required + @require_capability("module-frame.read" 或 "module-frame.create")——那是角色權限檢查,只問「你這個角色能不能用這個功能」,不問「這份範本是不是你們公司的」。所以重點在下一層。

範圍與邊界

本棒 3 檔/1,376 行:路由入口 260 行、序列化 105 行、商業邏輯 1,011 行,一條完整路徑,不用往別棒補。

不在本棒:產生 Excel 檔案的底層機制(app/module_frame/excel_template/ 那 7 支)在 B6;匯出整份 SSP 那條不同的路在 B4。看到程式呼叫 excel_template 的地方,只看「傳進去的是不是使用者可控」,不要追進去看它自己怎麼做。

盤點檔在 docs/features/FR-113-2609-oscal-host-wiring-security-scan/module-frame-scan-inventory.md,裡面有完整的範圍界定、八棒切法與推導。有疑問先翻盤點檔,但範圍以本卡為準。

🔴 先更正一件事:不要拿「完全沒有權限檢查」去掃

跨 arc 總表曾寫「這部分的功能入口只驗證有沒有登入、完全沒有功能權限檢查」。這句話經首腦實際查過程式碼,不成立,照抄去掃會掃出一整棒誤報。實際情況是:系統安全計畫(SSP)那條線的權限是有守的,只是守在下一層——網址入口那層只驗「有沒有登入」,真正判斷「你是不是這個專案的人、是不是負責人」寫在下一層的商業邏輯程式(app service)裡。這種「入口只驗登入、權限守在下一層」的寫法,是本專案 CLAUDE.md 明文允許的正規做法(原文:資源域守門維持 app service 層),不是漏洞。

所以這批掃描要問的問題是「逐支公開方法核對守門是不是齊全」,不是「找沒有守門的端點」。