🔒 情報セキュリティ

eMudhra(emSign)中間CA秘密鍵脆弱性インシデント徹底解説:秘密鍵が「4」になった原因とWebPKI・開発環境への影響

#セキュリティ#PKI#SSL/TLS#eMudhra#電子証明書#インシデント解説

2026年10月17日、インターネットの信頼の根幹を支える WebPKI(公開鍵基盤) において、近年で最も衝撃的かつ重大な暗号学的インシデントのひとつが発覚しました。

インドのパブリック認証局(CA)である eMudhra(ブランド名:emSign) が運用する 計8枚の中間CA証明書(TLSサーバー証明書用6枚・コードサイニング用2枚) について、「公開鍵から誰でも一瞬で秘密鍵を算出できる」 という致命的な脆弱性が明らかになったのです。さらに驚くべきことに、その中間CAの1つ(EM OV TLS CA - G3C)の384ビット楕円曲線暗号(ECC P-384)の秘密鍵は、文字通り 整数の 4 でした。

もし悪意ある攻撃者がこの事実に気づき、秘密鍵を使って任意のドメイン(Google、金融機関、クラウドAPIなど)の偽造TLS証明書を発行して中間者攻撃(MitM)を仕掛けていた場合、インターネット全体のHTTPS通信の安全性が根底から崩れかねない事態でした。

本記事では、eMudhra とはどのような企業・認証局なのかという背景から、なぜ HSM(ハードウェアセキュリティモジュール)を使った厳格な鍵生成セレモニーで秘密鍵が 4 になってしまったのか、そして ブラウザ以外の開発環境(Linux ca-certificates・Dockerコンテナ・Python certifi・Node.js 等)にどのような影響と対策が求められるのか までを体系的に解説します。


1. そもそも eMudhra(emSign)とはどのような認証局か?

まず、今回のインシデントの当事者である eMudhra Limited(エムドゥラ) について整理しておきましょう。日本のWeb開発者には馴染みが薄いかもしれませんが、同社は決して無名の小規模事業者ではなく、アジア圏を代表する巨大トラストサービスプロバイダーのひとつです。

1.1 インド最大の電子署名・PKI企業としての背景

  • 設立と沿革:2008年にインド・ムンバイで 3i Infotech Consumer Services Limited として設立され、現在はベンガルール(バンガロール)に本社を構えています。インドの証券取引所(NSE / BSE)にも上場している公開企業です。
  • インド国内での圧倒的シェア:インド情報技術法(IT Act)に基づく認証局監督機関(CCA:Controller of Certifying Authorities)から認可を受けており、インド国内の確定申告、電子入札、銀行取引、Aadhaar(国民ID)連携などで使われるデジタル署名証明書(DSC)市場で最大のシェアを握っています。
  • グローバルブランド「emSign」の展開:インド国内のPKI事業にとどまらず、グローバルなSSL/TLSサーバー証明書・S/MIME・コードサイニング証明書市場へ参入するために立ち上げたのが 「emSign」 ブランドです。

1.2 主要ブラウザ・OSのルートストアへの登録と「クロス署名」

eMudhra(emSign)は国際的な認証局監査基準である WebTrust を取得し、以下の主要ルートプログラムすべてに自社のルートCA(emSign Root CA / emSign ECC Root CA シリーズ)を登録していました。

  • Mozilla(NSS / Firefox)
  • Google(Chrome Root Store)
  • Apple(macOS / iOS トラストストア)
  • Microsoft(Windows トラストストア)

2. インシデントの全貌:楕円曲線暗号(P-384)の秘密鍵が「4」だった衝撃

2026年10月17日、セキュリティリサーチャーの Wayne 氏によって Mozilla のバグトラッカー(Bugzilla Bug 2083449)に1件の重大な報告が投稿されました。報告には、eMudhra の中間CAの秘密鍵を実際に保持している証拠(Proof of Key Possession)として、それらの秘密鍵で署名された検証データが添付されていました。

2.1 何が起きていたのか?(暗号学的な仕組み)

問題となった中間CA証明書は、楕円曲線暗号の NIST P-384(secp384r1) を使用していました。

