プレスルーム | クラウドストライクに関するメディア

「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キャンペーンに関わる詳細ファイルを以下の表に列挙しています。 実行ファイル [table id=3 /]   実行ファイル [table id=4 /]   ファイルシステム 次のファイルが1つでも存在する場合は、SUNSPOTに感染している可能性があります。 [table id=5 /]   揮発性アーティファクト [table id=6 /]   YARAルール   MITRE ATT&CKフレームワーク 次の表は、報告されたSUNSPOTのTTPをMITRE社のATT&CK®フレームワークに沿って記述したものです [table id=7 /]   ログされたステップと対応するエラー 次の表では、ログファイルで確認されたステップ番号をSUNSPOTによって実行されたアクションと紐づけています。ステップ番号は実際の順序を反映していません。欠落している値もあります。 [table id=8 /] (※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は、その他の商標とサービスマークを所有し、第三者の製品やサービスを識別する目的で各社のブランド名を使用する場合があります。