PythonとNode.jsでのサプライチェーン攻撃対策と修正パッチ適用手順
はじめに
最近の大規模なサプライチェーン攻撃対策として、パッケージマネージャでのminimumReleaseAge設定による対策が話題になっています。
しかし、リリース後間もないバージョンのインストールをブロックする方法までは説明されても、それを一時的に回避して緊急の修正パッチを適用する方法まで説明されている記事があまり見受けられないので、ここでまとめてみます。
Node.js (pnpm)
npmにもminimumReleaseAge機能は実装されましたが、依然としてpnpmがセキュリティ対策機能の実装は先を行っていると感じているのでpnpmを使います
minimumReleaseAge設定
早速注意点ですが、プロジェクトのpnpm-workspace.yamlにminimumReleaseAgeを設定する前に、グローバルにこの設定を入れておくべきです。
なぜなら、pnpm create viteなどのプロジェクト作成スクリプトを実行するタイミングでは、minimumReleaseAgeの設定を行う前のタイミングでパッケージのinstallが実行されてしまいかねないためです。
一応pnpm v11ではデフォルトでminimumReleaseAgeが1440分(=1日)に設定されているため、最低限の対策はされています。
しかし実際には3〜7日程度は様子見させておきたいのが実情でしょう。
そのため、少なくとも最初にプロジェクトを作成する人の環境では、グローバルにもminimumReleaseAgeは明示的に設定しておくべきです。
グローバルに設定するには以下のコマンドを実行します。
pnpm config set --location=global minimumReleaseAge 4320設定値は必要に応じて変更してください。今回は4320分(=3日)に設定しています。
プロジェクトファイル作成後は、プロジェクトディレクトリ直下で上記コマンドの--location=global部分を--location=projectに置き換えて実行し、プロジェクト側にも設定を追加します。
これによって、このプロジェクトをcloneしてきた他の開発者がpnpm installする際にもこの設定が有効になります。
修正パッチ適用
pnpm v11ではpnpm auditコマンドが改善され、minimumReleaseAgeとの連携を上手いことやってくれるようになっています。
pnpm audit --fix=update --interactive --audit-level=critical--fix=updateで、pnpm-workspace.yamlファイルにoverridesを設定することなく直接lockファイルを更新できます。
(厳密にはminimumReleaseAgeExcludeという設定がpnpm-workspace.yamlに追加されますが)
--interactiveオプションを指定することで、修正対象のパッケージを指定できるようにします。
--audit-level=criticalは指定しなくても良いですが、意味としては修正対象パッケージ一覧を重大度CRITICALのものにフィルタリングさせるものです。
なので、重大度HIGHのパッケージを修正したい場合はaudit-level=highと指定することになります。
Python (uv)
もはやPythonのパッケージマネージャはuvがデファクトスタンダードになりつつあるのと、最近やっとauditコマンドが実装されたこともあるのでuvを使います
minimumReleaseAge設定
uvではexclude-newerという機能名になっています。
こちらでも念の為、pnpmと同様にグローバルでの設定から行います。
~/.config/uv/uv.tomlに以下のように設定します。
exclude-newer = "3 days"次いで、プロジェクト内ではpyproject.tomlファイルに以下のように設定します。
[tool.uv]
exclude-newer = "3 days"修正パッチ適用
uvには2026年6月現在、まだpnpm audit --fix=update相当の便利機能は実装されていないようなので、若干面倒な手順になります。
まずpyproject.tomlファイルに、修正対象パッケージに対するexclude-newer設定を無効化するための設定を追加します。
[tool.uv]
exclude-newer-package = { hoge = false }exclude-newer-packageでパッケージごとにminimumReleaseAgeを設定できるのですが、ここにfalseを指定することで、そのパッケージに対するminimumReleaseAge設定を無効化できます。
これを設定した上で、以下のコマンドでパッケージを更新します。
uv audit --upgrade-package hoge(※ここはuv lockコマンドでも動きます)
対象パッケージの更新が一通り完了したら、pyproject.tomlファイルに一時的に設定していたexclude-newer-packageを削除して完了です。
uv auditコマンドは記事執筆時点ではまだプレビューリリース状態なのですが、将来的にはpnpmと同様にexclude-newer-packageへの追加も自動でやった上で更新してくれるようになってほしいですね
よく考えたら修正パッチ適用する瞬間にサプライチェーン攻撃を喰らうミラクル起きる可能性ゼロじゃないですね……
一時的に無効化するより、"1 hours"とか設定して作業する方が安心かも