メインコンテンツへスキップ
見出し画像

npmのbody-parser・multer・undici・happy-domにHighの脆弱性。npm lsとnpm auditで確かめる

    npm の4つのパッケージ、body-parser・multer・undici・happy-dom に、脆弱性の勧告が出た。
    GitHub Advisory Database での公開は 10/24(日本時間)。
    4つのパッケージそれぞれに、重大度 High が1件ある。

    Express を使っているなら、package.json に書いていなくても、Express の中に body-parser が入っている。
    自分のプロジェクトに入っているかどうかは、`npm ls` と `npm audit` の2つで確かめられる。

    この記事は、2026-10-25 12:47(日本時間)に取得した勧告6件のデータと、同じ日に使い捨てのプロジェクトで出た `npm ls`・`npm audit` の実出力をもとにしている。
    勧告は後から書き換わることがあるので、出典を開き直してほしい。

    何が起きたか

    GitHub の公開時刻は 2026-10-23 20:53〜22:14(UTC)で、日本時間では 10/24 05:53〜07:14 になる。
    GitHub Advisory Database の公式の勧告によると、影響を受ける版と修正版は次のとおりだ。

    画像
    4つのパッケージの修正版の番号

    body-parser

    • 勧告: GHSA-27r3-jxmh-p828(CVE-2026-111181)、High 7.5

    • 影響を受ける版: `< 1.20.9`、`>= 2.0.0, < 2.4.0`

    • 修正版: 1.20.9 / 2.4.0

    multer

    • 勧告: GHSA-q7qp-rjg7-q26m(CVE-2026-113872)、High 7.5

    • 影響を受ける版: `>= 2.0.0, < 2.5.0`

    • 修正版: 2.5.0

    undici(同じ日に3件)

    • GHSA-xjj6-f33q-929c(CVE-2026-109869)、High 7.5。影響を受ける版: `>= 6.23.0, < 6.29.1`、`>= 7.18.0, < 7.30.1`、`>= 8.0.0, < 8.12.2`

    • GHSA-4qv8-2p9j-2685(CVE-2026-109924)、Medium 5.9。影響を受ける版: `>= 6.5.0, < 6.29.1`、`>= 7.0.0, < 7.30.1`、`>= 8.0.0, < 8.12.2`

    • GHSA-f72v-6w45-q472(CVE-2026-109841)、Medium 5.9。影響を受ける版: `>= 7.15.0, < 7.30.1`、`>= 8.0.0, < 8.12.2`

    • 修正版: 6.29.1 / 7.30.1 / 8.12.2(3件とも、系列ごとの修正版の番号は同じ)

    happy-dom

    • 勧告: GHSA-834v-8h66-3h79(CVE-2026-115895)、High 8.8

    • 影響を受ける版: `>= 17.0.0, <= 21.0.3`

    • 修正版: 21.0.4

    happy-dom の範囲は、勧告の本文とデータで食い違っている。
    本文の "Suggested affected range" は `>= 17.0.0, <= 20.14.5` で、修正版は "No patched version is currently available." となっている。
    この記事では、勧告のデータと npm audit の表示に合わせて、範囲を 17.0.0〜21.0.3、修正版を 21.0.4 とした。

    自分に関係あるか

    npm でこれらのパッケージを入れている人が対象だ。勧告の「Impact」などに書いてある条件を、短くまとめる。
    攻撃に使う入力の例や、勧告の本文にある PoC は書かない。

    body-parser

    既定の設定のまま当たる。
    `Content-Encoding`(gzip など)付きの、圧縮されたリクエストを処理するところで起き、捕まえられない例外でプロセスが終わる。
    勧告によると、解析はルーティングより前に走るので、認証もルートの一致も要らない。

    圧縮されたリクエストを受ける必要がないなら、勧告は回避策として `inflate: false` を挙げている。

    multer

    非同期の fileFilter を使っているときだけ当たる。
    勧告によると、1つのリクエストでプロセスが終わりうる。
    同期の fileFilter なら当たらない。回避策は、fileFilter を同期にすることだ。

    undici

    • High の件: `fetch()` の相手のサーバーが悪意を持っていると、1つの応答でプロセスが落ちる。アプリが `fetch()` の reject を catch していても落ちる。回避策は「None」と書いてある

    • Medium の1件目(4qv8): `EventSource` で信頼できない相手とつなぎ続けると、メモリを使い切ってプロセスが終わりうる

    • Medium の2件目(f72v): Subresource Integrity(SRI)の検査で、アルゴリズム名が小文字でないと検査が飛ばされる。7.15.0 で入った不具合で、7.14.0 以前は当たらない

    happy-dom

    `enableJavaScriptEvaluation: true` にしていて、外から渡された HTML やモジュールのソースを処理するときに当たる。
    勧告は、SSR、プレビュー、スクレイピング、テストのサービスで、外から渡された HTML を評価する場合を挙げている。

    自分で書いた固定の HTML だけをテストで使う場合については、勧告に書いていない。
    なので、ここでも「当たらない」とは書かない。

    やること

    まず npm ls を打つ

    プロジェクトのフォルダで、次の1行を打つ。

    npm ls body-parser multer undici happy-dom

    npm の公式ドキュメントによると、`npm ls` は入っているパッケージの版を木の形で出す。
    名前を付けると、ほかのパッケージの中に入ったものも、道筋つきで出る。

    Express 4.21.2 だけを入れたプロジェクトでは、`express@4.21.2` の下に `body-parser@1.20.3` が出た(2026-10-25 12:48 日本時間の実出力)。
    この 1.20.3 は、修正版の 1.20.9 より小さい。

    次に npm audit を打つ

    npm audit

    npm の公式ドキュメントによると、`npm audit` はプロジェクトの依存をレジストリに送り、知られている脆弱性の報告を受け取る。

    ここで1つ、気をつけたいことがある。
    npm audit は、パッケージごとに1行にまとめて重大度を出す。
    undici だけを入れたプロジェクトでは、`Severity: high` の1行の下に勧告が3件並び、まとめの行も「1 high severity vulnerability」だけだった。

    画像
    npm audit の undici の行と、jq で取り出した1件ごとの重大度(実出力の抜粋)

    1件ごとの重大度は、`npm audit --json` の出力を jq で取り出すと見える。high は xjj6 の1件で、4qv8 と f72v の2件は moderate(Medium の npm での表記)だった。
    high が1つに見えても、undici の中には3件入っている。

    直接入れているパッケージは、修正版の番号に上げる

    `npm ls` で直接の依存として出たものは、修正版の番号を指定して上げる。元の記事のプロジェクトでは、こう上げて、最後の `npm audit` が `found 0 vulnerabilities` になった(実出力の抜粋)。

    $ npm install multer@2.5.0 undici@7.30.1
    $ npm install -D happy-dom@21.0.4
    $ npm audit
    found 0 vulnerabilities

    undici は系列ごとに修正版が違う。6.x なら 6.29.1、7.x なら 7.30.1、8.x なら 8.12.2 以上にする。

    Express の中の body-parser は、Express を上げる

    Express 4.21.2 は、body-parser を `1.20.3` に固定している。
    固定されているなら、Express を上げないと body-parser は変わらない。

    Express 4.21.2 のプロジェクトで 4.22.3 に上げると、body-parser は 1.20.9 になり、`npm audit` は `found 0 vulnerabilities` になった(実出力)。
    Express 5.3.0 を新しく入れたプロジェクトでは、body-parser は 2.4.0 で入った。

    Express の指定に幅があっても、package-lock.json が古い番号を持っていれば、その番号のまま入る。
    その場合は `npm update body-parser` で、指定の範囲の中で新しい版に上がる。
    元の記事では、Express 4.22.1 のプロジェクトで 1.20.3 から 1.20.9 に上がった。

    上げたら

    もう一度 `npm ls` と `npm audit` を打つ。lockfile が変わったら、その変更もコミットに入れる。

    `npm audit --omit=dev` にすると、devDependencies(テスト用の happy-dom など)が外れて見える。
    ただ、外して見えなくなっただけで、当たらないことにはならない。
    happy-dom をテストで使っているなら、上の条件を見て決める。

    攻撃の状況

    取得した勧告6件の本文に、実際に攻撃に使われたという記載はない。

    まとめ

    • body-parser・multer・undici・happy-dom に、それぞれ High の勧告が出た。undici は同じ日に3件

    • `npm ls` で入っている番号を見る。Express の中の body-parser も出る

    • `npm audit` の high が1つでも、undici の中には3件入っている

    • 修正版の番号を指定して上げる。Express の中の body-parser は、Express を上げる

    出典

    GitHub Advisory Database(body-parser): https://github.com/advisories/GHSA-27r3-jxmh-p828
    GitHub Advisory Database(multer): https://github.com/advisories/GHSA-q7qp-rjg7-q26m
    GitHub Advisory Database(undici、High): https://github.com/advisories/GHSA-xjj6-f33q-929c
    GitHub Advisory Database(undici、Medium): https://github.com/advisories/GHSA-4qv8-2p9j-2685 / https://github.com/advisories/GHSA-f72v-6w45-q472
    GitHub Advisory Database(happy-dom): https://github.com/advisories/GHSA-834v-8h66-3h79
    npm Docs「npm ls」: https://docs.npmjs.com/cli/v11/commands/npm-ls
    npm Docs「npm audit」: https://docs.npmjs.com/cli/v11/commands/npm-audit
    npm Docs「npm update」: https://docs.npmjs.com/cli/v11/commands/npm-update

     
     
    勝文のAI現場のノートです。 大手SIer -> 自社開発 -> フリーランスを経てAIエンジニアとして、働いてきました。 現場での知見や日々で得た情報を発信していきます。 詳しい型・記事は Zenn へ。 https://zenn.dev/masafumi_ai

    あなたへのおすすめ