Windowsセキュリティ・ワンポイントレッスン

第2回 USBメモリ経由でのマルウェア感染を防ぐには



近年、多くのマルウェアがその感染媒体としてUSBメモリに代表されるリムーバブルメディアを採用するようになってきています[1]。一昔前、フロッピーディスクを媒体としたウイルスが猛威を振るったことを考えると、まさに「時代は繰り返す」といった感慨を覚えずにはいられませんが、今回の「Windowsセキュリティ・ワンポイントレッスン」はこのUSBメモリ経由でのマルウェア感染の仕組みや、その対策についてお話したいと思います。




基本的な感染の仕組み


私がUSBメモリ経由でのマルウェア感染について初めて耳にしたのは、確か2006年7月の「[CRYPTO-GRAM日本語版]USBでパソコンを乗っ取る[2]」という記事だったと記憶しています。この記事にはUSB機器を接続することでPCを乗っ取ったり、あるいは侵入試験としてUSBメモリを喫煙所等に放置し、それを拾った従業員がPCにUSBメモリを挿入してマルウェアを実行させるといった内容が書かれていましたが、実は私はこの記事を読んだ頃、なぜUSBメモリ内にあるマルウェアが起動してしまうのか、たいそう不思議に思っておりました。

CD-ROMやDVDを挿入してマルウェアに感染するのならまだわかります。みなさんご承知の通り、通常、CD-ROM挿入時にはWindowsの自動実行機能(AutoRun)が働きますので、何か悪さをするソフトウェアがメディア内に入っていた場合、それが自動的に実行してしまうことはありがちな話です。しかしUSBメモリ等のリムーバブルメディアについては、Windowsの仕様として基本的に自動実行しません。つまりUSBメモリを挿入しただけではダメで、ユーザが何らかのアクション(メディア内のファイルを開く等)をとらない限りPCはマルウェアには感染しないハズなのです。

それなのに、なぜUSBメモリ経由でマルウェアに感染してしまうのでしょう?

その疑問を抱え続けていた2007年のある日、私が関係していた某大学で実習室内のPCにウイルスが感染するという騒ぎが発生しました。話を聞いてみると、どうやらUSBメモリ経由のようです。しかも感染時、本人はメディア内のファイルを開いたりした覚えはないとのこと。よい機会なので感染の仕組みを調べてみようと思い立ち、感染したPCからウイルスの検体(Trojan.Shipli)を抽出し、実験環境下でいろいろと試してみた結果、当該ウイルスに感染したUSBメモリにはウイルス本体(infrom.exe)および以下の内容を含む自動実行機能の設定ファイル(autorun.inf)が作成されていました。

[autorun]
open=infrom.exe
shellexecute=infrom.exe
shell\Auto\command=infrom.exe
shell=Auto
"open="や"shellexecute="はCD-ROMのautorun.infによく見られる記述で、CDを挿入した際にプログラムを実行させたい場合、起動プログラム名やファイル名を指定するものです。ですが前述の通り、USBメモリはこの記述では自動実行しません。どうやら秘訣は、

shell\Auto\command=infrom.exe
shell=Auto
の2行にありそうだということでautorun.infの構文を調べてみたところ、この2行はマイコンピュータ上に表示されるドライブアイコンのショートカットメニュー(ドライブを右クリックした際に表示されるメニュー)を定義するものであることがわかりました[3]。つまり、

shell\Auto\command=infrom.exe
によりショートカットメニューに"Auto"というエントリが追加され、ユーザがそれを選択すると"infrom.exe"が実行されるようになります。また、

shell=Auto
により、"Auto"というエントリがショートカットメニューのデフォルトに設定されます。

ところでアイコンのショートカットメニューのデフォルトは、アイコンをダブルクリックした際の動作に他なりません。すなわち、このようなautorun.infファイルを含むUSBドライブのアイコンをダブルクリックして開こうとすると、autorun.infの記述に従い、ドライブ内に存在する"infrom.exe"が実行され、ウイルスに感染してしまうわけです。


図1 autorun.infの記述によりショートカットメニューにデフォルトエントリを追加


先にUSBメモリの場合、ユーザが何らかのアクションをとらない限りウイルスには感染しないハズと書きましたが、その「何らかのアクション」とは「ドライブのダブルクリック(エクスプローラの設定によってはシングルクリック)」だったということですね。




自動再生ダイアログに偽の情報を表示


USBメモリ経由でのマルウェア感染は、多くの場合、上記の通り「ドライブのダブルクリック」によるものだと思われますが、もう一つの感染手法として自動再生ダイアログに偽の情報を表示し、ユーザにそれを選択させることでマルウェアを実行させる方法があります。

自動再生ダイアログはXP以降に導入された、挿入メディアごとに再生用のプログラムを選択/設定するための機能です。USBメモリなどを挿入すると、メディア内部がスキャンされ、保存されているファイルによってどのプログラムを実行するか聞いてくるダイアログが表示されますよね。あれが自動再生ダイアログです。

この自動再生ダイアログについても、自動実行機能のautorun.infファイルにおいてその動作を制御することができます。

例えばautorun.infに、

[autorun]
open=prog.exe
action=フォルダを開いてファイルを表示する
icon=explorer.exe,13
という記述をしたとしましょう。

"action="は自動再生ダイアログに指定したテキストのエントリを追加します。そのエントリのアイコンは"icon="で、またエントリを選択した際に実行するプログラムを"open="で指定します。つまり上記3行の記述により、「フォルダを開いてファイルを表示する」というエントリを追加し、ユーザがそれを選択するとメディア内の"prog.exe"が実行されることになります(図2の「偽物のフォルダオープン」)。


図2 autorun.infの記述により自動再生ダイアログに偽のフォルダオープンエントリを追加


「フォルダを開いてファイルを表示する」というエントリは、実は自動再生ダイアログに標準で存在しています(図2の「本物のフォルダオープン」)。通常、エクスプローラでドライブ内容を表示したい場合にこの項目を選択するのですが、ユーザが偽物のフォルダオープンに騙されてそちらを選択すると、USBメモリ内のマルウェアが起動してしまいます。注意深く見ると、偽物の方は「デバイスで提供されたプログラム使用」と表示されているので区別できるんですけどね・・・ :)




AutoRunを停止してマルウェア感染を防ぐ


USBメモリ経由でのマルウェア感染は、このようにWindowsの自動実行機能(AutoRun)の「ショートカットメニューへのエントリ追加」や、「自動再生ダイアログへのエントリ追加」を悪用することで行われます。そのため、Windows OSのAutoRun機能を停止することでマルウェア感染のリスクを低減させることが可能になります。

すべてのドライブタイプでAutoRun機能をオフにする場合、レジストリ項目「NoDriveTypeAutoRun」を「0xFF」に設定し、コンピュータを再起動します。

レジストリキー  : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
レジストリ項目名: NoDriveTypeAutoRun
レジストリ項目値: 0x01:不明な種類のドライブのAutoRunを停止
                   0x04:リムーバブルドライブのAutoRunを停止
                   0x08:固定ドライブのAutoRunを停止
                   0x10:ネットワークドライブのAutoRunを停止
                   0x20:CD-ROMドライブのAutoRunを停止
                   0x40:RAMディスクのAutoRunを停止
                   0x80:不明な種類のドライブのAutoRunを停止
                   0xFF:すべての種類のドライブのAutoRunを停止
                  (組み合わせる場合はそれぞれの和を設定、XP/Vistaのデフォルトは0x91)

図3 レジストリエディタでNoDriveTypeAutoRunを0xFFに設定(すべてのドライブタイプでAutoRunを停止)


レジストリ項目「NoDriveTypeAutoRun」の設定は、もちろんレジストリエディタ(regedit.exe)で直接行うこともできますが、グループポリシーエディタ(gpedit.msc)を使って設定することも可能です。その場合はグループポリシーエディタを開き、「コンピュータの構成→管理用テンプレート→システム」にある「自動再生機能をオフにする」のプロパティで「有効」を選択、「すべてのドライブ」に対して自動再生機能をオフに設定します(XPの場合)。

ただしNoDriveTypeAutoRun設定を上記のように変更しただけでは、AutoRun機能のすべてを停止することはできません。自動再生ダイアログは表示されなくなりますが、「ショートカットメニューへのエントリ追加」、すなわちドライブアイコン・ダブルクリックでのプログラム起動については、この設定変更だけでは停止させることができないのです。

マイクロソフトはこの問題を修正するために更新プログラムを提供しています。つまりNoDriveTypeAutoRun設定を完全に機能させるためには、マイクロソフトが提供している以下の更新プログラムを適用することが必須となります[4]。

Vista/2008    :MS08-038(950582、2008年7月よりWindows Updateで提供)
2000/XP/2003 :967715(2009年3月よりWindows Updateで提供)、または953252(ダウンロードセンターにて配布)
ちなみにWindows XP/2003には、ネットワークドライブのルートディレクトリにautorun.infが存在した場合、そのネットワークドライブをマウントすることであたかもCD-ROMを挿入した際のようにプログラムが自動実行してしまうという問題がありました。


図4 ネットワークドライブ上のautorun.infによりマウント直後にプログラムが自動実行(XP/2003で967715未適用の場合)


ネットワークドライブのAutoRunは、NoDriveTypeAutoRunのデフォルト設定(XPは0x91、2003は0x95)により禁止されているはずなのですが、その制限が有効に働いていなかったのでしょうね、きっと。この問題についても、上記更新プログラム「967715」を適用することで解消されます。




HKLMそれともHKCU?


ところでNoDriveTypeAutoRunは、コンピュータ全体およびユーザごとの二通りの設定方法があります。

コンピュータ全体に対して適用したい、つまりすべてのローカルログオンユーザに適用したい場合は、前述した通り、

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
というレジストリキーにNoDriveTypeAutoRunを設定しますが、カレントユーザに対してのみ適用したい場合は、

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
というキーに設定します(NoDriveTypeAutoRunのデフォルト値は、こちらに設定されています)。

逆に言うとHKEY_CURRENT_USER(HKCU)の下にNoDriveTypeAutoRunを設定した場合、適用範囲はそのユーザのみに限定されてしまいますので、すべてのユーザに対して適用するためにはHKEY_LOCAL_MACHINE(HKLM)の下に設定する必要があるということになります(両方に設定した場合はHKLMが優先されます)。

マイクロソフトのサポート文書「Windows の自動実行機能を無効にする方法[4]」には、レジストリエディタでNoDriveTypeAutoRunを設定する場合、HKCUの下に設定するように記述されています。その真意がどこにあるのか私には分かりませんが、基本的にはHKCUではなくHKLMに設定する方が望ましいでしょう。




おまけ ・・・ CDドライブを含むUSBメモリ


前述の通り基本的にUSBメモリは、挿入しただけではAutoRunによるプログラムの自動実行はしません。しかしUSBメモリの機種によっては、U3対応製品のように挿入しただけで自動実行するものもあります。

U3規格のUSBメモリは、その中にアプリケーションプログラムや設定情報をデータと共に保存しておくことにより、そのUSBメモリさえあればどのPCでも同じアプリケーション環境を実現できるという特徴を持っています。その機能を実現するため、U3対応のUSBメモリには通常のデータ保存用ドライブ以外に、ランチャープログラムを格納するためのCDドライブが含まれています(図5)。つまりU3対応USBメモリをPCに挿入すると、CDドライブ内のランチャープログラムがAutoRunによって起動し、ユーザはそのランチャープログラムを使ってUSBメモリ内のさまざまなアプリケーションを実行するわけです。


図5 CDドライブを含むU3規格のUSBメモリ


このCDドライブ部分は基本的にリードオンリーになっているため、ユーザが自由にファイルを書き込んだりすることはできませんが、ランチャープログラムのアップデートの仕組みを利用してドライブ全体を書き換えることにより、マルウェアを仕込むことは可能です。CDドライブのAutoRunを停止していないPCにこのようなUSBメモリをうっかり挿入すると、それだけでマルウェアに感染してしまうので注意が必要です。まあ、見かけに騙されてはいけないぞということですね。



マイクロソフトのブログ[5]によると、USBメモリ経由でのマルウェア感染のリスクを低減させるため、Windows 7ではCD/DVD以外について自動再生ダイアログの仕様を変更し、VistaやXPについても同様の修正を計画しているとのことです。「デフォルトセキュア」の観点から言えば、これは歓迎すべき仕様変更でしょう。

残念なことですが、ユーザにとって便利な機能は多くの場合、攻撃者にとっても便利な機能です。便利で安全、しかも低コストと三拍子そろうのがベストですが、現実はなかなか厳しいものがあります。WindowsのAutoRun問題は、利便性の裏に潜む危険性について改めて我々に問いかけているように思います。



[1]  USBメモリ経由の感染機能を持つマルウエア調査報告書
     http://www.jpcert.or.jp/research/2009/usbmalware_20090619.pdf

[2]  [CRYPTO-GRAM日本語版]USBでパソコンを乗っ取る
     http://itpro.nikkeibp.co.jp/article/COLUMN/20060710/242866/

[3]  Autorun.inf Entries
     http://msdn.microsoft.com/en-us/library/bb776823(VS.85).aspx

[4]  Windowsの自動実行機能を無効にする方法
     http://support.microsoft.com/kb/967715

[5]  AutoRun changes in Windows 7
     http://blogs.technet.com/srd/archive/2009/04/28/autorun-changes-in-windows-7.aspx


2009年8月執筆
塩月 誠人
ネットワークセキュリティコンサルタント
合同会社セキュリティ・プロフェッショナルズ・ネットワーク