
Supervisa los registros de Certificate Transparency en busca de certificados con claves privadas EC trivialmente pequeñas (la clase de claves débiles de eMudhra). P-256/384/521.
Detecta certificados X.509 cuya clave privada de curva elíptica es un entero trivialmente pequeño (punto público Q = d*G para d pequeño) — la clase de emisión incorrecta de eMudhra. Curvas: P-256, P-384, P-521.
p4mon/ — monitor de producción: verificador Rust en memoria, rastreador de registros CT, unidades systemdcommon/ — targets.tsv, answers.tsv (vectores de respuesta conocida)benchmarks/ — implementaciones del detector en rust c cpp goreference/ — detector en Python y barridos CCADB / BSGS| métrica | valor |
|---|---|
| certificados escaneados | ~220 M avistamientos/día → ~11 M claves distintas (90 % de deduplicación entre registros) |
| claves débiles encontradas | 0 |
| CPU | ~5 % de un núcleo (limitado estrictamente a 1 núcleo, SCHED_IDLE) |
| RAM | ~580 MB (pico de 642 MB, límite de 1 GB) |
| red | ~30–40 Mbit/s de entrada (~300–430 GB/día); salida insignificante |
| E/S de disco | ~ninguna (la tabla se carga una vez desde la caché de páginas; los hallazgos se escriben solo al producirse una coincidencia) |
Escala con el volumen de emisión de CT. Medido en AWS m7g.large (aarch64), 16 registros.
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
Las unidades asumen que el checkout está en /home/ec2-user/p4-inventory/p4mon; ajusta las rutas en caso contrario.
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 obtiene automáticamente loglist.json si falta (ExecStartPre). Las alertas (de hallazgo +
diarias) se entregan mediante Apprise a los destinos que indiques en
~/.config/p4mon/apprise.txt — correo electrónico, ntfy, Pushover, Telegram, Slack, webhook,
etc. (consulta apprise.txt.example). No interviene ningún LLM. Si no hay ningún destino configurado, el
informe se registra en el journal en lugar de enviarse.