背景情報

公開された1つのエクスプロイトが、世界中にこれほど大きな影響を及ぼしたケースはほとんどありません。NSA開発のエクスプロイトが外部にリークされた結果、私たちは今回、強力なツールが悪の手に渡った場合に何が起きるかを目の当たりにすることとなりました。2017年4月14日、Shadow Brokersと呼ばれるハッキング・グループが、「Lost in Translation」というタイトルとともに、盗み出したサイバー攻撃ツールの大部分をインターネットに公開しました。このリークには多数のエクスプロイトが含まれていましたが、そのうちMicrosoft Server Message Block(SMB)に関する深刻な脆弱性については、リークの1か月前にMicrosoftからセキュリティ更新プログラムが公開されています(MS17-010)。しかしそれにもかかわらず、修正プログラムを適用していないユーザが多数存在していたようです。WannaCryが出現する前の時点で、約150か国のコンピュータ40万台以上が、リークされたツールの1つDoublePulsarに感染したのです。この大規模な感染被害が、単一の攻撃者によって引き起こされたのか、それとも複数の攻撃者が関与しているのかは、判明していません。分かっているのは、この一連の流れを受けた2017年5月、ランサムウェアWannaCryによる攻撃が始まったという事実です。

SMBの脆弱性を突く大規模攻撃が発生したのは、2008年に出現したConfickerワーム以来のことです。SMBはファイル転送のために広く使用されているプロトコルであり、多くのシステムではデフォルトで有効にされています。本稿では、このSMBプロトコルの仕組みを紹介するとともに、リークされたツールがSMBの脆弱性をどのような方法で攻撃しているかを詳しく解説します。さらに、SMBTouchやEternalBlue、DoublePulsarなど、リークされた一連のツールや、各ツールを1つにまとめたエクスプロイト・スイートEternalRocksについても説明します。

そして最後に、チェック・ポイントのIPSがこれらの攻撃をゼロデイの段階でいかにして阻止したかを解説します。

SMBの概要

Windowsクライアント・システムでは、ネットワーク上のサーバ・システムに対してファイル・サービスや印刷サービスを要求する際、Common Internet File System(CIFS)プロトコルを使用します。

CIFSプロトコルでは、SMBプロトコルのセキュリティ、ファイル、およびディスク管理が強化されており、フラグの追加、リクエストおよびレスポンスの拡張、情報レベルの追加などが行われています。すべての機能強化は、クライアントがリクエストを開始する際のリクエスト/レスポンス・パターンに準拠していますが、oplock breakだけは例外となります。

SMBプロトコルには3つのバージョンがあり、いずれもTCPポート139および445で動作します。使用するSMBのバージョンは、Windowsのバージョンに応じて、接続ごとに次のように決定されます。

クライアント/サーバOS

Windows 8
Windows Server 2012

Windows 7
Windows Server 2008 R2

Windows Vista
Windows Server 2008

Previous versions
of Windows

Windows 8
Windows Server 2012

SMB 3.0

SMB 2.1

SMB 2.0

SMB 1.0

Windows 7
Windows Server 2008 R2

SMB 2.1

SMB 2.1

SMB 2.0

SMB 1.0

Windows Vista
Windows Server 2008

SMB 2.0

SMB 2.0

SMB 2.0

SMB 1.0

それ以前のWindows

SMB 1.0

SMB 1.0

SMB 1.0

SMB 1.0


SMBメッセージの送信時には、先行してNetBIOSセッション・サービスの情報ブロックが送られます。この情報ブロックは次のような構造になっています。

情報ブロック

メッセージは、次の3つのパートで構成されています。

  • ヘッダ(固定長)
  • パラメータ・ブロック(可変長)
  • データ・ブロック(可変長)

SMBメッセージ・ヘッダは32バイト長で、次のような構造になっています。

SMBメッセージ・ヘッダ

Command Typeフィールドには、0x32などの1バイトの値が格納されます。この値は、SMBメッセージで送信されるSMBコマンドを指定します。

パラメータ・ブロックの内容は、各Command Typeによって異なります。パラメータ・ブロックの構造やサイズは、格納するコマンド・パラメータによって変化します。

