Linux版SideWalkバックドアを新たに発見

ESETの研究者は、SideWalkバックドアのLinux版を発見しました。
これは、すでに多くの攻撃能力を持つAPTグループSparklingGoblinが使用しているツールです。

ESETの研究者は、APTグループのSparklingGoblinが使用している独自のインプラントの1つであるSideWalkバックドアのLinux版を検出しました。この亜種は、2021年2月に香港の大学に展開されました。同大学は、2020年5月の香港の学生が大規模な抗議活動を行っていた時期にも、SparklingGoblinの標的になりました。ESETは当初、このバックドアを「StageClient」と名付けましたが、現在は単に「SideWalk Linux」と呼んでいます。また、既知のLinuxバックドアであるSpecter RAT(360 Netlabが最初に報告)も、実際にはSideWalkのLinux版であり、ESETが確認した検体との共通点が複数あることがわかりました。

SparklingGoblinは、APT41やBARIUMと一部共通するTTP(戦術/技術/手順)を使用するAPTグループです。Motnug/ChaCha20ベースのローダー、CROSSWALK/SideWalkバックドア、Korplug(別名PlugX)、Cobalt Strikeを利用しています。SparklingGoblinは、主に東アジアと東南アジアの組織を標的にしていますが、世界中のさまざまな組織や業種も標的とし、特に学術機関に焦点を絞っています。SparklingGoblinは、ShadowPadバックドアを利用するAPTグループの1つです。

このブログでは、SideWalk Linux、攻撃の標的、そして当初発見されたSideWalkバックドアとの多くの類似点について解説します。

攻撃の帰属

SideWalkバックドアはSparklingGoblinだけが使用している攻撃ツールです。SideWalkのLinux版と、SparklingGoblinが使用しているさまざまなツールには、コードの類似点が複数あります。それに加えて、SideWalk Linuxの検体の1つは、SparklingGoblinが以前使用していたC&Cサーバーのアドレス(66.42.103[.]222)を使用しています。

ESETはこれらの要因を考慮し、SideWalk LinuxがAPTグループSparklingGoblinによるものであると確信しています。

攻撃の標的

現在、VirusTotalではSideWalk Linuxの多様な検体が存在することが明らかになっています。しかし、ESETのテレメトリによると、香港の大学だけがこのSideWalkの亜種によって侵害されたことが確認できます。同大学は、学生が抗議活動を行っていた時期に、SparklingGoblin(MotnugローダーとCROSSWALKバックドアを使用)とFishmonger(ShadowPadバックドアとSpyderバックドアを使用)の標的となりました。なお、ESETは当時、この2つの攻撃クラスタを両方とも「Winnti Group」という名称で分類していました。

SparklingGoblinが最初に同大学に侵入したのは2020年5月であり、そのネットワークでSideWalkのLinux版が最初に検出されたのは2021年2月でした。SparklingGoblinは、長期間にわたってこの組織を継続的に攻撃し、印刷サーバー、メールサーバー、学生のスケジュールや履修登録を管理するサーバーなど、複数の主要サーバーのセキュリティを侵害しました。

SIDEWALK LINUXの特定に至るまでの経緯

SideWalkについてESETが初めて報告したのは、2021年8月24日のブログです。このときは、Windows版について説明しました。SideWalkは、C&Cサーバーから送られる追加モジュールをロードできる多目的のバックドアです。デッドドロップリゾルバーにGoogle Docsを利用し、C&CサーバーにCloudflare Workersを利用します。プロキシ経由の通信も問題なく処理できます。

セキュリティ侵害のチェーンは現在のところ明らかになっていませんが、ESETは脆弱性の悪用が最初の攻撃ベクトルだったのではないかと考えられます。Specterボットネットの標的がIPカメラとNVR/DVRデバイスであると説明する360 Netlabの記事と、この香港の標的が脆弱なWordPressサーバーを使用していたという事実(さまざまなWebシェルをインストールしようとする試みが多く実行されたため)が、この仮説の根拠となっています。

