> > 標的型攻撃ランサムウェア「Ryuk」の内部構造を紐解く

標的型攻撃ランサムウェア「Ryuk」の内部構造を紐解く

2019.12.11
コンサルティングサービス事業本部
サイバーインテリジェンスグループ
吉川 孝志
title1

2019年末現在、Emotetによる被害が国内で収まる気配がありませんが、昨年のブログ記事でも言及したように、Emotetはメール情報を窃取するだけでなく、他のマルウェアを呼び寄せるダウンローダーの性質を持つことが特徴の一つです。海外ではすでに以前よりEmotetからTrickBot等、他のマルウェアがダウンロードされているケースが報告されていますが、最近になり、Emotetから最終的に「Ryuk」という標的型攻撃ランサムウェアの感染に繋がるという事例が海外で複数確認されています。つまり、場合によっては日本国内でもいずれRyukの感染被害が明るみに出てくる可能性が今後想定出来なくはありません。

そこで本記事では、標的型攻撃ランサムウェア「Ryuk」についてその詳細を解説します。


■Ryukとは

2018年夏頃に初めて存在が確認された「Ryuk」という標的型ランサムウェアは、これまで海外で多くの企業や行政機関を攻撃してきました。一部ではRyukを操る攻撃者に5億円を超える身代金を要求されたケースも確認されています。

Ryukは、2017年2月に出現した「Hermes」というランサムウェアのコードを改変した亜種であり、攻撃対象の企業ごとにカスタマイズされて開発されています。そのため、攻撃で使用された検体ごとに挙動が異なりますが、個々の機能(部品)には変化がなく、まるで攻撃先の環境に合わせて必要機能をブロックのように組み立てて作り上げているような印象を受けます。また、Ryukは少しずつ新しい機能を追加する試みも行われており、最近(2019年10月〜11月)出現した最新のRyukは、ネットワーク上に存在するシャットダウンされたPCを強制的に起動させ暗号化するWake-On-Lan(WOL)による暗号化機能を初めて搭載しました。以降の記事では、最新Ryukの検体を中心にし、旧Ryukの動作も交えつつ、「Ryuk」の全体像を解説します。


■Ryukの全体動作

RyukはEXEファイルであり、EXE本体は管理者権限の有無によらず動作できるように作られています。ただし、Ryukが意図する全ての挙動をもれなく実現するためには、管理者権限での実行が必要なため、攻撃者は管理者権限で実行する前提であることが伺い知れます。実際の攻撃事例でも、PsExecを利用しRyukを管理者権限で展開するケースが確認されています。

Ryukは実行されると自身の実行引数(コマンドライン)を調べ、その引数により挙動が分かれます。そのまま実行した場合には使われない引数の遷移も含まれており、これは攻撃者が外部から明確にその引数指定することでRyukをツールのように利用して特定の挙動を行えるようにも作られていることを意味します。
Ryukの動作遷移とその全体像がわかるように表したものが以下の図です。

図1 Ryukの動作遷移から見る全体像

Ryukは何も引数を付けずに起動すると、まず自分自身をランダムな7文字の名前で同一フォルダ内にコピーし、子プロセスとして実行します。またその際、自身の子プロセスに「8 LAN」という実行引数をつけて起動させます。
RyukのEXE名の生成ロジックと、子プロセスが起動した際のプロセスツリーを示したものが以下の図です。

図2 RyukのEXE名生成ロジックとプロセスの動作様子

■Wake-On-Lanによる攻撃

Ryukは、「8 LAN」という実行引数を渡され起動すると、ネットワーク上の端末の電源をリモートでONにするWake-On-Lanと呼ばれる技術を利用し、同一ネットワーク上でシャットダウン/スリープしている端末の起動を次々と試みます。具体的には、最初に感染した端末からArpテーブル一覧を取得し、それらから攻撃可能な範囲のIPアドレスに対してWake-On-Lanのマジックパケットを生成し送信します。つまりこれにより、たとえシャットダウンしている端末でさえも、Ryukにより遠隔で電源を入れられ、暗号化の攻撃対象にされてしまいます。(なお、この影響を受けるのはWake-On-Lanが有効になっている端末に限ります)
この仕組みは従来のRyukでは見られなかった新しい機能であり、Ryukの攻撃者がいかに被害を拡大させるためのアイデアを日夜探求しているか伺い知れます。

