
Certificate Transparency ログを監視し、極端に小さい EC 秘密鍵を持つ証明書(eMudhra の弱鍵クラス)を検出します。P-256/384/521。
楕円曲線秘密鍵が自明なほど小さい整数である X.509 証明書(公開点 Q = d*G、d が小さい場合)を検出します — eMudhra の誤発行クラスです。 曲線: P-256、P-384、P-521。
p4mon/ — 本番モニター: インメモリ Rust チェッカー、CT ログテーラー、systemd ユニットcommon/ — targets.tsv、answers.tsv(既知解ベクター)benchmarks/ — rust c cpp go の検出器実装reference/ — Python 検出器および CCADB / BSGS スイーパー| 指標 | 値 |
|---|---|
| スキャンした証明書 | 約2.2億件/日 → 約1,100万個の異なる鍵(ログ間重複排除で90%) |
| 検出した弱い鍵 | 0 |
| CPU | 1コアの約5%(1コアにハード制限、SCHED_IDLE) |
| RAM | 約580 MB(ピーク642 MB、上限1 GB) |
| ネットワーク | 受信 約30〜40 Mbit/s(約300〜430 GB/日)、送信は無視できる程度 |
| ディスク I/O | ほぼなし(テーブルはページキャッシュから一度だけ読み込み、検出時のみ結果を書き込み) |
CT の発行量に応じてスケールします。AWS m7g.large(aarch64)、16ログで計測。
cargo build --release --manifest-path p4mon/Cargo.toml
cd p4mon
curl -fsSo loglist.json https://www.gstatic.com/ct/log_list/v3/log_list.json
./target/release/p4mon build table.bin # precompute d*G, d=1..1_000_000 (~80s, once)
./target/release/p4mon selftest # known-answer gate
./target/release/p4mon cert <file> # -> WEAK d=<n> | clean
python3 ct_tail_live.py | ./target/release/p4mon stream table.bin # live tail
ユニットはチェックアウトが /home/ec2-user/p4-inventory/p4mon にあることを前提としています。それ以外の場合はパスを調整してください。
cd p4mon
python3 -m pip install --user apprise # delivery library (alerts)
mkdir -p ~/.config/p4mon && cp apprise.txt.example ~/.config/p4mon/apprise.txt
chmod 600 ~/.config/p4mon/apprise.txt # then edit: add your target URL(s)
sudo cp systemd/p4mon-*.service systemd/p4mon-*.path systemd/p4mon-*.timer /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now p4mon-ct.service p4mon-find.path p4mon-report.timer
p4mon-ct は loglist.json が存在しない場合、自動的に取得します(ExecStartPre)。アラート(検出時および日次)は、~/.config/p4mon/apprise.txt に列挙した任意のターゲットへ Apprise 経由で配信されます — メール、ntfy、Pushover、Telegram、Slack、webhook など(apprise.txt.example を参照)。LLM は関与しません。ターゲットが設定されていない場合、レポートは送信されずにジャーナルへ記録されます。