ESETは、2021年7月2日にSideWalkのLinux版を最初にStageClientとして報告しましたが、このときはSparklingGoblinと独自のSideWalkバックドアに関連付けていませんでした。当初の名前は、StageClientという文字列がコードで繰り返し使用されていたために割り当てられたものです。

StageClientをさらに調査したESETは、360 NetlabのブログでSpecterボットネットに関する説明を見つけました。そのブログで説明されていたのは、ChaCha20暗号の亜種を使用し、柔軟な構成が可能なモジュール型Linuxバックドアです。これは、基本的にはStageClientの機能のサブセットです。ESETはさらなる調査で、すべてのバイナリで機能、インフラストラクチャ、シンボルが大きく重複していることを発見し、この仮説が裏付けられました。

ESETは、StageClientの検体E5E6E100876E652189E7D25FFCF06DE959093433とSpecterの検体7DF0BE2774B17F672B96860D013A933E97862E6Cを比較し、多くの類似点を特定しました。その一部を以下に紹介します。

第一に、C&Cコマンドが重複しています。第二に、検体の構成と暗号化方式が同じです(図1、図2参照)。

さらに、検体のモジュールの管理方法がほぼ同じであり、インターフェースも大部分が同一です。StageClientのモジュールの場合は、モジュールを閉じるためのハンドラを追加で1つ実装する必要があるだけです。既知のモジュール5つのうち、3つはほぼ同じです。

最後に、比較した検体のネットワークプロトコルにも、顕著な重複を確認しました。ChaCha20の亜種を2回使用し、全く同じ方法でLZ4圧縮による暗号化を実行しています。StageClientもSpecterも、多くのスレッド(図3、図4参照)を作成して、ハートビートとともに非同期メッセージの送受信を管理します。

このように顕著な類似点がある一方で、いくつかの変更もあります。大きな変更点は以下のとおりです。

a. 使用する言語がCからC++に切り替わりました。理由は不明ですが、C++はポリモーフィズムをサポートしていることから、このようなモジュール型アーキテクチャの実装が容易になることが考えられます。
b. HTTPでメッセージを交換するオプションが追加されました(図5、図6.参照)。

c. ダウンロード可能なプラグインが、同じ目的を果たす事前コンパイル済みモジュールに置き換えられ、多くの新しいコマンドと新しい2つのモジュールが追加されました。
d. 組み込みのcronユーティリティとして動作するモジュールTaskSchedulerModが追加されました。cronテーブルはメモリに保存され、ネットワーク経由で受信したジョブがシェルコマンドとして実行されます。
e. システムの基本情報(インストールされたパッケージのリスト、ハードウェアの詳細など)を提供するモジュールSysInfoMgrが追加されました。

これらの類似点から、SpecterとStageClientが同じマルウェアファミリーに属するとESETは確信しています。次のセクションで述べるように、2021年2月に香港の大学に対する攻撃で使用されたStageClientの亜種と、SideWalkのWindows版の間には、コードの重複が多数あります。ESETはこの点を踏まえ、SpecterとStageClientの両方がSideWalkのLinux版であると判断し、「SideWalk Linux」と呼ぶことにしました。

Windows版との類似点

SideWalk WindowsとSideWalk Linuxには、このブログでは説明しきれないほど多くの類似点があります。このため、最も顕著なものだけを以下で取り上げます。

ChaCha20

ChaCha20暗号の実装には明らかな類似性があり、両方とも初期値が0x0Bのカウンターを使用しています。これについては、以前にもSideWalkのChaCha20実装に見られる特異性としてブログで紹介しました。

ソフトウェアのアーキテクチャ

