Prototype Pollution은 공격자가 JavaScript 객체의 프로토타입 체인 최상위인 Object.prototype에 악성 속성을 주입하여 애플리케이션의 동작을 예측 불가능하게 만들거나 민감한 정보를 탈취하는 취약점입니다. 이 취약점은 주로 외부에서 받은 신뢰할 수 없는 데이터를 객체로 변환하는 과정에서 발생합니다.
🔍 원리 이해: 왜 위험한가?
JavaScript 객체는 속성(Property)을 통해 데이터를 구조화합니다. 이 구조화 과정에서, 개발자가 외부 입력값(예: JSON 파싱)을 객체에 매핑할 때, 만약 입력값의 키(Key)를 검증하지 않으면, 공격자는 __proto__와 같은 특수 속성을 이용하여 객체의 기본 구조 자체를 조작할 수 있습니다.
핵심 위험 요소: __proto__ 속성은 객체의 프로토타입(Prototype)을 가리키며, 이 프로토타입은 객체가 상속받는 모든 속성의 근간이 됩니다. 여기에 악성 코드를 주입하면, 애플리케이션 전체의 동작 로직에 영향을 미칠 수 있습니다.
🛡️ 주요 공격 시나리오
- 속성 오염 (Property Pollution): 공격자가 입력값에
{"__proto__": {"isAdmin": true}}와 같은 구조를 포함시키면, 애플리케이션이 이를 객체로 파싱하는 순간, 객체의 프로토타입에isAdmin: true라는 속성이 추가될 수 있습니다. - 정보 탈취: 이 오염된 속성을 통해, 개발자가 의도하지 않은 내부 속성(예: 세션 토큰, 관리자 권한 플래그)을 읽어내어 정보가 유출될 수 있습니다.
🛠️ 방어 전략: 어떻게 막을 것인가?
가장 효과적인 방어책은 신뢰할 수 없는 데이터는 절대로 신뢰해서는 안 된다는 원칙을 철저히 지키는 것입니다.
- 입력값 검증 및 제한 (Input Validation): 외부에서 들어오는 모든 데이터는 반드시 허용된 스키마(Schema)에 맞는지 검증해야 합니다. 특히, 키(Key) 이름에
__proto__,constructor,prototype등이 포함되어 있는지 검사하는 로직을 추가해야 합니다. - 안전한 파싱 라이브러리 사용: JSON 파싱 시, 속성 오염을 방지하도록 설계된 라이브러리나 API를 사용해야 합니다. 예를 들어, 일부 라이브러리는 기본적으로
__proto__속성에 대한 쓰기 접근을 막아줍니다. - 프로토타입 보호 (Prototype Pollution Prevention): 사용 중인 프레임워크나 라이브러리 레벨에서 프로토타입 오염 방지 기능을 활성화하는 것이 가장 확실합니다.
📚 요약 및 체크리스트
| 단계 | 조치 사항 | 목적 |
| :— | :— | :— |
| 입력 | 모든 외부 입력값에 대한 스키마 검증 필수. | 악성 키(Key)의 유입 차단. |
| 처리 | 객체 생성 시, __proto__ 속성 접근 차단 로직 구현. | 프로토타입 조작 시도 무력화. |
| 코드 리뷰 | JSON 파싱 및 객체 매핑 로직에 대한 보안 코드 리뷰 강화. | 잠재적인 취약점 사전 발견. |
이러한 다층적인 방어 전략을 통해, 개발자는 객체 속성 조작을 통한 잠재적인 보안 위협으로부터 애플리케이션을 안전하게 보호할 수 있습니다.