fix-node-vuln について
fix-node-vulnは、2026年10月21日のセキュリティリリースの影響を受けるNode.jsランタイムを調査し、承認済みリポジトリを修正するエージェント向けスキルです。読み取り専用の調査、編集前の承認、成果物での検証、個別のPR作成を重視します。
主な機能
- 01読み取り専用のリポジトリ調査
- 02ランタイムの修正済み・脆弱・EOL・不明の分類
- 03承認済みリポジトリを確認済みの版へ更新
- 04ビルド成果物のテストと検証
- 05リポジトリ別のPRと展開メモの作成
活用シーン
- 01アプリやインフラのリポジトリから脆弱なNode.js版を特定
- 02イメージの種類と固定方式を保ち承認済みランタイムを更新
- 03承認されたメジャーアップグレードの互換性リスクを評価
- 04展開前にランタイム修正を検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ cognitionai/ devin-vuln-fixes --skill fix-node-vulnインストール後、Claude Code で/fix-node-vulnを入力して読み込まれたか確認します。
詳細
Node.js の脆弱性を修正する(2026 年 10 月 21 日のセキュリティリリース、CVE-2026-111497 を含む)
概要
2026 年 10 月 21 日のセキュリティリリースで修正された 10 件の CVE の影響を受ける Node.js ランタイムを特定し、修正します。うち 4 件は深刻度が高く、Brotli デコーダーの境界外書き込みによる RCE(CVE-2026-111497)と、TLS/DNS のホスト名に関する 3 件の問題(CVE-2026-105482、-105483、-106069)が含まれます。修正済みリリースは 22.23.4、24.22.1、26.12.1 です。Node 20 以前はサポート終了となっており、修正は提供されないため、メジャーバージョンのアップグレードが必要です。まず読み取り専用でインベントリを作成します。編集する前に承認を待ちます。承認された各リポジトリにパッチを適用し、ビルド済みアーティファクトを検証して、対象を絞った PR を作成します。
ユーザーに必要な情報
- スキャンするリポジトリまたは組織。デフォルトでは、ユーザーが指定したリポジトリ、またはエージェントがアクセスできるすべてのリポジトリが対象です。
- 検出されたリポジトリのうち、パッチを適用するものの承認と、サポート終了済みメジャーバージョンのアップグレードを対象に含めるかどうか。
- 対象の検証とビルドの実行に必要な、レジストリおよび CI へのアクセス。
手順
- クローンする前に、Git ホストのコード検索を使って、アクセス可能なすべてのリポジトリを読み取り専用で検索します(検索機能がない場合(GitHub Enterprise Server やセルフマネージドの GitLab ではよくあります)は、浅いクローンを作成し、
rg -n --hidden --glob '!.git'を実行します。バージョンファイルはドットファイルであるためです)。次を確認します。- マルチステージビルドを含む、
node:などの Node ベースイメージ。 .nvmrc、.node-version、.tool-versions、Volta の設定、actions/setup-node/CI イメージ。- NodeSource または OS の
nodejsパッケージ。 - Serverless のランタイム設定(Lambda の
nodejs22.x、Cloud Functions、Azure Functions)。 - Node をインストールする Helm/Terraform/Ansible のコード。
- シグナルとしての
engines.node。 - 対象メジャーバージョンで既知の問題が起きるコード(例:import assertions
assert {、binding.gyp/node-gypによるネイティブアドオン、削除された API)と、アップグレードのリスクをゲートで示せるよう、リポジトリのテストコマンド。
- マルチステージビルドを含む、
- 1 つのインベントリ表を作成します。列は、リポジトリ、ファイル:行、シグナル、現在のバージョン、チャネル、固定/フローティング/ダイジェストによるピン留め、本番用かビルド/CI 専用か、判別可能な場合はインターネットへの公開状況、テストカバレッジ(なし、薄い、テストスイート)、確信度です。検索できなかったリポジトリは別に列挙します。
- 各項目を固定済み、脆弱、EOL、または不明に分類します。ディストリビューションのパッケージとマネージドランタイムについては、上流のバージョン文字列との比較ではなく、ベンダーのパッケージ変更履歴またはアドバイザリを確認します。
- ここで停止します。表を提示し、どのリポジトリを修正するかユーザーに確認します。メジャーアップグレードで想定されるアプリコードの変更点を列挙し、事前にユーザーの承認を得ます。調査中は何も変更しません。
- 承認されたリポジトリを、1 つずつ作業します。エージェントがサブエージェントに対応している場合は、リポジトリごとに 1 つ割り当て、同時に最大 5 つまで実行します。編集前に、そのリポジトリのインベントリを再確認します。
- 各リポジトリについて、パスごとに修正済みの最小のターゲットを選び、編集前にそのターゲットが存在することを確認します。公開ホストにアクセスできない場合は、リポジトリの CI で既に使用しているレジストリまたはパッケージミラー(Artifactory、Nexus、Harbor、またはクラウドレジストリ)で確認します。どちらにもアクセスできない場合は、PR でターゲットを未検証と明記し、CI ビルドで確認します。
- 固定されたイメージタグ:バリアント(
-alpine、-slim、-bookwormなど)を維持し、同じメジャーバージョンの修正済みパッチバージョンに更新します。 - ダイジェストによるピン留め:新しいダイジェストを解決してピン留めします。
- サポート対象のメジャーバージョン内でのフローティングタグ:タグはそのままにします。
--pull --no-cacheで再ビルドして再デプロイすることを必須とし、新しいダイジェストを記録します。承認済みのメジャーアップグレードでは、リポジトリのピン留め方式を維持します(フローティングはフローティングのまま、固定は固定のまま)。 - 新しいイメージはすべて、固定タグも含めてマルチアーキテクチャのインデックスダイジェストを記録します。OS レイヤーは引き続き変化するためです。
- バージョンファイル:修正済みパッチバージョンを設定し、バージョンを指定するすべてのファイルで一貫させます。
- フローティングバージョン(
22、lts/*)を指定した CI のsetup-node:check-latest: trueを追加するか、修正済みパッチバージョンにピン留めします。そうしないと、ランナーにキャッシュされた古い Node が使われます。 - マネージド Serverless ランタイム(例:Lambda の
nodejs22.x):プロバイダーは正確なパッチバージョンを公開しないため、プロバイダーの公開ベースイメージ(例:public.ecr.aws/lambda/nodejs:22)を確認するか、関数からprocess.versionをログに出力します。Lambda の Auto runtime-update モードでは、AWS がインプレースで更新するため、再デプロイは更新を早めるだけです。Function update モードまたは Manual モードでは、再デプロイまたはランタイムバージョンの変更が必要です。
- 固定されたイメージタグ:バリアント(
engines.nodeは、新しいバージョンを除外する場合(例:20 から 22 へのアップグレードで20.xを指定しており、npm ciがEBADENGINEの警告を出す場合)を除き、変更しないでください。これは何もインストールしません。- Node 20 以前は別に報告し、22 または 24 LTS へのアップグレード経路を示します。メジャーアップグレードはユーザーの承認を得た場合にのみ実施し、その後、手順 9 のメジャーアップグレード向けチェックを適用します。
- 変更前後に回帰テストを実施します。
- ベースライン:編集前に、
--pullを指定して現在のイメージをビルドし、そのダイジェストを記録します(これがロールバック先です)。イメージ内でnpm ci/pnpm install --frozen-lockfile/yarn install --immutable、ビルドスクリプト(ある場合)、テストを実行します。結果を記録し、既存の失敗がアップグレードのせいにされないようにします。 - 変更後:ホスト上ではなく、新しい本番イメージ内でインストール、ビルド、テストを繰り返します。そのイメージにテストや開発用依存関係が含まれていない場合(マルチステージ、
--omit=dev)、同じベースからテスト/ビルダーステージをビルドするか、テストを本番イメージにマウントします。新たな失敗や非推奨警告を回帰として扱います。 - ランタイムを比較します。
node -p process.versions(V8、OpenSSL、ICU など)と、旧イメージと新イメージのベース OS の差分を確認します。外部への TLS 呼び出し(https、fetch、tls.connect)を行うサービスでは、eMudhra CA の削除と、より厳格な OpenSSL のデフォルト設定に留意します。 - スモークテスト:本番コマンドでコンテナーを起動し、ヘルスチェック用またはメインのルートにリクエストを送信して、ログにクラッシュや警告がないか確認します。
- メジャーアップグレード(例:20 から 22)では、
NODE_OPTIONS=--pending-deprecationを設定したテストの実行、ソースからのネイティブアドオンの再ビルド(npm rebuild)、該当するリリースノートの破壊的変更の列挙(例:Node 22 では import assertionsassert { type: 'json' }が削除され、withに置き換わりました)も行います。 - 各ステップの出力をログ(ベースライン、変更後、ランタイム差分、スモークテスト)として保存し、PR に添付します。
- リポジトリにテストがない場合、またはテストがわずかしかない場合は、その旨を目立つように記載し、最小限のスモークテストまたは特性テストを提案します(承認なしにコミットはしません)。
- ビルド済みの本番イメージまたはランタイム内で
node -vを確認します。 - 回帰が発生した場合は、上記の読み取り専用チェックを完了してから停止し、失敗時の出力とスクラッチコピーで検証済みの最小限の修正案を報告します。ユーザーが判断するまで、バージョン変更はコミットせずに残します。承認なしにアプリコードを変更しません。
- ベースライン:編集前に、
- リポジトリごとに、変更前後の各パス、ダイジェスト、再ビルドが必要なフローティングタグ、ブロックされた項目、EOL 項目、変更前後のテスト結果、ランタイム差分、検証の証拠を記載した、焦点を絞った PR を 1 件作成します。リスクを分類します。同じベースでのパッチ更新は低、メジャーアップグレード、ベース OS の変更、または未テストのリポジトリは高です。テストカバレッジが薄い場合はその旨を記載します。フローティングタグについては、今日時点のダイジェストを提示します。ステージングまたはカナリアを先に実施し、その後ロールバック先となる以前のイメージダイジェスト/バージョンに戻すロールアウト計画を含めます。ロールバック先にも脆弱性があるため、ロールバックは短期間に限ります。
- リポジトリごとの結果を 1 つの表にまとめます。列は、リポジトリ、PR、パス、変更前 → 変更後、本番用か CI 専用か、テスト、ブロックされた項目、フォローアップです。修正はデプロイ後にのみ有効になることをユーザーに伝えます。
仕様
- 調査は読み取り専用で行い、明示的な承認ゲートで終了します。
- 編集前に、対象がすべて存在することを確認します。
- 各 PR には、ビルド済みの本番アーティファクトから取得した
node -vの証拠を含めます。CI 専用のパス、バージョンファイル、管理対象のランタイムについては、入手可能な最善の証拠(インストーラーまたはベースイメージで解決されたバージョン)を提示し、マージ後にユーザーが実行する必要のあるチェックを明記します。 - 完了とは、承認されたデプロイがすべて修正済みと確認されるか、具体的な次の手順を添えてブロック中と報告されている状態です。
アドバイスと参考情報
- Brotli を展開するインターネット向けサービス(HTTP クライアント/サーバー、プロキシ、
zlib.createBrotliDecompress)を優先します。また、ユーザー指定のホストに接続する TLS クライアントも優先します。 - このリリースでは、同梱の c-ares、OpenSSL(22/24)、SQLite(22)、Undici、CA 証明書(eMudhra の削除)も更新されます。
- Electron アプリ、ベンダーイメージ、アプライアンスには独自の Node が同梱されています。ベンダーによる更新が必要なものとして挙げてください。
- CI 専用の Node は本番ランタイムより優先度が低いものの、低コストで対応できる場合は同じ PR で修正してください。
禁止事項
- ユーザーがリポジトリを承認する前に編集しないでください。
- イメージタグ、ダイジェスト、パッケージバージョンを推測しないでください。
- 明示的な承認なしに Node のメジャーバージョンをアップグレードしないでください。
- 事前に伝えることなく、ベースディストリビューションやイメージの種類を変更しないでください。
コメント
Markdown 対応