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 함수에 도달합니다. 재귀 병합 또는 경로 작업이 특수 경로 요소를 잘못 처리해 내장 프로토타입의 속성을 변경하거나 삭제할 수 있습니다. 다른 코드가 이후 그 상속 속성을 읽을 수 있으며, 영향은 속성과 앱에서 도달 가능한 gadget에 따라 달라집니다. 프로토타입 오염만으로 원격 코드 실행이 입증되지는 않습니다.

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의 두 메서드에 영향을 줬으며 4.18.0에서 수정됐습니다. 이 가이드에서 확인한 최신 버전은 4.18.1입니다. 범위는 패키지별로 다르므로 lodash-es, 모듈 패키지, OS 배포본의 권고를 별도로 확인하세요.

의존성 확인 및 수정

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

직접 및 전이 복사본을 업그레이드하고 lockfile을 갱신하며 vendored 또는 bundle 복사본도 확인하세요. 요청 데이터를 deep merge나 경로 API에 직접 전달하지 말고 검증된 허용 필드로 새 객체를 만드세요. 예제는 공격자가 정하는 키와 경로를 피합니다. 2026-10-05 기준 확인된 최신 Lodash는 4.18.1이며, 이후 보안 수정은 권고를 확인하세요.

자주 묻는 질문

최신 버전의 lodash.merge()는 안전한가요?

검토한 npm lodash 권고는 관련 수정이 후속 버전에 포함됐다고 안내하며, 여기서 확인한 최신 버전은 4.18.1입니다. 최신 상태를 유지하고 설치된 모든 복사본을 확인하며 mass assignment를 일으킬 수 있는 요청 본문 전체 병합을 피하세요.

프로토타입 오염은 항상 원격 코드 실행으로 이어지나요?

아니요. 상속 속성을 변경하거나 삭제합니다. 영향은 이후 앱 코드가 무엇을 읽거나 호출하는지, 도달 가능한 gadget이 있는지에 따라 달라집니다. RCE를 단정하지 말고 확인된 영향을 설명하세요.

lodash-es와 lodash.* 패키지도 같은 버전 범위인가요?

반드시 그렇지는 않습니다. 패키지마다 영향받는 버전과 수정 버전이 다를 수 있습니다. 정확한 패키지명, lockfile, 권고를 확인하고 lodash 범위를 모든 배포본에 적용하지 마세요.

참고 자료

함께 보기 JavaScript 프로토타입 오염: 원인과 대응 Object.assign()과 Prototype Pollution: 무엇이 안전한가요? JSON.parse()가 프로토타입 오염을 일으킬까? JSON.parse()는 eval()보다 안전한가요?