AsyncAPIのサプライチェーン攻撃、開発者トークンやクラウドキー、CI/CDシークレットを狙う

悪意のあるバージョンは202620262026年7月141414日に公開され、その間わずか909090分ほどで拡散しました。

影響を受けたパッケージには、@asyncapi/specsのバージョン6.11.2-alpha.1および6.11.2、@asyncapi/[email protected]、@asyncapi/[email protected]、@asyncapi/[email protected]が含まれます。

この事件が重大なのは、@asyncapi/specsが多くのAsyncAPIツールにおける推移的依存関係(トランジティブ依存)であるためです。

つまり、この悪意のあるコードは、汚染されたバージョンをインストール・インポートした開発者のシステム、CI/CDランナー、コンテナビルド、さらには本番環境のワークロードにまで及んだ可能性があります。

多くのnpmサプライチェーン攻撃とは異なり、今回のキャンペーンではpreinstallやpostinstallスクリプトは使用されていませんでした。

その代わり、マルウェアは対象モジュールがrequire()やimportでインポートされた際に実行される仕組みになっていました。そのため、npm install –ignore-scriptsを使用しても実行を防ぐことはできませんでした。

Microsoftによると、注入されたコードは隠れたNode.jsプロセスを起動し、IPFSからsync.jsという名前の第2段ペイロードをダウンロードしていたとのことです。

このペイロードは、コマンド&コントロール機能、永続化機能、分散型通信機能、認証情報窃取機能を備えたモジュール式マルウェアフレームワーク「Miasma」に関連付けられていました。

攻撃は、asyncapi/generatorリポジトリに対する悪意あるプルリクエストから始まったとされています。

攻撃者は、pull_request_targetで設定されたGitHub Actionsワークフローを悪用しました。この設定では、ベースリポジトリのセキュリティコンテキストにアクセスした状態でワークフローが実行されます。

また、このワークフローは攻撃者が制御するプルリクエストのコードをチェックアウトしており、リポジトリの認証情報やシークレットにもアクセス可能でした。この安全とは言えない組み合わせにより、攻撃者はasyncapi-botに紐づく特権トークンを取得できたとみられています。

その後、攻撃者はこのbotのアイデンティティを利用して、自動公開用ブランチに不正なコミットをプッシュしました。npmを直接侵害するのではなく、攻撃者はプロジェクトの正規のリリースワークフローを悪用して、汚染されたパッケージを公開したのです。

これらのパッケージは、npm-oidc-no-reply@github[.]comというアイデンティティを通じて、GitHubのOpenID Connect信頼済みパブリッシングによってリリースされていました。

さらに、ビルドが正規のリポジトリと認可されたGitHub Actionsワークフローから生成されていたため、有効な出所証明(プロベナンス・アテステーション)も付与されていました。

しかし、これらのリリースの起点となったソースコミット自体は不正なものでした。

この事件は、出所証明の署名がアーティファクトの「どこで」「どのように」ビルドされたかを証明するものであっても、信頼されているソースリポジトリやリリースワークフローがすでに侵害されていないことまでは独立して保証できない、という点を浮き立たせています。

悪意のあるローダーは、アプリケーション起動時に通常実行されるパッケージファイルに組み込まれていました。これは、隠れた実行設定を伴う独立したNode.js子プロセスを生成し、ハードコードされたIPFSの場所からsync.jsを取得するものでした。

Windowsでは、ペイロードは%LOCALAPPDATA%\NodeJS\sync.jsに書き込まれました。Linuxシステムでは~/.local/share/NodeJS/sync.jsが、macOSシステムでは~/Library/Application Support/NodeJS/sync.jsが使用されていました。

ダウンロードされたsync.jsファイルには、暗号化された8.28.28.2MBのMiasmaランタイムが含まれていました。有効化されていた設定では、永続化、リモートコマンド実行、ファイルのアップロード/ダウンロード、プロキシ機能、データ持ち出しがサポートされていました。

永続化の仕組みとしては、Windowsではmiasma-monitorという名前のレジストリRunキー、Linuxではmiasma-monitor.serviceという名前のsystemdユーザーサービス、macOSではシェルプロファイルの改変が使われていました。

今回分析されたビルドには認証情報を収集するモジュールも含まれていましたが、分析時点では無効化されていました。しかし、そのコードは開発者のワークステーションやビルドシステムに一般的に存在する100100100個以上の環境変数や認証情報ファイルを標的にできる能力を備えていました。

標的となり得る対象には、GITHUB_TOKEN、NPM_TOKEN、AWSアクセスキー、Azureクライアントシークレット、Google Cloudサービスアカウントの認証情報、Dockerトークン、Kubernetesの認証情報、SSH秘密鍵、.npmrcファイル、HashiCorp Vaultトークンなどが含まれていました。

このフレームワークは、ポート808080808080、808180818081、809180918091を通じて85.137.53[.]71と通信していました。さらに、IPFS、Nostr、Ethereum、BitTorrent DHT、libp2pを介したフォールバック通信もサポートしており、主要なコマンド&コントロール基盤が遮断された場合でも耐性を持つ設計になっていました。

Microsoft Defenderは関連するアーティファクトをTrojan、JS/MiasmStealer.SC、Trojan: Script/Supychain.Aとして検出しています。各組織は、ロックファイルやアーティファクトリポジトリ、ビルドキャッシュに含まれる推移的依存関係も含めて、影響を受けたバージョンを直ちに特定し、削除する必要があります。

各チームは、npmおよびYarnのキャッシュを削除し、不審なNode.jsディレクトリ内にsync.jsが存在しないかエンドポイントを調査し、検出されていないNode.jsプロセスを調べる必要があります。また、可能な限り、判明しているIPアドレスとIPFSコンテンツ識別子をブロックすべきです。

最も重要なのは、影響を受けたパッケージをインポートした開発者マシン、ビルドランナー、サービスからアクセス可能なすべての認証情報をローテーションすることです。

また、汚染されたキャッシュや永続化の仕組みが今後のビルドに拡散しないよう、既知の安全な依存関係のベースラインからコンテナ、ゴールデンイメージ、CIランナーを再構築することも不可欠です。

SOC調査の死角を減らし、ANY.RUNで脅威をより早期に封じ込めることで、対応コストと業務への影響を抑えましょう。

翻訳元: https://cyberpress.org/asyncapi-supply-chain-secrets-theft/

ソース: cyberpress.org