楕円曲線暗号において、曲線のベースポイント(生成元)を G、位数を n(約 2^384 の巨大な素数)とすると、鍵ペアは次のように定義されます。

  • 秘密鍵(スカラー値 d):1 から n - 1 までの範囲から、暗号論的に安全な乱数生成器(CSPRNG / TRNG)でランダムに選ばれた 384ビット(48バイト)の巨大な整数
  • 公開鍵(曲線上の点 Q):ベースポイント G を d 回足し合わせた点(スカラー倍算)
Q = d × G

本来であれば、公開鍵 Q とベースポイント G が分かっていても、そこから秘密鍵 d を逆算すること(楕円曲線離散対数問題:ECDLP)は、現代のスーパーコンピュータを使っても天文学的な時間がかかるため不可能です。

ところが、今回発覚した eMudhra の8枚の中間CA証明書では、48バイト(384ビット)あるべき秘密鍵 d の上位47バイトがすべて 0x00 であり、末尾の1バイト(すなわち 1〜255 の小さな整数)しか値が入っていなかったのです。

2.2 影響を受けた8種類(計16枚)の中間CAと実際の秘密鍵一覧

リサーチャーおよび Mozilla エンジニアの解析によって判明した、8つの鍵ペア(eMudhra ルート署名版8枚 + Sectigo クロス署名版8枚 = 計16枚の中間CA証明書)の実際の秘密鍵(スカラー値 d)は以下のとおりです。

中間CA証明書名(Subject CN)用途(拡張鍵用途)本来のエントロピー実際の秘密鍵(10進数)16進数表記(48バイト中47バイトがゼロ)
EM OV TLS CA - G3CTLSサーバー証明書(OV:企業認証)384 bit40x00...0004
EM EV TLS CA - G3CTLSサーバー証明書(EV:拡張認証)384 bit560x00...0038
EM OV CS CA - G3Bコードサイニング証明書(OV)384 bit660x00...0042
EM EV TLS CA - G3BTLSサーバー証明書(EV:拡張認証)384 bit1150x00...0073
EM OV TLS CA - G3BTLSサーバー証明書(OV:企業認証)384 bit1550x00...009b
EM DV TLS CA - G3BTLSサーバー証明書(DV:ドメイン認証)384 bit1560x00...009c
EM DV TLS CA - G3CTLSサーバー証明書(DV:ドメイン認証)384 bit2300x00...00e6
EM OV CS CA - G3Cコードサイニング証明書(OV)384 bit2370x00...00ed

ご覧のとおり、EM OV TLS CA - G3C の公開鍵 Q は単に Q = 4G = G + G + G + G であり、他の7枚もすべて 256 未満の整数(実質エントロピーはわずか 3〜8ビット)でした。


3. なぜこんなことが起きたのか?原因は2025年4月の鍵生成セレモニー

「WebTrust監査を受けている認証局が、なぜ FIPS 140 認定の HSM(ハードウェアセキュリティモジュール)を使っていながら、秘密鍵 4 を生成してしまったのか?」——これは世界中の暗号学者やインフラエンジニアが最初に抱いた疑問でした。

Mozilla Bugzilla に提出された eMudhra のインシデント調査報告(根本原因分析)から、2025年4月30日に実施された鍵生成セレモニー(Key Generation Ceremony)における複数の手順逸脱とヒューマンエラーの連鎖が明らかになっています。

