
Scanner offline para o comprometimento da chave da CA eMudhra/emSign de outubro de 2026, que localiza certificados afetados em repositórios de confiança do sistema operacional, pacotes de CAs, cacerts do Java, NSS e imagens de contêiner.
Ferramentas de deteção para o comprometimento da chave privada da CA intermédia eMudhra / emSign em outubro de 2026. Oito CAs intermédias foram emitidas com chaves P-384 cujos escalares privados eram inteiros minúsculos (valores recuperados 4, 56, 66, 115, 155, 156, 230, 237), pelo que qualquer pessoa pode trivialmente forjar certificados que encadeiam até elas. Os navegadores e as trust stores dos sistemas operativos propagaram a desconfiança rapidamente - mas a maioria das trust stores que não são de navegadores não se atualiza automaticamente, e é isso que esta ferramenta deteta.
Estado: o incidente está ativo, pelo que os IOCs incluídos devem ser tratados como um snapshot (cada execução imprime a sua data de
generated). Para os atualizar, renovetools/sources/*.jsona partir do tracker upstream e volte a executar o gerador (abaixo).
trustscan (Python) e trustscan.ps1 (Windows/PowerShell) inventariam
as trust stores e os bundles de CA num host e sinalizam tudo o que corresponda aos
certificados afetados. Apenas stdlib + cryptography; sem outras dependências.
Requer Python 3 e cryptography (a única dependência):
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 saída: 0 = limpo, 1 = achado(s), 2 = erro. Resultados apenas INFO (ver
--flag-aaa abaixo) saem com 0.
Toda execução termina com uma ressalva de uma linha sobre o caminho de cross-sign da AAA (ver
Escopo e limitações). No modo text ela faz
parte do relatório; nos modos json/csv ela vai para stderr para que a saída
legível por máquina permaneça limpa.
Todo certificado encontrado em qualquer local abaixo recebe uma impressão digital e é verificado de quatro formas:
| Correspondência | Severidade | Significado |
|---|---|---|
compromised_ca_cert | CRITICAL | intermediário comprometido exato (SHA-256 do certificado) |
compromised_key_reuse | CRITICAL | um certificado diferente que carrega uma chave comprometida (SPKI SHA-256) - captura os cross-signs da Sectigo e qualquer reemissão |
issued_by_compromised_ca | HIGH | uma folha/sub-CA cujo AuthorityKeyIdentifier aponta para um intermediário comprometido - forjável |
distrust_root_present | CRITICAL | uma raiz emSign não confiável ainda é confiada aqui. Sua própria chave está intacta - mas as chaves dos intermediários são públicas, então enquanto esta raiz for confiada, um certificado forjado para qualquer domínio valida para todo cliente que não verifica revogação (a maioria dos clientes não-navegador). Remova-a / atualize o bundle. Por si só, isso não fecha o caminho de cross-sign da AAA (abaixo) |
Uma verificação adicional é opcional (--flag-aaa / -FlagAaa):
| Correspondência | Severidade | Significado |
|---|---|---|
cross_sign_root_present | INFO | a raiz legítima da Sectigo AAA Certificate Services está presente. Ela fez cross-sign dos oito intermediários, então ancora o segundo caminho de confiança deles; sua própria chave está intacta. Mozilla e Chrome a removeram em abril de 2025, mas Windows, Apple, bundles Linux mais antigos e muitos keystores Java ainda confiam nela. Reportada apenas sob solicitação, para equipes decidindo se devem removê-la (a atualização da Debian para este incidente o faz); nunca afeta o código de saída |
Por padrão, AAA Certificate Services não é sinalizada: sua própria chave está intacta e removê-la é uma escolha deliberada, não uma remediação padrão. Veja as limitações abaixo para entender por que isso importa.
trustscan procura| Origem | O que é | Locais verificados |
|---|---|---|
certifi | Pacote de CAs do Python | certifi.where() (resolvido em tempo de execução) |
bundles → distro | Agregados de ca-certificates do 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 Java consolidado, diretório anchors/ do administrador · SUSE /etc/ssl/ca-bundle.pem, /var/lib/ca-certificates/ca-bundle.pem · Diretório de origem 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 | pacote curl autônomo | /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 ambiente | $CONDA_PREFIX · /opt/conda · ~/anaconda3, ~/miniconda3, ~/miniforge3 (incl. envs/*) |
bundles → AWS CLI v2 | botocore empacotado | /usr/local/aws-cli/.../botocore/cacert.pem · C:\Program Files\Amazon\AWSCLIV2\... |
bundles → SDKs de nuvem / registry / ecossistema | mais pacotes vendorizados | gcloud / Azure CLI third_party/certifi · container-registry /etc/{docker,containers}/certs.d/*/ · Perl Mozilla::CA · Erlang/Elixir certifi |
bundles → pip | certifi vendorizado do pip | <pip>/_vendor/certifi/cacert.pem (resolvido via import pip) |
nss | Firefox / Thunderbird / Chrome-Linux + banco de dados NSS do 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 |