threat-research

LockerGoga:重要インフラを標的としたランサムウェア

FortiGuard Labsによる脅威分析レポート

Stuxnetの発見以来、重要インフラを標的とした攻撃が次々と見つかっています。高度な攻撃もそうでないものもありますが、いずれもその影響は非常に大きく、損害は多大なものになります。

図1:Stuxnet発見以降の重要インフラへの攻撃

図1:Stuxnet発見以降の重要インフラへの攻撃

初期のランサムウェアは、重要インフラを攻撃することが主な目的ではありませんでした。しかし近年、WannaCry、NotPetya、SamSam、そして今回のLockerGogaなどの攻撃を使用して、重要インフラを標的としているランサムウェアが増加していることを、FortiGuard Labsの脅威調査チームが突き止めました。これはランサムウェアの今後の傾向を明示すものです。

今年初めに発見されたLockerGogaは新しいランサムウェアファミリーで、産業分野の企業を攻撃して事業に大きな損害を与えました。このファイルを暗号化するマルウェアの活動が始まったのは、フランスに本拠地を置くエンジニアリング関連のコンサルティング会社の攻撃中だったと言われています。また、2週間ほど前には、国際的なメーカー企業の業務に大きな影響を及ぼしたという報道がありました。その直後には、米国の2社の化学関連企業が同じマルウェアに攻撃されたと報告されています。

現在、このマルウェアがシステムに侵入した方法については非常に限られた情報しかありません。しかし、複数の段階を経てキャンペーン活動が絞り込まれ、攻撃が行われた可能性が高いと考えられています。この前提に基づくと、マルウェアの実行には管理者権限が必要なため、攻撃者は攻撃の初期段階で高レベルのシステム権限を入手していたことになります。

こうした推測とは別に、この記事ではランサムウェアとしてのLockerGogasについて明らかになっている点を詳しく解説します。このランサムウェアは通常とは異なるテクニックを使用していますが、標的型の攻撃としてはそれほど高度なものではないという点も説明します。


概要

このLockerGogaの亜種のバイナリは、セキュリティ侵害や難読化の手法を使用してはおらず、後にファイル暗号化段階で使用するRSAパブリックキーのエンコーディングを行うだけです。攻撃者は対象企業のセキュリティ対策を把握しており、難読化をしなくてもマルウェアが捕捉されないという自信があった可能性があります。

もう1つ興味深いのは、このマルウェアがオープンソースのBoostライブラリをファイルシステムに使用し、Crypto++(Cryptopp)をファイル暗号化に使用している点です。これらのライブラリを使用することの利点の1つは、開発と実装が簡単になることです。開発者はネイティブAPIを個別に呼び出さなくても、ラッパー関数だけで同じことが達成できるからです。これは高度なプログラミングを使用するので、ソースコードなしで静的そして動的にアプリケーションを分析することは、Windows APIの単純なシーケンスを読み込むよりもはるかに複雑な作業になります。ただし、標準ライブラリを使用しないため手作業でリンクし、関数を物理的に最終的なバイナリへ追加する必要があります。そのため、ファイルは通常よりも大きくなります。

以下の図は、LockerGogaランサムウェアの実行フローを示したものです。マルウェアの実行は基本的に3段階に分かれており、マルウェアは提供されたパラメータの有無に応じて各段階の間を移動します。

図2:LockerGogaの実行フロー

図2:LockerGogaの実行フロー

LockerGogaはマスター/スレーブモデルを使用してファイルを暗号化します。「マスター」プロセスは、一方向で「スレーブ」プロセスと通信します。LockerGogaはBoost Interprocess Communication(IPC)を使用してこのモデルを実装します。「マスター」および「スレーブ」プロセスは、データが書き込まれる共有メモリを使って通信します。「マスター」プロセスは暗号化するファイルを検索し、次にファイルのパスを共有メモリ内に書き込みます。そして「スレーブ」プロセスはファイルパスを入手するために共有メモリを読み込み、ファイルを暗号化します。


