
Отслеживайте журналы Certificate Transparency на предмет сертификатов с тривиально малыми приватными ключами EC (класс слабых ключей eMudhra). P-256/384/521.
Обнаружение сертификатов X.509, чей закрытый ключ на эллиптической кривой представляет собой тривиально малое целое число (публичная точка Q = d*G для малого d) — класс ошибочной выдачи eMudhra. Кривые: P-256, P-384, P-521.
p4mon/ — рабочий монитор: проверяющее ядро на Rust в памяти, tailer CT-логов, юниты systemdcommon/ — targets.tsv, answers.tsv (векторы с известными ответами)benchmarks/ — реализации детектора на rust c cpp goreference/ — детектор на Python и сканеры CCADB / BSGS| метрика | значение |
|---|---|
| просканировано сертификатов | ~220M обнаружений/день → ~11M уникальных ключей (90% дедупликации между логами) |
| найдено слабых ключей | 0 |
| CPU | ~5% одного ядра (жёстко ограничено 1 ядром, SCHED_IDLE) |
| RAM | ~580 МБ (пик 642 МБ, лимит 1 ГБ) |
| сеть | ~30–40 Мбит/с входящий трафик (~300–430 ГБ/день); исходящий незначителен |
| дисковый ввод-вывод | ~отсутствует (таблица загружается один раз из page cache; результаты записываются только при обнаружении) |
Масштабируется вместе с объёмом выдачи CT. Измерено на AWS m7g.large (aarch64), 16 логов.
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
Юниты предполагают, что рабочая копия находится в /home/ec2-user/p4-inventory/p4mon; в противном случае скорректируйте пути.
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 автоматически загружает loglist.json, если он отсутствует (ExecStartPre). Оповещения (при обнаружении + ежедневные) доставляются через Apprise на любые цели, указанные вами в
~/.config/p4mon/apprise.txt — email, ntfy, Pushover, Telegram, Slack, webhook
и т. д. (см. apprise.txt.example). LLM не задействована. Если цель не настроена,
отчёт записывается в журнал вместо отправки.