Press Release | Media on CrowdStrike

「SUNSPOTマルウェア」:SolarWinds製品のビルド中に埋め込んだ高度な手口を解明

クラウドベースのエンドポイント保護とクラウドワークロード保護の業界リーダーであるCrowdStrike, Inc.(Nasdaq:CRWD、日本支社:東京都港区、以下「CrowdStrike」)は本日、SolarWinds Orion製品のビルドプロセスにバックドアを混入させるために使用されたマルウェア「SUNSPOT」に関する詳細情報を公開しました。SolarWindsは、ネットワークパフォーマンス監視ツールの大手プロバイダーであり、あらゆる規模の組織が世界中でそのサービスを利用しています。2020年12月、綿密に練られたサプライチェーン攻撃がSolarWinds社を襲った事実が判明し、業界を震撼させました。

CrowdStrikeを含む2社では、ビルドサイクルにおいて不正かつ悪意あるコードが組み込まれた、というこの出来事に関する調査および根本原因の究明にあたり、SolarWindsのサポートを行っています。SolarWindsは、顧客やビルドプロセスのセキュリティ確保を目的とした取り組みを進めており、この件についてブログで説明を公開しています(英語)。今回、製品提供に没頭するSolarWindsの開発チームに気付かれることなく、同社のOrion Platformにバックドアを混入させるためビルド環境にデプロイされた悪意あるツールについて、CrowdStrikeではSolarWindsと連携して技術的な分析を行っています。現時点では、SUNSPOTの埋め込み、SUNBURSTバックドア、およびポストエクスプロイトツールのTEARDROPについて、CrowdStrikeでは既知の攻撃者によるものとしていません。そのためCrowdStrike Intelligenceチームは、こうしたアクティビティを仕掛けた攻撃者をStellarParticleと呼び、今回の侵入プロセスを追跡しています。

重要ポイント

  • SUNSPOTはStellarParticleのマルウェアで、SolarWindsのIT管理ソフトウェア製品であるOrionのビルドプロセスに、SUNBURSTバックドアを組み込むために使用されています。
  • SUNSPOTはOrion製品のコンパイルに関連する実行中のプロセスを監視し、ソースファイルの1つを置き換えてSUNBURSTバックドアコードを混入させています。
  • Orionのビルドが失敗し、開発者に攻撃者の存在が警告されるのを防ぐため、SUNSPOTにはいくつかのセーフガード機能が追加されていました。

SolarWindsのソフトウェア開発に使用されるビルドサーバーを分析すると、StellarParticleがどのようにビルドプロセスを乗っ取り、更新パッケージにSUNBURSTが組み込まれるようになったかが見えてきました。SUNSPOTの設計からは、StellarParticleの開発者が確実にコードを組み込み、また検知されないために相当な労力を割いたこと、ビルド環境においてSolarWindsの開発者に存在が明らかにならないよう運用セキュリティを優先したことを伺い知ることができます。

技術面の分析

SUNSPOTは、ディスク上でtaskhostsvc.exe(SHA256 ハッシュ値:c45c9bda8db1d470f1fd0dcc346dc449839eb5ce9a948c70369230af0b3ef168)というファイル名で識別されますが、内部の開発者によりtaskhostw.exeというファイル名がつけられています。バイナリで見られるビルドタイムスタンプによると、このファイルがビルドされたのは2020-02-20 11:40:02だと思われ、現在分析されているStellarParticleのサプライチェーン攻撃のタイムラインと一致します。StellarParticleのオペレーターは、SUNSPOTがホストの起動時に実行されるようタスクセットをスケジュールし、持続性を確保しました。

攻撃の始まりとログ

