
Surveillez les journaux Certificate Transparency pour détecter les certificats dotés de clés privées EC trivialement petites (la classe de clés faibles eMudhra). P-256/384/521.
Détecte les certificats X.509 dont la clé privée à courbe elliptique est un entier trivialement petit (point public Q = d*G pour d petit) — la classe de mauvaise émission eMudhra. Courbes : P-256, P-384, P-521.
p4mon/ — moniteur de production : vérificateur Rust en mémoire, suiveur de journaux CT, unités systemdcommon/ — targets.tsv, answers.tsv (vecteurs à réponse connue)benchmarks/ — implémentations du détecteur en rust c cpp goreference/ — détecteur Python et balayeurs CCADB / BSGS| métrique | valeur |
|---|---|
| certificats analysés | ~220 M observations/jour → ~11 M clés distinctes (90 % de déduplication inter-journaux) |
| clés faibles trouvées | 0 |
| CPU | ~5 % d'un cœur (plafonné à 1 cœur, SCHED_IDLE) |
| RAM | ~580 Mo (pic 642 Mo, plafond 1 Go) |
| réseau | ~30–40 Mbit/s en entrée (~300–430 Go/jour) ; sortie négligeable |
| E/S disque | ~aucune (la table est chargée une fois depuis le cache de pages ; les résultats ne sont écrits qu'en cas de détection) |
Évolue avec le volume d'émissions CT. Mesuré sur AWS m7g.large (aarch64), 16 journaux.
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
Les unités supposent que le dépôt se trouve à /home/ec2-user/p4-inventory/p4mon ; ajustez les chemins sinon.
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 récupère automatiquement loglist.json s'il est absent (ExecStartPre). Les alertes (détection +
quotidienne) sont envoyées via Apprise vers les cibles que vous listez dans
~/.config/p4mon/apprise.txt — e-mail, ntfy, Pushover, Telegram, Slack, webhook,
etc. (voir apprise.txt.example). Aucun LLM impliqué. Sans cible configurée, le
rapport est consigné dans le journal au lieu d'être envoyé.