
Monitoriza os logs de Certificate Transparency em busca de certificados com chaves privadas EC trivialmente pequenas (a classe de chaves fracas eMudhra). P-256/384/521.
Detecta certificados X.509 cuja chave privada de curva elíptica é um inteiro trivialmente pequeno (ponto público Q = d*G para d pequeno) — a classe de emissão incorreta da eMudhra. Curvas: P-256, P-384, P-521.
p4mon/ — monitor de produção: verificador Rust em memória, tailer de log CT, unidades systemdcommon/ — targets.tsv, answers.tsv (vetores de resposta conhecida)benchmarks/ — implementações do detector em rust c cpp goreference/ — detector em Python e varredores CCADB / BSGS| métrica | valor |
|---|---|
| certificados verificados | ~220M avistamentos/dia → ~11M chaves distintas (90% de deduplicação entre logs) |
| chaves fracas encontradas | 0 |
| CPU | ~5% de um núcleo (limitado rigidamente a 1 núcleo, SCHED_IDLE) |
| RAM | ~580 MB (pico de 642 MB, limite de 1 GB) |
| rede | ~30–40 Mbit/s de entrada (~300–430 GB/dia); saída desprezível |
| I/O de disco | ~nenhum (a tabela é carregada uma vez do page cache; descobertas gravadas apenas em caso de acerto) |
Escala com o volume de emissão de CT. Medido em 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
As unidades assumem que o checkout está em /home/ec2-user/p4-inventory/p4mon; ajuste os caminhos caso contrário.
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 busca automaticamente o loglist.json caso esteja ausente (ExecStartPre). Os alertas (descoberta +
diário) são entregues via Apprise para quaisquer destinos que você listar em
~/.config/p4mon/apprise.txt — email, ntfy, Pushover, Telegram, Slack, webhook,
etc. (veja apprise.txt.example). Nenhum LLM envolvido. Sem nenhum destino configurado, o
relatório é registrado no journal em vez de ser enviado.