SUNSPOTが実行されると、{12d61a41-4b74-7610-a4d8-3028d2f56395}という名前のミューテックスが作成され、これによって1つのインスタンスのみが実行されます。次に、暗号化されたログファイルをC:\Windows\Temp\vmware-vmdmp.logに作成します。個々のログエントリはストリーム暗号RC4で暗号化され、これにはハードコードされたキー、FC F3 2A 83 E5 F6 D0 24 A6 BF CE 88 30 C2 48 E7が使用されます。実行される間、SUNSPOTは他のデプロイ情報とともに、このファイルにエラーを記録します。ログエントリは32 78 A5 E7 1A 79 91 ACという16進数文字列で表され、最初のログ行から経過した秒数で始まります。エラーに対応するログ行のほとんどにはステップ番号(Step19など)が含まれますが、これを理解するにはマルウェアの知識が必要です。こうしたステップ番号をマルウェアのアクションにマッピングしたものを、このブログの最後に掲載しています。ステップ番号は、実際に実行された順序通りになっているわけではなく開発者がマルウェアの作成を進める中でコードの一部をデバッグすることに集中する必要があり、ログの呼び出し機能が追加されたことを示唆しています。テスト環境でSUNSPOTによって生成されたログファイルから、抜粋を以下に示します。

次に、マルウェアはセキュリティトークンを変更してSeDebugPrivilegeを追加することで、自身にデバッグ特権を与えます。このステップは、他のプロセスにおけるメモリの読み取りも含めSUNSPOTが最後まで実行されるための必要条件です。

 

ビルド乗っ取りの手順

ソフトウェアがビルドされるプロセスを監視
SUNSPOTは初期化後、開発ツールMicrosoft Visual Studioの一部であるMsBuild.exe のインスタンスについて、実行中のプロセスを監視します。実行中の各プロセスについてその名前をハッシュ化し、対応する値0x53D525と比較することでMsBuild.exeのコピーが識別されます。この比較に使用されるハッシュアルゴリズムはElfHashです。図1のPythonをご覧ください。

図1 プロセス名ハッシュ化のロジック

MsBuild.exeのプロセスを検出すると、SUNSPOTは新しいスレッドを生成してOrionソフトウェアがビルドされている最中かどうかを判断します。ビルドされている最中だと判断した場合は、ビルド操作を乗っ取ってSUNBURSTを注入します。監視ループは毎秒実行されるため、SUNSPOTはコンパイラに読み込まれる前に対象のソースコードを変更することができます。

初期化中に作成されたミューテックスにより、複数のプロセス監視ループの実行がすでに防止されているはずですが、このマルウェアは2番目のミューテックス{56331e4d-76a3-0390-a7ee-567adf5836b7}の存在をチェックしています。ミューテックスが見つかった場合、バックドアはこれを中断すべきとの信号だと捉え、実行中のバックドア注入のスレッドが完了するのを待った上で終了します。このミューテックスは、プロセスを強制終了するなどリスクのより高い方法を取る代わりに、気づかれることなくマルウェアを停止させるために、StellarParticleのオペレーターにより使われていた可能性があります。SUNSPOTを途中で停止させるとOrionのソースコード改ざんが中途半端に終わってしまい、ビルドエラーを引き起こす可能性があります。そうなればSolarWindsの開発者が調査に乗り出し、攻撃者の存在が明るみに出てしまうかもしれないからです。

プロセスメモリからコマンドライン引数を抽出
マルウェアは、実行中のMsBuild.exeプロセスそれぞれにおけるコマンドラインの引数を、仮想メモリから抽出します。ここで使われた手法は、すでに公開されているもの(※1)と類似しています。

NtQueryInformationProcessの呼び出しによって、攻撃側は_RTL_USER_PROCESS_PARAMETERS構造体へのポインタを含む、リモートプロセスのプロセス環境ブロック(Process Environment Block、PEB)へのポインタを取得することができます。これを読み取ることで、MsBuild.exeプロセスへ渡される完全なコマンドラインを取得できます。

次にコマンドラインを解析して個々の引数を抽出し、SUNSPOTはOrionソフトウェアのVisual Studioソリューションのディレクトリパスを探します。この値はAES128-CBCを使った暗号化形式により、バイナリでハードコードされます。そのパラメーターは下記の通りです。AESを用いてバイナリで暗号化されるすべてのBLOBに対して、同じモードが使用されます。

こうした暗号化キーや初期化ベクトル(IV)は一意でなく、いくつかの人気のあるビデオゲームにおける他のバイナリサンプルでも使用されている場合があります。値の静的検出が行われないようにするため、意図的にこのモードが選択されたと考えられます。

