프로토타입 오염 (Prototype Pollution) - Dynamic access
Prototype Pollution
설명
프로토타입 오염은 JavaScript/TypeScript에서 동적으로 객체 속성에 접근하거나 값을 할당하면서 발생할 수 있는 심각한 취약점입니다. 사용자가 입력한 key(속성 이름)가 'proto', 'constructor', 'prototype' 등 객체 프로토타입 관련 속성일 경우, 모든 객체에 영향을 미치는 속성을 추가하거나 덮어쓸 수 있습니다. 공격자는 이 취약점을 이용해 의도치 않은 동작을 유발하거나 보안 검증을 우회할 수 있습니다.
잠재적 영향
애플리케이션 동작 변경(애플리케이션 오동작): 공격자가 모든 객체에 영향을 미치는 속성을 주입해 프로그램 로직이 예상과 다르게 동작할 수 있습니다.
보안 우회: 인증이나 권한확인 등 보안 관련 로직에서 공격자가 임의의 속성을 삽입해 검증을 우회할 수 있습니다.
서버 다운 및 데이터 손상: 주요 함수나 값이 오염되어 서버 장애 또는 데이터 훼손이 발생할 수 있습니다.
해결 방법
입력값 검증: 속성 이름이 'proto', 'prototype', 'constructor' 인지 확인하고, 해당 이름일 경우 접근/할당을 차단합니다.
객체 생성 안전화: prototype이 없는 객체(Object.create(null))를 사용해 데이터 저장소를 만듭니다.
속성 접근 제한: 루프 내에서 동적 key 접근 시 항상 화이트리스트(허용 목록)를 적용하거나, 타겟 객체 제한을 검토합니다.
최신 보안 라이브러리 사용: Lodash, dot-prop 등 신뢰할 수 있는 라이브러리의 최신 버전을 활용하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 이 코드는 사용자 입력 key에 아무런 제한 없이 객체 속성을 동적으로 할당합니다. 만약 key에 'proto' 등이 포함되어 있으면 객체 전체의 프로토타입이 오염될 수 있습니다.
안전한 코드: 이 코드는 동적으로 할당하려는 key가 'proto', 'constructor', 'prototype'인지 검사하여, 해당 속성에 접근하거나 값을 할당하지 못하도록 차단합니다. 이를 통해 프로토타입 오염을 방지할 수 있습니다.
참조
Last updated