12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

eMudhra事件でWebアプリ開発者が点検すべきこと

12
Last updated at Posted at 2026-10-24

2026年10月、認証局eMudhraの中間CA秘密鍵が極端に弱く、公開情報から復元できる問題が明らかになりました。復元した秘密鍵を用いて攻撃者が他人のドメインの証明書を偽造できるため、インターネットの信頼基盤が揺らぐ事件です。

ただし、この事件を正しく理解することはなかなか大変です。HTTPS通信の仕組みやPKIの枠組み、証明書ストアがどこに保存されているかを理解しないと、「フィッシングサイトが作りやすくなっただけでしょ?OSからルート証明書を削除すれば問題ないのかな?」程度だと問題を過小評価します。

この記事では、証明書の仕組みを解説したうえで、アプリ開発者がどこを点検し、何から対処すべきかを整理します。

1. HTTPSは「暗号化」だけでは成り立たない

HTTPSで使われるTLSは、通信の盗聴や改ざんを防ぐとともに、接続先の認証を行います。その理由は、通信の暗号化だけでは、盗聴は防げますが、中間者攻撃を防げないからです。「暗号化して送った相手が、本当に目的のサーバなのか」を確認する必要があります。

その確認に使うのが、ドメイン名と公開鍵を結びつけるサーバ証明書です。一般的な公開Webサイトでは、次のような証明書の連鎖(証明書チェーン)を検証します。

証明書 役割
ルートCA証明書 OSやブラウザなどが、あらかじめ信頼する起点
中間CA証明書 上位のCAから、一定の条件で証明書を発行する権限を委任される
サーバ証明書 接続先のドメイン名と、そのサーバが使用する公開鍵を結びつける

ブラウザがWebサイトにアクセスするとき、Webサーバは証明書チェーンの公開鍵と、サーバ証明書に基づく通信内容の署名を送信します。クライアントは、サーバ証明書から中間CA、信頼済みルートCAへと署名を辿ります。OSやブラウザには証明書ストアを管理する機能があり、そこで「信頼する」と設定した証明書に辿り着けた場合、接続先のサーバを信頼するのです。(後述しますが実際はもう少し複雑です)

2. eMudhraで何が起きたのか

問題の通報は2026年10月17日UTC、日本時間では18日に行われました。
eMudhraというインドの認証局の発行する中間CA証明書の秘密鍵が第三者によって容易に復元できたという内容でした。
対象は8組の中間CA鍵で、TLS用が6組、コード署名用が2組です。

これらはP-384という楕円曲線を使う鍵だったが、秘密鍵に相当する整数がすべて256未満でした。本来は384ビットという非常に大きな範囲から予測不能な値を選ぶところ、8ビットの強度しかありませんでした。公開鍵との対応を調べれば、誰でも秘密鍵を容易に特定できる状態です。

つまり、暗号方式そのものが破られたわけではなく、杜撰な秘密鍵の生成方法を用いていたため、今回の問題が起こりました。

今回のTLS用鍵を使えば、攻撃者は自分の公開鍵に、他人のドメイン名を結びつけた証明書を作れます。対象CAを信頼し、追加の検証でも拒否しないクライアントには、それが正規の証明書に見えてしまいます。

3. 本当の脅威はフィッシング攻撃ではない

さて、この問題でどのような攻撃が考えられるでしょうか?
サーバ証明書が作れることで最初に思いつくのはフィッシングサイトによる攻撃です。

通常のフィッシングでは、攻撃者が紛らわしいドメインを取得して偽サイトを作ります。
そのドメインを管理していれば、Let’s Encryptなどの認証局から通常の手続きで証明書を取得できます。今回対象となった中間認証局の秘密鍵を使う必要はありません。

すなわち、今回、危険になったのは「偽サイトにもHTTPSを付けられること」ではありません。攻撃者が、本物のドメイン名に対する証明書を、管理者の許可なく作れることです。

例えば、利用者がブックマークから正しい業務サイトを開いたとします。攻撃者がその通信を自分のサーバへ誘導し、本物のドメイン名を持つ偽造証明書を提示します。クライアントがそれを信頼すれば、利用者は正しいURLを指定していても、攻撃者とのTLS接続を確立します。普段と全く同じ画面を操作し、ブラウザも警告を出しません。その場合、利用者に全く気づかれることなく、通信を盗聴したり、取得したセッションを使って業務アプリに不正アクセスが可能です。

ただし、この攻撃を成立させるには、二つの条件が必要になります。

1.	DNS応答の改ざんや経路操作などにより、被害者の接続を攻撃者側へ誘導できる。  
2.	偽造証明書を、被害者のTLSクライアントが受け入れる。  

