脅威アクターがDiscord Webhookを悪用し、npm、PyPI、Rubyパッケージ経由でC2通信を実行

概要:オープンソースパッケージを介したDiscord Webhookの悪用

脅威アクターは、オープンソースパッケージ内に隠されたDiscord Webhookを秘密のコマンド&コントロール(C2)チャネルとして悪用する事例が増加しています。これにより、機密情報、ホストのテレメトリー、開発環境データなどを、専用のインフラを構築することなく密かに外部に持ち出すことが可能になります。

Socketの脅威調査チームは、npm、PyPI、RubyGemsといったエコシステム全体でこの種の悪用が活発に行われていることを文書化しました。ハードコードされたDiscord WebhookのURLは、HTTPS経由でデータを吸い上げる「書き込み専用のシンク」として機能します。Webhookの投稿は、広く許可されているドメインへの通常のJSONトラフィックに見えるため、多くの場合、境界フィルタリングやシグネチャベースの制御を回避します。

Discord Webhookがデータ流出経路となる仕組み

Discord Webhookは、IDとシークレットトークンを含むURLを所有するだけで、チャネルにメッセージを投稿できるHTTPSエンドポイントです。通常、正常なエンドポイントは「204 No Content」または「?wait=true」付きで「200 OK」を返します。一方、「401」「404」「429」は、それぞれ無効なトークン、削除、またはレート制限を示します。

重要な点として、WebhookのURLは書き込み専用です。防御側はURLだけでは以前のチャネル履歴を読み取ることができません。これにより、テイクダウンや事後調査が困難になり、攻撃者側の手間とコストが削減されます。

  • 書き込み専用アクセス: Webhook URLはメッセージの投稿のみを許可し、チャネル履歴の読み取りはできません。
  • 最小限の認証: IDとシークレットトークンを含むURLの所有のみが必要です。
  • 標準的なHTTP応答: ライブエンドポイントは検証のために予測可能なステータスコードを返します。
  • ステルス上の利点: トラフィックは人気のあるDiscordドメインへの正当なJSON投稿に見えます。

エコシステム全体に広がる悪意のあるパッケージ

この攻撃手法は、様々なパッケージエコシステムで確認されています。

  • npmを標的とした攻撃:mysql-dumpdiscord」は、config.json.envayarlar.jsayarlar.json(トルコ語で「設定」)などの機密性の高い設定アーティファクトを標的とし、ファイルの内容を読み込んでチャンクに分割した後、ハードコードされたDiscord WebhookにPOSTします。より単純な「nodejs.discord」は、任意の文字列を埋め込みWebhook URLに転送する薄いラッパーを実装しており、ログ記録に使用されることもありますが、インストールスクリプトや実行時に呼び出されると簡単にデータシンクとなり得ます。
  • PyPIへの侵入:malinssx」は、setuptoolsのインストールコマンドを上書きし、pip install中にサイレントにDiscord WebhookへのPOSTをトリガーし、ベトナム語で通知メッセージを送信します。「malicus」「maliinn」といった同一のパッケージが、同じアクターハンドル「sdadasda232323」によって公開され、同じWebhookを再利用していました。これは、単一パッケージのテイクダウンを回避するための自動化された、または反復的なシードの兆候です。
  • RubyGemsの悪用:sqlcommenter_rails」はさらに踏み込み、/etc/passwdの内容、/etc/resolv.confからのDNSリゾルバー、ユーザー名、ホスト名、作業ディレクトリとホームディレクトリ、パッケージメタデータ、api.ipify.org経由の公開IPなど、ホストレベルのシグナルを収集します。これらをシリアル化して、ハードコードされたDiscord Webhookにペイロード全体を送信します。エラーはすべて抑制され、ノイズの多い例外よりもサイレントな失敗が優先されます。
  • クロスプラットフォームでの永続性: 同じ脅威アクターが複数のパッケージエコシステムにわたって展開しています。

この戦術が機能する理由と対策

Discord WebhookをC2として利用するこの戦術は、サプライチェーン攻撃の経済性を根本から変えます。無料で、高速で、TLS経由で人気のあるドメインへのトラフィックに紛れ込み、URLの所有以外の認証ワークフローは不要です。インストール時のフック、postinstallスクリプト、またはRuby/Pythonのセットアップ上書きと組み合わせることで、これらのパッケージは、アプリケーションのランタイム制御やEDR検出が機能するずっと前に、開発者のラップトップやCIランナーから機密情報を外部に持ち出すことができます。同様のパターンはTelegram、Slack、GitHubのWebhookでも観察されており、「サービスとしてのコモディティC2」への広範な移行を示しており、静的なIOCの価値を低下させています。

軽減策は、行動ベースおよびエグレス制御に焦点を当てるべきです。Webhookエンドポイントを潜在的なデータ流出経路として扱い、可能な場合はDNSおよびTLS SNIフィルタリングによる許可リストを強制します。ロックファイルで依存関係を固定し、プロベナンス/SLSAアテステーションを要求し、ハードコードされたWebhook URL、アウトバウンドネットワーク呼び出し、インストール時の実行をフラグ付けするPRスキャンを通じて依存関係の更新をゲートします。パッケージの差分における機密情報へのアクセスをスキャンし、最小特権スコープで開発者資格情報をローテーションします。CIでは、ビルドおよびテストステップのアウトバウンドインターネットをデフォルトで拒否し、狭い範囲の例外を付与します。最後に、Webhookベースのデータ流出パターンが着地する前に傍受できるパッケージの評判およびマルウェア検出機能を開発ワークフローに装備します。

侵害の痕跡(IoCs)

  • T1005 Data from Local System
  • T1016 System Network Configuration Discovery
  • T1020 Automated Exfiltration
  • T1033 Account Discovery
  • T1059 Command and Scripting Interpreter
  • T1059.006 Command and Scripting Interpreter: Python
  • T1059.007 Command and Scripting Interpreter: JavaScript
  • T1071.001 Application Layer Protocol: Web Protocols
  • T1082 System Information Discovery
  • T1119 Automated Collection
  • T1195.002 Supply Chain Compromise: Compromise Software Supply Chain
  • T1552.001 Unsecured Credentials: Credentials In Files
  • T1567 Exfiltration Over Web Service

元記事: https://gbhackers.com/threat-actors-exploit-discord-webhooks-for-c2/