Wake-On-Lanは、マジックパケットと呼ばれる特殊なパケットを送信することで実現されますが、マジックパケットの構造は「FF:FF:FF:FF:FF:FF」というデータで始まり、その後に送信先端末のMACアドレスを16個繰り返し並べた構造になっています(つまり102バイトのデータ構造となります)。
以下は、実際に同一ドメイン上の別端末にRyukが送信したマジックパケットのキャプチャ様子ですが、「FF:FF:FF:FF:FF:FF」のあとに[00-0C-29-19-E3-1A]という攻撃先のMACアドレスが16個並んでいることがわかります。

図3 RyukのWake-On-Lanマジックパケットの送信

以下は、RyukがWake-On-Lanの処理(マジックパケットの送信)を行うコード部分の抜粋です。

図4 RyukのWake-On-Lanマジックパケット送信に関わるコード

Ryukは上記のように眠っていた端末を起こした後、ping送信による疎通確認を利用してネットワーク上に現存する端末を探索していきます。具体的には、現在のネットワークアダプタに関連付けられた端末のIPアドレスを取得し、[10.][172.16.][192.168.]で始まるかどうか(つまりプライペートIPの範囲かどうか)を調べます。もし該当した場合、同一セグメントの全範囲を対象にpingを送信し、pingの応答があった端末が見つかった場合、該当端末の管理共有(C$等)にアクセスを試みます(管理共有に関する話題は本記事の末尾に対策と併せて別途触れています)。管理共有にアクセスできた場合、配下の全てのファイルを暗号化していきます。

図5 Ryukがpingで端末を探索して暗号化する流れ

上記で説明した、Ryukがping送信処理を行うコードを以下に抜粋します。

図6 Ryukのping送信に関わるコード

以下の図は、Ryukが同一ドメイン上の別端末を攻撃している際の[Ryukのプロセスのハンドルリスト](Ryukが開いているファイルのリスト)と、[攻撃を受けている側のパケットキャプチャ]の様子となりますが、ネットワーク先の端末に管理共有(C$)を経由してアクセスしている様子がわかります。

図7 Ryukがネットワーク上の別端末にアクセスしている際の様子

なおこの際、Ryukのプロセスが管理者権限で実行されていない場合(管理共有にアクセスできる権限を持っていない場合)、以下のようにACCESS_DENIEDとなり、ネットワーク上の端末の暗号化は失敗します。つまり今のところ、権限奪取やパスワードアタックなどで認証を突破する機能はありませんが、次々と機能を追加してきているRyukにおいて、それらの機能が近々追加される可能性は十分にあります。

図8 Ryukが管理共有にアクセスできない権限時のパケットキャプチャ様子

■Ryukが暗号化しない対象

Ryukは以上で示したとおり、アクセスできる全てのネットワーク上の端末と、ローカルの全てのファイルを暗号化しますが、その際、以下に挙げる特定の文字列を含むフォルダやファイルを暗号化の対象から除外します。

図9 Ryukの暗号化処理の除外対象

なお、上記のリストからわかるようにRyukはWindows OSの起動に必要な「bootmgr」(ブートローダー本体)を除外対象にしていないため、管理者権限で実行された場合、「bootmgr」も併せて暗号化します。
そのため、Ryukに感染した端末を再起動してしまうと、以下の図のように、二度とOSが立ち上がらなくなってしまいます。

図10 Ryukに感染するとPCが起動できなくなるケースがある

■Ryukに暗号化されたファイルの特徴

Ryukに暗号化されたファイルには、ファイル末尾に「Hermes」という文字列で始まる274バイトのデータ(ここではHermesマーカーと呼ぶ)が追加されます。これはRyukにすでに暗号化されたファイルであることを示す一種のマーキングであり、RyukはHermesマーカーを含むファイルが見つかると暗号化対象から除外し、重複して暗号化しないようにしています。Hermesマーカーの後には、AES鍵がRSA公開鍵で暗号化されたデーターが記録されています。なお、冒頭でも述べたとおり、RyukはHermesというランサムウェアの亜種であるため、マーカーが同一となっています。

