
Escáner offline para el compromiso de claves de la CA eMudhra/emSign de octubre de 2026, que encuentra los certificados afectados en los almacenes de confianza del sistema operativo, los bundles de CA, los cacerts de Java, NSS y las imágenes de contenedores.
Herramientas de detección para el compromiso de la clave privada de la CA intermedia de eMudhra / emSign de octubre de 2026. Se emitieron ocho CAs intermedias con claves P-384 cuyos escalares privados eran enteros diminutos (valores recuperados 4, 56, 66, 115, 155, 156, 230, 237), por lo que cualquiera puede falsificar trivialmente certificados que encadenen con ellas. Los navegadores y los almacenes de confianza de los sistemas operativos aplicaron la desconfianza rápidamente, pero la mayoría de los almacenes de confianza que no son de navegadores no se actualizan automáticamente, y eso es lo que encuentra esta herramienta.
Estado: el incidente está activo, así que trata los IOCs incluidos como una instantánea (cada ejecución imprime su fecha de
generated). Para actualizarlos, refrescatools/sources/*.jsondesde el rastreador upstream y vuelve a ejecutar el generador (más abajo).
trustscan (Python) y trustscan.ps1 (Windows/PowerShell) inventarían
los almacenes de confianza y los bundles de CAs de un host y marcan cualquier cosa que coincida con los
certificados afectados. Solo stdlib + cryptography; sin otras dependencias.
Requiere Python 3 y cryptography (la única dependencia):
pip install -r requirements.txt
# scan this host's trust stores and CA bundles
python trustscan.py
# machine-readable for ticketing
python trustscan.py --format csv > findings.csv
# Windows-native: cert stores (both scopes) + GPO roots + env bundles
pwsh -File trustscan.ps1
Códigos de salida: 0 = limpio, 1 = hallazgo(s), 2 = error. Los resultados solo con INFO (véase
--flag-aaa más abajo) salen con 0.
Cada ejecución termina con una advertencia de una línea sobre la ruta de contrafirma AAA (véase
Alcance y limitaciones). En modo text forma
parte del informe; en modo json/csv va a stderr para que la salida legible por máquina
permanezca limpia.
Cada certificado encontrado en cualquier ubicación a continuación se somete a fingerprinting y se comprueba de cuatro formas:
| Coincidencia | Gravedad | Significado |
|---|---|---|
compromised_ca_cert | CRITICAL | intermedio comprometido exacto (SHA-256 del certificado) |
compromised_key_reuse | CRITICAL | un certificado diferente que porta una clave comprometida (SHA-256 del SPKI) - detecta las contrafirmas de Sectigo y cualquier reemisión |
issued_by_compromised_ca | HIGH | una hoja/sub-CA cuyo AuthorityKeyIdentifier apunta a un intermedio comprometido - falsificable |
distrust_root_present | CRITICAL | una raíz emSign no confiable sigue siendo de confianza aquí. Su propia clave está intacta - pero las claves intermedias son públicas, así que mientras esta raíz sea de confianza, un certificado falsificado para cualquier dominio valida para todo cliente que no compruebe la revocación (la mayoría de los clientes que no son navegadores). Elimínela / actualice el bundle. Por sí sola, esto no cierra la ruta de contrafirma AAA (más abajo) |
Hay una comprobación adicional opcional (--flag-aaa / -FlagAaa):
| Coincidencia | Gravedad | Significado |
|---|---|---|
cross_sign_root_present | INFO | la raíz legítima de Sectigo AAA Certificate Services está presente. Contrafirmó los ocho intermedios, por lo que ancla su segunda ruta de confianza; su propia clave está intacta. Mozilla y Chrome la retiraron en abril de 2025, pero Windows, Apple, los bundles de Linux más antiguos y muchos keystores de Java aún confían en ella. Se informa solo a petición, para equipos que deciden si eliminarla (la actualización de Debian para este incidente lo hace); nunca afecta al código de salida |
Por defecto AAA Certificate Services no se marca: su propia clave está intacta y eliminarla es una decisión deliberada, no una remediación por defecto. Véanse las limitaciones a continuación para entender por qué esto importa.
trustscan| Origen | Qué es | Ubicaciones comprobadas |
|---|---|---|
certifi | Paquete de CA de Python | certifi.where() (resuelto en tiempo de ejecución) |
bundles → distro | Agregados de ca-certificates del SO | Debian/Arch/Alpine /etc/ssl/certs/ca-certificates.crt · RHEL /etc/pki/tls/certs/ca-bundle.crt, /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem, cacerts de Java consolidado, directorio anchors/ del administrador · SUSE /etc/ssl/ca-bundle.pem, /var/lib/ca-certificates/ca-bundle.pem · Directorio de origen de Debian /usr/share/ca-certificates/ · /etc/ssl/cert.pem |
bundles → FreeBSD | ca_root_nss | /usr/local/share/certs/ca-root-nss.crt · /usr/local/etc/ssl/cert.pem |
bundles → Homebrew / MacPorts | brew / port ca-certificates, openssl | /opt/homebrew/etc/ca-certificates/cert.pem · /opt/homebrew/etc/openssl*/cert.pem · /usr/local/etc/... (Intel) · /opt/local/etc/{openssl,ssl}/cert.pem |
bundles → curl | paquete de curl independiente | /usr/local/share/curl/curl-ca-bundle.crt · /opt/local/share/curl/curl-ca-bundle.crt · C:\Program Files\Git\...\ca-bundle.crt |
bundles → conda | ssl/cacert.pem de cada entorno | $CONDA_PREFIX · /opt/conda · ~/anaconda3, ~/miniconda3, ~/miniforge3 (incl. envs/*) |
bundles → AWS CLI v2 | botocore incluido | /usr/local/aws-cli/.../botocore/cacert.pem · C:\Program Files\Amazon\AWSCLIV2\... |
bundles → SDKs de nube / registro / ecosistema | más paquetes incluidos | gcloud / Azure CLI third_party/certifi · registro de contenedores /etc/{docker,containers}/certs.d/*/ · Perl Mozilla::CA · certifi de Erlang/Elixir |
bundles → pip | certifi incluido en pip | <pip>/_vendor/certifi/cacert.pem (resuelto mediante import pip) |
nss | Firefox / Thunderbird / Chrome-Linux + base de datos NSS del sistema | ~/.mozilla/firefox/*/cert9.db · ~/.thunderbird/*/cert9.db · ~/snap/firefox/common/.mozilla/firefox/*/cert9.db · ~/.pki/nssdb/cert9.db · /etc/pki/nssdb/cert9.db · %APPDATA%\Mozilla\Firefox\Profiles\*\cert9.db · %APPDATA%\Thunderbird\Profiles\*\cert9.db |