
Monitora i log di Certificate Transparency alla ricerca di certificati con chiavi private EC banalmente piccole (la classe di chiavi deboli eMudhra). P-256/384/521.
Rileva certificati X.509 la cui chiave privata a curva ellittica è un intero banalmente piccolo (punto pubblico Q = d*G per d piccolo) — la classe di emissione errata eMudhra. Curve: P-256, P-384, P-521.
p4mon/ — monitor di produzione: checker Rust in memoria, tailer dei log CT, unit systemdcommon/ — targets.tsv, answers.tsv (vettori a risposta nota)benchmarks/ — implementazioni del rilevatore in rust c cpp goreference/ — rilevatore Python e sweeper CCADB / BSGS| metrica | valore |
|---|---|
| certificati analizzati | ~220M avvistamenti/giorno → ~11M chiavi distinte (90% di deduplicazione tra log) |
| chiavi deboli trovate | 0 |
| CPU | ~5% di un core (limitato rigidamente a 1 core, SCHED_IDLE) |
| RAM | ~580 MB (picco 642 MB, limite 1 GB) |
| rete | ~30–40 Mbit/s in ingresso (~300–430 GB/giorno); in uscita trascurabile |
| I/O su disco | ~nessuno (la tabella viene caricata una volta dalla page cache; i risultati vengono scritti solo in caso di rilevamento) |
Scala con il volume di emissione CT. Misurato su AWS m7g.large (aarch64), 16 log.
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
Le unit presuppongono che il checkout sia in /home/ec2-user/p4-inventory/p4mon; in caso contrario, adattare i percorsi.
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 scarica automaticamente loglist.json se manca (ExecStartPre). Gli avvisi (rilevamento +
giornaliero) vengono consegnati tramite Apprise ai target elencati in
~/.config/p4mon/apprise.txt — email, ntfy, Pushover, Telegram, Slack, webhook,
ecc. (vedi apprise.txt.example). Nessun LLM coinvolto. Se non è configurato alcun target, il
report viene registrato nel journal invece di essere inviato.