攻撃の分析

先ごろ、EternalRocksという新たなエクスプロイト・スイートの存在が明らかとなりました。このスイートは、将来的な攻撃に利用する目的で、感染先ホストを乗っ取ります。EternalRocksで特筆すべきは、感染拡大の手段として、Shadow Brokersが公開したSMBエクスプロイトを利用している点です。ここでは、次の3つの段階で構成される攻撃チェーンを分析します。

  • 偵察:
    • SMBTouch
    • ArchiTouch
  • 脆弱性の悪用:
    • EternalBlue
    • EternalChampion
    • EternalSynergy
    • EternalRomance
  • バックドア:
    • DoublePulsar

以降では、段階ごとに1つのツールに絞って分析を行います。

SMBTouch:

偵察ツールのSMBTouchは、攻撃開始前に標的マシンのスキャンを実行し、その結果をまとめた詳細なレポートを作成します。

SMBTouchは、情報を収集するにあたり、標的マシンについての情報を取得する正規のSMBメッセージを使用します。

例えば、ネイティブOSのバージョンを取得する際には、SMB_COM_SESSION_SETUP_ANDX(0x73)コマンドを使用します。

SMBTouch

SMBTouchは、セッションを開始して、標的マシンにOS情報を開示させます。脆弱性のあるOSが見つかったら、そのOSにより自身に付与される権限を確認し、標的マシンに存在する脆弱性を報告します。これは、Webブラウザのプラグインを検出して脆弱性の有無を調査するエクスプロイト・キットにも共通する手順です。SMBTouchが報告した情報は、攻撃に適したエクスプロイトの判断に使用されます。

MS17-010(CVE-2017-0144)を悪用するEternalBlue

MS17-010は、memmove操作によって引き起こされるバッファ・オーバーフローの脆弱性です。このmemmove操作では、DWORDがWORDにキャストされる数学的エラーが発生します。

この脆弱性は、Parameters Offset、Data Count、Parameter Countの各フィールドを細工したSMB_COM_TRANSACTION2_SECONDARY(0x33)リクエストによって発現します。この脆弱性を突くことにより、エクスプロイトでDoublePulsarバックドアを標的のマシンにインストールできます。

細工したパケットを送信するSMB_COM_TRANSACTION2_SECONDARY(0x33)リクエスト
細工したパケットを送信するSMB_COM_TRANSACTION2_SECONDARY(0x33)リクエスト

CIFSの仕様(MS-CIFS)で定義されているように、前述の各パラメータは、次の条件を満たしていなければなりません。

ParameterOffset(2バイト): SMB_Headerの先頭から、SMBメッセージに含まれるトランザクション・パラメータ・バイトまでのオフセット(バイト)。この値は、SMBメッセージの先頭から、SMB_Data.Bytes.Trans2_Parametersフィールドの先頭までのバイト数でなければなりません。

ParameterCount(2バイト): SMBメッセージで送信されるトランザクション・パラメータ・バイトの数。この値は、TotalParameterCount未満でなければなりません。トランザクションに含まれるすべてのリクエスト・メッセージのParameterCount値の合計は、トランザクションの最終リクエスト・メッセージで報告されるTotalParameterCountと同じでなければなりません。

DataCount(2バイト): SMBメッセージで送信されるトランザクション・データ・バイトの数。この値は、TotalDataCountの値未満でなければなりません。トランザクションに含まれるすべてのリクエスト・メッセージのDataCount値の合計は、サーバに報告される最小のTotalDataCount値と同じでなければなりません。

しかし、設定によっては、次に示すように、正しくない値を挿入できる場合があります。

正しくない値を挿入した場合

この図では、Parameter CountがTotal Parameter Countより、Data CountがTotal Date Countよりも大きくなっています。また、Parameter Offsetが、SMB Headerとトランザクション・パラメータ・バイト間のオフセットよりも大きくなっています。

このような状況を作り出すことにより、次のようにbase64でエンコードしたDoublePulsarバックドアを標的マシンに送り込みます。

