
2026年10月のeMudhra/emSign CA鍵漏洩に対応するオフラインスキャナー。OSのトラストストア、CAバンドル、Java cacerts、NSS、コンテナイメージ全体から影響を受けた証明書を検出します。
2026年10月の eMudhra / emSign 中間CA秘密鍵侵害に対する検出ツール。8つの中間CAが、秘密スカラーが極めて小さな整数である P-384 鍵で発行されていた(復元値 4, 56, 66, 115, 155, 156, 230, 237)。そのため、誰でもこれらのCAに連鎖する証明書を容易に偽造できる。ブラウザやOSのトラストストアは迅速に信頼を解除したが、ほとんどの非ブラウザのトラストストアは自動更新されない。本ツールはまさにそこを検出する。
ステータス: 本インシデントは現在進行中であるため、同梱のIOCはスナップショットとして扱うこと(実行のたびに
generated日付が表示される)。更新するには、上流のトラッカーからtools/sources/*.jsonを再取得し、ジェネレーター(下記)を再実行する。
trustscan(Python)と trustscan.ps1(Windows/PowerShell)は、ホスト上のトラストストアとCAバンドルを棚卸しし、影響を受けた証明書に一致するものを警告する。標準ライブラリのみ + cryptography を使用し、その他の依存関係はない。
Python 3 と cryptography(唯一の依存関係)が必要:
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
終了コード: 0 = クリーン、1 = 検出あり、2 = エラー。INFO のみの結果(下記の
--flag-aaa を参照)は 0 で終了します。
すべての実行は、AAA クロスサイン経路に関する 1 行の注意書きで終わります(
スコープと制限事項を参照)。text モードではこれは
レポートの一部です。json/csv モードでは機械可読な出力をクリーンに保つため stderr に出力されます。
下記のいずれかの場所で見つかったすべての証明書はフィンガープリントが取得され、4 通りの方法でチェックされます:
| マッチ | 重大度 | 意味 |
|---|---|---|
compromised_ca_cert | CRITICAL | 正確に一致する侵害された中間証明書(証明書 SHA-256) |
compromised_key_reuse | CRITICAL | 侵害された鍵を持つ別の証明書(SPKI SHA-256) - Sectigo のクロスサインや再発行を検出 |
issued_by_compromised_ca | HIGH | AuthorityKeyIdentifier が侵害された中間証明書を指すリーフ/サブ CA - 偽造可能 |
distrust_root_present | CRITICAL | 信頼されていない emSign ルートがここで依然として信頼されている。ルート自身の鍵は無傷 - しかし中間鍵は公開されているため、このルートが信頼されている間は、あらゆるドメインに対する偽造証明書が、失効確認を行わないすべてのクライアント(ほとんどの非ブラウザクライアント)で検証を通ってしまう。これを削除するか、バンドルを更新すること。これ単独では AAA クロスサイン経路(下記)を塞がない |
さらに 1 つのチェックはオプトインです(--flag-aaa / -FlagAaa):
| マッチ | 重大度 | 意味 |
|---|---|---|
cross_sign_root_present | INFO | 正規の Sectigo ルート AAA Certificate Services が存在する。これは 8 つの中間証明書にクロスサインしており、それらの第 2 の信頼経路を支えている。自身の鍵は無傷。Mozilla と Chrome は 2025 年 4 月にこれを削除したが、Windows、Apple、古い Linux バンドル、そして多くの Java キーストアは依然としてこれを信頼している。要求時のみ報告され、削除すべきか判断するチーム向けの情報(このインシデントに対する Debian の更新では削除されている)。終了コードには一切影響しない |
デフォルトでは AAA Certificate Services はフラグされません: 自身の鍵は無傷であり、 これを削除するのは意図的な選択であって、デフォルトの修復措置ではないためです。これが重要である理由については、下記の制限事項を参照してください。
trustscan が参照する場所| ソース | 内容 | 確認される場所 |
|---|---|---|
certifi | Python CAバンドル | certifi.where()(実行時に解決) |
bundles → ディストロ | OSのca-certificates集約 | 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、統合Java cacerts、管理者anchors/ディレクトリ · SUSE /etc/ssl/ca-bundle.pem、/var/lib/ca-certificates/ca-bundle.pem · 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 | スタンドアロンcurlバンドル | /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 | $CONDA_PREFIX · /opt/conda · ~/anaconda3、~/miniconda3、~/miniforge3(envs/*を含む) |
bundles → AWS CLI v2 | バンドルされたbotocore | /usr/local/aws-cli/.../botocore/cacert.pem · C:\Program Files\Amazon\AWSCLIV2\... |
bundles → クラウドSDK / レジストリ / エコシステム | その他のベンダーバンドル | gcloud / Azure CLI third_party/certifi · コンテナレジストリ /etc/{docker,containers}/certs.d/*/ · Perl Mozilla::CA · Erlang/Elixir certifi |
bundles → pip | pipにバンドルされたcertifi | <pip>/_vendor/certifi/cacert.pem(import pip経由で解決) |
nss | Firefox / Thunderbird / Chrome-Linux + システムNSS DB | ~/.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 |
| ソース | 確認される場所 |
|---|---|
os(Linux) | /etc/ssl/certs · /usr/local/share/ca-certificates · /etc/pki/tls/certs · /etc/pki/ca-trust/extracted/pem(再帰)、さらにAndroid/AOSP /system/etc/security/cacerts、/apex/com.android.conscrypt/cacerts、cacerts-added/(ハッシュ名ファイル) |
os(macOS) | デフォルトキーチェーン + SystemRootCertificates.keychainに対するsecurity find-certificate -a -p |
os(Windows、Python) | ROOT、CA、MY、TrustedPublisher、AuthRootに対するssl.enum_certificates + グループポリシーでプッシュされたLocalMachineルート(レジストリ) |
java | $JAVA_HOME + JVMルート(/usr/lib/jvm/*、/opt/java/*、/Library/Java/JavaVirtualMachines/*、C:\Program Files\Java\*、Adoptium、Corretto、Microsoft) → .../lib/security/cacerts |
env | SSL_CERT_FILE、REQUESTS_CA_BUNDLE、CURL_CA_BUNDLE、NODE_EXTRA_CA_CERTS内のファイル、SSL_CERT_DIR内のディレクトリ |
containers(オプトイン) | Docker /var/lib/docker/overlay2/*/diff、podman(root + rootless、他ユーザーを含む)、containerd overlayfsスナップショット - 各レイヤーの集約バンドルをスキャン、root権限が必要、場所がレイヤー名を示す |
apptrust(オプトイン) | アプリサーバーおよびデータインフラのJavaトラストストア(Tomcat、WildFly/JBoss、Kafka、Elasticsearch)と/opt/*/jre/.../cacerts、C:\Program Files\*\jre\...配下のアプリバンドルJRE - ホストのJavaスキャンでは見逃されるベンダーバンドルJRE |
--pathターゲット | 設定で参照されるストア(nginx、Apache、HAProxy、Oracle sqlnet.ora、LDAP)、およびプロジェクトごとのバンドル(Composer vendor/composer/ca-bundle/...) - --pathをそれらに向ける |
paths | 渡した任意のファイル/ディレクトリ |
--rootfs <dir> | 展開されたイメージまたはファームウェアルートfs内のディストロ / curl / Java / Androidストアの場所 |
env変数はパスを保持しており、証明書データではありません -trustscanはそのパスにあるファイルを読み取ります。
--pathを使用certifi は、独自の CA ルートを同梱している唯一の Python パッケージではありません。以下のパッケージは、certifi と OS のストアの両方から独立して、site-packages 内に独自の *.pem をバンドルしています:
| パッケージ | 同梱ファイル |
|---|---|
| botocore (AWS CLI / boto3) | botocore/cacert.pem |
| grpcio (gRPC) | grpc/_cython/_credentials/roots.pem |
| httplib2 | httplib2/cacerts.txt (変則的な拡張子 - ファイルを直接指定してください) |
| requests (レガシー <2.16) | requests/cacert.pem |
デフォルトのスキャンは、certifi と pip にベンダリングされた certifi のみを自動的に特定し、trustscan.py を実行しているインタプリタに対してのみ行います。上記のその他すべて - さらにマシン上の他のすべての virtualenv や conda 環境 - は、--path を site-packages に向けて明示的にスキャンする必要があります:
python trustscan.py "$(python -c 'import site;print(site.getsitepackages()[0])')"
# or cover many environments at once
python trustscan.py /opt/venvs/ /home/*/.virtualenvs/ /opt/conda/envs/
# Windows / PowerShell equivalent
python trustscan.py (python -c "import site; print(site.getsitepackages()[0])")
OS のルートストア(/etc/ssl/certs など)にはこれらは含まれていません。ライブラリはそれらに依存しないよう、まさに自前のコピーをバンドルしています。ディレクトリのスキャンでは証明書拡張子のファイルしか開かないため、cacerts.txt のような風変わりな名前はファイルとして直接渡す必要があります。
trustscan.ps1)はさらに踏み込むPython の os ソースは LocalMachine ストアと LocalMachine GPO ルートをカバーします。trustscan.ps1 は、Python 標準ライブラリが Win32 相互運用なしでは到達できない唯一のもの、すなわち CurrentUser スコープ(同じ論理ストア)を追加します。さらに env バンドルや -Path のファイル/ディレクトリをネイティブに処理します。ユーザーごとの信頼が重要な場合はこれを使用してください。そうでなければ、Python ツールの Windows カバレッジと同等です。
PEM/DER X.509、PKCS#7(.p7b/.p7c)、PKCS#12(.p12/.pfx、changeit/空で試行)、および JKS キーストア - すべて標準ライブラリのみで解析されます。