flawopen.com/プロトタイプ汚染/lodash.merge()
lodash.merge()はプロトタイプ汚染に安全ですか?
深いマージを、他人の書類棚のラベルをアプリの基幹記録へコピーする作業だと考えてください。古いLodashでは、特殊なプロパティ名を共有プロトタイプ状態へ進む指示として扱う経路がありました。新しい修正は既知の経路を遮断しますが、リクエストの全フィールドをコピーするとMass Assignmentのリスクが残ります。受け入れるフィールドを検証してください。
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です。以降の修正もアドバイザリで確認してください。
よくある質問
確認したnpm lodashのアドバイザリでは、関連修正は後続バージョンに含まれます。本ガイドで確認した最新版は4.18.1です。更新を保ち、インストール済みの全コピーを確認し、Mass Assignmentを招くリクエスト全体のマージを避けてください。
いいえ。継承プロパティを変更または削除します。影響は後続コードが何を読み出し、呼び出すか、到達可能なガジェットがあるかによります。RCEを前提にせず、確認できた影響を説明してください。
必ずしもそうではありません。パッケージごとに影響範囲と修正版が異なる場合があります。正確なパッケージ名、lockfile、アドバイザリを確認し、lodashの範囲を他の配布物へ流用しないでください。