ブートキットおよびルートキットサンプルの分析 は何をしますか?
使用すべき状況
- OSを再インストールしても持続する、システムの侵害を示す兆候がある
- 明確な侵害の証拠があるにもかかわらず、ウイルス対策ソフトやEDRがマルウェアを検出できない
- UEFIセキュアブートが無効になっている、または整合性違反が発生している
- メモリフォレンジックによりルートキットの動作(隠しプロセス、システムコールのフック)が明らかになった
- ブートキットを展開することが知られている国家レベルの脅威(APT28、APT41、Equation Group)を調査している
使用すべきでない状況: 標準的なユーザーモードのマルウェアには使用しないでください。ブートキットやルートキットは根本的に異なるレベルで動作するため、特殊な分析技術が必要です。
前提条件
- ディスクイメージングツール(dd、FTK Imager) MBR/VBRセクターの取得用
- UEFITool UEFIファームウェアボリュームの分析とモジュール抽出用
- chipsec ハードウェアレベルのファームウェアセキュリティ評価用
- Ghidra(x86リアルモードおよび16ビット対応) MBRコード分析用
- Volatility 3 カーネルレベルでのルートキットアーティファクト検出用
- オフライン分析用の起動可能なLinux Live USB
ワークフロー
ステップ 1: ブートセクターとファームウェアの取得
MBR、VBR、UEFIファームウェアを抽出し、オフラインで分析します:
# MBRの取得(ディスクの最初の512バイト)
dd if=/dev/sda of=mbr.bin bs=512 count=1
# 最初のトラックの取得(通常、MBRを超えるブートキットコードを含む)
dd if=/dev/sda of=first_track.bin bs=512 count=63
# VBR(ボリュームブートレコード - パーティションの最初のセクター)の取得
dd if=/dev/sda1 of=vbr.bin bs=512 count=1
# UEFIシステムパーティションの取得
mkdir /mnt/efi
mount /dev/sda1 /mnt/efi
cp -r /mnt/efi/EFI /analysis/efi_backup/
# UEFIファームウェアのダンプ(chipsecまたはflashromが必要)
# chipsecを使用:
python chipsec_util.py spi dump firmware.rom
# flashromを使用:
flashrom -p internal -r firmware.rom
# ファームウェアダンプの整合性を確認
sha256sum firmware.rom
ステップ 2: MBR/VBRのブートキットコード分析
悪意のある変更がないかブートセクターコードを調査します:
# MBRコードの逆アセンブル(16ビットリアルモード)
ndisasm -b16 mbr.bin > mbr_disasm.txt
# MBRを既知の正常なWindows MBRと比較
# 標準的なWindows MBRの先頭: EB 5A 90(JMP 0x5C, NOP)
# 標準的なWindows 10 MBR: 33 C0 8E D0 BC 00 7C(XOR AX,AX; MOV SS,AX; MOV SP,7C00h)
python3 << 'PYEOF'
with open("mbr.bin", "rb") as f:
mbr = f.read()
# MBRシグネチャの確認(バイト510-511は0x55AAであるべき)
if mbr[510:512] == b'\x55\xAA':
print("[*] 有効なMBRシグネチャ (0x55AA)")
else:
print("[!] 無効なMBRシグネチャ")
# 既知のブートキットシグネチャの確認
bootkit_sigs = {
b'\xE8\x00\x00\x5E\x81\xEE': "TDL4/Alureonブートキット",
b'\xFA\x33\xC0\x8E\xD0\xBC\x00\x7C\x8B\xF4\x50\x07': "標準Windows MBR(正常)",
b'\xEB\x5A\x90\x4E\x54\x46\x53': "標準NTFS VBR(正常)",
}
for sig, name in bootkit_sigs.items():
if sig in mbr:
print(f"[{'!' if '正常' not in name else '*'}] シグネチャ一致: {name}")
# パーティションテーブルエントリの確認
print("\nパーティションテーブル:")
for i in range(4):
offset = 446 + (i * 16)
entry = mbr[offset:offset+16]
if entry != b'\x00' * 16:
boot_flag = "アクティブ" if entry[0] == 0x80 else "非アクティブ"
part_type = entry[4]
start_lba = int.from_bytes(entry[8:12], 'little')
size_lba = int.from_bytes(entry[12:16], 'little')
print(f" パーティション {i+1}: タイプ=0x{part_type:02X} {boot_flag} 開始=LBA {start_lba} サイズ={size_lba} セクター")
PYEOF
ステップ 3: UEFIファームウェアのインプラント分析
不正なモジュールがないかUEFIファームウェアボリュームを検査します:
# UEFIToolでUEFIファームウェアコンポーネントを抽出
# GUI: firmware.romを開く -> ファームウェアボリュームを検査
# CLI:
UEFIExtract firmware.rom all
# すべてのDXEドライバをリスト(UEFIインプラントの最も一般的なターゲット)
find firmware.rom.dump -name "*.efi" -exec file {} \;
# 既知の正常なファームウェアモジュールリストと比較
# 各UEFIモジュールにはGUIDがある - ベンダーのベースラインと比較
# セキュアブート設定の確認
python chipsec_main.py -m common.secureboot.variables
# SPIフラッシュ書き込み保護の確認
python chipsec_main.py -m common.bios_wp
# 既知のUEFIマルウェアパターンの確認
yara -r uefi_malware.yar firmware.rom
既知のUEFIブートキット検出ポイント:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
LoJax (APT28):
- 変更されたSPIフラッシュ
- WindowsにエージェントをドロップするDXEドライバを追加
- OS再インストールとディスク交換後も持続
BlackLotus:
- CVE-2022-21894を悪用してセキュアブートを回避
- EFIシステムパーティションのブートローダーを変更
- 起動中にカーネルドライバをインストール
CosmicStrand:
- CORE_DXEファームウェアモジュールを変更
- 起動中にカーネル初期化をフック
- シェルコードをWindowsカーネルメモリにドロップ
MoonBounce:
- CORE_DXEモジュール内のSPIフラッシュインプラント
- 変更されたGetVariable()関数
- ブートチェーンを通じてユーザーモードインプラントを展開
ESPecter:
- ESP上のWindowsブートマネージャーを変更
- winload.efiにパッチを適用してDSEを無効化
- 署名なしカーネルドライバをロード
ステップ 4: カーネルレベルでのルートキット動作の検出
実行中のシステムを分析してルートキットのアーティファクトを検出します:
# ルートキット検出のためのメモリフォレンジック
# SSDTフック検出
vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k"
# 隠しプロセス(DKOM)
vol3 -f memory.dmp windows.psscan > psscan.txt
vol3 -f memory.dmp windows.pslist > pslist.txt
# Diffで隠しプロセスを特定
# カーネルコールバック登録(ルートキットはフィルタリングのためにコールバックを登録する)
vol3 -f memory.dmp windows.callbacks
# ドライバ分析
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.modules
# 署名なしドライバの確認
vol3 -f memory.dmp windows.driverscan | while read line; do
driver_path=$(echo "$line" | awk '{print $NF}')
if [ -f "$driver_path" ]; then
sigcheck -nobanner "$driver_path" 2>/dev/null | grep "Unsigned"
fi
done
# IDTフック検出
vol3 -f memory.dmp windows.idt
ステップ 5: ブートプロセスの整合性検証
ブートチェーン全体の整合性を検証します:
# Windowsブートマネージャーの署名を確認
sigcheck -a C:\Windows\Boot\EFI\bootmgfw.efi
# winload.efiを確認
sigcheck -a C:\Windows\System32\winload.efi
# ntoskrnl.exeを確認
sigcheck -a C:\Windows\System32\ntoskrnl.exe
# 測定ブートログの確認(TPMが利用可能な場合)
# Windows: BCDEdit /enum firmware
bcdedit /enum firmware
# セキュアブート状態の確認
Confirm-SecureBootUEFI # PowerShellコマンドレット
# 改ざんのためのブート設定の確認
bcdedit /v
# ブート設定の変更を確認
# testsigning: Noであるべき
# nointegritychecks: Noであるべき
# debug: Noであるべき
bcdedit | findstr /i "testsigning nointegritychecks debug"
ステップ 6: ブートキット/ルートキット分析の文書化
包括的な分析結果をまとめます:
分析で文書化すべき内容:
- ブートセクター(MBR/VBR)の整合性ステータス(16進数比較を含む)
- UEFIファームウェアモジュールのインベントリと整合性検証
- セキュアブートのステータスと検出されたバイパスメカニズム
- 特定されたカーネルレベルのフック(SSDT、IDT、IRP、インライン)
- 発見された隠しプロセス、ドライバ、ファイル
- 持続性メカニズム(SPIフラッシュ、ESP、MBR、カーネルドライバ)
- ブートチェーン整合性検証の結果
- 可能であれば既知のブートキットファミリーへの帰属
- 是正手順(ファームウェアの再フラッシュ、MBRの再構築、ハードウェアの交換)
主要な概念
| 用語 | 定義 |
|---|---|
| ブートキット | オペレーティングシステムがロードされる前に実行されるようブートプロセス(MBR、VBR、UEFI)に感染し、永続的な低レベルの制御を得るマルウェア |
| MBR(マスターブートレコード) | ブートストラップコードとパーティションテーブルを含むディスクの最初の512バイト。MBRブートキットはこのコードを悪意のあるローダーに置き換える |
| UEFI(Unified Extensible Firmware Interface) | BIOSに代わる最新のファームウェアインターフェース。UEFIブートキットはファームウェアボリュームに悪意のあるモジュールを埋め込むか、ESPを変更する |
| セキュアブート | ブートコンポーネントのデジタル署名を検証するUEFIセキュリティ機能。BlackLotusなどのブートキットは脆弱性を悪用してこれを回避する |
| SPIフラッシュ | UEFIファームウェアを保存するフラッシュメモリチップ。LoJaxやMoonBounceなどの高度なブートキットは、ファームウェアレベルの持続性のためにSPIフラッシュを変更する |
| DKOM(Direct Kernel Object Manipulation) | 関数をフックせずに、カーネル構造を変更してプロセス、ファイル、ネットワーク接続を隠すルートキット技術 |
| ドライバ署名の強制(DSE) | カーネルドライバにデジタル署名を要求するWindowsセキュリティ機能。ブートキットは起動中にDSEを無効にして、署名なしのルートキットドライバをロードする |
ツールとシステム
- UEFITool: ファームウェアボリューム、ドライバ、モジュールを検査するためのオープンソースのUEFIファームウェアイメージエディターおよびパーサー
- chipsec: SPIフラッシュ保護、セキュアブート、UEFI設定を検証するためのIntelハードウェアセキュリティ評価フレームワーク
- Volatility: カーネルルートキット検出のためのSSDT、IDT、コールバック、ドライバ分析プラグインを備えたメモリフォレンジックフレームワーク
- GMER: SSDTフック、IDTフック、隠しプロセス、変更されたカーネルモジュールをスキャンするWindowsルートキット検出ツール
- Bootkits Analyzer: MBR/VBRコードを分析するための特殊なツール。逆アセンブルと既知の正常なベースラインとの比較を含む
一般的なシナリオ
シナリオ: OS再インストール後も持続する侵害の調査
コンテキスト: ある組織が侵害されたワークステーションを再イメージングしたが、数時間以内に同じC2ビーコンが再開された。標準的なディスクフォレンジックではマルウェアは見つからず、UEFIブートキットが疑われる。
アプローチ:
- Linux Live USBから起動し、侵害されたOSコンポーネントを実行しないようにする
- chipsecまたはflashromを使用してSPIフラッシュファームウェアをダンプし、オフライン分析を行う
- ddでMBRおよびVBRセクターをダンプし、ブートセクター分析を行う
- EFIシステムパーティションをコピーしてブートローダーの整合性を検証する
- UEFIToolでSPIダンプを開き、モジュールGUIDをベンダー提供のファームウェアと比較する
- 存在すべきでない追加または変更されたDXEドライバを探す
- Ghidra(x86_64 UEFIモジュール形式)で疑わしいモジュールを分析する
- セキュアブート設定を確認し、エクスプロイトベースのバイパスがないかチェックする
落とし穴:
- 侵害されたOSが実行されている状態でシステムを分析する(ルートキットがライブ分析から隠れる可能性がある)
- SPIフラッシュを確認しない(ディスクベースのブートコンポーネントのみを分析すると、ファームウェアレベルのインプラントを見逃す)
- セキュアブートがすべてのブートキットを防ぐと想定する(既知のバイパスが存在する、例: CVE-2022-21894)
- 再フラッシュ前に元のファームウェアダンプを保存しない(帰属のための重要な証拠を失う)
出力形式
ブートキット / ルートキット分析レポート
========================================
システム: Dell OptiPlex 7090 (UEFI, TPM 2.0)
ファームウェアバージョン: 1.15.0 (Dell)
セキュアブート: 有効(ただしバイパス済み)
取得方法: Linux Live USB + chipsec SPIダンプ
MBR/VBR分析
MBRシグネチャ: 有効 (0x55AA)
MBRコード: 標準Windows 10 MBRと一致(正常)
VBRコード: 標準NTFS VBRと一致(正常)
UEFIファームウェア分析
モジュール総数: 287
ベンダー想定: 285
追加モジュール: 2 不正
[!] DXEドライバGUID: {ABCD1234-...} "SmmAccessDxe_mod"(変更)
元のサイズ: 12,288 バイト
現在のサイズ: 45,056 バイト(32KB追加)
エントロピー: 7.82(高 - 暗号化ペイロード)
[!] DXEドライバGUID: {EFGH5678-...} "UefiPayloadDxe"(新規 - ベンダーファームウェアに存在しない)
サイズ: 28,672 バイト
機能: 起動時に持続性エージェントをドロップ
ブートチェーン整合性
bootmgfw.efi: 変更あり(ハッシュ不一致、CVE-2022-21894によるセキュアブートバイパス)
winload.efi: 変更あり(ロード時にDSEが無効化)
ntoskrnl.exe: 正常(ただし起動後に署名なしドライバがロードされた)
カーネルルートキットコンポーネント
ドライバ: C:\Windows\System32\drivers\null_mod.sys(署名なし、隠し)
SSDTフック: 3(NtQuerySystemInformation, NtQueryDirectoryFile, NtDeviceIoControlFile)
隠しプロセス: 2(PID 6784: beacon.exe, PID 6812: keylog.exe)
隠しファイル: C:\Windows\System32\drivers\null_mod.sys
帰属
ファミリー: BlackLotus亜種
信頼度: 高(CVE-2022-21894エクスプロイト、ESP変更パターンが一致)
是正
1. ハードウェアプログラマーを使用してSPIファームウェアを正常なベンダーイメージで再フラッシュ
2. 正常なWindowsインストールメディアからEFIシステムパーティションを再構築
3. 検証済みメディアからOSを再インストール
4. すべてのファームウェア書き込み保護を有効化
5. ファームウェアを最新バージョンに更新(CVE-2022-21894を修正)