3 ポイント 投稿者 GN⁺ 2025-09-20 | まだコメントはありません。 | WhatsAppで共有
  • オープンソースパッケージ @ctrl/tinycolor を含む複数の npm パッケージが悪性バージョンに感染する事件が発生し、原因は共同リポジトリの GitHub Actions ワークフローを通じた npm トークンの窃取 だった
  • 攻撃者は広範な権限を持つ npm トークンを使って約 20個のパッケージ に悪意あるコードを配布し、このうち @ctrl/tinycolor は週間ダウンロード数が 200 万回に達していたため影響が大きかった
  • 感染したバージョンは postinstall 段階で悪性ペイロードを実行し、GitHub および npm セキュリティチームが迅速に対応して削除と整理措置が行われた
  • 筆者は再発防止のため、Trusted Publishing(OIDC) への移行、トークン権限の最小化、2FA の義務化、pnpm 機能の活用など、強化されたセキュリティ計画を用意した
  • 今回の事件は ソフトウェアサプライチェーンセキュリティの脆弱性 を示しており、npm エコシステム全体でのセキュリティ機能改善とセキュリティ慣行の変化の必要性を浮き彫りにした事例である

TL;DR

  • 悪性の GitHub Actions ワークフローが共有リポジトリに push され、npm トークン が窃取された事件
  • そのトークンを使って攻撃者は 20個のパッケージの悪性バージョン を配布し、その中でも @ctrl/tinycolor はダウンロード数が多く波及効果が大きかった
  • 個人アカウントやリポジトリが直接侵害されたわけではなく、フィッシングやローカルへのマルウェア導入もなかった
  • GitHub/npm セキュリティチームの迅速な対応により悪性バージョンは削除され、その後クリーンなバージョンが再配布されてキャッシュも整理された

事件発覚の経緯 (How I Found Out)

  • 9月15日の午後、コミュニティメンバー Wes Todd が Bluesky の DM を通じて問題を知らせてくれた
  • すでに GitHub/npm セキュリティチームは影響を受けたパッケージの一覧を整理し、削除対応を開始していた
  • 初期の手がかりとして「Shai-Hulud」という悪性ブランチ名が共有され、これは Dune 世界観の サンドワーム の名称に由来する

実際に起きたこと (What Actually Happened)

  • 以前に共同作業していた angulartics2 リポジトリ に、いまも admin 権限を持つ協力者が残っていた
  • そのリポジトリに保管されていた npm トークン が悪性 GitHub Actions ワークフローによって窃取された
  • 攻撃者はこのトークンで @ctrl/tinycolor を含む約 20 個のパッケージを配布した
  • GitHub/npm セキュリティチームが素早く悪性バージョンを削除し、筆者が信頼できる新しいバージョンを再配布した

影響 (Impact)

  • 悪性バージョンをインストールすると postinstall スクリプト が実行され、セキュリティ上の脅威が生じる
  • 影響を受けたユーザーには、StepSecurity の 即時対応ガイド を参照することが推奨される

配布環境と対応計画 (Publishing Setup & Interim Plan)

  • これまでは semantic-release + GitHub Actions の組み合わせで自動配布を行っていた
  • npm の provenance 機能を活用していたが、有効なトークンを持つ攻撃者を防ぐことはできなかった
  • 今後は Trusted Publishing(OIDC) の導入により静的トークンを廃止する計画
  • 現在はすべてのトークンを失効させ、2FA の必須化、granular 権限のトークンのみ許可、pnpm の minimumReleaseAge 機能の検討など、追加のセキュリティ対策を適用している

理想的な改善案 (Publishing Wishlist)

  • npm アカウント単位で OIDC ベースの Trusted Publishing を強制するオプション の提供が必要
  • provenance が欠落している場合に配布をブロックする機能、semantic-release と OIDC の完全統合サポートが必要
  • GitHub UI で 2FA ベースの手動承認配布 機能が提供されることを希望
  • Pro サブスクリプションがなくても GitHub Environments レベルの保護機能を利用できるようにすべき
  • npm パッケージページで postinstall スクリプトの有無表示 と削除されたバージョンの理由公開が必要

まだコメントはありません。

まだコメントはありません。