Endpoint Protection

 View Only

デジタル証明書から秘密鍵を盗み出す攻撃者の手口 

Feb 26, 2013 03:49 AM

いつもシマンテックのブログをお読みいただいていれば、有効なデジタル証明書を使って署名された不正ファイルや、盗み出したデジタル証明書を使って署名されたマルウェアについての記事を何度かご覧になったことがあるでしょう。

マルウェア史上最も悪名高いと言っていい Stuxnet の作成者が、有名企業の有効なデジタル証明書の秘密鍵を使ってマルウェアに署名していたことを連想する向きもあるかもしれません。

デジタル証明書の重要性は言うまでもなく、デジタル証明書の付いたファイルを調べれば、作成者がわかり、改変されていないことも確認できます。また、一部のバージョンの Windows では、デジタル署名の付いていないファイルを開くときにダイアログボックスが表示されますが、デジタル証明書から盗み出した秘密鍵を使って攻撃者がマルウェアに署名している場合、たいていのファイルは実行されてしまいます(ただし、そのファイルが Web ブラウザを使ってインターネットからダウンロードされた場合は除きます)。

攻撃者がデジタル証明書から秘密鍵を盗み出す手口

コンピュータにバックドア型のトロイの木馬を仕掛けると、攻撃者はそのコンピュータへのフルアクセスを手にして制御できるようになります。そのため、攻撃者はそのコンピュータ上であればどのような情報も盗み放題です。

また、攻撃者はその気になれば、秘密鍵とデジタル証明書の両方を盗み出すこともできますが、侵入先のコンピュータすべてを調べることは非常に困難で、仮に何百台ものコンピュータに侵入できたとしても、その 1 台 1 台を調べるのはさらに厄介です。感染したコンピュータが増えるほど、この作業は難しくなります。

収集したサンプル

シマンテックは、オペレーティングシステムの機能を利用して Windows 証明書ストアから秘密鍵とデジタル署名の両方を盗む機能があるマルウェアのサンプルを、1 カ月以上にわたって追跡しました。この間、重複を数えずに 800 近いファイルが集まりました。収集したサンプルには、以下のようなマルウェアがありました。

マルウェアサンプルのうちの多くは Trojan.Zbot(別名 Zeus)でした。

収集したすべてのサンプルの分布を感染のあった国や地域別に示したのが以下の図です。

図 1. 国/地域別の感染を示した分布図

この図でわかるとおり、収集したマルウェアに感染しているコンピュータの大多数は米国にあるようです。

デジタル証明書の保存方法