図11 Ryukに暗号化されたファイルの末尾

■Ryukの脅迫文

また、Ryukは暗号化の処理と並行し、別スレッドで全てのフォルダ内に脅迫文ファイルを作成していきます。
過去のRyukの脅迫文はテキストファイルで作成されており、明確な脅迫文章が記載されていましたが、新しいRyukの脅迫文はHTMLファイルで作成されており、シンプルな内容に変化していることがわかります。

図12 旧バージョンのRyukの脅迫文
図13 新バージョンのRyukの脅迫文

なおRyukは同様に、新規メディアの書き込み準備フォルダ内にも脅迫文を作成するため、感染した端末にCDやDVDの新規メディアを挿入すると、誤って脅迫文ファイルがメディアに書き込まれてしまう可能性もあります。ただし、これはRyukが狙った動きではなく、全てのフォルダ内に脅迫文を作成してしまうことから起きる現象です。

図14 Ryukにディスク書き込み準備フォルダ内へ脅迫文を作成される様子

また、同じくスタートアップフォルダにも脅迫文が作成されるため、システムの起動時にHTMLの脅迫文が表示されることになります。ただし、こちらも前述の通り、Ryukが管理者権限で動作した場合はbootmgrを暗号化してしまうため、そもそも再起動後はOSを起動できなくなり、この脅迫文をスタートアップフォルダ経由で実際に目にすることはありません。

図15 スタートアップフォルダ内へ脅迫文を作成される様子

■サービスとプロセスの強制終了

Ryukは暗号化処理と並行した別スレッドで、セキュリティ製品やバックアップソリューションに関わるサービスやプロセスを強制終了します。

Ryukがサービスを強制終了させる際は以下のコマンドを使用します。

net stop <サービス名> /y

Ryukが強制終了させるサービスのリストは次の通りであり、バックアップソリューション関連のサービスが目立ちます。なお、以下のリストはRyukが保有していた順序で記載していますが、不思議なことに、作りが大きく異なる別の標的型攻撃ランサムウェアであるMegaCortexが直近で強制終了の対象としていたサービス名の最初の並びと同じです。(ただし、MegaCortexの方が遥かに多くのリストを保有している事がわかっています。)

図16 Ryukが強制終了させるサービスのリスト

Ryukがプロセスを強制終了させる際は以下のコマンドを使用します。

taskkill /IM <プロセス名> /F

Ryukが強制終了させるプロセスのリストは以下となります。サービスのリストと比較すると少ないですが、オフィス系のプロセスなどが並んでいることからも、データを掴んでいる使用中のアプリケーションを強制終了させることで確実にユーザーが必要なデータを暗号化させようとしている意図がわかります。

図17 Ryukが強制終了させるプロセスのリスト

■プロセスインジェクションによる暗号化

Ryukには、他のプロセスに自身をインジェクション(注入)し、他プロセス内から暗号化を行う機能も含まれています。ただし、最新のRyukでは、この処理に移る前に、(図1に示したとおり)一連の暗号化処理が無限ループで繰り返されるため、プロセスインジェクションの処理には遷移しない場合があります。また、旧Ryukなど検体によっては、このプロセスインジェクションの処理が早々に行われる場合もあります。
Ryukの該当機能は、「NT AUTHORITY」(つまりシステム関連)に属するプロセスのリストを作成し、それらのうち「csrss.exe」「explorer.exe」「lsass.exe」以外の全プロセスを対象にインジェクションを行います。
インジェクションの手口は、マルウェアにおいては非常にスタンダードなWriteProcessMemoryによるもので、自分自身をインジェクションし、相手のプロセス内からも不正活動を開始させます。

図18 Ryukの正規プロセスへのインジェクションに係るコード

以下は、実際に旧Ryukの検体が正規プロセスである「sihost.exe」にインジェクションしている際の状況を示した図となります。RyukがWriteProcessMemoryを使用し、相手プロセス内のメモリに自身のコードを書き込んでいる様子がわかります。

