本卡屬 FR-078(母卡 CM-1602),第 1 棒:jedi-notification 套件本體(jedi monorepo)。只掃不修。本棒同時是「5X 額度下驗證面板跑不跑得完」的實驗。
用 claude-security plugin 掃 jedi-notification 這支套件的全部程式碼(30 個受版控 .py,其中 15 個是 __init__.py(多數為空),真正有邏輯的 15 檔約 622 行),找出資安問題並產出報告。這支套件負責產品所有對外通知的實際投遞:SMTP 寄信、Discord webhook、Telegram bot。只找問題、不修問題。
套件本體與宿主接線在兩個 repo,而 scanRoot 只能指一個目錄,所以物理上必須切開(宿主那半是 N2)。本棒單獨看「協定層怎麼實作」:憑證驗不驗、密碼會不會進 log、對外請求有沒有 timeout、使用者輸入怎麼組進郵件標頭。
額外意義:這是至今嘗試過最小的一棒(FR-076 L1 的 10 檔是唯一面板跑完的紀錄,本棒 30 檔但有效邏輯只有 15 檔 622 行)。決策者目前 5X 額度,FR-077 R1 的 42 檔面板全滅。本棒的面板跑不跑得完,決定這個工具在此額度下還能不能用。
以下是首腦讀過程式碼後認為最容易出事的地方,是思考起點不是檢查清單——工具不會照這份走,漏掉的要 runner 自己補追(FR-076 L2 的 HIGH 就是 runner 照這種清單人工追出來的,工具只報了 LOW)。
infra/smtp_mail/smtp_mail_adapter.py 的 server.starttls() 不帶 SSL context,等於不驗伺服器憑證,可被中間人攔截並取得 SMTP 帳密。同款問題本 codebase 已犯兩次:LDAP TLS(CM-1560)、Redis TLS(CM-1565)。logger.error(f"...smtp info: {self.config}") 把整個設定物件印出來,SmtpEmailConfigDTO 含 password 欄位。正常路徑的 info log 也印伺服器、port、帳號。要追:log 落地到哪、誰讀得到、有沒有進 journal 或外送。infra/telegram/telegram_adapter.py 與 infra/discord/discord_adapter.py 的 requests.post 完全沒有 timeout 參數。SMTP 那邊有設 60 秒,這兩支沒有——外部服務不回應會吊死呼叫它的 thread。追消費端是不是在 background thread 呼叫、吊死會不會累積。msg['To'] = ", ".join(request.to)、Header(request.subject)),而測試信端點的 to 是使用者可控的自由字串。要看 CRLF 注入擋不擋得住、能不能塞額外收件人或改寫標頭。順帶看 to.split(",") 這種切法在多收件人時的行為。self.config.webhook_url 發 POST,而那是使用者在設定頁填的任意 URL——可指向內網。Telegram 的 bot_token 直接字串拼進 URL 路徑(f"<https://api.telegram.org/bot{token}/sendMessage>"),要看能不能藉此改寫路徑。ports/notification_provider/notification_factory.py 的 register_adapter() 是後登記者勝出、不做已存在檢查,docstring 說這是「刻意留給宿主替換內建管道的餘地」。這正是工具第二個盲點的典型場景(會被註解說服)——請判斷「能被覆寫」在本產品的載入模型下實際上有沒有攻擊面,不要因為註解說是刻意的就跳過。plugin.py 的 _assert_api_wiring() 在缺認證接線時拒絕掛載,理由寫得很好;但 mount_api=False 那條路徑會無條件覆寫 app.extensions。看有沒有辦法讓測試信端點在缺守門的狀態下仍被掛上。MailRequestDTO 的 cc / bcc / attachment 三個欄位 adapter 完全沒用到,靜默丟掉。呼叫端以為送了副本其實沒有。這條不是漏洞,但屬於「真 bug」,照 FR-075 S6 的先例值得在報告裡另闢一段記下。本套件從未被掃過。security-scan-2607 只掃主專案 BE/FE;FR-075 掃 jedi-iam;FR-076 掃 License 鏈;FR-077 掃遠端 Agent 鏈(已暫停)。這支是空白。
參照用的舊發現(未經本棒驗證,只是提示同類病灶存在):CM-1560 LDAP TLS 不驗憑證、CM-1565 Redis TLS 不驗憑證、CM-1564 LDAP 連線測試改位址可套出既存密碼。前兩條與本棒重點①同型,第三條與 N2 的測試信端點同型。