Orionソースコードの置き換え
実行中のMsBuild.exeプロセスでOrionソリューションのファイルパスを見つけると、SUNSPOTはソリューションディレクトリのソースコードファイルを悪意あるバリアント型に置き換え、これがOrionのビルド中にSUNBURSTを注入します。SUNSPOTが複数のファイルを置き換えるのに対し、識別されたコピーはInventoryManager.csのみを置き換えます。

SUNBURSTの悪意あるソースコードは対象となるファイルパスとともに、AES128-CBCで暗号化されたBLOBに保存され、同じ暗号化キーおよび初期化ベクトルで保護されます。

ビルドエラーが引き起こされると、Orionの開発者がすぐさま解決に乗り出し、攻撃者の発見につながると考えられるため、SUNSPOTの開発者はハッシュ検証チェックを盛り込みました。これにより、注入したバックドアコードが既知のソースファイルと互換性があることを確認し、復号化に失敗した不要なデータでファイルを置き換えることを防いでいると考えられます。SUNSPOTの典型となるサンプルを見ると、バックドアのソースコードにおけるMD5ハッシュ値は5f40b59ee2a9ac94ddb6ab9e3bd776caとなっています。

パラメーター(対象のファイルパスと置き換え用ソースコード)の復号化に成功し、MD5チェックを通ることができると、SUNSPOTはソースファイル内容の置き換えを続行します。元のソースファイルは元の内容をバックアップするために拡張子.bk
(InventoryManager.bkなど)でコピーされます。バックドアのソースは、MoveFileExで元のファイル名
(InventoryManager.cs)に戻される前に同じファイル名で書き込まれますが、この時の拡張子は.tmpとなります
(InventoryManager.tmpなど)。こうしたステップの後、SUNBURSTによってバックドアされたソースファイルは、標準プロセスの一環としてコンパイルされます。

SUNSPOTはバックドアを試みた日付と時間をログファイルに追加し、MsBuild.exeのプロセスが終了するのを待ってから元のソースコードを復元し、一時ファイルのInventoryManager.bkを削除します。Orionソリューションのビルドが成功した時には、SUNBURSTによってバックドアされているということです。

SUNBURSTのソースコード
SUNBURSTのソースコードは、SUNSPOTに組み込まれる前にサニタイズされた可能性があります。一般的な変数名やあらかじめ難読化された文字列が使用され、開発者のコメントや無効化されたコードがないという状況は、バックドアされたOrionのバイナリを逆コンパイルした後に取得できるものと類似しています。図2では、注入されたソースコード(上)と逆コンパイルで得られた出力結果(下)の比較を示しています。

図2 注入されたソースコード(上)とDnSpyで逆コンパイルした結果(下)の比較

攻撃者自身のコードがもとになってコンパイラが警告を出すと、SolarWindsの開発者に気付かれる可能性があります。こうしたコンパイル警告を削除するため、StellarParticleは#pragma warning disableや#pragma warningといったRESTOREステートメントで編集を行い、編集箇所を示唆しました。具体的には、次のようなtry/catchコードブロックが追加され、正規のOrionソフトウェアのRefreshInternal機能にSUNSPOTのエントリポイントが追加されました。

様々な攻撃手口(TTPs: Tactics, Techniques, Procedures)

このブログで説明したSUNSPOTの活動を特徴づける様々な攻撃手口(TTPs)として、以下が使用された可能性があります。

  • 起動時に作動するようスケジュールされたタスクにより、持続性を確保
  • AES128-CBCを使用し、バイナリ内において対象のソースコードファイルおよびバックドアソースコードファイルを保護
  • ハードコードされたキーでRC4による暗号化を使用し、ログファイルのエントリを保護
  • ハードコードされた値(32 78 A5 E7 1A 79 91 AC)で区切られたマルウェアの様々な実行によるログエントリ
  • 正規のVMWareログファイルになりすまし、システムの一時ディレクトリC:\Windows\Temp\vmware-vmdmp.logにログファイルを作成
  • exeプロセスの仮想メモリを読み取り、対象となるソリューションのファイル名を探すことで、標的のVisual Studioのソリューションビルトを検出
  • リモートプロセスのPEB構造体を介した、リモートプロセス引数へアクセス
  • ビルドプロセスにおいて、コンパイル前にファイル内容をSUNBURSTが含まれる別のバージョンと置き換えることによる、ソースコードファイルの置き換え
  • バックドアコードの行がビルドログに表示されないよう、#pragmaステートメント内にバックドアコードを挿入し警告を無効化および復元
  • 改ざんによってビルドエラーが発生しないよう、元のソースコードとバックドアソースコードにおけるMD5ハッシュ値をチェック
  • NON-EXISTENT状態のミューテックスを開き、マルウェアの操作者がバックドアの実行を停止して安全に終了するタイミングを検出

 