図19 Ryukが正規プロセスへインジェクションする様子

■旧Ryukに見られるその他の動作

旧Ryukには、C:¥Users¥Public¥フォルダ内に自身をコピーし、そのパスをレジストリの自動起動エントリーに登録するなど、新Ryukにはない動作も存在します。

図20 旧バージョンのRyukに見られるその他の動作(1)

また旧Ryukにおいては、以下のようにC:¥Users¥Public¥フォルダ内にバッチファイルを作成し、フォレンジックや復旧活動を妨害する処理をコマンドとして最後に一斉実行する挙動も確認しています。

図21 旧バージョンのRyukに見られるその他の動作(2)

ただしこれらの機能は、旧Ryukに見られる動きとは述べたものの、実際は呼び出されていませんが新Ryukの内部にもコードとして残されていることを確認しており、こうした側面が(使う機能/使わない機能の)ブロックをつなぎ合わせて作られているかのように見えると冒頭で述べた理由の一つです。検体によってある機能が有効であったり無効であったりと挙動がバラけていることから、Ryukがビルダー(生成ツール)で作られている可能性も背景の一つとして考えられます。

以上までがRyuk全体の挙動解説となりますが、その他の補足情報をいくつかご紹介します。


■[その他の解析情報 ①] Ryukのバグ

Wake-On-Lan等の機能を装備した新しいRyukには特定条件下でクラッシュするバグがあることがわかりました。
具体的なシチュエーションとしては、オフライン環境でネットワークアダプタにキャッシュが残っていない状況下でのみ起きる現象です。Ryukがローカルネットワークのアドレスを探索する際に使用するGetAdapteraddressという関数を使用すると、通常はオフライン環境であっても、最後にオンラインだった際のIPアドレス情報が得られるのでRyukの動作に問題はないのですが、オフライン環境かつネットワークアダプタの再起動(初期化)を行っている環境だと、ネットワークアダプタからRyukが想定したIPアドレスを含む構造体が取得できないため、pingを送信する処理の過程で、最終的にサイズ0のメモリを確保しようとしてしまい、その点のエラーハンドリングがされていないことから、直後にRyukのプロセスがクラッシュします。ただし、日常的に何らかのネットワークに参加している一般的な端末上で起きうるシチュエーションではありませんので、このバグがあるからといって安心できるものではありません。

図22 Ryukのバグ

■[その他の解析情報 ②] 特定の国を示すコード

最新のRyukには、感染端末が韓国の言語圏であるかどうかの確認を示唆するコードが組み込まれています。ただし、このコードはどこからも呼び出されていません。Hermesや初期のRyukにはロシアやウクライナなどの言語圏の端末には感染しない仕組みが組み込まれており、一般的なマルウェアの中にも自国民の端末には感染させないように作り込まれているケースがしばしば見受けられます。ただし、そうした背景を逆手に取って他国が開発したマルウェアであるかのように見せかけ偽装することもまた容易です。今回のケースも実際に韓国に何らかの関わりがあるのか、または韓国の攻撃者であると思わせようとしているのかなど、その背景はわかりませんが、興味深い分析結果の一つであると言えるでしょう。

図23 特定の国を示すコード

■対策

今回のRyukによるネットワーク越しの暗号化は大きな脅威の一つですが、ではそれを防ぐためはどうすればよいのか、OSの設定で対策可能な範囲のうち、実際に有効であることが確認できた対策を3つピップアップしてご紹介します。

(※以降でご紹介する各種システム変更は、変更することにより組織の管理に何らかの影響を受ける場合もありますので、所属している組織の管理上問題がなく、管理者の許可が得られる場合のみ実施してください。)

