
Überwacht Certificate-Transparency-Logs auf Zertifikate mit trivial kleinen EC-Privatschlüsseln (die eMudhra-Schwachschlüsselklasse). P-256/384/521.
Erkennt X.509-Zertifikate, deren privater Schlüssel auf einer elliptischen Kurve eine trivial kleine ganze Zahl ist (öffentlicher Punkt Q = d*G für kleines d) — die eMudhra-Fehlausstellungs-Klasse. Kurven: P-256, P-384, P-521.
p4mon/ — Produktions-Monitor: In-Memory-Rust-Prüfer, CT-Log-Tailer, systemd-Unitscommon/ — targets.tsv, answers.tsv (Known-Answer-Vektoren)benchmarks/ — Detektor-Implementierungen in rust c cpp goreference/ — Python-Detektor und CCADB-/BSGS-Sweeper| Metrik | Wert |
|---|---|
| gescannte Zertifikate | ~220M Sichtungen/Tag → ~11M eindeutige Schlüssel (90% Cross-Log-Deduplizierung) |
| gefundene schwache Schlüssel | 0 |
| CPU | ~5% eines Kerns (hart begrenzt auf 1 Kern, SCHED_IDLE) |
| RAM | ~580 MB (Spitze 642 MB, 1-GB-Limit) |
| Netzwerk | ~30–40 Mbit/s eingehend (~300–430 GB/Tag); ausgehend vernachlässigbar |
| Festplatten-I/O | ~keine (Tabelle wird einmal aus dem Page-Cache geladen; Ergebnisse werden nur bei einem Treffer geschrieben) |
Skaliert mit dem CT-Ausstellungsvolumen. Gemessen auf AWS m7g.large (aarch64), 16 Logs.
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
Die Units gehen davon aus, dass sich der Checkout unter /home/ec2-user/p4-inventory/p4mon befindet; andernfalls die Pfade anpassen.
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 lädt loglist.json automatisch nach, falls es fehlt (ExecStartPre). Alarme (bei Fund + täglich) werden über Apprise an alle Ziele zugestellt, die in ~/.config/p4mon/apprise.txt aufgeführt sind — E-Mail, ntfy, Pushover, Telegram, Slack, Webhook usw. (siehe apprise.txt.example). Es ist kein LLM beteiligt. Ist kein Ziel konfiguriert, wird der Bericht stattdessen ins Journal geschrieben.