Skip to content

feat(m6,ct): M6 更名為「暗網帳號密碼外洩」並新增相似憑證統計章節#1

Open
like19970403 wants to merge 1 commit intoastroicers:mainfrom
like19970403:feat/m6-rename-and-ct-details
Open

feat(m6,ct): M6 更名為「暗網帳號密碼外洩」並新增相似憑證統計章節#1
like19970403 wants to merge 1 commit intoastroicers:mainfrom
like19970403:feat/m6-rename-and-ct-details

Conversation

@like19970403
Copy link
Copy Markdown

Summary

本 PR 解決兩個先前容易誤導客戶的問題,並新增一個資訊性章節:

  1. M6 命名修正:module 名稱「暗網憑證外洩」中的「憑證」容易與 TLS certificate 混淆(同一 PR 後段要新增的 CT 章節就是典型受害者)。改為「暗網帳號密碼外洩」。
  2. M6 COMB 假 10000 問題ProxyNova 的 count 是 substring match 全集(最大 10000),含大量與目標 domain 無關的誤報。實測 net-chinese.com.tw 假 10000 實際只有 2 筆真實 @domain 命中。改為對 lines 做 email suffix 過濾。
  3. 新增「相似憑證統計(Certificate Transparency)」章節:從 crt.sh 擷取 CT metadata,顯示憑證總數 / Wildcard 張數 / 最近與最早紀錄 / Issuer 分布 / 明細表。純資訊展示,不計入評分。

變更內容

M6 更名

  • darkweb.py module_name、finding title 字串
  • scoring/weights.py
  • 同步更新 CHANGELOG.mdADR-002ADR-003、測試

M6 COMB 過濾修正

  • _check_credential_leaks 改為對 lines 做 email @domain suffix 過濾
  • 回傳 3-tuple (count, matched_lines, error),原始 email:password 帶到 Finding.evidence,方便客戶直接取得明文重設帳密

相似憑證統計(新功能)

  • models/assets.py:新增 Certificate dataclass + Assets.certificates 欄位與統計屬性(total_certificates / wildcard_certificates / latest_certificate / earliest_certificate / issuer_stats
  • discovery/web_sources.py:新增 query_crtsh_certificates() 回傳 CT metadata
  • crt.sh 雙 endpoint fallback:JSON 後端(output=json)是本專案實戰時觀察到的不穩來源,經常 502。新增 HTML table scrape fallback(Identity=%.<domain>q=<domain>&group=none 兩條 HTML 路徑),JSON 掛掉時仍能取得完整憑證資料
  • discovery/pipeline.py:新增 Step 1c ct_certificates,把資料塞進 Assets

報告版面改善

  • 憑證章節置於「資產清單」之後
  • Finding evidence 若含多行自動渲染為可展開 <details>(紅色樣式,適合展示外洩明文)
  • 資產清單加免責說明,點出被動來源可能有已下線 / 內網 only / 遷移殘留
  • 憑證明細表 table-layout: fixed + word-break,避免 PDF 窄欄位被截
  • @media print 全文改 A4 landscape,客戶 PDF 不再被 portrait 窄版截

Test plan

  • 全套 382 tests passed(新增 1 test:test_html_fallback_when_json_502
  • 實測 net-chinese.com.tw:
    • M6 finding 正確顯示 2 筆 user@net-chinese.com.tw:password 明文
    • 127 筆 CT 憑證完整呈現
    • crt.sh JSON 全程 502 時,HTML fallback 實戰救回資料
    • PDF 中文字型正確(需在容器內 render,容器已含 Noto CJK)
  • Reviewer 檢查:憑證明文展示是否符合客戶交付要求(否則 default 改為 masked 或僅 email)
  • Reviewer 檢查:CT 章節預設顯示是否合適(某些客戶可能不想看到舊憑證歷史)

Known follow-ups

  • query_crtsh_certificates 目前若 JSON/HTML 都掛會回空,未做 cross-scan 快取 fallback。可加「若本次為空就沿用上次 scan 結果」。
  • crt.sh 近日(PR 期間實測多次)後端不穩。HTML fallback 是必要但不是銀彈,若 CT 資料在評分中變成關鍵來源,需考慮其他 CT log 來源(Google、Censys)。

🤖 Generated with Claude Code

M6 改名
  - module_name: 暗網憑證外洩 → 暗網帳號密碼外洩(中文「憑證」易與 TLS 憑證混淆)
  - finding title: 外洩憑證 → 外洩帳號密碼
  - 同步更新 scoring/weights.py、測試、CHANGELOG、ADR-002、ADR-003

M6 COMB 查詢修正(ProxyNova 誤報 10000 問題)
  - _check_credential_leaks 改為對 lines 做 email suffix 過濾,不再盲信 count
  - 回傳 3-tuple (count, matched_lines, error),把原始 email:password 帶出
  - Finding.evidence 改存明文外洩資料供報告展示

新增相似憑證統計章節(資訊性,不計入評分)
  - models: 新增 Certificate dataclass + Assets.certificates 欄位與統計屬性
  - discovery: 新增 query_crtsh_certificates(),抓 CT metadata(crt_id / 時間 /
    CN / SANs / issuer)
  - crt.sh 雙 endpoint fallback:JSON 掛時改走 HTML table scrape,解決 crt.sh
    後端 output=json 偶發 502 時完全拿不到資料的問題
  - pipeline Step 1c 將憑證塞進 Assets
  - report.html 新增「相似憑證統計(Certificate Transparency)」章節:統計卡
    (總數 / Wildcard / 最近 / 最早)+ Issuer 分布表 + 憑證明細表
  - 章節位置置於「資產清單」之後,作為攻擊面情資佐證

報告版面改善
  - Finding 的 evidence 若為多行(如外洩帳密清單)自動渲染為可展開的
    <details> 區塊,方便客戶直接取得明文
  - 資產清單加上免責說明:被動情資來源可能回報已下線、內部 only、遷移殘留等
    情境,欄位「-」代表該項掃描當下無資料
  - 憑證明細表改為 table-layout: fixed + word-break,避免 PDF 窄欄位被截斷
  - @media print 全文改 A4 landscape,統一印出橫向版面

測試
  - 新增 test_html_fallback_when_json_502:驗證 JSON 掛掉時 HTML parser 能
    正確解析 crt.sh 表格
  - 更新 _mock_comb_response 使 lines 反映真實過濾後筆數
  - test_check_credential_leaks_filters_by_email_suffix 驗證 substring 誤報
    被濾除且 matched_lines 保留原始行

全套 382 tests passed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants