11章
1 レジストリ/スケジューリングタスク等の解析
攻撃者がマルウェアの永続化を図る場合、ユーザーがログオンするたびにマルウェアが自動起動されるようにするなど、さまざまな手法を試みます。ここでは、マルウェアの永続化に悪用される、以下の代表的な自動起動方法について、順に紹介します。
レジストリ(RUNキー)
Windowsサービス
タスクスケジューラ
スタートアップフォルダ
レジストリ(Runキー)を使用した永続化
レジストリの概要
Windowsのレジストリは、OSやアプリケーションのさまざまな設定を管理するデータベースで、複数のレジストリファイルに分散して記録されています。レジストリには膨大な情報が記録されており、デジタルフォレンジックにおいては、PCの使用状態や使用履歴などを調査するための重要なアーティファクトです。
レジストリのデータ構造は、フォルダとファイルの関係に似ており、多数の階層をもつレジストリキー(Key)の配下に、複数の「値」が登録される階層構造になっています。
「値」は、値の名前(Name)・値の種類(Type)・値のデータ(Value)により構成されています。
以下は、Windows標準の レジストリエディター(regedit.exe) を使用して、レジストリ内容を参照した例です。

レジストリハイブとレジストリファイル
上記の図では、レジストリキーのフルネームが
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
となっており、図には表示しきれていませんが、実際は以下のような階層となっています。
- HKEY_LOCAL_MACHINE
- Software
- Microsoft
- Windows
- CurrentVersion
- Run
- 値(iTunesHelper)
- 値(SecurityHealth)
- Run
- CurrentVersion
- Windows
- Microsoft
- Software
この階層の最上位の「HKEY_LOCAL_MACHINE」は、レジストリの種類の大分類であり、レジストリハイブと呼ばれています。以下は、デジタルフォレンジックにおいて特に重要となるレジストリハイブです。
- HKEY_LOCAL_MACHINE(略称:HKLM) : システム共通の重要な設定を記録
- HKEY_CURRENT_USER(略称:HKCU) : 各ユーザー別のシステムやソフトウェアの設定を記録
HKEY_LOCAL_MACHINEのレジストリファイル
HKEY_LOCAL_MACHINE に属するレジストリキーは、設定内容の種別によって複数のファイルに分かれて保存されています。各ファイルは、フォルダ「C:\Windows\System32\config 」に保存されています。
レジストリハイブの2番目の階層名(上記の例では「Software」)が、各ファイル名に対応しています。以下は、デジタルフォレンジックで特に重要となるファイルと記録内容です。
ファイル名 : SOFTWARE
主にアプリケーションプログラムを動作させるための設定情報が記録されています。後述するRunキー(プログラムの自動起動設定)は、このファイルに記録されます。
ファイル名 : SYSTEM
OSの動作に関わる設定情報(システムコンポーネントの設定、ハードウェアドライバの設定など)が記録されています。
ファイル名 : SAM
Windowsのユーザーアカウント情報などが記録されています。
ファイル名 : SECURITY
OS上の監査ポリシーや認証に関する設定が記録されています。
HKEY_CURRENT_USERのレジストリファイル
HKEY_CURRENT_USER に属するレジストリキーは、ユーザー別の単一のレジストリファイルに保存されています。
このレジストリファイルは、「NTUSER.dat」という共通のファイル名になっており、「ユーザープロファイル」と呼ばれるユーザー別のフォルダ「C:\Users\(ユーザー名)」内に保存されています。
NTUSER.datにも、後述するRunキー(プログラムの自動起動設定)が記録されており、重要な調査対象となります。
「値」の設定内容
レジストリキーの各「値」には、アプリケーション開発者が任意の名前を付与できます。「値」の新規作成時や更新時は、「値の名前」と「値のデータ」に加えて、「値の種類」で、データのフォーマットを指定する必要があります。以下は、その主な「値の種類」です。
- REG_SZ : 文字列
- REG_BINARY : バイナリデータ
- REG_DWORD : 32bitの数値
- REG_QWORD : 64bitの数値
- REG_MULTI_SZ : マルチバイト文字列(全角の文字など)
種類の指定については、「値のデータ」の内容を文字列として扱うか計算に使用する数値として扱うかなど、そのデータを使用するアプリケーション側の仕様に依存します。
以下は、後述する「Runキー」と呼ばれるレジストリキーの一例です。以下の図のように、「値のデータ」には、実行ファイルのファイルパスを文字列で設定するため、「値の種類」にはREG_SZ(文字列)が指定されています。

Runキーによる永続化
マルウェアの感染を永続化するための手段の1つとして、Runキーと呼ばれるレジストリキーがあります。この方法は、永続化の手段として、攻撃者が多用する傾向にあります。
一方、防御側では、Runキーに着目することにより、マルウェア感染の有無・マルウェア実体の保存フォルダやファイル名・感染時期などを把握できるケースがあります。
Runキーは、Windows OSによる特定プログラムの自動実行や常駐化のために設定された、特殊なレジストリキーです。Runキーに登録されたプログラムは、ユーザーのログオン時に自動実行されます。本来は、ソフトウェアの自動アップデートなどに利用されるものです。
攻撃者はこの機能に目をつけ、感染させたマルウェアをRunキーに登録し、ユーザーがログオンするたび、密かにマルウェアが自動起動されるように仕組みます。
Runキーの種類
Runキーには、複数のレジストリキーが設定されていますが、特に悪用される傾向があるのは以下のものです。
すべてのユーザーのログオン時に自動起動されるRunキー
HKEY_LOCAL_MACHINE \Software\Microsoft\Windows\CurrentVersion\ Run
HKEY_LOCAL_MACHINE \Software\Microsoft\Windows\CurrentVersion\ RunOnce
NTUSER.datが属するユーザーのログオン時のみ自動起動されるRunキー
HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\ Run
HKEY_CURRENT_USER \Software\Microsoft\Windows\CurrentVersion\ RunOnce
すべてのユーザーに適用されるHKEY_LOCAL_MACHINE のRunキーを登録するためには、管理者権限が必要となります。攻撃者側の目的を考えれば、すべてのユーザーのログオン時に自動実行させたいケースがほとんどと思われますが、 管理者権限を取得できるとは限りません。そこで、一般ユーザー権限のみ取得した場合でも永続化できるよう、HKEY_CURRENT_USER もターゲットにしているものと推測されます。
また、上記のレジストリキーには、「Run」と「RunOnce」の2種類があります。
「Run」に登録された実行ファイルは、ユーザーがログオンする度に実行されます。
一方、「RunOnce」に登録された実行ファイルは、次回のログオン時に一度だけ実行された後に自動的に削除されます。
後者を利用するケースでは、マルウェアが自動起動後に毎回「RunOnce」を再登録することで、結果的に永続化される手法が確認されています。
この他にも、マルウェアの感染永続化で悪用されるRunキーは複数存在します。
以下は、その主な例です。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\Software\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Terminal Server\Install\Software\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunHKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnceHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RunHKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesHKEY_LOCAL_MACHINE\SoftwareWow6432Node\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run
このように多くのレジストリキーが悪用される候補となりますので、インシデントレスポンスにおいては、Runキーを抽出できるツールを使用して、チェックもれがないようにしましょう。
なお、ツールの紹介や使用方法については、次節「2 Runキーのファストフォレンジック」で詳しく紹介します。
Runキー調査の概要
Runキーの調査により、マルウェアが潜んでいるフォルダ/ファイル名や、マルウェアに感染した時期 (レジストリキーの最終更新日時から推定)などの情報を取得できます。
マルウェアを潜ませる場所としては、ユーザーの目につきにくく、かつ一般ユーザー権限でもアクセスが可能なフォルダが選択される傾向にあります。Runキーに、以下のようなフォルダをファイルパスとする実行ファイルが登録されている場合は、マルウェアの可能性を疑いましょう。
C:\Users\<ユーザー名>\AppData\Localユーザー名>C:\Users\<ユーザー名>\AppData\Roamingユーザー名>C:\Users\PublicC:\ProgramData
また、「temp」「tmp」というサブフォルダや、ランダムな英数字を組み合わせた名前のサブフォルダを作る傾向もみられます。
上記の他、標準設定では正規の実行プログラムのインストール先となる、次のフォルダ以外から起動されるものについては、不審な実行ファイルかどうかの確認を推奨します。
Windowsシステムプログラムの標準フォルダ
C:\Windows\System32C:\Windows\SysWOW64
一般的なソフトウェアのデフォルトのインストールフォルダ
C:\Program FilesC:\Program Files(x86)
このようにして疑わしい実行ファイルを確認した場合は、Runキーに登録されたファイルパスから当該実行ファイルを保全して、検体調査を実施しましょう。
以下は、実際にマルウェア「Emotet」の感染により作成されたRunキーの例です。
- レジストリキー:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run - 値の名前:
blbdigital - マルウェアのファイルパス:
C:\Users\<ユーザー名>\AppData\Local\blbdigital.exeユーザー名>

Windowsサービスを悪用した永続化
Windowsサービスは、サービスコントロールマネージャーによって管理されるプロセスです。システムに常駐することが前提であるため、OS起動時に自動的に実行するオプションが設定できます。
また、サービスは基本的にバックグラウンドで動作しており、どのようなサービスが稼働しているかを一般ユーザーが意識することはほとんどありません。マルウェアをユーザーの目につかないよう、密かに動作させるにはうってつけと言えます。
<Windows標準のサービス管理ツールでリスト表示した稼働中サービスの例>

通常、Windows上では多くの正規サービスが動作しているため、稼働中のサービスから、何のヒントもなく不審なサービスを見つけ出すことは簡単ではありません。効率的な調査方法は、レジストリキーに設定されたサービスの登録情報から、実行ファイルパスや最終更新日時などの不審点を探すというものになります。サービスの登録情報は、以下のレジストリキー配下に登録されます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
Runキーの調査と同様に、通常は実行ファイルが格納されることのないファイルパスから起動されるサービスや、インシデントの発覚日時からさかのぼって、近接した時期に登録されたサービスなどに着目して調査しましょう。
レジストリキーに登録されたサービスの実例を紹介します。
サービスは、Windows標準の「sc」コマンドを使用して登録できます。なお、sc コマンドの実行には管理者権限が必要です。以下は、次のようなサービスを登録するコマンドの例です。
- サービス名 :
TestService - 実行ファイルパス :
C:\Users\Public\malware.exe - 自動起動 :
オン
sc create TestService binpath= "C:\Users\Public\malware.exe" start= auto
上記の例では、「TestService」をキー名とする、以下のレジストリキーが作成されます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TestService
以下は、実際に上記のコマンドで登録したサービスを、レジストリエディターで表示した例です。
「TestService」というレジストリキーに対し、実行ファイルパスが設定された「ImagePath」をはじめ、複数の「値」が作成されています。

マルウェアは、上記の例で使用した「sc」コマンドや、Microsoft社が提供するWindows APIなどを使用して、サービスの登録を行います。Runキーとともに、サービスの登録情報が記録されたレジストリキーも調査しましょう。
タスクスケジューラを悪用した永続化
タスクスケジューラは、特定の日時や一定間隔で定期的に実行したいプログラムやコマンドを、「タスク」としてタイマーのようにセットできる機能です。攻撃者やマルウェアは、この機能を悪用して永続化を図る場合があります。
攻撃者やマルウェアがタスクを登録する場合、Windows標準の「schtasks」コマンドで作成するケースが多くみられます。また、Windows10 では廃止されましたが、Windowsの旧バージョンのOSでは「at」コマンドでも同様の操作ができます。
登録されたタスクの実例を紹介します。
以下は、schtasksコマンドにより、「TestTask」というタスク名で、毎日午前8時30分に、実行ファイル名c:\temp\mal.exeが起動されるよう登録する例です。
schtasks /create /tn TestTask /sc DAILY /st 08:30 /tr c:\Temp\mal.exe
登録されたタスクは、Windows標準のタスクスケジューラで確認できます。

さらに、「schtasks」コマンドや「at」コマンドは、リモートコンピュータに対してタスクを登録することもできます。攻撃者は、この機能を侵入後の攻撃拡大(横展開:Lateral movement)のために悪用することがあります。なお、リモート実行には、ターゲットとなるコンピュータの管理者権限を持つアカウント情報が必要です。
また、タスクの内容は、「C:\Windows\System32\Tasks」配下に、タスク名をファイル名としたXMLファイル(拡張子なし)として保存されます。
次の図は、上記で登録した「TestTask」(C:\Windows\System32\Tasks\TestTask)の例です。

なお、Windowsのイベントログにも、タスク登録や実行の履歴が記録されます。イベントログの解析方法については、別章で紹介します。
マルウェアの永続化調査では、このようなタスクの登録状況を調査して、実行ファイルパスやタスク作成日時などから不審なタスクを探しましょう。
スタートアップフォルダを悪用した永続化
スタートアップフォルダは、ログオン時に自動実行させたいプログラムを登録する方法として一般的にもよく知られていますが、マルウェアの永続化にも悪用される例があります。
Windows OSは、スタートアップフォルダとして、以下のフォルダパスを設定しています。
- 全ユーザー共通のスタートアップフォルダ
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
- 各ユーザー別のスタートアップフォルダ
C:\Users\<ユーザー名>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupユーザー名>
これらのフォルダに、プログラムの実行ファイル、もしくは実行ファイルのショートカットファイルを配置しておくと、ユーザーがログオンした際に、自動的にそのプログラムが実行されます。
攻撃者が、スタートアップフォルダによって永続化を行う場合、マルウェア本体、もしくはマルウェア本体のショートカットファイルを上記フォルダに配置することになります。
比較的発見されやすいため、使用される頻度はそれほど高くありませんが、スタートアップフォルダに不審な実行ファイルやショートカットファイルが存在しないかも、忘れずに確認しましょう。