例えば、フリーWiFiを攻撃者が運営し、DNSサーバに細工をする、あるいは特殊な機器をネットワーク上に設置するなどで通信経路を誘導、介入できます。

TLSは本来、通信経路が攻撃者に操作されても安全性を保つための仕組みです。ネットワークの管理によって介入の機会を減らし、介入されてもTLSが接続先を認証する、二段構えの防衛策のうちの後者が、今回、未対策のクライアントでは突破され得る状態になりました。

コラム:コード署名にも別のリスクがある

この記事ではHTTPS通信の脅威を主に取り扱っていますが、
今回の対象にはコード署名用の中間CAも含まれます。WindowsのAuthenticodeなどでは、署名によって配布物の完全性と発行者を確認しています。その検証環境が問題のCAを信頼していれば、攻撃者が発行者を装った証明書で悪意あるプログラムに署名する危険があります。こちらは、配布したファイルを利用者やシステムに受け入れさせる攻撃であるため、ネットワーク経路への介入を必須としません。

ただ、コード署名はHTTPS通信ほどに標準化されているわけではなく、OSや処理系ごとに検証の方法が異なります。例えば.NETのパッケージ管理に使うNuGetは、Linux上でSDK同梱のコード署名用CAバンドルを利用する場合があります。ただし、開発者の署名だけではなくリポジトリの署名も確認する設定や利用者側でどの署名者を信頼するか設定できるため、今回の中間CAだけで攻撃を成立させられるシナリオは限定的です。

4. ブラウザの対策だけでは不十分な理由

さて、今回の脆弱性が発見されてから、主要なブラウザでは急速に対策がとられています。
主要なブラウザでは特定の認証局証明書を拒否するリストを配信する機能を利用して、今回問題となった中間CAがブロックされています。これらの配信を受信しているブラウザは、特にアップデートなどしなくても今回の脆弱性の影響を受けないようになっています。

しかしながら、ブラウザ以外の経路では拒否リストのような仕組みがありません。
OSの証明書マネージャでは今のデバイスで信頼する証明書一覧を確認できます。
ここで問題となったルートCAを信頼解除することが一定の対策になりますが、処理系によってはOS管理以外に独自の証明書ストアを保持しているケースがあるため、それだけでは十分ではありません。HTTPS通信をするすべての経路で件の中間CA証明書を拒否するようにしなければいけません。

また今回問題となった中間CA証明書には eMudhra 以外にも Sectigo のクロス署名がなされていました。そのため、SectigoのルートCAも信頼解除する必要がありますが、その結果Sectigoが発行するサーバ証明書を利用している一部のサイトに繋がらなくなる場合があります。

5. 開発者が点検すべき範囲

さて、アプリ開発者は今回の脆弱性に対して、何を点検しどう対応すべきでしょうか?
大きく分けると、自身が管理している成果物やサーバと、自らの開発環境を点検する必要があります。

まず、次の単位で「検証器・参照ストア・更新方法・担当者」を記録すると、対応漏れを追いやすい。

点検対象 確認する内容
本番サーバ・バックエンド 外部APIに接続するライブラリ、CAストア、独自設定
コンテナ・CI/CD ベースイメージ、ランナー、ビルドツール、配布物に同梱するランタイム
配布するデスクトップアプリ 同梱ライブラリ、更新経路、利用者への修正版の提供
クラウドエージェント 提供元の対策、利用者が指定するイメージ、実行中の環境への反映
ローカル開発環境 OS、複数の言語環境、CLI、デスクトップアプリ、開発用コンテナ
自社の公開サービス 提示する証明書チェーンと、ルート信頼解除による接続障害の有無

ローカル環境では、Javaのcacerts、Pythonのcertifiなど、OSとは別に保持されるCA情報も調べる必要があります。Pythonの仮想環境が複数あるなら、それぞれにパッケージが存在し得ます。Node.jsも同梱CAとシステムCAの利用方法が設定に依存するため、言語名だけではなく実際の利用経路を確認する必要があります。

CLIも同様です。curlはビルドに使われたTLS実装などによって、OSのストアを使う場合と証明書ファイルを使う場合がある。Gitにはhttp.sslCAInfo、AWS CLIにはAWS_CA_BUNDLEなどの設定があります。修正版がリリースされているか確認し、ローカルのバイナリを更新し、独自CAバンドルを利用していればそれらも更新が必要です。

ElectronなどのWeb系のマルチプラットフォームアプリでは、ChromiumとNode.jsを同梱しており、Chromium側の通信と、Node.jsのhttpsなどを使う通信が共存します。Chromeを更新したり、PCにインストールしたNode.jsを更新したりしても、配布アプリ内のElectronが置き換わるわけではないため、修正版のアプリをインストールする必要があります。