2025年4月30日:eMudhra 鍵生成セレモニーでの事故発生プロセス
  1. 正常な鍵生成
    • HSM内部の乱数生成器により、本来の中間CA用 P-384 鍵ペア(高エントロピー)を正常に生成
  2. 承認外のスクリプト変更・キーラッピング(Wrap/Unwrap)テストの実施
    • 鍵バックアップ(エクスポート/インポート)検証用の PKCS#11 ユーティリティ/スクリプトを実行。
    • この際、パラメータまたはバッファ指定の不備により、上位47バイトが 0x00 で埋められた極小スカラー値(4, 56, 66...)を持つ「2つ目の欠陥鍵オブジェクト」が HSM 内に生成・インポートされる
  3. 同一・紛らわしいキーラベルによる取り違え
    • HSM 内で「正常な鍵」と「欠陥のあるテスト鍵」に重複・類似したラベルが付与されていたため、CSR(証明書署名要求)生成時に誤って「欠陥のある鍵」が参照された
  4. 検証ゲートの欠如とルート署名・クロス署名の発行
    • 生成された公開鍵の妥当性(微小スカラーチェック等)を検証する仕組みがないまま、上位ルート(emSign ECC Root CA - G3)および Sectigo(AAA Certificate Services)が署名・発行
  5. 約17ヶ月間の放置(2025年4月30日 〜 2026年10月17日)
    • Certificate Transparency (CT) ログに公開された状態で17ヶ月間インターネット上に存在し続けた

3.1 技術的なボトルネック:PKCS#11 ラップ/アンラップ処理の罠

HSM は内部で直接鍵を生成(C_GenerateKeyPair)する場合にはハードウェア乱数生成器(TRNG)を使うため、本来このような低エントロピー鍵は生まれません。

しかし、HSM 間で鍵をバックアップ・移行するために外部から鍵データを暗号化してインポートする Key Wrapping / Unwrapping(C_UnwrapKey) 機能を使う場合、HSM は「渡されたバイト列」をそのまま秘密鍵スカラー値(CKA_VALUE)として展開します。 このテストスクリプトの実装バグ(48バイト領域のうち1バイトの値やポインタ/カウンタ値だけが書き込まれ、残りがゼロパディングされた状態)によって作られたオブジェクトが、ラベル管理の杜撰さから本番の CSR 生成に使われてしまったことが直接の原因でした。

3.2 なぜ危険性が極めて高かったのか?

  1. 名前制約(Name Constraints)のない汎用TLS中間CAだった
    これら6枚のTLS中間CAには、発行可能なドメインを制限する nameConstraints 拡張が付与されていませんでした。つまり、秘密鍵を入手した第三者は、*.google.com であれ、メガバンクのドメインであれ、社内 ゼロトラストアクセス基盤 のドメインであれ、世界中のあらゆるドメインに対してブラウザが正規と認めるTLS証明書(DV / OV / EV)を無制限に偽造できる権限を持っていました。
  2. Certificate Transparency(CT)ログすら回避可能だった
    通常、パブリックCAが誤って証明書を発行すると CT ログに記録され、ドメイン所有者が検知できます。しかし、中間CAの秘密鍵そのものが奪われた場合、攻撃者は CT ログに一切登録しないまま、さらに配下の「偽造サブ中間CA」を勝手に作ったり、必要なSCT(Signed Certificate Timestamp)を装ったり、あるいは CT 強制を行わない非ブラウザ環境(APIクライアント・CLIツール)を狙い撃ちにすることが可能でした。
  3. コードサイニング証明書(OV CS CA)も含まれていた
    TLS用の6枚だけでなく、ソフトウェアにデジタル署名を行うためのコードサイニング中間CA(EM OV CS CA - G3B / G3C)も2枚含まれていました。これにより、マルウェアに対して「正規の認証局から発行された有効な署名」を付与できるリスクもありました。

4. 時系列で見る発覚からブラウザ各社の緊急ブロック、そして事業撤退まで

報告を受けたブラウザベンダーおよびルートプログラム運営各社の対応は、WebPKI の歴史上でも類を見ないほど迅速でした。

日時(2026年)出来事・対応内容
2025年4月30日eMudhra が問題の鍵生成セレモニーを実施。脆弱な8つの鍵ペアから中間CA証明書(計16枚)が発行される
2026年10月17日リサーチャーが Mozilla Bugzilla(Bug 2083449)に秘密鍵の所持証明とともに脆弱性を報告
2026年10月17日(数時間以内)Mozilla が Firefox 向けに OneCRL の緊急アップデートを配信し、該当する中間CAを即時ブロック。
Google も Chrome / Chromium / Android 向けに CRLSet の緊急更新を配信し、該当する公開鍵ハッシュ(SPKI)を即時ブロック
2026年10月17日〜18日eMudhra およびクロス署名元の Sectigo が、該当する計16枚の中間CA証明書をすべて失効(Revoke)処理
2026年10月19日〜20日Apple および Microsoft が OS レベルのトラストリスト更新を配信し、プラットフォーム全体で遮断
2026年10月下旬各ブラウザのルートプログラムが親ルートである emSign ECC Root CA - G3 自体の信頼削除(Distrust)を決定。これを受け、eMudhra はグローバルなパブリックSSL/TLS証明書事業からの撤退を表明(インド国内向けのCCA管轄PKI事業およびエンタープライズ事業は継続)

