JavaScript form-data の脆弱性 CVE-2025-7783 が FIX:パラメータ挿入と PoC の提供

Critical JavaScript Library Vulnerability Exposes Apps to Remote Attacks

2025/07/23 gbhackers — 人気の JavaScript パッケージである form-data に、深刻なセキュリティ脆弱性が発見された。このリモート攻撃を引き起こす脆弱性は、予測可能な境界値の生成に起因するものであり、その悪用により数千のアプリケーションに影響が及ぶ可能性がある。この脆弱性 CVE-2025-7783 (CVSS 4.0:9.4) を発見し、2025年7月18日に公開したのは、JavaScript の著名な開発者であり、TC39 仕様の編集者でもあった、Jordan Harband (ljharb) である。

脆弱性 CVE-2025-7783 の詳細

マルチパート形式のフォーム・エンコード・データ用の境界値を form-data が生成する際に、JavaScript の Math.random() 関数に依存することに、この脆弱性は起因する。

この、無害に見えるデザインの選択だが、擬似ランダムによる予測可能な値を Math.random() が生成するため、重大なセキュリティ弱点となっている。つまり、高度な攻撃者に悪用されると、HTTP リクエストへの悪意のパラメーター注入が可能になってしまう。

AttributeValue
CVE IDCVE-2025-7783
SeverityCritical
CVSS 4.0 ScoreCVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:H/VA:N/SC:H/SI:H/SA:N
CWE ClassificationCWE-330 (Use of Insufficiently Random Values)
Affected Packageform-data (npm)
Vulnerable Versions< 2.5.4, 3.0.0-3.0.3, 4.0.0-4.0.3
Patched Versions2.5.4, 3.0.4, 4.0.4
Attack VectorNetwork
Attack ComplexityHigh

この脆弱性が影響を及ぼす範囲は、form-data パッケージのバージョン 2.5.4 未満/3.0.0〜3.0.3/4.0.0〜4.0.3 となる。

これらの脆弱なバージョンを使用する組織は、パラメータ・インジェクション攻撃のリスクにさらされ、内部システムへの侵害による、機密データの漏洩の可能性を抱えることになる。

ターゲット・アプリにより生成される Math.random() の値を観察する攻撃者は、擬似乱数生成器 (PRNG:Pseudo Random Number Generator) の内部状態を、数学的な手法を用いて予測し、この脆弱性の悪用を可能にする。

PRNG の状態を特定した攻撃者は、将来におけるバウンダリ値を予測できるようになり、その値と攻撃者が制御するフィールドを取り込んだ、悪意のペイロード作成を達成する。

この攻撃シナリオには、以下の2つの条件が必要となる:

  1. 対象アプリにより生成される、Math.random() の値の観測
  2. form-data リクエスト内の、操作が可能な1つのフィールド

観測の手段として多用される可能性があるのは、分散トレーシングで用いられるリクエスト ID ヘッダーである。それらの生成においては、Math.random() が頻繁に使用される。

したがって、form-data を用いるアプリが、ユーザーが制御するデータをバックエンドに送信しながら、何らかの形で Math.random() の値を外部に漏らす場合に、この脆弱性の影響を受けることになる。

この脆弱性の悪用に成功した攻撃者は、リクエスト内への任意のパラメータ注入を達成し、意図された値の上書きや、セキュリティ制御を回避するための、悪意のデータ作成/挿入を可能にする。

この脆弱性の悪用により、ネットワーク経由での攻撃が可能になる。その結果として、機密データやシステムの完全性に重大な影響を生じることから、深刻度 Critical と評価されている。

なお、この脆弱性に対する PoC エクスプロイトが、すでにセキュリティ研究者たちにより開発されている。

それぞれのユーザー組織に推奨されるのは、現時点で使用しているバージョンに応じて、パッチ適用済みのバージョン 2.5.4/3.0.4/4.0.4 へと、速やかにアップグレードすることだ。

これらのパッチにより、Math.random() が暗号的に安全な乱数生成に置き換えられ、今回の攻撃の原因となっていた予測可能性の問題は解消している。