SideWalkの特徴は、1つのタスクを実行するときに複数のスレッドを使用することです。両方の亜種で5つのスレッドが同時に実行され、各スレッドに特定のタスクが関連付けられています。以下のリストは、それぞれの関数を説明しています。スレッド名はコードに由来します。

  • StageClient::ThreadNetworkReverse
    C&Cサーバーへの接続がまだ確立されていない場合、このスレッドは定期的にローカルプロキシ構成とC&Cサーバーの場所をデッドドロップリゾルバーから取得しようと試みます。前のステップが成功した場合、C&Cサーバーへの接続を開始しようと試みます。
  • StageClient::ThreadHeartDetect
    バックドアが指定時間内にコマンドを受信しなかった場合、このスレッドはC&Cサーバーとの接続を終了するか、動作に小さな変化を導入する「nap」モードに切り替わります。
  • StageClient::ThreadPollingDriven
    送信すべきデータがキュー内に他にない場合、このスレッドはC&Cサーバーに対して、現在時刻を追加的に含むことができるハートビートコマンドを定期的に送信します。
  • StageClient::ThreadBizMsgSend
    このスレッドは、他のすべてのスレッドが使用するメッセージキューに送信するデータがあるかどうかを定期的にチェックし、ある場合はそれを処理します。
  • StageClient::ThreadBizMsgHandler
    このスレッドは、C&Cサーバーから受け取った保留中のメッセージがあるかどうかを定期的にチェックし、ある場合はそれを処理します。

構成

SideWalk Windowsと同様に、構成の復号化にはChaCha20が使用されます。

チェックサム

復号化の前に、まずデータの整合性チェックが行われます。このチェックは、SideWalkの両方の実装(図7、図8参照)で類似しており、暗号化された構成データに連結されたChaCha20 nonceに対してMD5ハッシュが計算されます。続いて、あらかじめ定義された値に対してハッシュが照合され、等しくない場合はSideWalkが終了します。

レイアウト

図9は、ESETが分析した検体から復号化した構成の抜粋です。

SideWalk Linuxの構成に含まれる情報は、SideWalk Windowsの構成よりも少なくなっています。これは、SideWalk Windowsの構成アーティファクトの大部分が暗号やネットワークパラメータとして使用されるのに対し、SideWalk Linuxではそれらがほとんど内部で構成されていることから、当然のことと言えます。

ChaCha20を用いた復号化

前述のとおり、SideWalkは構成を保存するためにメインのグローバル構造体を使用します。この構成は最初に、変更されたChaCha20の実装を使用して復号化されます(図10参照)。

ChaCha20のキーは両方の亜種で全く同じであり、2つの関連性のさらなる確証となっています。

デッドドロップリゾルバー

デッドドロップリゾルバーのペイロードは、両方の検体で同一です。図11は、SideWalkに関するブログに基づいて、デッドドロップリゾルバーから取得されるペイロードのフォーマットを示しています。

最初のデリミタでは、文字列のPublicKey:部分が無視され、文字列AE68[…]3EFFが直接検索されます(図12参照)。

デリミタはもちろん、複合化アルゴリズム全体も同一です。

標的のフィンガープリンティング(属性の収集)

標的のフィンガープリンティングのために、標的のマシン上のさまざまなアーティファクトが収集されます。ESETは、取得された情報が完全に一致し、取得の順番すらも一致していることを特定しました。

いずれの場合も、起動時間はWindowsに準拠する時間フォーマットであることから、オペレーターのコントローラーがWindowsを実行しており、またLinuxとWindowsの両方の標的についてコントローラーが同一であるという仮説が成り立ちます。SideWalkの両方の実装で使用されるChaCha20のキーが同じであることも、この仮説を裏付けるもう1つの論拠です。

通信プロトコル

データのシリアライズ

感染マシンとC&Cの間の通信プロトコルは、構成に応じてHTTPまたはHTTPSとなっています。しかし、データのシリアライズ方法は両方とも同じです。実装が非常に似ているだけでなく、両方の実装で同一の暗号化キーが使用されており、これも2つの亜種の類似性を際立たせています。

POSTリクエスト

SideWalkがC&Cサーバーからコマンドやペイロードを取得するために使用するPOSTリクエストについては、gtsidとgtuvidという2つのパラメータの使用に顕著な特徴が見られます(図13参照)。Linux版でも同じパラメータが使用されています。

さらに、Windows版が完全に保存場所に依存しないシェルコードとして実行されるのに対し、Linux版は共有ライブラリを使用していることも、興味深い点です。マルウェア作成者はシェルコードを手動で記述しましたが、その代わりに、追加的にsRDIのようなツールでコンパイル済みSideWalk PEをシェルコードに変換して済ませることも可能だったはずです。