ただし、Electron本体は修正版がリリースされているものの、各デスクトップアプリで修正版がリリースされているとは限りません。手動でパッチを当てるのは困難ですので、リリースされ次第迅速にバージョンアップが必要です。

Dockerコンテナを使って開発している場合にはコンテナの中に同梱されるCAを確認する必要があります。自らでDockerfileを管理している場合にはその中で対応が必要ですし、公開されているイメージを利用している場合には、修正済みのバージョンに更新する必要があります。

自分のPCを更新するだけでは終わりではありません。Webアプリを運用している場合はデプロイ先のサーバや、成果物(アプリパッケージやコンテナ)に同梱される証明書ストアについても点検、更新が必要です。さらにはCICD環境やクラウドエージェント用の環境など、製品のサプライチェーンにある環境についても点検が必要になります。

最後に、必要な再起動や再読み込みを行い、実アプリが使う検証経路で対象CAを拒否することを確かめるのが良いでしょう。今回は確認用のサイトが公開されていますが、ブラウザでそのサイトが開けないことを確認するだけではなく、処理系ごとの経路(curlやfetch、WebClientなど)で証明書を拒否することを確認すべきです。

6. ネットワークへの介入可能性から対応の優先順位を決める

ここまで説明してきて、今回の点検範囲が膨大であることが理解できたかと思います。すべての経路で完全な対策をするにはかなりの工数が必要になります。実際の対応では優先度をつけて対応していく必要があります。

今回の脆弱性を突く攻撃を成功させるには、ネットワーク経路の誘導と、問題となった中間CAの信頼が必要です。そのため、最も優先すべきは、不特定のネットワークで動作する環境です。逆に、信頼できるネットワークやVPC上のマシンであれば、相対的に緊急度を下げる判断は可能です。
ただし、ネットワークが比較的安全でも、DNS汚染など他の脆弱性と組み合わせて攻撃されるリスクは残るため、ミッションクリティカルな領域では対応を後回しにすることはできません。

状況 優先順位の考え方
不特定のネットワークで動くデスクトップ・モバイルアプリやIoT機器 開発元が経路を管理できないため、修正版の提供を優先する
社外に持ち出す開発端末 接続環境の制限と、CLI・アプリの更新を優先する
管理されたサーバ・CI/CD・クラウドエージェント 経路の管理状態と、秘密情報・実行権限・配布への影響を合わせて判断する

7. 経路を防ぎきれないときの暫定対応

デスクトップアプリなどで、アプリ内部の検証器を利用者が修正できない場合、暫定対策は通信経路への介入機会を減らすことになります。未対策アプリで重要な通信を行う間は、管理主体の分からないWi-Fiを避け、管理された回線を選ぶことが一定の緩和策になります。家庭や職場のルーターを点検し、DNSやプロキシ設定の不審な変更を確認しましょう。

組織が管理するVPNなどを使う方法も一定の緩和策としては効果があります。ただし、対象アプリの通信が実際にそのトンネルを通り、VPNの接続先認証も安全であることが前提です。VPNの出口から先まで保護されるわけではなく、単にVPNサービスを追加すれば安全になるわけではありません。

VPNクライアント自体も点検対象になる。実際にCloudflareは、今回の問題に対応したWARP/Cloudflare One Clientの更新を提供しています。「VPNを使っている」ではなく、「そのVPNも対策済みか」まで確認するのが良いでしょう。

もちろん、これは対応版がリリースされるまでの応急処置です。接続エラーを避けるために証明書検証を無効にするのは逆効果になる。修正版が提供されたら適用し、接続先の認証を回復させることが根本対策になる。

結論:信頼を与えるより、取り消す方が100倍難しい

今回問題となったのは、TLSの暗号化方式そのものではありません。認証局の鍵が弱かったことで、接続先を認証する前提が崩れました。通信経路を操作できる攻撃者にとっては、突破できなかったはずの認証を通過する手段になります。

ブラウザには迅速な拒否情報の配信で対策済みである一方で、ランタイム、CLI、コンテナ、デスクトップアプリ、クラウドエージェントには、それぞれ異なる検証器と更新経路があります。そのため、OS同梱の証明書ストアを更新しただけで完了とは判断できません。実際の信頼ストアを棚卸しし、管理できないネットワークで動くソフトウェアを優先して、修正を稼働環境まで届ける必要があります。

今回突きつけられたのは認証局基盤が抱える本質的な脆弱性です。信頼先を追加することは簡単ですが、一度付与した信頼を失効させるのは非常に煩雑な作業が必要になるということです。

参考資料

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?