本卡屬 FR-078(母卡 CM-1602),第 2 棒:主專案宿主接線(scanRoot 是 BE repo,與 N1 不同)。只掃不修等 N1 驗收完才派,不與 N1 平行。

這一棒在做什麼(白話)

掃主專案這一側的通知接線(18 個受版控 .py,其中 8 個是空的 __init__.py,有邏輯的 10 檔約 700 行):SMTP 設定從哪讀、密碼怎麼還原、誰能按下「發送測試郵件」、背景執行緒發通知時租戶脈絡怎麼來。只找問題、不修問題。

為什麼切這一塊

jedi-notification 這支套件把所有安全決策都外包給宿主——套件自己只知道「有人給了我一組 SMTP 設定和一封信」,至於那組設定從哪來、密碼是不是使用者可控、呼叫者有沒有權限,全在主專案這一側。真正的風險在接縫上,而接縫的另一半在這裡。 這與 FR-077 R3 的形狀相同(套件把安全決策外包給宿主,真正的答案在宿主那少少幾個檔裡)。

分兩棒是物理限制不是設計選擇:scanRoot 只能指一個目錄,套件在 jedi monorepo、宿主在 BE repo。

重點看什麼

以下是首腦讀過程式碼後標出的可疑點,是思考起點不是檢查清單。工具不會照這份走,漏掉的要 runner 自己補追。

已知背景

這一塊從未被掃過。security-scan-2607 掃主專案時通知模組還在 api/notification/(後來 FR-069 P3.3 搬進套件),且當時的掃描範圍與深度都與現在不同。

參照用的舊發現(未經本棒驗證):CM-1564(LDAP 連線測試改位址可套出既存密碼——與重點①同型)、CM-1559(RLS fail-open,In progress,與重點③④相鄰)、CM-1585/1586(讀端點無守門、失效角色算成有效——守門不一致的先例)。

N1 的結果要先讀:本棒派出時 N1 已完成,報告在 docs/features/FR-078-2609-notification-security-scan/scan-N1-package-core.md先讀它,套件側已報的問題本棒不重複報,但要追「宿主有沒有把它放大」(例如套件的 log 印密碼,宿主決定了 log 落到哪、誰讀得到)。

怎麼做