Windows は、デジタル証明書を証明書ストアに保存します。多くの場合プログラムコードは、PFXExportCertStoreEx 関数を使って証明書ストア情報をエクスポートし、その情報を .pfx という拡張子のファイルに保存します(実際のファイル形式では PKCS#12 が使われます)。PFXExportCertStoreEx 関数で EXPORT_PRIVATE_KEYS オプションを指定すると、デジタル証明書とそれに対応する秘密鍵の両方が保存されるので、.pfx ファイルは攻撃者にとって有益です。

図 2 に示したコードは、保存されている証明書を CertOpenSystemStoreA 関数で開くので、最も一般的なシステム証明書ストアを選択しています。

PFXExportCertStoreEx 関数は、以下の証明書ストアの内容をエクスポートします。

  • MY: 秘密鍵が関連付けられている証明書を含む証明書ストア
  • CA: 認証局の証明書
  • ROOT: ルート証明書
  • SPC: ソフトウェア発行者の証明書

以下の例では、MY 証明書ストアの情報が、「Pass」というパスワードとともに .pfx ファイル形式で保存されています。この PFXExportCertStoreEx 関数は EXPORT_PRIVATE_KEYS オプションを指定して呼び出されるので、デジタル証明書とそれに対応する秘密鍵が両方ともエクスポートされます。

図 2. 証明書ストアの情報をエクスポートするコードの例

このコードは、以下の処理を実行します。

  1. MY 証明書ストアを開く。
  2. 3C245h バイトのメモリを割り当てる。
  3. 実際のデータサイズを計算する。
  4. 割り当てられていたメモリを解放する。
  5. 実際のデータサイズにメモリを割り当てる。
  6. PFXExportCertStoreEx 関数が、pPFX でポイントされている CRYPT_DATA_BLOB 領域にデータを書き込む。
  7. データを書き出す。

証明書ストアの内容を書き出すときに暗号化ルーチンはなく、ただ証明書ストアの内容を正確に書き出すだけです。

収集したマルウェアサンプルのうち、攻撃者のコマンドを待ってから証明書ストアを盗み出すものは 1 つしかなく、その他のマルウェアサンプルはいずれも、コンピュータの起動時に証明書ストア情報を盗み出します。このことから、証明書ストアを盗み出す前に侵入先のコンピュータを実際にチェックしている攻撃者はほとんどいないと考えられます。

攻撃者が使うパスワード

上の例(図 2)で攻撃者は、証明書ストアのデータをファイルに書き出すときに「Pass」というパスワードを使っていました。他の攻撃では、「Password」、「0」、「12345」などもパスワードとして使われています。では、Trojan.Zbot の場合はどうでしょうか。

図 3. 暗号化されたパスワードの例

パスワードは暗号化され、復号しないと判読できません。攻撃者はデータを暗号化して、ウイルス対策ベンダーからパスワードを隠しているのです。

図 4. _decrypt_password コード

図 4 の赤い枠で囲んだコード部分が、メインの復号コードです。サンプルのコードはさまざまですが、どのサンプルにも同じパスワード「pass」がありました。攻撃者は、バッチプロセスを利用して .pfx ファイルから秘密鍵を取得しており、同じパスワードを指定することで処理を簡単にしています。

署名プロセスは容易

Stuxnet は特殊な例ではありません。攻撃者が、盗み出した証明書の秘密鍵を使ってマルウェアに署名するという報告は頻繁に見かけます。

Microsoft 社は、Windows DDK、Platform SDK、Visual Studio にバンドルして署名ツールを配布しています。証明書ストアの内容を盗み出すことさえできれば、攻撃者は署名ツール(signtool.exe)を使ってマルウェアにデジタル署名することができます。Trojan.Zbot のソースコードがある場所を知っていれば、それを手に入れて設定し、拡散できるうえに、署名ツールは誰でも入手できます。証明書を盗み出すのに、技術力は不要なのです。

秘密鍵をどのように守ればよいか

秘密鍵を保護する方法のひとつは、社内ネットワークから完全に切り離してソフトウェア開発用のネットワークを構築し、それぞれのネットワークで異なるパスワードを使うことです。マルウェアが社内ネットワークに侵入した場合でも、秘密鍵にはアクセスできません。

と同時に、ソフトウェアの出荷準備ができるまで、開発者がコードに署名するときには、必ずテスト用証明書を使うようにします。デジタル証明書が保存されているコンピュータにマルウェアが侵入すると、秘密鍵が盗み出されてしまいます。

秘密鍵をコンピュータ上のファイルに保存することは推奨されませんが、やむをえずそうするしかない状況もあります。そのような場合は、秘密鍵を保存するコンピュータの数を制限し、アクセスするユーザーも最小限に限定してください。

秘密鍵とデジタル証明書は、保管室や鍵のかかる部屋などの安全な場所に保管します。IC カードや USB トークン(USB メモリスティックのことではありません)、HSM(ハードウェアセキュリティモジュール)のような暗号化デバイスを使うのが理想的です。それができない場合、デジタル証明書と秘密鍵は圧縮して、強力なパスワードで保護します。ポータブルメディアに秘密鍵を保存するのは、絶対に必要な場合のみとし、最終的にはそのメディアから秘密鍵を削除してオフラインにしてください。

また、シマンテックは、Extended Validation(EV)コードサイニングと呼ばれる秘密鍵を保護するサービスも提供しています。EV コードサイニングについて詳しくは、こちら(英語)を参照してください。コードサイニングの基本的なセキュリティ対策について詳しくは、こちらのホワイトペーパー(英語)をご覧ください。

シマンテックは、今回ご報告したマルウェアや悪質な手口を引き続き監視していく予定です。疑わしいプログラムは実行しないようにし、オペレーティングシステムとウイルス対策ソフトウェアは最新の状態に保つことをお勧めします。

 

* 日本語版セキュリティレスポンスブログの RSS フィードを購読するには、http://www.symantec.com/connect/ja/item-feeds/blog/2261/feed/all/ja にアクセスしてください。

Statistics
0 Favorited
0 Views
0 Files
0 Shares
0 Downloads

Tags and Keywords

Related Entries and Links

No Related Resource entered.