5. 【重要】ブラウザは安全でも「サーバー・CLI・コンテナ環境」が危険な理由

一般のエンドユーザーが利用する Web ブラウザ(Chrome、Firefox、Safari、Edge)は、CRLSet や OneCRL といったブラウザ独自のオンライン失効リスト自動配信機能を持っているため、2026年10月17日〜20日の時点で自動的に保護されています。

しかし、Webエンジニアやインフラ管理者が最も警戒しなければならないのは「ブラウザ以外の通信環境(バックエンドサーバー・CLIツール・Dockerコンテナ・言語ランタイム)」です。

5.1 非ブラウザ環境が抱える2つの死角

ブラウザ環境(Chrome / Firefox 等)
  1. 偽造証明書 + 脆弱な中間CA(Sectigoクロス署名版)を受信
  2. CRLSet / OneCRL で中間CAの SPKI ハッシュを照合
  3. 【ブロック成功】即座に通信を遮断!
非ブラウザ環境(curl / Python / Node.js / Go / 古いコンテナ)
  1. 偽造証明書 + 脆弱な中間CA(Sectigoクロス署名版)を受信
  2. 失効・ブロックの仕組みがすり抜けられる
    • OneCRL や CRLSet のような自動ブロックリストを持たない
    • デフォルトで OCSP / CRL(失効確認)を行わない(Soft-fail または無効)
    • ローカルの ca-certificates 内の「Sectigo (AAA Certificate Services)」ルートを信頼している
  3. 【検証通過の危険】正規の証明書チェーンとして信頼してしまう!
    • 攻撃者が中間CA証明書をTLSハンドシェイクに同梱して提示すると、そのまま検証を通過する

TLS ハンドシェイクでは、サーバー側が「リーフ証明書(偽造)+ 中間CA証明書(Sectigoがクロス署名した EM OV TLS CA - G3C)」をセットでクライアントへ送りつけることができます。クライアント側が中間CAの失効チェックを行わない場合、ローカルの AAA Certificate Services ルートまで署名が繋がってしまうため、偽造証明書を完全に正規のものとして受け入れてしまうのです。


6. 開発者・インフラ管理者が今すぐ実施すべき確認と対策

自分の管理するWebサイト、クラウド環境、ローカル開発マシン、コンテナイメージを守るために、以下の3つの対策を必ず実施してください。

対策①:OS・コンテナ・言語ランタイムの CA バンドルとパッケージを最新化する

Linux ディストリビューション(Ubuntu / Debian / RHEL / Alpine)やプログラミング言語のパッケージメンテナは、今回のインシデントを受けて緊急のアップデートや中間CAブラックリスト対応を行っています。

Ubuntu / Debian / Alpine(Docker コンテナを含む)

OS のパッケージを更新し、ca-certificates および openssl / gnutls を最新状態に保ちます。特に本番稼働中の Docker コンテナは、ベースイメージを再プルしてリビルド&再デプロイしてください。

Terminal
# Ubuntu / Debian 系
sudo apt update && sudo apt install --only-upgrade -y ca-certificates openssl
sudo update-ca-certificates --fresh

# Alpine Linux 系(Dockerコンテナ等)
apk update && apk upgrade ca-certificates openssl
update-ca-certificates

Python 環境(certifi パッケージ)

Python の requests や httpx、urllib3 などは、OS の証明書ストアではなく Python 独自の certifi パッケージに同梱された CA バンドルを参照するケースが多々あります。

