계: Input Validation and Representation

입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.

Prototype Pollution

Abstract
그러면 응용 프로그램에서 사용자가 프로토타입을 오염시킬 수 있게 됩니다.
Explanation
프로토타입 오염에서는 악의적인 사용자가 개체의 프로토타입을 덮어쓸 수 있습니다.
프로토타입 오염의 개념을 이해하려면 프로토타입 상속에 대해 파악해야 합니다. 프로토타입과 프로토타입 체인은 상속 지원을 위한 JavaScript의 속성과 함수 조회 기능으로 사용됩니다. 특정 개체의 속성 액세스를 시도하면 현재 개체 정의 확인이 진행됩니다. 현재 개체가 속성을 정의하지 않으면 프로토타입 클래스가 확인됩니다. 이러한 방식으로 속성이 확인되거나 설정된 프로토타입이 더 이상 남아 있지 않을 때까지 프로토타입을 반복적으로 확인합니다.

JavaScript의 대다수 개체에서는 프로토타입이 기본적으로 Object.prototype을 가리키므로 개체 프로토타입을 덮어쓸 수 있는 공격자는 보통 Object.prototype의 정의도 덮어쓸 수 있습니다. 그러면 응용 프로그램 내의 모든 개체가 영향을 받게 됩니다.

응용 프로그램이나 해당 종속성 중 하나에서 속성을 항상 명시적으로 설정하지 않고 undefined로 설정할 수 있는 경우 프로토타입이 오염되면 응용 프로그램이 올바른 개체가 아닌 프로토타입에서 속성을 잘못 읽을 수도 있습니다.

프로토타입 오염은 다음과 같은 경우에 발생할 수 있습니다.

1. 신뢰할 수 없는 소스의 데이터가 프로그램에 입력됩니다.



2. 프로토타입 덮어쓰기를 허용하는 API로 데이터가 전달됩니다.

예제 1: 다음 코드는 lodash의 취약한 버전을 사용하여 개체의 프로토타입을 오염시킵니다.


import * as lodash from 'lodash'
...
let clonedObject = lodash.merge({}, JSON.parse(untrustedInput));
...


여기서 신뢰할 수 없는 입력이 {"__proto__": { "isAdmin": true}}라면 Object.prototype에서 isAdmin = true가 정의됩니다.

응용 프로그램 뒷부분에는 다음 코드가 있다고 간주합니다.


...
let config = {}
if (isAuthorizedAsAdmin()){
config.isAdmin = true;
}
...
if (config.isAdmin) {
// do something as the admin
}
...
isAdminisAuthorizedAdmin()이 true를 반환하는 경우에만 true로 설정되어야 합니다. 그런데 응용 프로그램이 else 조건에서 config.isAdmin = false를 설정하지 않으므로 config.isAdmin === undefined === false가 사용됩니다.
그리고 프로토타입이 오염되었으므로 config의 프로토타입은 이제 isAdmin === true로 설정되었습니다. 따라서 관리자 인증을 우회할 수 있습니다.
References
[1] Olivier Arteau Prototype pollution attack.
[2] Open Web Application Security Project (OWASP) Prototype Pollution Prevention Cheat Sheet
[3] Standards Mapping - Common Weakness Enumeration CWE ID 1321
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754
[5] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[6] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-2 Application Partitioning (P1), SI-10 Information Input Validation (P1)
[7] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-2 Separation of System and User Functionality, SI-10 Information Input Validation
[8] Standards Mapping - OWASP API 2023 API3 Broken Object Property Level Authorization
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.5.2 Input and Output Architectural Requirements (L2 L3), 5.1.2 Input Validation Requirements (L1 L2 L3)
[10] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[11] Standards Mapping - OWASP Top 10 2017 A5 Broken Access Control
[12] Standards Mapping - OWASP Top 10 2021 A08 Software and Data Integrity Failures
[13] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.8
[14] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 6.2.4
[16] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 5.4 - Authentication and Access Control
[17] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 5.4 - Authentication and Access Control
[18] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[19] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[20] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002150 CAT II, APSC-DV-002560 CAT I
[21] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002150 CAT II, APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
[22] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002150 CAT II, APSC-DV-002530 CAT II, APSC-DV-002560 CAT I
desc.dataflow.javascript.prototype_pollution