본문 바로가기
tmp

Prototype Pollution

by m_.9m 2023. 2. 8.

 

 

1. 프로토 타입

Java, C 와같은 클래스 기반 객체 지향 프로그래밍 언어와 달리 자바스크립트는 프로토타입 기반 객체 지향 언어이다. 클래스 기반 객체 지향 프로그래밍 언어는 객체 생성 이전에 클래스를 정의하고 객체를 생성하지만 프로토타입 기반 객체지향 프로그래밍 언어는 클래스 없이 객체를 생성한다.

 

자바스크립트의 모든 객체는 부모 객체와 연결되어 상속되는데 이런 부모 객체를 프로토타입이라고 한다. 모든 객체들이 메소드와 속성들을 상속 받기 위한 템플릿으로써 프로토타입 객체를 가진다. 최소 하나 이상의 다른 객체로부터 상속을 받는다. 프로토타입 객체도 또 다시 상위 프로토 타입 객체로부터 메소드와 속성을 상속받을 수 있는데 이를 프로토타입 체인이라고 한다.

 

상속되는 메소드들은 객체 생성자의 prototype이라는 속성에 정의되어 있다. 객체 인스턴스와 프로토타입과의 연결을 따라 타고 올라가며 속성과 메소드를 탐색한다. new 연산자를 사용해 생성한 객체는 생성자의 프로토타입을 자신의 프로토타입으로 상속받는다.

var obj = new Object(); // 이 객체의 프로토타입은 Object.prototype입니다.
var arr = new Array();  // 이 객체의 프로토타입은 Array.prototype입니다.
var date = new Date();  // 이 객체의 프로토타입은 Date.prototype입니다.

 

또한 Object.prototype는 어떠한 프로토타입도 가지지 않고 아무런 상속도 받지 않아 가장 상위에 존재하는 프로토타입이다. 자바스트립트에 내장된 모든 생성자나 새 생성자는 이 객체를 프로토 타입으로 가진다.

 

 

2. CWE

는 CWE-843로 등록되어 있다. CWE에 기록된 항목 설명은 다음과 같다.

 

객체 프로토타입의 속성을 추가하거나 수정하여 모든 객체에 존재하는 속성을 생성하거나 중요한 속성을 악의적인 속성으로 대체할 수 있습니다. 제품이 특정 속성의 존재 여부에 따라 달라지거나 객체 프로토타입의 미리 정의된 속성(예: hasOwnProperty, toString 또는 valueOf)을 사용하는 경우 문제가 될 수 있습니다.

이 약점은 일반적으로 proto, 생성자 또는 프로토타입이라는 개체의 특수 속성을 사용하여 악용됩니다. 이러한 속성은 개체 프로토타입에 대한 액세스를 제공합니다. 이 약점은 사용자 입력을 기반으로 객체 속성을 할당하거나 재귀적으로 객체를 병합 또는 복제하는 코드에서 종종 발견됩니다.

 

2. Prototype Pollution

Prototype Pollution은 Js의 처리 로직의 문제로 Object들의 prototype을 수정할 수 있을 때 발생하는 보안 문제이다. 이 경우 의도된 로직을 벗어나거나 DOM에 관여하여 XSS등의 추가적인 문제가 생길 수 있다.

Prototype 수정 방법은 아래 방법을 활용할 수 있다. 

  • Object.__proto__
  • Object.constructor.prototype
let myObj = {} 
myObj['__proto__']['a'] = 'a’ 
// myObj의 prototype(__proto__) 의 a에 a를 넣습니다.
console.log(myObj.a) 

let newObj = {} 
// 이후 newObj라는 Object를 만들었는데, 
// log를 보면 a가 찍힙니다. Object prototype이 바뀌었기 때문입니다.
console.log(newObj.a)

코드 출처 | https://www.hahwul.com/cullinan/prototype-pollution/

 

 

이를 통해 대표적으로 XSS 를 발생시킬 수 있다. Object의 Prototype을 변경해 이후 Object의 생성이나 사용단에 관여해 임의의 스크립트를 동작시킬 수 있다. 

GET /?__proto__[innerHTML]=<img/src/onerror%3dalert(1)>
GET /?__proto__[context]=<img/src/onerror%3dalert(1)>
GET /?__proto__[onload]=alert(1)
GET /?__proto__[src][]=data:,alert(1)//
GET /?__proto__[url]=data:,alert(1)//

코드 출처 | https://www.hahwul.com/cullinan/prototype-pollution/