Terminal
# pip / uv / poetry 等で certifi を最新版へ更新
pip install --upgrade certifi

Node.js / Go 環境

Node.js はバイナリ自体に Mozilla NSS ベースのルートストアを内蔵しています(--use-openssl-ca フラグを指定している場合を除く)。最新のセキュリティリリースが適用されたマイナーバージョンへ更新してください(mise や fnm を使った Node.js バージョン管理 を導入しておくと一括更新が容易です)。

対策②:ローカルのトラストストアから emSign ルート証明書を明示的に無効化する

非ブラウザ環境で emSign ECC Root CA - G3(および関連する emSign ルート)を即座に信頼対象から外したい場合、以下のコマンドで現在の登録状況を確認し、除外できます。

Terminal
# システムの証明書バンドル内に emSign が含まれているか確認(macOS / Linux 共通)
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/cert.pem | \
  openssl pkcs7 -print_certs -noout | grep -i -C 1 "emSign"

Debian / Ubuntu 系で特定のルート証明書を無効化する場合は、sudo dpkg-reconfigure ca-certificates を実行して emSign 系のチェックを外すか、/etc/ca-certificates.conf 内の該当行の先頭に ! を付与して sudo update-ca-certificates を実行します。

対策③:自社ドメインに DNS の「CAA レコード」を設定して意図しないCAからの発行を防ぐ

WebPKI における防御策として、すべてのドメイン所有者が設定しておくべきなのが DNS の CAA(Certification Authority Authorization)レコード です(Cloudflare DNS でのセキュリティ設定 でも必須の項目です)。

CAA レコードを設定しておけば、正規の認証局が証明書を発行する際、指定された CA(例:Let’s Encrypt や Google Trust Services、Cloudflare が利用する CA)以外の認証局による誤発行をプロトコルレベルで拒否できます。

DNS ゾーン(CAA レコード)
; Cloudflare や Let's Encrypt、Google Trust Services のみに証明書発行を許可する CAA レコード例
example.com.  IN  CAA  0 issue "letsencrypt.org"
example.com.  IN  CAA  0 issue "pki.goog"
example.com.  IN  CAA  0 issue "ssl.com"
example.com.  IN  CAA  0 iodef "mailto:security@example.com"

まとめ

2026年10月に発覚した eMudhra(emSign)の中間CA秘密鍵インシデント は、「厳格な監査をパスしたパブリックCAであっても、HSM 運用スクリプトのわずか1つのバグとラベル管理ミスによって、秘密鍵が『4』になるような壊滅的な欠陥を生み出し得る」という厳しい現実を突きつけました。

本記事のポイントを改めて整理します。

現代のアプリケーション開発では、外部API連携や Webhook 検証、コンテナ間の通信など、すべてが TLS(WebPKI)の信頼の上に成り立っています。手元の開発環境や本番サーバーの CA バンドル・ランタイムの更新状況をぜひこの機会に点検してみてください。


📚 関連する技術記事

情報セキュリティの記事一覧 →

Webアプリケーションにおけるパスワード認証と保持の正しい仕組み:なぜ「暗号化」もNGで「ハッシュ化」が必須なのか

Webアプリケーションの認証基盤において、パスワードを平文で保存してはいけない理由だけでなく、「暗号化(可逆変換)」での保存もNGである理由、「不可逆な暗号化」という表現が不適切な理由を整理。ソルト・ペッパー・ストレッチングの仕組みと、Argon2idやbcryptを用いた現代の正しい実装方式を解説します。

PHPの重大脆弱性「PHP2Shell」(CVE-2026-109618 / CVE-2026-109619)技術解説:なぜこの事件はAIとセキュリティ史の「転換点」なのか

2026年10月に公開されたPHPコアの致命的なリモートコード実行(RCE)脆弱性「PHP2Shell」(CVE-2026-109618・CVE-2026-109619)の内部メカニズム(zend_bailout / longjmp・multipart解析・Use-After-Free)をエンジニア向けに徹底解説。あわせて、フロンティアAIが10年以上眠っていた脆弱性を発見・連鎖させたこの事件がなぜ時代の転換点なのかを論じます。