最初の実行

マルウェアの最初の実行はパラメータなしで行われるため、あまり顕著な動きはありません。自分自身を%TEMP%/tgytutrc{number}.exeにドロップし、 「-m」(マスター)パラメータで実行するだけです。

-l」パラメータを追加することで、マルウェアは詳細を「C:\.log」に書き込むことができます。

図3:LockerGoga実行ログのサンプル

図3:LockerGoga実行ログのサンプル


マスター

「マスター」プロセスは、暗号化するファイルの検索、システムからの管理者ユーザーのロックアウト、ネットワークインタフェースの無効化といった悪意のあるルーチンの多くを担っています。

セッションログオフと管理者パスワードの変更

最初に、現行のもの以外の全セッションをログオフします。そのためにWindowsのネイティブツール、logoff.exeを使用します。その後、すべての管理者アカウントに、ハードコーディングされたパスワードを設定します。

これは、このマルウェアによる紛らわしいふるまいのひとつです。被害者が知らないパスワードを設定することで、マルウェアは被害者をシステムからロックアウトできるので、「Locker」という名前が付けられています。しかしながら、これによって被害者はランサムノート(身代金の要求)も読めなくなり、支払いの機会が失われてしまいます。したがって、このキャンペーンは金銭目的ではないことを証明していることになります。事実、通常とは異なるこのようなふるまいのため、このマルウェアには別な目的があるという憶測がなされています。

図4:他のセッションをログオフし、管理者パスワードを設定するProcmonログ

図4:他のセッションをログオフし、管理者パスワードを設定するProcmonログ

図5:管理者アカウントにパスワードを設定

図5:管理者アカウントにパスワードを設定

次に、スレーブプロセスを実行して実際にファイルを暗号化します。これについては、以下の「スレーブ」セクションで詳しく説明します。ファイルを暗号化するために、パラメータ「-i <shared memory name> -s」を使用してバイナリを実行します。「-s」はマルウェアを「スレーブ」として実行するように指示します。「-i」は「マスター」と「スレーブ」のプロセス間通信に使用する共有メモリ名を指定します。 これはBoostのIPCライブラリを使用して実装されます。

「スレーブ」プロセスと通信できるように、マスタープロセスは名前付きの共有メモリ、「SM-tgytutrc」を0x10000バイトのサイズで作成します。Boostライブラリを使用してこのメモリを初期化しますが、内部ではFile Mapping APIを使用します。

図6:名前付き共有メモリの作成

図6:名前付き共有メモリの作成

前述のように、「スレーブ」プロセスはハンドルを0xFFFFFFFFに設定してCreateFileMappingA() APIを呼び出します。これはWindows Page Fileの使用を意味しています。

「マスター」プロセスは暗号化するファイルを列挙し、Base64でエンコーディングされたパスを共有メモリ内に挿入します。共有メモリに書き込まれたデータを「スレーブ」プロセスがどのように使用するのかという点についても、以下の「スレーブ」セクションを参照してください。

暗号化されたファイルがディスク上で削除されたファイルからリカバリされないようにするため、別のWindowsネイティブツール、cipher.exeを使用します。cipher.exeはディスクドライブ上で使用されていない、または空いているディスクスペースを消去し、削除されたファイルがリストアされないようにします。

その後は、システム内のインタフェースをすべて無効化し、リモート接続を阻止します。最初にシステムへの侵入方法を見付けなければならないので、ランサムウェアでは暗号化されたファイルのリカバリについてはあまり気にしないのが一般的です。そういった意味で、この点は通常とは異なります。

図7:cipher.exe、netsh.exeスレーブを実行するProcmonログ

図7:cipher.exe、netsh.exeスレーブを実行するProcmonログ


スレーブ