攻撃のホストインジケータ

ファイル名、SHA25ハッシュ値、そしてわかっている場合はビルドタイムなど、SUNSPOTキャンペーンに関わる詳細ファイルを以下の表に列挙しています。

実行ファイル

ファイル名SHA256ハッシュ値ビルドタイム(UTC)
taskhostsvc.exec45c9bda8db1d470f1fd0dcc346dc449839eb5ce9a948c70369230af0b3ef1682020-02-20 11:40:02

 

実行ファイル

説明SHA256ssssハッシュ値
SUNSPOTでバックドアされたOrionのソースコード0819db19be479122c1d48743e644070a8dc9a1c852df9a8c0dc2343e904da389

 

ファイルシステム
次のファイルが1つでも存在する場合は、SUNSPOTに感染している可能性があります。

ファイルパス説明
C:\Windows\Temp\vmware-vmdmp.log暗号化されたログファイル

 

揮発性アーティファクト

名前種類説明
{12d61a41-4b74-7610-a4d8-3028d2f56395}ミューテックス1つの埋め込みインスタンスを実行
{56331e4d-76a3-0390-a7ee-567adf5836b7}ミューテックスマルウェアが安全に終了できるよう信号の送信に使用

 

YARAルール

 

MITRE ATT&CKフレームワーク
次の表は、報告されたSUNSPOTのTTPをMITRE社のATT&CK®フレームワークに沿って記述したものです

戦術技術事象
偵察T1592.002 標的のホスト(ソフトウェア)情報を収集StellarParticleは、改ざんを目的としてSUNSPOTを開発する前にOrionのビルドチェーンを理解していました。
リソースの開発T1587.001 マルウェアの開発能力SUNSPOTはOrionのビルドを明確な標的と位置付け、一つのソースコードを置き換えてSUNBURSTと呼ばれるバックドアを入れ込むよう、作成されました。
永続化T1053.005 スケジュールされたタスクSUNSPOTは、ホストが起動した後に実行されるよう、スケジュールされたタスクセットにおいて永続化されています。
防衛回避T1140 情報の難読化を解除/復号SUNSPOTの構成はAES128-CBCで暗号化されています。これには、置き換え用ソースコード、標的となるVisual Studioソリューションのファイル名、そしてソリューションディレクトリに関連する標的のソースコードファイルのパスが含まれています。
T1027 ファイルや情報を難読化SUNSPOTが書くログファイルはRC4で暗号化されています。
T1480 防御回避策の実行元のソースコードファイルとバックドアされた置き換え用ソースコードの両方のMD5チェックサムがハードコードされた値と一致する場合にのみ、ソースコードの置き換えを実行します。
T1036 なりすましSUNSPOTは正規のWindowsバイナリになりすまし、ログを偽のVMWareログファイルに書き込みます。
探索T1057 プロセスの発見SUNSPOTは実行中のプロセスを監視し、MsBuild.exeのインスタンスを探します。
影響T1565.001 操作したデータを保存 – データ操作SUNBURSTを注入するためにOrionのソースコードを変更します。

 

ログされたステップと対応するエラー
次の表では、ログファイルで確認されたステップ番号をSUNSPOTによって実行されたアクションと紐づけています。ステップ番号は実際の順序を反映していません。欠落している値もあります。

