要約 / ポイント
NPMの攻撃ベクトルは大きく開かれている
ソフトウェアサプライチェーン攻撃は劇的にエスカレートし、開発インフラを直接標的とする高度なキャンペーンへと進化しています。脅威アクターは現在、CI/CDパイプラインに侵入するために特別に設計された「Shai-Hulud」ワームのような高度な戦術を展開しています。これらのキャンペーンは、ビルド環境を侵害し、認証情報を盗み出すことを目的としており、攻撃者に組織内での深く永続的なアクセスを許可します。
攻撃者は主に、AWS、GitHub、またはnpmのような機密トークンを抜き出すことを目的としています。これらはクラウドリソース、コードリポジトリ、ユーザーデータへの特権アクセスを許可します。彼らは、広く使用されているパッケージを乗っ取ったり、悪意のある模倣品を展開したりするなど、様々な巧妙な方法でこれを達成します。このタイポスクワッティング戦略は、開発者を騙して、正規のものと区別がつかないことが多い、侵害された依存関係をインストールさせます。
JavaScriptエコシステムの巨大な規模は、比類のない攻撃対象領域を提供し、広範な侵害にとって魅力的な標的となっています。エコシステムのデフォルトパッケージマネージャーであるnpmは、現在250万以上のパッケージをホストし、毎週数十億のダウンロードを処理しています。この計り知れない相互接続性により、単一の侵害された依存関係または悪意のあるパッケージが、世界中の無数のプロジェクトや組織に急速に感染し、壊滅的なセキュリティ侵害につながる可能性があります。
あなたの30秒のクールダウン期間
npmサプライチェーン攻撃の猛威に対する、驚くほどシンプルでありながら強力な防御策が存在します。それは、最小パッケージリリース期間の実装です。この「クールダウン期間」は、デプロイに費用がかからず、しかし重要な保護を提供する、安価で高いレバレッジを持つセキュリティ対策として機能します。これは、初期侵害の一般的なベクトルである、新しく公開されたコードの即時インストールを防ぎます。
仕組みはこうです。あなたのパッケージマネージャー(npm、pnpm、またはBunのいずれであっても)は、数分前に公開されたものではなく、あなたの年齢要件を満たす最新のパッケージバージョンを取得します。例えば、24時間の最小期間を設定した場合、あなたのビルドシステムはその日中にリリースされたパッケージを無視します。これにより、新しい、未審査のリリースに対する最も脆弱な期間を回避し、決定的な遅延が保証されます。
このシンプルな設定は、迅速な「スマッシュ・アンド・グラブ」事件に対して非常に効果的であることが証明されています。これは重要な時間的バッファを作り出し、セキュリティツール、自動スキャナー、そして警戒心の高いオープンソースコミュニティが、悪意のあるパッケージがあなたの環境に感染する前に発見し、フラグを立てることを可能にします。pnpmは、デフォルトで1日の最小リリース期間を設定しており、これは他が模倣すべき堅牢なベースラインです。
ロックダウンする:npm、pnpm、Bunのコード
最小リリース期間を実装することは、迅速で影響力のあるセキュリティアップグレードを提供します。この少ない労力での変更は、新しい悪意のあるパッケージへの露出を大幅に減らします。ここでは、人気のあるJavaScriptパッケージマネージャー全体でセットアップをロックダウンする方法を紹介します。
npmの場合、グローバルな`.npmrc`ファイルに`min-release-age`を適用します。`min-release-age=7`を設定すると、新しいパッケージをインストールする前に7日間の保留が強制され、これは脅威を検出するための重要な期間となります。この重要な保護を利用するには、npm CLIがバージョン11.10.0以降であることを確認してください。
`pnpm`は`pnpm-workspace.yaml`またはグローバル設定で`minimumReleaseAge`を構成しますが、値は分単位で指定します。7日間の遅延には`minimumReleaseAge: 10080`が必要です。特筆すべきは、`pnpm`が24時間のクールダウンという堅牢なデフォルトを設定し、プロアクティブなセキュリティをリードしている点です。詳細については、Mitigating supply chain attacks | pnpmをご覧ください。
`Bun`はエコシステムの一貫性に反し、`minimumReleaseAge`に秒単位を使用します。7日間の遅延には、`bunfig.toml`の`[install]`セクションに`minimumReleaseAge = 604800`を追加してください。`npm`、`pnpm`、`Bun`間でのこの単位の不一致は、特異ではあるものの、開発者にとって小さな摩擦点となっています。
このシンプルな設定により、インストールは確立され、検証済みのバージョンを優先し、初期段階のsupply chain attacksに対するリスクプロファイルを大幅に削減します。
これは万能薬ではありません
`minimum release age`は、日和見的な`supply chain attacks`の大部分をブロックする、強力で労力の少ない防御策を提供します。しかし、この重要な設定は、堅牢で多面的なセキュリティ戦略の中の一つの層として機能するに過ぎません。ソフトウェア`supply chain attacks`の動的な脅威の状況に対して、単一の設定が完全な解決策となることはありません。
開発者は、この防御策を他のいくつかの不可欠な実践と統合する必要があります。常にlockfiles(例:`package-lock.json`、`pnpm-lock.yaml`)をコミットして使用し、すべてのインストールが同一の依存関係ツリーを生成することを保証し、非決定的なビルドを防ぎます。決定的に重要なのは、すべての`CI/CD`パイプラインで`npm ci`を実行することです。このコマンドは、`lockfile`から直接クリーンインストールを実行し、パッケージ解決をバイパスして、正確で再現性のある依存関係のインストールを保証します。さらに、`Snyk`や`npm audit`のようなツールを使用して、既知の脆弱性についてプロジェクトの依存関係を定期的に監査し、リスクを特定して修正してください。
個々のプロジェクト設定を超えて、より広範なエコシステムレベルのセキュリティ強化が不可欠です。`GitHub`のようなプラットフォームは、必須のFIDOベースの2FAや`OpenID Connect (OIDC)`を介したtrusted publishingの採用など、開発者アカウントのセキュリティ強化を積極的に推進しています。これらの取り組みは、多くの`supply chain attacks`の主要なベクターである、侵害された開発者アカウントや盗まれた認証情報に直接対処します。ソースでの不正なパッケージアップロードを防ぐことで、これらの進歩はオープンソースエコシステム全体のセキュリティ態勢を大幅に向上させます。
よくある質問
`npm`パッケージの`minimum release age`とは何ですか?
これは、パッケージマネージャーが設定された期間(例:7日間)に新しいパッケージバージョンをインストールするのを防ぎ、最近公開された悪意のあるコードを回避するためのセキュリティ設定です。
パッケージのインストールを遅らせることが良いセキュリティ対策となるのはなぜですか?
ほとんどの悪意のあるパッケージは、数時間から数日以内に発見され、レジストリから削除されます。遅延、つまり「クールダウン期間」を設けることで、この重要な高リスク期間中にそれらをインストールしないようにします。
すべての主要なパッケージマネージャーがこの機能をサポートしていますか?
はい。`npm`は`min-release-age`(日数)を使用し、`pnpm`は`minimumReleaseAge`(分)を使用し、`Bun`は`minimumReleaseAge`(秒)を使用し、`Yarn`は`npmMinimalAgeGate`を使用します。
設定するのに良い`release age`はどれくらいですか?
控えめなアプローチとしては7日間が一般的な推奨です。`pnpm`は現在24時間をデフォルトとしており、これはほとんどの「スマッシュ・アンド・グラブ」攻撃を防ぐための強力なベースラインでもあります。