Node.jsで作ったWebアプリや社内ツールの依存関係には、自分で入れた覚えのないパッケージが何百も入っています。10月23日から25日の3日間だけで、npmのパッケージ11個、計23件の脆弱性を当編集部は記事にしました。数が多いので、全部を更新する前に、自社に当たるものを絞る必要があります。
この記事では、11個の修正版と当たる条件を1枚の表にし、条件の種類で3つに分けました。更新できないときの回避策も載せています。
Node.jsのパッケージ11個の脆弱性23件と修正版(2026年10月25日までの掲載)作成: 編集部 / 出典: GitHub Advisory Databaseをもとに編集部が作成
11個の脆弱性と修正版
深刻度は、勧告に書かれているものだけを載せています。
| パッケージ |
起きること |
当たる条件 |
修正版 |
| body-parser |
1回の要求でアプリが停止(High) |
既定の設定。認証は不要 |
1.20.9・2.4.0 |
| multer |
1回の要求でプロセスが停止(High) |
fileFilterが非同期 |
2.5.0 |
| undici |
停止2件、fetch()の整合性検証の回避1件 |
EventSourceの利用など、件ごとに違う |
6.29.1・7.30.1・8.12.2(検証の回避は7.30.1・8.12.2) |
| fast-uri |
参照先や接続先の判定が変わる。XSSも |
normalize・parse・出力のどれを使うか |
2.4.8・3.1.9・4.2.3 |
| serialize-javascript |
XSS |
関数のソースを攻撃者が操作できる |
7.1.3 |
| DOMPurify |
無害化の後にスクリプトが残る(Critical・High・Low) |
SAFE_FOR_TEMPLATESやIN_PLACEなどの設定 |
3.4.17 |
| Fastify |
ヘッダー名の検証を回避される |
propertyNamesのenumやconstに大文字 |
5.12.6以降 |
| Nuxt |
経路ルールの回避2件、XSS、スクリプト実行 |
大小文字を区別しない設定ほか、件ごとに違う |
4.6.2(Nuxt 3に修正版なし) |
| @graphql-tools/utils |
プロトタイプ汚染(High) |
上流のサーバーを攻撃者が操作できる |
12.0.2 |
| Happy DOM |
コード実行(High) |
JavaScriptの実行を有効にして外部のHTMLを読む |
21.0.4 |
| Nodemailer |
宛先の誤読3件、DKIM署名で停止1件 |
宛先の検証や、DKIM署名を使う送信 |
各勧告が10.1.4のリリースを参照 |
Nuxtの4件は、経路ルールの回避が2件(大文字小文字とパーセント符号化)、サーバーアイランド内のuseHeadSafeのXSS、NuxtLinkからのスクリプト実行です。Nodemailerも4件で、undici・fast-uri・DOMPurifyが3件ずつ、ほかの6個が1件ずつです。Nodemailerは、DKIM署名の停止について、勧告の本文が未修正としている一方で参考リンクに10.0.10のリリースがあり、修正済みと断定できません。更新先は、勧告とリリースの内容を照らして決めます。Nuxt 3は2026年7月31日にサポートが終わっていて、経路ルールの回避に修正版は出ません。
当たる条件は3つに分かれる(編集部の整理)
同じ「脆弱性」でも、攻撃が成立する条件はパッケージごとに違います。条件の種類で分けると、先に見るパッケージが決まります。
当たる条件の3つの型と、更新できないときの回避策作成: 編集部 / 出典: GitHub Advisory Databaseをもとに編集部が整理
既定のままで当たるのは、body-parserです。経路の振り分けの前に本文を読むため、認証も当たる経路も要らず、既定の設定のアプリが対象になります。Expressの4.22.3と5.3.0は、指定の範囲に修正版が入るので、Expressを待たなくても依存を入れ直せば修正版が入ります。ただし、ロックファイルが古い版に固定されていると変わりません(body-parserの脆弱性 1回の要求でアプリが止まる恐れ)。
設定や書き方が条件なのは、multerなどです。multerのfileFilterは、中身を調べる、データベースに問い合わせるといった処理を待つ書き方が珍しくなく、その書き方がそのまま条件に当たります。同期の処理にすれば当たりません(multerの脆弱性 非同期のfileFilterで落ちる)。Happy DOMは、20.0.0から既定でJavaScriptの実行を無効にしており、設定で有効にしていなければ当たりません(Happy DOMの脆弱性 3月の修正の抜け道)。
外から入る値が条件なのは、上流のサーバーや入力のURI、宛先などを攻撃者が操作できる場合です。@graphql-tools/utilsは、上流のGraphQLサーバーが攻撃者の手に渡ったときに、プロトタイプ汚染が起きます。fast-uriは、入力のURIを許可の判定やキャッシュのキーに使っている場合に、判定がずれます。
なぜ版だけでは決められないのか
勧告の対象版は、パッケージのコードの範囲を示すものです。自社のアプリが、そのコードの危ない部分を通るかどうかは、設定と使い方で決まります。逆に、条件に当たらないからといって更新しなくてよいわけではありません。条件に当たる使い方を、後から追加する可能性があります(編集部の見立て)。
影響する会社・しない会社
- 影響する: Node.jsで社外に公開するWebアプリやAPIを動かしている会社です。body-parser、Nuxt、Fastifyは、版と設定の確認が要ります。
- 影響する: ファイルのアップロードやメールの送信、URIの解釈をアプリで行っている会社です。multer、Nodemailer、fast-uriが入っていないかを確認します。
- 影響する: 委託先が作ったNode.jsのアプリや、Node.jsで動く製品を使っている会社です。中のパッケージの版は、委託先や提供元に確認します。
- 影響しない(発表の範囲では): Node.jsのアプリを動かしていない会社です。npmのパッケージをテストや開発のツールとしてだけ使う場合は、Happy DOMのように、外部のHTMLを読まなければ当たらないものがあります。
今日の確認の手順
- ロックファイルで版を見ます。 11個のパッケージ名で検索し、実際に入っている版を一覧にします。入れた覚えのないパッケージも対象です。
- 条件に照らします。 上の3つの型で、設定と使い方が当たるかを、開発担当に確認します。
- 更新日を決めます。 当たる場合は、修正版への更新日を決めます。ロックファイルが古い版に固定されているなら、固定を外す作業も含めます。
- 更新できないときは回避策を当てます。 body-parserはinflate: false、multerはfileFilterの同期化、Nuxtはrouter.options.sensitive: trueが、勧告に書かれた回避策です。
- 委託先に問い合わせます。 委託先のアプリは、11個のうち入っているものと、更新の予定を書面で出してもらいます。
「版が対象かどうか」と「条件に当たるかどうか」を分けて確認すると、更新の順番を決めやすくなります。
委託先に出してもらう情報の例
委託先や製品の提供元には、次の4点を書面で出してもらうと、自社で条件を照らせます。
版の一覧だけが返ってきたときは、2の設定の確認を重ねて依頼します。版が対象でも設定が条件に当たらなければ、更新の優先度を下げられます。逆に、設定が当たるのに更新日が決まらない場合は、回避策を先に当てます。