base64でエンコードしたDoublePulsarバックドア

インストールされたDoublePulsarは、TRANS2_SESSION_SETUP(0x000E)サブコマンドを使用したSMB_COM_TRANSACTION2(0x32)コマンドによる基本的な通信インタフェースを用意します。

このサブコマンドは予約されているだけであり、実装はされていません。クライアントは、このコマンド・コードを使用したリクエストを送信すべきでないとされています。また、このコマンド・コードを含むリクエストを受信したサーバは、STATUS_NOT_IMPLEMENTEDを返すべきであるとされています。

攻撃のメッセージは、TimeoutフィールドとMultiplex IDフィールドを使用して送信されます。

Timeoutフィールドは、コマンド自体の送信に使用され、Multiplex IDフィールドは、リクエストしたコマンドに対するバックドアからの肯定/否定の回答の取得に使用されます。

Timeoutフィールド:

Timeoutフィールドに記述されたコマンドは、次の計算式でデコードされます。
0xff & ((x) + (x >> 8) + (x >> 16) + (x >> 24))

この式でデコードを行うと、次のいずれかの基本コマンドが導き出されます。

  1. 0x23 – バックドアがインストールされているかどうかを確認する。
  2. 0xc8 – DLLを読み込むかシェルコードを実行する。
  3. 0x77 – バックドアをアンインストールする。

Multiplex IDフィールド:

攻撃者は、先ほどのコマンドとともに、0x41(65)または0x42(66)を設定したMultiplex IDフィールドを送信します。バックドアは、肯定の回答を返す場合、0x41(65)に対しては0x51(81)、0x42(66)に対しては0x52(82)を送信します。

否定の回答を返す場合は、0x41または0x42を送信します。

次の例では、0xc8コマンドを使用して任意のシェルコードを実行しています。

任意のシェルコードを実行

次の例では、0x77コマンドを使用して標的マシンからバックドアをアンインストールしています。

バックドアをアンインストール

最後に、0x23コマンドを使用して、バックドアが標的マシンからアンインストールされたことを確認します。

バックドアが標的マシンからアンインストール

バックドアは、標的マシンはクリーンな状態であり、感染の証拠がすべて削除されたことを示す、否定の回答(0x41/65)を返しています。

感染の証拠がすべて削除

チェック・ポイントのIPSでの対応

多くの人々は、5月になってWannaCryが感染を広げ始めるまで、SMBの脆弱性を突くサイバー攻撃の存在に気付いていませんでした。しかし、以下に示したグラフにあるように、チェック・ポイントのIPSは、それよりだいぶ前から問題のトラフィックを検出しています。これは、DoublePulsarに感染したマシン数を示す世界規模の調査データの傾向とも一致しています。グラフでは、攻撃の最初の大きな波が4月21日に記録されていますが、これは、DoublePulsarバックドアをインストールするための攻撃であったと考えられます。

IPS SMB保護機能でのブロック数

第2のピークが記録されている5月12日は、WannaCryによる攻撃が始まった日です。この攻撃は、DoublePulsarに感染したマシンの多くに対しても行われています。上のグラフにあるように、この攻撃トラフィックをブロックするIPSのログが大量に記録されています。

以下のタイムラインは、世界規模でのイベント(パッチの提供と攻撃)の発生状況(上側)とIPSの対応状況(下側)を示しています。

  • SMB保護機能によるブロックは、SMBの脆弱性をカバーする累積のIPS保護機能を示す
  • 2017年3月、MicrosoftがSMBの脆弱性を修正する緊急のセキュリティ更新プログラムを公開
    • 同時に、チェック・ポイントがMicrosoftの脆弱性をカバーするIPS保護機能をリリース
  • 4月14日、Shadow Brokersが「Lost in Translation」エクスプロイトをインターネット上に公開
    • 4月27日、チェック・ポイントが、Shadow Brokersから公開されたツールに対する最初のIPS保護機能をリリース
  • 5月12日、WannaCryが史上最大規模のSMB攻撃として感染を拡大
    • 過去にリリースされたSMB保護機能でWannaCryに対応
  • 5月18日、Shadow Brokersが公開した複数のツールを使用するEternalRocksスイートの存在が確認される
    • 5月18~25日、チェック・ポイントがSMB/RDP EternalRocksエクスプロイトに対応するIPS保護機能を連続的にリリース

