HANGUL.WIKI

웹 애플리케이션 보안과 프로토타입 오염 취약점

Web Application Security: Prototype Pollution and Jailbreak Vulnerabilities

금융·건강·법률 등 민감 주제입니다. 중요한 결정 전 전문가 확인을 권장합니다. 고지·면책 안내
2026-07-12
목차 (0개 섹션)

2018년 11월, npm 패키지 매니저 생태계에 조용한 파장이 일었다. 보안 연구자들이 lodash와 jQuery를 비롯한 인기 라이브러리 수십 개에서 동일한 계열의 결함을 잇달아 찾아냈기 때문이다. 이름하여 "프로토타입 오염(Prototype Pollution)". 겉보기엔 사소한 객체 병합 버그처럼 보였지만, 실제로는 자바스크립트 언어 설계 그 자체의 특성을 파고든 취약점이었다.

자바스크립트의 모든 객체는 Object.prototype이라는 공용 원형을 상속받는다. {}로 새 객체를 만들어도, 그 객체는 보이지 않는 실에 묶여 Object.prototype과 연결돼 있다. 문제는 __proto__라는 특수 키를 통해 이 원형에 직접 접근할 수 있다는 데 있다. 공격자가 사용자 입력값을 재귀적으로 병합하는 함수(merge, extend, clone 등)에 {"__proto__": {"isAdmin": true}} 같은 JSON을 밀어넣으면, 병합 로직이 이를 그대로 처리하면서 전역 원형 객체에 isAdmin 속성을 심어버린다. 그 순간부터 애플리케이션 내 모든 객체는 별도의 선언 없이도 isAdmin: true를 상속받게 된다.

파급력은 여기서 끝나지 않는다. 2019년 카네기멜론대 CERT/CC와 스노크(Snyk)가 공동 발표한 분석에 따르면, 단순 권한 상승을 넘어 서비스 거부(DoS), 심하게는 원격 코드 실행(RCE)으로까지 이어질 수 있었다. 특히 Node.js 서버 환경에서 child_process나 템플릿 엔진(예: 오래된 버전의 handlebars, pug)과 결합될 경우, 오염된 원형 속성이 명령어 실행 경로에 개입해 임의 코드가 실행되는 사례가 실제 CVE로 다수 등록됐다. lodash는 CVE-2018-3721, CVE-2019-10744 두 차례에 걸쳐 이 문제로 패치를 냈고, 당시 주간 다운로드 2천만 건이 넘는 패키지였던 만큼 영향 범위는 사실상 전체 npm 생태계에 가까웠다.

방어책을 두고도 개발자 커뮤니티 내에서 논쟁이 있었다. 일각에서는 Object.freeze(Object.prototype)로 원형 자체를 동결하는 방법을 제시했지만, 이는 프레임워크 내부 동작을 깨뜨리는 부작용이 보고되며 실무 도입이 제한적이었다. 결국 업계 표준으로 자리잡은 대응은 Object.create(null)로 원형이 없는 객체를 만들거나, Map 자료구조로 사용자 입력을 다루는 방식, 그리고 병합 함수 내부에서 __proto__, constructor, prototype 키를 명시적으로 차단하는 방식이다. OWASP는 2021년판 Top 10 개정 논의에서 이 취약점을 "인젝션" 범주의 하위 사례로 편입하는 안을 검토하기도 했다. 정적 분석 도구만으로는 탐지가 까다로워, 실전에서는 코드 리뷰와 의존성 스캔(예: npm audit, Snyk)을 병행하는 것이 일반적인 관행으로 굳어졌다.

문서 정보

최초 작성
최종 갱신
분류
기술

HANGUL.WIKI가 정리·작성한 문서입니다. 정확성을 위해 노력하나 오류가 있을 수 있으므로, 중요한 내용은 공식 출처를 통해 확인하시기 바랍니다. 내용의 오류나 정정 요청은 오류·정정 신고로 알려주시면 검토 후 반영합니다.