프로토타입 오염 (Prototype Pollution) - Object assignment
Prototype Pollution
설명
프로토타입 오염은 자바스크립트 객체의 프로토타입(Prototype) 속성이 부적절하게 변경될 때 발생하는 취약점입니다. 외부 입력(예: 요청 파라미터)이 객체의 프로토타입 속성('proto', 'constructor' 등)에 할당될 경우, 모든 객체가 이 영향을 받아 예상치 못한 동작이나 보안 문제가 발생할 수 있습니다. 공격자는 이를 이용해 인증 우회, 데이터 변조, 원격 코드 실행 등이 가능합니다.
잠재적 영향
시스템 동작 변경 (시스템 전체 행동 변조): 공격자가 객체의 프로토타입을 조작해 전체 애플리케이션의 동작을 바꿀 수 있습니다.
데이터 변조 (데이터 변경): 공격자가 의도하지 않은 속성을 주입해 저장된 데이터를 변경할 수 있습니다.
보안 우회 (보안 기능 우회): 인증이나 권한 검증 로직을 우회할 수 있습니다.
해결 방법
사용자 입력값 검증: 입력값이 'proto', 'constructor' 등 위험한 키인지 검사하고 차단합니다.
안전한 객체 생성:
Object.create(null)로 프로토타입이 없는 객체를 생성하여 저장소 등에서 사용합니다.Map 자료구조 사용: 객체 대신 Map을 사용하면 프로토타입 오염 위험이 줄어듭니다.
외부에서 전달받은 키 값으로 직접 객체 속성에 할당하지 않습니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 외부 입력값(req.query.name)을 별도의 검증 없이 객체의 속성명으로 사용하면, 사용자가 'proto'나 'constructor' 등 프로토타입 속성명을 입력해 전체 시스템에 영향을 줄 수 있습니다.
안전한 코드: 허용하지 않는 속성명('proto', 'constructor', 'prototype')이 입력되는지를 검사하고, 해당 키로 객체 속성을 설정하는 것을 차단하여 프로토타입 오염 위험을 막습니다.
참조
Last updated