FlawOpen

flawopen.com/プロトタイプ汚染/lodash.merge()

lodash.merge()はプロトタイプ汚染に安全ですか?

CWE-1321: Prototype Pollutionリファレンスガイド
Short answer

深いマージを、他人の書類棚のラベルをアプリの基幹記録へコピーする作業だと考えてください。古いLodashでは、特殊なプロパティ名を共有プロトタイプ状態へ進む指示として扱う経路がありました。新しい修正は既知の経路を遮断しますが、リクエストの全フィールドをコピーするとMass Assignmentのリスクが残ります。受け入れるフィールドを検証してください。

脆弱 — 影響を受けるLodashバージョン
const _ = require("lodash");

const settings = {};
const input = request.body;

_.merge(settings, input);
_.set(settings, request.query.path, request.query.value);
修正 — 更新して既知の形を構築
const allowedLocales = new Set(["en", "fr"]);
const input = request.body;

const settings = {
  theme: input.theme === "dark" ? "dark" : "light",
  locale: allowedLocales.has(input.locale)
    ? input.locale
    : "en",
};

脆弱性の経路

影響を受けるバージョンでは、信頼できないJSONや呼び出し側が制御するパスが脆弱なLodash関数に届きます。再帰マージやパス操作が特殊なパス要素を誤処理し、組み込みプロトタイプのプロパティを変更または削除します。その後、別のコードが継承プロパティを読む可能性があります。影響は対象プロパティと、アプリ内で到達できるガジェットによって異なります。プロトタイプ汚染だけでRCEが証明されるわけではありません。

npm lodashのアドバイザリは対象範囲が異なります。CVE-2018-16487は4.17.11未満のdefaultsDeep、merge、mergeWith、CVE-2019-10744は4.17.12未満のdefaultsDeep、CVE-2020-8203は4.17.19未満のpick、set、setWith、update、updateWith、zipObjectDeepが対象です。CVE-2025-13465は4.17.22までのunsetとomitに影響し、4.17.23で修正。続くCVE-2026-2950は4.17.23の同じ2関数に影響し、4.18.0で修正されました。本ガイドで直近に確認した最新版は4.18.1です。これらの範囲はパッケージごとに異なるため、lodash-es、モジュール版、OS配布版のアドバイザリも個別に確認してください。

依存関係の確認と修正

npm install lodash@^4.18.1 npm ls lodash npm audit npm explain lodash

直接・推移依存を更新し、lockfileを保存して、vendor化またはbundle化されたコピーも確認します。リクエストデータを深いマージやパスAPIへ直接渡さず、検証済みの許可フィールドから新しいオブジェクトを作成してください。この例では攻撃者指定のキーやパスを使いません。2026-10-05時点でLodashの最新版は4.18.1です。以降の修正もアドバイザリで確認してください。

よくある質問

最新版のlodash.merge()は安全ですか?

確認したnpm lodashのアドバイザリでは、関連修正は後続バージョンに含まれます。本ガイドで確認した最新版は4.18.1です。更新を保ち、インストール済みの全コピーを確認し、Mass Assignmentを招くリクエスト全体のマージを避けてください。

プロトタイプ汚染は必ずRCEにつながりますか?

いいえ。継承プロパティを変更または削除します。影響は後続コードが何を読み出し、呼び出すか、到達可能なガジェットがあるかによります。RCEを前提にせず、確認できた影響を説明してください。

lodash-esやlodash.*にも同じバージョン範囲が適用されますか?

必ずしもそうではありません。パッケージごとに影響範囲と修正版が異なる場合があります。正確なパッケージ名、lockfile、アドバイザリを確認し、lodashの範囲を他の配布物へ流用しないでください。

参考資料

関連項目 JavaScriptのプロトタイプ汚染:原因と対策 Object.assign() と Prototype Pollution:何が安全? JSON.parse() はプロトタイプ汚染を起こす? JSON.parse()はeval()より安全ですか?