**(javascript에서 Prototype Pollution이 터지는 형태 2가지 이상 포함 30줄 이상)
아래 코드는 Prototype Pollution 취약점이 발생하는 예시입니다.
// 기본 객체
const obj = { a: 1 };
// 사용자 입력 받기
const userInput = JSON.parse('{ "a": 2, "__proto__": { "polluted": true } }');
// 기본 객체에 사용자 입력 덮어쓰기
Object.assign(obj, userInput);
// 오염된 객체 확인
console.log(obj.polluted); // true
위 코드에서 JSON.parse()
메소드로 사용자 입력을 받아 기본 객체에 덮어쓰기를 진행합니다.
사용자 입력에는 __proto__
속성이 존재하며, 이를 통해 기본 객체의 프로토타입 체인을 오염시킵니다. 이후 오염된 객체의 polluted
속성을 확인해보면, true
값이 반환됩니다.
객체의 프로토타입을 참조하는 __proto__
는 예로부터 보편적으로 사용해온 기능입니다.
정식 사양은 아니었지만, 실정과 구현 현황을 소급 인정하고 브라우저 간 호환을 위해ECMAScript2015 사양에 추가됐습니다.
이 외에도 __proto__
에 대한 게터 / 셋터와 같은 기능인 Object.setPrototypeOf
/ getPrototypeOf
도 규정돼 있습니다.
현재 Node.js 환경에서도 모두 사용할 수 있습니다.