タイムライン

Shadow Brokersが公開したツールやWannaCry、EternalRocksに対応するチェック・ポイントIPSのSMB保護機能を次の表に示します。

チェック・ポイントのIPS Software Bladeは、EternalRocksのすべてのエクスプロイトに完全対応しています。

ツールの種類

ツール名

CVE

保護機能名

偵察

SMBtouch

ArchiTouch

Microsoft Windows SMBTouch Scanner(Microsoft Windows SMBTouchスキャナ)

Microsoft Windows ArchiTouch SMB Scanner(Microsoft Windows ArchiTouch SMBスキャナ)

脆弱性の悪用

EternalBlue

EternalChampion

EternalSynergy

EternalRomance

EsteemAudit

Eclipsedwing

EBBISLAND aka EBBSHAVE

MS17-10(CVE-2017-0143)

MS17-10(CVE-2017-0144)

MS17-10(CVE-2017-0145)

MS17-10(CVE-2017-0146)

MS17-10(CVE-2017-0147)

MS17-10(CVE-2017-0148)

CVE-2017-3623

CVE-2017-9073

MS08-067(CVE-2008-4250)

Microsoft Windows NT Null CIFS Sessions(Microsoft Windows NTの無効なCIFSセッション)

Repetitive SMB Rename Command Attempts(SMB Renameコマンドの繰り返しの試行)

Ransomware Shared Folder Access(ランサムウェアによる共有フォルダへのアクセス)

Microsoft Windows SMB Remote Code Execution(Microsoft WindowsにおけるSMB経由でのリモート・コード実行)(MS17-010: CVE-2017-0143)

Microsoft Windows SMB Remote Code Execution(Microsoft WindowsにおけるSMB経由でのリモート・コード実行)(MS17-010: CVE-2017-0144)

Microsoft Windows SMB Remote Code Execution(Microsoft WindowsにおけるSMB経由でのリモート・コード実行)(MS17-010: CVE-2017-0145)

Microsoft Windows SMB Remote Code Execution(Microsoft WindowsにおけるSMB経由でのリモート・コード実行)(MS17-010: CVE-2017-0146)

Microsoft Windows SMB Information Disclosure(Microsoft WindowsにおけるSMB経由での情報漏洩)(MS17-010: CVE-2017-0147)

Microsoft Windows SMB Remote Code Execution(Microsoft WindowsにおけるSMB経由でのリモート・コード実行)(MS17-010: CVE-2017-0148)

Microsoft Windows EternalBlue SMB Remote Code Execution(Microsoft Windowsにおける、EternalBlueによるSMB経由でのリモート・コード実行)

Microsoft Windows EternalChampion SMB Remote Code Execution(Microsoft Windowsにおける、EternalChampionによるSMB経由でのリモート・コード実行)

Microsoft Windows EternalSynergy SMB Remote Code Execution(Microsoft Windowsにおける、EternalSynergyによるSMB経由でのリモート・コード実行)

Microsoft Windows EternalRomance SMB Remote Code Execution(Microsoft Windowsにおける、EternalRomanceによるSMB経由でのリモート・コード実行)

Oracle Solaris Remote Shell Code Execution(Oracle Solarisにおけるリモート・シェルコード実行)(CVE-2017-3623)

Microsoft Windows EsteemAudit RDP Remote Code Execution(Microsoft Windowsにおける、EsteemAuditによるRDP経由でのリモート・コード実行)

Microsoft Windows Eclipsedwing RPC Buffer Overflow(Microsoft Windowsにおける、EclipsedwingによるRPC経由でのバッファ・オーバーフロー)

バックドア

DoublePulsar

Microsoft Windows DoublePulsar SMB Remote Code Execution(Microsoft Windowsにおける、DoublePulsarによるSMB経由でのリモート・コード実行)