「スレーブ」プロセスは、ファイル暗号化を担います。「スレーブ」プロセスは、暗号化対象ファイルのパスが含まれたメッセージがマスタープロセスから送信されるのを待ちます。

スレーブプロセスは、以下のパラメータと共に実行されます。

-i <shared memory name(共有メモリ名)> -s -l

-l(log)は、マスタープロセスも-lパラメータ付で実行された場合に使用されます。

共有メモリのビューをマッピングするために、MapViewOfFileEx() APIを呼び出します。

図8:共有メモリのビューのマッピング

図8:共有メモリのビューのマッピング

次に、マスタープロセスからのメッセージを待ちます。このメッセージにbase64でエンコーディングされたデータが含まれており、これを復号すると、暗号化対象ファイルのパスになります。

図9:Base64でエンコーディングされた暗号化対象ファイルのパス

図9:Base64でエンコーディングされた暗号化対象ファイルのパス

ファイルの暗号化前に、Restart ManagerとService Control Manager APIを呼び出して、暗号化対象ファイルを使用している可能性がある重要性の低いサービスを中止します。

図10:Restart ManagerとService Control Managerで、暗号化対象ファイルを使用している可能性があるサービスを中止

図10:Restart ManagerとService Control Managerで、暗号化対象ファイルを使用している可能性があるサービスを中止

ファイル暗号化は、暗号化するファイルを操作するために使用するNative APIのアドレスを入手することから始まります。アドレスの代表的なものに以下が挙げられます。

  • NtOpenFile
  • NtClose
  • NtReadFile
  • NtWriteFile
  • RtlInitUnicodeString

次に、暗号化したファイルに追加する0x90バイトのサイズのメモリスペースを作成します。ここには以下のデータを含む「GOGA」構造が保存されています。

図11:暗号化情報を含む「GOGA」構造

図11:暗号化情報を含む「GOGA」構造

マーカーには文字列「GOGA1510」が含まれています。この後に、暗号化対象ファイルのサイズが記述されます。次のDWORDは常に0です(これに関しては以下で詳しく説明します)。次のデータには、ランダムに生成されたAESキーとIV、そしてエンドマーカーである「goga」とパディングが続きます。

図12:「GOGA」構造内のデータ初期化

図12:「GOGA」構造内のデータ初期化

次に「.locked」の拡張子が付いたファイルがないか確認します。存在する場合は、そのファイルを削除します。

図13:「.locked」の拡張子が付いたファイルの削除

図13:「.locked」の拡張子が付いたファイルの削除

そして対象ファイル名を、「.locked」の拡張子付きに変更します。

図14:「.locked」の拡張子を付けてファイル名を変更

図14:「.locked」の拡張子を付けてファイル名を変更

「スレーブ」プロセスは、ファイルを0x10000バイト単位(チャンク)に分け、ランダムに生成されたキーとIVを使用して、それぞれをCrypto++ AESアルゴリズムで個別に暗号化します。

図15:0x10000バイト単位でファイルを暗号化

図15:0x10000バイト単位でファイルを暗号化

最終チャンク(0x10000バイトより小さい場合があります)を暗号化する前に、crc32の無効化バリューをチャンクに追加して、4バイトにサイズを増やします。

図16:最終チャンクの無効化CRC32を、暗号化前のファイルコンテンツに追加

図16:最終チャンクの無効化CRC32を、暗号化前のファイルコンテンツに追加

そして、上記の「append_negated_crc32val」関数を2回呼び出します。2回目の呼び出しで、前述の「GOGA」構造内で「always_0」 DWORDに値を割り当てます。これは、「always_0」メンバーにもファイルコンテンツの最終チャンクのcrc32が含まれていた可能性があることを意味します。しかし、何らかの理由で関数終了前に作者が-1の値をcrc32バッファーにコピーしているため、2回目の呼び出しで0 (~(-1))が「always_0」にコピーされます。

図17:-1をCRC32バッファーにコピー

図17:-1をCRC32バッファーにコピー

