** 本記事は、 How SunBurst malware does defense evasion の翻訳です。最新の情報は英語記事をご覧ください。**
企業の IT 管理を専門とする SolarWinds 社のソフトウェアサプライチェーンが、悪意のあるコードの配布を目的とした未知の攻撃者によるセキュリティ侵害を受けました。この攻撃は、特定の国の政府のために、あるいはその政府に代わって実行されたものだと考えられています。
この攻撃 (後に「Sunburst」と命名) が成功した結果、攻撃者は企業や政府の情報システムに広範にわたってアクセスすることが可能となりました。すでに大量 (その規模はいまだ不明) のデータ窃取が発生しており、攻撃者がこれを足掛かりにして、他にもバックドアを企業ネットワークに仕込んだのではないかという懸念も出てきています。
Sunburst の影響の深刻さから、この攻撃の詳細を伝えるレポートがすでに数多く発表されています。本レポートでは、ソフォスが特に関心を寄せている攻撃の特定の部分に焦点を当てます。その部分とは、攻撃者が検知と防御を迂回する際に使用している手法です。他の研究者、企業組織、IT 専門家が攻撃チェーンのこの部分について理解を深めることができるよう、Sunburst 攻撃で使用されたコードを段階を追って説明していきます。
ソフォスが分析した結果、Sunburst は侵入したソフトウェアコンポーネントを悪用して SolarWinds Orion を使用し、標的システムで実行されているセキュリティソフトウェアを検出し、場合によっては無効化しようとしていました。膨大にあるプロセスのいずれかが実行されていることが判明した場合、そのコンポーネントは再度呼び出されるまで完全にシャットダウンします。プロセスが見つからなかった場合にはサービスのリストと照合し、プロセスが見つかった場合は終了し、他のプロセスの無効化を試みます。また、セキュリティ製品に関連するドライバーについても同様の自動チェックが行われ、そのプログラムはシャットダウンします。
また、Sunburst は最初の C&C (C2) にカスタム DGA アルゴリズムを使用しています。攻撃者は、DGA ルックアップに対する DNS レスポンスを使用して、バックドアの終了などのバックドアアクティビティを制御しています (基本的には killswitch)。
「アップグレードされた」コード
SophosLabs が分析したのは、改ざんされた SolarWinds のソフトウェアの特定のコンポーネントで、SolarWinds.Orion.Core.BusinessLayer.dll という名前のダイナミックリンクライブラリ (DLL) です。この DLL は、SolarWinds Orion の正規コンポーネントのコードを改ざんして作成されたもので、別の Orion コンポーネントである InventoryManager に追加されたコードによってアクティベートされます。
このコードは、Sunburst バックドアのコードを実行するスレッドを新規に作成します。
実行は、DLL が solarwinds.businesslayerhost.exe という名前のプロセス内で実行されている場合にのみ進行します。
興味深いことに、セキュリティ業界が詳細に調査したところ、完全なバックドアではなく、短いスケルトンコードだけが挿入されたバージョンの DLL が確認されました。これはおそらく、攻撃者が実際に攻撃を行う前に何らかのテストを行っていのだと考えられます。
Sunburst のコードを見てみると、次の 2 つの手法が用いられていることは明白です。
- 文字列の難読化。レジストリキーやファイル名などの文字列に対して、圧縮と Base64 の組み合わせを使った軽度な難読化が施されています。これはおそらく、改ざんしたソースコードが発見される可能性を低くするためです。
- 特定のプロセスのファイル名がコード内で直接参照されておらず、その代わりに、プロセス名のハッシュが使用されています。これは、分析しにくくするためです。
Sunburst DLL は標的のセキュリティ対策を迂回するために、プロセス、サービス、ドライバーのハードコードされたリストをチェックします。前述したように、Sunburst が検索するプロセスとサービスの名前は、事前に計算された名前のハッシュと照合されるため、コードの目的を分析するのが非常に難しくなります。
スイッチオン
Sunburst は、ProcessTracker.TrackProcesses() 関数を介して実行中の環境をチェックします。この関数は 3 か所から呼び出されますが、そのうちの次の 2 か所はバックドアの実行のメインフローの中です。
- メイン実行ループに入る前に呼び出される UpdateNotification()
- メイン実行ループ内の Update()
UpdateNotification() 関数は、api.solarwinds.com のホスト名も解決します。内部 IP アドレスが返された場合、実行は終了します。これは、攻撃者が SolarWinds の支配下にあるネットワーク内でバックドアが実行されないようにしていることを示しています。
Update() のメインループ内に TrackProcesses() の呼び出しがもう 1 つありますが、これは攻撃が検出された場合にメインループから抜け出します。
いずれの場合も、プロセスがマルウェアによって検出されると、悪意のある DLL が次回ロードされるまで (アプリケーションの次回実行時まで) Sunburst の実行は停止します。
迂回のための 3 ステップ
TrackProcesses() 関数は、プロセスのチェック (SearchAssemblies())、サービスのチェック (SearchServices())、ドライバーのチェック (SearchConfigurations()) の 3 ステップで構成されています。
この関数は最初に SearchAssemblies() を呼び出し、137 のプロセス名のハードコードされたハッシュを含む単純なフラットリストを渡します。この時点ではまだ、逆の名前の抽出が進行中です。これらのプロセスには、セキュリティ製品 (Tanium や AVG のウイルス対策ソフトウェアなど) に関連付けられた実行ファイルや、次のようなパケットキャプチャ、フォレンジック、マルウェア解析ツールなどが含まれます。
- Wireshark
- VirtualBox
- RetDec decompiler
- Process Hacker
- Registry Monitor
- PE Explorer
一致したハッシュの詳細なリストは、SophosLabs の GitHub ページにある本レポートの IOC ファイルに記載されています。
ハッシュは、プロセスの小文字の名前のハッシュと照合されます。SearchAssemblies() がプロセス名と一致しない場合、TrackProcesses() 関数は SearchServices() を呼び出します。
SearchServices() は、実行中のサービスをハードコードされたサービスの短いリストと比較しますが、ここでも、対応するプロセスファイル名とレジストリサービスのサブキーに対して事前計算されたハッシュを使用します。
SearchServices() は、実行中のサービスをハードコードされたサービスの短いリストと比較します。ここでも、対応するプロセスファイル名とレジストリサービスサブキーのために事前に計算されたハッシュを使用します。
Sunburst コードは、サービスレジストリ構成の「Start」値を変更して、リスト内の特定のサービスを無効にしようとします。
製品 | サービス名 |
Windows Defender | msmpeng |
Windows Defender Advanced Threat Protection | mssense |
Avast | avastsvc |
Carbon Black | cavp、cb |
Crowdstrike | csfalconservice、csfalconcontainer |
FireEye | xagt |
Eset | ekrn、egui、ekrnepfw |
F-Secure | fsgk32、fsma32、fssm32、fnrb32、fsaua、fsorsp、fsav32、fsdevcon、fsgk32st、fswebuid |
このプロセスでいずれかのサービスが無効になっている場合、ConfigManager.WriteServiceStatus() が呼び出され、アプリケーション設定ファイル (SolarWinds.Orion.Core.BusinessLayer.dll.config) にパックされたデータを書き込み、一致したサービスエントリを保存します(例: …….)。サービスが検出されなかったり無効化されていなかったりした場合で、SearchAssemblies() がブラックリストからプロセスを見つけられなかった場合には、SearchConfigurations() が呼び出され、インストールされたドライバーを事前計算された 17 個のハッシュと照合します。
この関数は、WMI の “Select * From Win32_SystemDriver” を使用してドライバーのファイル名を取得することで、各ドライバーの小文字のファイル名を入手し、リストと照合するためのハッシュを生成します。標的ドライバーのいずれかが選択されると、バックドアは終了します。このリストには、CyberArk Endpoint Privilege Manager、Symantec Management Agent、Sentinel Agent のドライバーが含まれています。ドライバーのファイル名とハッシュの一覧は、SophosLabs の Github にある IOC ファイルに記載しています。
なお、ソフォス製品と一致するハッシュは見つかりませんでした。
リモートキル
すべてのプロセス、サービス、ドライバーのチェックに合格すると、Sunburst はメインの実行ループに進みます。ホスト名を生成するために使用されるのは、DGA です (avsvmcloud[.]com のサブドメイン。標的となったホスト名がここでエンコードされる)。生成されたホスト名に対する DNS レスポンスで返された IP は次に、リストと照合されます。これは、バックドアの実行フローを制御するために使用されます。(DGA については、すでに他の研究者が詳細な調査を行っています。)
たとえば、プライベートサブネットの範囲内のアドレスによって、バックドアの実行は終了させられます。この場合、ステータスは “Truncate” (3) に設定され、前述したアプリケーション設定ファイルの ReportWatcherRetry フィールドに書き込まれます。
<add key="ReportWatcherRetry" value="3"/>
ここにステータスを保存することで、今後バックドアは実行されなくなります。この値は Initialize() 関数内でチェックされます。
結論
Sunburst を実行するかどうかの選択や、できる限り攻撃的でない方法でセキュリティ対策を無効化する方法を見ると、この攻撃者が侵入時にできるだけ気付かれないようにと用心深くなっていることが分かります。