ログファイルに
おけるステップ
意味
START初期化完了が成功したあと、ログの記録が開始されました。
Step1ビルドプロセスが改ざんされた後、元のファイルを復元することはできません。
Step2(ソリューションディレクトリに関連する)対象ソースコードファイルのパスのうち1つを復号化できませんでした。
Step3対象となるソースコードファイルに到達するファイルパスを作成することができませんでした。
Step4元のソースコードファイルのサイズを取得することができませんでした。
Step5元のソースファイルについてMD5ハッシュ値の計算に失敗しました。
Step6対象となる元のソースコードファイルにおいて、MD5ハッシュ値が予想と一致しませんでした。
Step7バックドアされたソースコードの復号化に失敗しました。
Step8バックドアされたソースコードについてMD5ハッシュ値の計算に失敗しました。
Step9バックドアされたソースコードデータについて、MD5ハッシュ値が予想と一致しませんでした。
Step10元のソースコードファイルについてバックアップの作成ができませんでした。
Step11バックドアされたソースコードを(.tmpファイルの)ディスクに書き込むことができませんでした。
Step12バックドアされたソースコードが入った一時ファイル(拡張子.tmp)を、元のソースのパスにコピーできませんでした。
Step14MsBuild.exeプロセスのメモリを読み取り、コマンドラインの引数を抽出することができませんでした。
Step15リモートプロセスにおけるPEBアドレスがゼロで返されました。
Step16NtQueryInformationProcessの呼び出しに失敗しました。
Step17SYNCHRONIZEアクセスでMsBuild.exeプロセスへのハンドルを作成できませんでした。
Step18MsBuild.exeプロセスの終了を正常に待つことができませんでした。
Step19NtQueryInformationProcess関数のアドレス取得に失敗しました。
Step20SeDebugPrivilegesを取得するためのプロセスセキュリティトークンの変更に失敗しました。
Step21現在実行中の改ざんスレッドの数が256を超えました。SUNSPOTはこれより多くのスレッドを追跡できません。
Step22実行中のプロセスについてリストを取得できません。
Step23実行中のプロセスリストを列挙する際にエラーが発生しました。
Step30ソリューション名core.slnを復号化できませんでした。

(※1)https[:]//blog.xpnsec[.]com/how-to-argue-like-cobalt-strike/

 

※この資料は、米国時間2021年1月11日に発表されたCrowdStrikeのIntelligenceチームによるブログの抄訳です。

CrowdStrikeについて
CrowdStrike® Inc.(Nasdaq:CRWD)は、サイバーセキュリティのグローバルリーダーであり、セキュリティ侵害を阻止するためにゼロから構築したエンドポイント・ワークロード保護プラットフォームにより、クラウド時代のセキュリティを再定義しています。CrowdStrike Falcon®プラットフォームは、軽量なシングルエージェントによるアーキテクチャで、クラウドスケールの人工知能(AI)を活用し、リアルタイムで組織全体の保護・可視化を提供するとともに、ネットワーク内外でエンドポイントに対する攻撃を防止します。独自のCrowdStrike Threat Graph®を採用したCrowdStrike Falconは、世界で最も高度なセキュリティデータプラットフォームのひとつとして、世界中から取得した週4兆件のエンドポイント関連イベントをリアルタイムで相関分析しています。

CrowdStrikeが提供するクラウドネイティブのFalconプラットフォームは、お客様の環境の保護機能とパフォーマンスを高め、短期間で価値を提供します。

CrowdStrikeについて覚えておいていただきたいことはただ1つですー「We Stop Breaches」

Falcon Prevent™の無料トライアルが可能です。

詳細はこちら: https://www.crowdstrike.jp/

ソーシャルメディア:
Blog: https://www.crowdstrike.com/blog/
Twitter: https://twitter.com/crowdstrike

© 2021 CrowdStrike, Inc. All rights reserved. CrowdStrike、Falconのロゴ、CrowdStrike Falcon、CrowdStrike Threat Graphは、CrowdStrike, Inc.が所有するマークであり、米国および各国の特許商標局に登録されています。CrowdStrikeは、その他の商標とサービスマークを所有し、第三者の製品やサービスを識別する目的で各社のブランド名を使用する場合があります。