本卡屬 FR-120(母卡待填)。這一棒掃主專案自己程式的「權限檢查共用層+共用小工具」(15 檔/1132 行)。只掃不修。
用資安掃描工具掃 BE repo 自己寫的「權限檢查共用層+共用小工具」這塊程式(15 檔,約 1132 行),找出權限檢查、資料歸屬判斷上的漏洞並產出報告。只找問題、不修問題。
🔴 優先序第 1:全產品守門地基,前面每棒都假設它沒問題,後面各棒的研究員都會追進來讀。
這些是首腦讀過盤點檔與程式碼後認為最容易出事的地方,是思考起點不是檢查清單:
common/authz/license.py(367 行):授權檔決定「這家客戶買了哪些模組」,掛在每支 route 的 @require_license 就是它。問:授權檔讀不到、過期、被竄改時是擋下還是放行(fail-open)?快取多久、換客戶會不會拿到上一家的結果?common/authz/__init__.py(180 行)是決策表:re-export 哪一軸給誰用。問:五支 shim(admin/capability/decorators/platform/signed_token)轉到 jedi_iam.authz 時,有沒有哪一支名字對了、實作指到舊路徑。sharing.py:母租戶分享資源給子樹的判斷(FR-094.4b 新增)。問:「分享給子樹」會不會被反過來用——子租戶改到母租戶的資源。round_guard.py:稽核輪次的狀態守門。問:只看狀態、還是也看「這一輪屬於你的專案」。redis_client_util.py:FR-085 C1 報告提到這支(Redis 金鑰前綴),當時是越界讀、沒正式掃。問:鍵名有沒有帶租戶,跨客戶會不會讀到彼此的快取。or 串起來,其中一個條件永遠成立;例外處理把「查不到資料」與「沒有權限」混成同一個回應;背景排程/系統身分執行的程式碼假設「呼叫者一定是自己人」;防重放/計次的邏輯只在單一進程內生效,多台機器或重啟就破功;註解寫「這裡刻意不檢查」但沒人在上一層真的檢查。本範圍從未被任何一棒正式掃過(多棒研究員追進來讀但只有 U1 本身報這裡的問題)。FR-085 C1 對 redis_client_util.py 有越界提及、未經面板驗證,只是參照。
第一步:讀完本卡與母卡,再讀盤點檔 docs/features/FR-119-2609-security-scan-closeout/scan-inventory.md 對應本棒段落。
第二步:驗 scope 檔數,在 BE repo 跑下面指令,對上 15 檔/1132 行 才往下;對不上停下回報。
cd /Users/chouraymond/Projects/Billows/Audit-Manager/compliance-manager-be && git ls-files -- \
common/authz/__init__.py \
common/authz/admin.py \
common/authz/capability.py \
common/authz/decorators.py \
common/authz/license.py \
common/authz/menu_license_filter.py \
common/authz/platform.py \
common/authz/sharing.py \
common/authz/signed_token.py \
common/iam_ports.py \
common/util/round_guard.py \
common/util/ssp_resource_name_dup.py \
common/util/common_util.py \
common/util/redis_client_util.py \
common/util/resource_path.py | xargs wc -l | tail -1 # 15 檔、1132 行