계: API Abuse

API는 호출자와 피호출자 간의 계약입니다. 가장 흔한 형태의 API 오용은 호출자가 이 계약에서 자신의 몫을 이행하지 못하기 때문에 발생합니다. 예를 들어, 프로그램이 chroot()를 호출한 후 chdir()을 호출하지 못하면 활성 루트 디렉터리를 안전하게 변경하는 방법을 지정하는 계약을 위반하는 것입니다. 라이브러리 오용의 또 다른 좋은 예는 피호출자가 호출자에게 신뢰할 만한 DNS 정보를 반환할 것으로 예상하는 것입니다. 이 경우, 호출자는 자신의 행동에 대해 특정한 가정을 함으로써(반환 값이 인증 목적으로 사용될 것으로 예상) 피호출자 API를 오용합니다. 다른 쪽에서 호출자-피호출자 계약을 위반할 수도 있습니다. 예를 들어, 코더가 하위 클래스 SecureRandom을 지정하고 임의 값이 아닌 값을 반환하는 경우 계약을 위반하는 것입니다.

Often Misused: Encoding

Abstract
.NET Framework에서 클래스를 잘못 오버라이드할 경우 서버에서의 임의의 코드 실행, 응용 프로그램 로직 남용 또는 DoS(Denial of Service)를 야기할 수 있습니다.
Explanation
프로그램을 작성한 언어와 관계 없이 대부분의 파괴적인 공격은 원격 코드 실행과 관련이 있으며 이러한 점을 사용하여 공격자는 프로그램의 컨텍스트에 악성 코드를 실행하는 데 성공합니다. DecoderEncoding 클래스의 GetChars 메서드와 .NET Framework의 EncoderEncoding 클래스의 GetBytes 메서드는 문자 및 바이트 배열에 대해 내부적으로 포인터 산술을 수행하여 문자 범위를 바이트 범위로 변환하거나 그 반대로 수행합니다.
포인터 산술 작업을 수행하는 경우 개발자는 흔히 잘못된 방식으로 앞선 메서드를 오버라이드하고 임의의 코드 실행, 응용 프로그램 로직 남용 및 Denial Of Service(DoS)와 같은 취약점을 야기합니다.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 176
[2] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[3] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[4] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[5] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[6] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.structural.dotnet.often_misused_encoding
Abstract
이 메서드는 올바르게 사용하기 어렵습니다.
Explanation
이 인코딩 메서드가 injection 공격으로부터 보호할 것이라 믿기는 쉽지만 메서드가 올바른 컨텍스트에서 정확하게 사용되지 않는 경우, 알려진 것보다 제대로 보호하지 못할 수 있습니다.

예제 1: 다음 인코딩 호출은 공격자에게 마음대로 악성 JavaScript를 삽입할 수 있도록 허용합니다.

out.println("x = " + encoder.encodeForJavaScript(input) + ";");
References
[1] OWASP ESAPI Secure Coding Guideline
[2] Standards Mapping - Common Weakness Enumeration CWE ID 176
[3] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[4] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[5] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[6] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[7] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.structural.java.often_misused_encoding
Abstract
식별된 호출은 문자를 자동으로 맞출 수 있습니다. 기본 API 메서드에 전달된 지원되지 않는 문자는 위험한 문자에 잘 맞추어 매핑됩니다.
Explanation
문자 집합이 운영 체제와 운영 체제에서 실행 중인 응용 프로그램 간에 일치하지 않을 때 기본 API 메서드에 전달된 지원되지 않는 문자는 위험한 문자에 가장 잘 맞추어 매핑될 수 있습니다.

예제 1:Objective-C에서 다음 예제는 UTF-8 문자를 포함하는 NSString 개체를 ASCII 데이터로 변환했다가 다시 되돌립니다.


...
unichar ellipsis = 0x2026;
NSString *myString = [NSString stringWithFormat:@"My Test String%C", ellipsis];
NSData *asciiData = [myString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];
NSLog(@"Original: %@ (length %d)", myString, [myString length]);
NSLog(@"Best-fit-mapped: %@ (length %d)", asciiString, [asciiString length]);
// output:
// Original: My Test String... (length 15)
// Best-fit-mapped: My Test String... (length 17)
...


출력을 주의해서 보면, "..." 문자가 연속 마침표 세 개로 변환되었습니다. 입력 버퍼를 기반으로 출력 버퍼를 크기 조정한 경우, 응용 프로그램이 buffer overflow에 취약할 수 있습니다. 다른 문자가 하나에서 두 개의 문자로 매핑될 수 있습니다. 그리스어 "fi" 문자가 "f" 뒤에 "i"가 붙은 문자로 매핑됩니다. 이러한 문자로 버퍼를 프론트 로드하여 공격자는 버퍼를 오버플로하는 데 사용하는 문자의 수에 대해 완전한 제어권을 얻습니다.
References
[1] Apple Secure Coding Guide Apple
[2] String Programming Guide Apple
[3] Standards Mapping - Common Weakness Enumeration CWE ID 176
[4] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[5] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[6] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[7] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[8] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.semantic.objc.method_may_best_fit_map_characters
Abstract
식별된 호출은 문자를 자동으로 맞출 수 있습니다. 기본 API 메서드에 전달된 지원되지 않는 문자는 위험한 문자에 잘 맞추어 매핑됩니다.
Explanation
문자 집합이 운영 체제와 운영 체제에서 실행 중인 응용 프로그램 간에 일치하지 않을 때 기본 API 메서드에 전달된 지원되지 않는 문자는 위험한 문자에 가장 잘 맞추어 매핑될 수 있습니다.

예제 1: Swift에서 다음 예제는 UTF-8 문자를 포함하는 NSString 개체를 ASCII 데이터로 변환했다가 다시 되돌립니다.


...
let ellipsis = 0x2026;
let myString = NSString(format:"My Test String %C", ellipsis)
let asciiData = myString.dataUsingEncoding(NSASCIIStringEncoding, allowLossyConversion:true)
let asciiString = NSString(data:asciiData!, encoding:NSASCIIStringEncoding)
NSLog("Original: %@ (length %d)", myString, myString.length)
NSLog("Best-fit-mapped: %@ (length %d)", asciiString!, asciiString!.length)

// output:
// Original: My Test String ... (length 16)
// Best-fit-mapped: My Test String ... (length 18)
...


출력을 주의해서 보면, "..." 문자가 연속 마침표 세 개로 변환되었습니다. 입력 버퍼를 기반으로 출력 버퍼를 크기 조정한 경우, 응용 프로그램이 buffer overflow에 취약할 수 있습니다. 다른 문자가 하나에서 두 개의 문자로 매핑될 수 있습니다. 그리스어 "fi" 문자가 "f" 뒤에 "i"가 붙은 문자로 매핑됩니다. 이러한 문자로 버퍼를 프론트 로드하여 공격자는 버퍼를 오버플로하는 데 사용하는 문자의 수에 대해 완전한 제어권을 얻습니다.
References
[1] Apple Secure Coding Guide Apple
[2] String Programming Guide Apple
[3] Standards Mapping - Common Weakness Enumeration CWE ID 176
[4] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[5] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[6] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[7] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[8] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
desc.semantic.swift.method_may_best_fit_map_characters