本卡屬 FR-078(母卡 CM-1602),修 N2(CM-1604)的 F4 與 F8,兩條都 3/3 全票通過。併一張卡(同性質:腳本內硬編憑證)。

🔴 這兩組密碼與那四把 API 金鑰不同——它們還沒有被撤銷、目前仍然有效。 決策者已被告知需更換。本卡處理的是程式碼層面(把硬編值改成環境變數);密碼本身的更換由決策者執行,不在本卡範圍。動手前先向首腦確認密碼是否已更換,兩者順序會影響手測怎麼做。

問題是什麼(白話)

① POC 資料庫密碼寫死在文件產生腳本裡。任何能讀這個 repo 的人,拿著那組連線資訊就能直接連上 POC 資料庫。POC 等同 production(對外 demo/客戶試玩),這是繞過整個應用層授權直接讀寫客戶資料。

② blsadmin 管理員密碼寫死在三支腳本裡。拿到的人可以直接登入任何搆得到的環境、取得管理員權限。而管理員權限又能改 SMTP 設定——與本 arc 的 F1 串起來就是完整的攻擊鏈

首腦核對過的位置

F4 — POC DB 密碼
  docs/system-design/scripts/generate_db_schema_docx.py:34
    DB_CONN = dict(host=..., port=25432, dbname="guidant_ai_poc",
                   user="cm_app", password="<硬編>")

F8 — blsadmin 密碼(三處)
  scripts/e2e_test_module_frame_with_docx.py:38          TEST_PASS = "<硬編>"        ← 無環境變數逃生門
  scripts/migrate_2026-08-09_fr062_existing_tenant_licenses.py:80
      SEED_PASS = os.getenv("FR062_SEED_PASS", "<硬編>")  ← 有變數但 default 是真密碼
  scripts/seed_2026-08-01_fr059_detection_profiles.py:65
      SEED_PASS = os.getenv("FR059_SEED_PASS", "<硬編>")  ← 同上

注意後兩處的形狀:它們「有」環境變數,但 default 直接寫真密碼——變數沒設時就靜默用真密碼,等於沒有防護還多一層誤導。

怎麼修

不用寫測試

這幾支是一次性的維運/文件腳本,不屬「核心共用邏輯」,照 CLAUDE.md 測試政策不需要新增 unit test。驗證用手測即可。

手測

紀律