コマンド

Linux版で実装されていない、または実装が異なるコマンドは4つだけです(表1参照)。他のコマンドはすべて存在し、IDも同じです。

 

表1.SideWalkのLinux版で実装が異なる、または実装されていないコマンド

コマンドID
(C&Cから)
Windows版Linux版
0x7CC&Cサーバーから送られたプラグインをロードします。SideWalk Linuxには実装されていません。
0x82実行中のプロセスのドメイン情報、所有者(所有者SID、アカウント名、プロセス名、ドメイン情報)を収集します。何も実行しません。
0x8Cデータのシリアライズ関数。処理されないコマンド、またはデフォルトのケース(ロードされた全モジュールにメッセージをブロードキャストする)に該当するコマンド。
0x8E受信したデータを%AllUsersProfile%\UTXP\nat\にあるファイルに書き込みます(は、マルウェアの実行ごとにVirtualAllocが返す値のハッシュ)。

バージョン

Linux版には、バージョン番号が計算されるというWindows版にない特性が見られます(図14参照)。

ハードコードされた日付は、SideWalk Linuxのこのバージョンについて開発を開始または終了した日を指す可能性があります。最終的な計算は、値Oct 26 2020の年、日、月から実行されます。この場合、結果は1171798691840です。

プラグイン

SideWalkのLinux版では、モジュールは組み込まれており、C&Cサーバーから取得することはできません。これがWindows版との顕著な違いです。ネットワーク構成などのシステム情報の収集(SysInfoMgrなど)のような一部の組み込み機能は、Windows版の専用の関数によって直接実行されます。Windows版では、一部のプラグインはC&Cとの通信により追加できます。

防衛機能の回避

SideWalkのWindows版では、コードの目的を隠すために多くの手が尽くされています。実行に不要なデータやコードはすべて切り捨てられ、残りは暗号化されています。一方、Linux版には、一部のシンボルや固有の認証キーなどのアーティファクトが暗号化されずに残っていることから、検出や分析が非常に容易になっています。

また、インライン化された関数がWindows版で圧倒的に多いことから、より高度なコンパイラ最適化によりコードがコンパイルされていることが示唆されます。

結論

2021年2月に香港の大学を攻撃したバックドアは、SideWalkバックドアと同じマルウェアファミリーであり、実際にはLinux版となります。このLinux版には、Windows版との類似点がいくつかありますが、さまざまな新しい機能も追加されています。

IOC(セキュリティ侵害の痕跡)

SHA-1ファイル名ESETの検出名説明
FA6A40D3FC5CD4D975A01E298179A0B36AA02D4Essh_tunnel1_0Linux/Agent.KUSideWalk Linux
(StageClientの亜種)
7DF0BE2774B17F672B96860D013A933E97862E6Chw_ex_watchdog.exeLinux/Specter.BSideWalk Linux
(Specterの亜種)

ネットワーク

ドメインIP最初の確認備考
rec.micosoft[.]ga172.67.8[.]592021年6月15日SideWalk C&Cサーバー
(StageClientの亜種)
 66.42.103[.]2222020年9月25日SideWalk C&Cサーバー
(360 Netlabのブログで報告されたSpecterの亜種)

MITRE ATT&CKの技術

この表は、MITRE ATT&CKフレームワークのバージョン11を使用して作成されています。

手法ID名前説明
リソース開発T1587.001開発能力:マルウェアSparklingGoblinは、独自の能力によりマルウェア攻撃を実行しています。
検出T1016システムネットワーク構成の検出SideWalk Linuxは、プロキシ構成を含む、侵害されたマシンのネットワーク構成を見つける機能を持ちます。
C&C(コマンド&コントロール)T1071.001アプリケーションレイヤープロトコル:WebプロトコルSideWalk Linuxは、HTTPS経由でC&Cサーバーと通信します。
T1573.001暗号化されたチャネル:対称暗号方式SideWalk Linuxは、通信データの暗号化にChaCha20を使用します。