1つめは管理共有の無効化です。Ryukの挙動解説の中ではこの点の詳細にあまり触れませんでしたが、通常Windowsには管理共有という隠し共有フォルダがあり、デフォルトでCドライブなどシステムドライブ全体の共有(C$)が有効になっています。
ご自身の環境で確認するには、コマンドプロンプトを起動し「net share」と入力するだけで確認することが可能です。表示された一覧に「C$」(Cドライブがシステムドライブの場合)やADMIN$が含まれれば、管理共有が有効になっています。
管理共有にアクセスできる権限をもつ場合、エクスプローラー等から「¥¥相手のIPアドレス¥C$¥」にアクセスする事で配下全てのファイルを操作する事が可能であり、Ryukはまさにそれを悪用しているわけですが、この管理共有を無効にすることでRyukのネットワーク越しの暗号化を防ぐことができます。

管理共有を無効にするには、以下のレジストリ値を設定することで設定することができます。

レジストリキー:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters
レジストリ値:AutoShareWks = 0
(REG_DWORD / サーバOSの場合はAutoShareServer)

上記レジストリを設定後、OSを再起動し、net shareコマンドの一覧からC$などが消えていれば無効化できていることになります。

図24 Ryukのネットワーク越しの暗号化攻撃に有効な対策(1)

上記に挙げた「管理共有の無効化」は、Ryukに限ったことではなく、標的型攻撃におけるその他脅威のラテラルムーブメント(横展開)を予防する対策にもなります。

2つめに挙げるのはWindowsのファイルとプリンタの共有機能を無効化する対策です。Windowsのファイルとプリンタの共有機能はネットワークアダプタにバインドされた機能で実現されており、ネットワークアダプタのプロパティから無効化することができます。ただし、これも利便性との引き換えになるため、無効化設定が可能な状況下で有効な対策です。

図25 Ryukのネットワーク越しの暗号化攻撃に有効な対策(2)

3つめは、ファイアウォールによるブロックです。
現時点のRyukはpingが通らないネットワーク端末へは暗号化活動を行わないため、ファイアウォールでping(ICMP)をブロックすることでも防御が可能です。
以下の図は、ping(ICMP)のみをファイアウォールでブロックするよう「拒否」に設定にした場合と、その設定を「許可」に変更した場合のRyukの攻撃パケットの様子ですが、pingがブロックされている間は暗号化が発生しませんが、pingを許可し疎通確認が通り次第、Ryukの暗号化が発生する流れがわかります。

図26 Ryukのネットワーク越しの暗号化攻撃に有効な対策(3)

ただし、このファイアウォールによるpingブロックの対策は「現時点」と前置きしたように、将来変更されうる挙動であり、あくまで今のRyukのみに有効な限定的な対策といえます。
ファイアウォールにおける汎用的な観点として、ファイル共有をブロックすることなども有効です。
また今回挙げた他にも、Wake-On-Lanが不必要であれば、BIOSやOSの設定で無効にすることも予防の一つになります。


■まとめ

新しいRyukにWake-On-Lanやpingの機能が追加され始めたように、Ryukの攻撃者はいかに組織内の広範囲に被害を広めるかという点に頭を捻っていることが伺えます。今後さらに改良された新バージョンのRyukが現れるのは時間の問題でしょう。

前回解説したMegaCrotexもそうですが、標的型攻撃で使用されるランサムウェアは非常に早いスパンで次々と改良されており、今回のように新しいアイデアも試されている状況にあります。また、攻撃先ごとに検体の機能が異なるように、まさに狙った相手のための検体を作成していると思われるケースが目立ってきていることから、従来のように1つの事例を参考にその多くを語れる状況では無くなってきている現状もあります。とはいえ、それぞれの脅威にしっかりと腰を据え、一つずつ丁寧に理解していくことが、効果的な予防や対策への近道になることに違いはありません。弊社のマルウェア解析記事が、今後もそうした理解の一助になれば幸いです。


※本記事で使用した検体のハッシュ値:

e75622957decf1594c2cbe726ff0aaba4a509dab7b77721d3db16977f224ae4a
c7d465c8069662e6206684a7cc80e7f820dff3cfb6feb2f35a7356998694b7c1
74654957ba3c9f1ce8bb513954b9deea68a5a82217806977a1247fb342db109f
23F8AA94FFB3C08A62735FE7FEE5799880A8F322CE1D55EC49A13A3F85312DB2