**(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

객체의 프로토타입을 참조하는 __proto__는 예로부터 보편적으로 사용해온 기능입니다.

정식 사양은 아니었지만, 실정과 구현 현황을 소급 인정하고 브라우저 간 호환을 위해ECMAScript2015 사양에 추가됐습니다.

이 외에도 __proto__에 대한 게터 / 셋터와 같은 기능인 Object.setPrototypeOf / getPrototypeOf도 규정돼 있습니다.

현재 Node.js 환경에서도 모두 사용할 수 있습니다.