最後に、前述の「GOGA」構造に含まれている、ファイルの暗号化に使用するAESキーとIVを以下のパブリックキーを使用して、RSAアルゴリズムで暗号化します。

図18:マルウェア本文に組み込まれたRSAパブリックキー

図18:マルウェア本文に組み込まれたRSAパブリックキー

最終的な「GOGA」構造を、暗号化されたファイルに追加します。

図19:暗号化されたファイルに最終的な「GOGA」構造を追加

図19:暗号化されたファイルに最終的な「GOGA」構造を追加


ランサムノート(身代金の要求)

次に、「README-NOW.txt」と名付けられたランサムノート(身代金の宣告)が現在のユーザーの%Desktop%にドロップされます。これには、複数の電子メールアドレスが支払い方法を指示するための連絡先として記載されています。

図20:LockerGogaのランサムノート

図20:LockerGogaのランサムノート


結論

LockerGogaは、他のランサムウェアと比較して特に高度なものとは言えません。

しかし、攻撃対象ファイルへのアプローチが極めて特殊です。ほとんどの場合、ランサムウェアはマルチスレッド型のアプローチで低レベルのWindows APIを使用し、全ファイルを暗号化します。これは、そうすることがこの目的には有効だからです。ただし今回のケースでは、自身を「スレーブ」モードで拡散し、ファイルを暗号化しています。つまり、各ファイル毎に新たな「スレーブ」プロセスを実行してファイルを暗号化するのです。これによって、数百もの子プロセスを生むようなプロセスなどのノイズが大幅に増えるため、控えめに言っても疑われる可能性は高くなります。

バイナリがまったく難読化されていないことから考えても、このマルウェアの開発者は検知を回避することについてはそれほど気にしていないようです。これは、有効なDigital Certificateを使用していることで自信があるためでしょう。また、この種の攻撃は標的型攻撃の一部として過去に実施された偵察段階に続くもので、その目的はペイロード導入前にセキュリティ体制をチェックすることにあるとするレポートも複数存在しています。こうした過程では検知を回避する必要はないと判断した可能性も指摘されています。

この種の標的型攻撃では、マルウェアのペイロードがどの程度高度なのかは重要ではありません。重要なのは、企業内部にどうやって侵入できたのかという点です。最も高速で高度なマルウェアであっても、システムに侵入できなければ被害をもたらすことはできません。このように、LockerGogaは他のランサムウェアファミリーよりも優れた機能はありますが、それよりも重要なのは、企業内部に侵入し、ランサムウェアを実行できたという点です。

つまり、継続的に調査して、最初にどうやって攻撃が成功したのかを究明することがユーザーとセキュリティ業界の両方にとって非常に重要です。このインシデントは引き続き調査中なので、新たな進展があればお伝えします。

-= FortiGuard Lionチーム =-


ソリューション

フォーティネットのお客様は以下によって保護されています。

  • サンプルは、W32/Crypren.AFFL!tr.ransomシグネチャで検知
  • FortiSandboxはLockerGogaのふるまいが高リスクであると評価します

IOC

Sha256
c97d9bbc80b573bdeeda3812f4d00e5183493dd0d5805e2508728f65977dda15 - W32/Crypren.AFFL!tr.ransom


最新のボットネット、マルウェア、およびエクスプロイト各々の指標を示した、Fortinet Threat Landscape Indexについては、こちらをご覧ください。

FortiGuard LabsおよびFortiGuardセキュリティサービスのポートフォリオの詳細については、こちらをご覧ください。毎週お届けするFortiGuard脅威インテリジェンス情報(英文)にぜひご登録ください。

セキュリティ監査とベストプラクティスを提供するFortiGuard セキュリティレーティングサービスについては、こちら(英文)をご参照ください。

ネットワーク セキュリティ エキスパート プログラムネットワーク セキュリティ アカデミーFortiVetsプログラム(英文)の詳細をご紹介しています。