계: API Abuse

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

Often Misused: Strings

Abstract
멀티바이트 문자열과 유니코드 문자열 간 변환을 수행하는 함수를 사용하면 buffer overflow 발생 위험이 큽니다.
Explanation
Windows는 MultiByteToWideChar(), WideCharToMultiByte(), UnicodeToBytes()BytesToUnicode() 함수를 제공하여 임의의 멀티바이트(보통 ANSI) 문자열과 유니코드(와이드 문자) 문자열 간 변환을 수행합니다. 이들 함수의 크기 인수는 다른 단위(바이트 또는 문자)로 지정되기 때문에 이들 함수를 사용하면 오류가 발생하기 쉽습니다. 멀티바이트 문자열에서 각 문자가 차지하는 바이트 수가 다르기 때문에 멀티바이트 문자열의 크기는 총 바이트 수로 지정하는 것이 가장 편리합니다. 하지만 유니코드에서는 문자의 크기가 항상 고정되어 있고 문자열 길이를 보통 문자열에 포함된 문자 수로 나타냅니다. 실수로 크기 인수에 잘못된 단위로 값을 지정하면 buffer overflow가 발생할 수 있습니다.

예제: 다음 함수는 멀티바이트 문자열로 지정된 사용자 이름 및 사용자 정보의 구조체에 대한 포인터를 받아 지정한 사용자에 대한 정보로 구조체를 채웁니다. Windows authentication이 username에 유니코드를 사용하기 때문에 우선 사용자 이름 인수를 멀티바이트 문자열에서 유니코드 문자열로 변환합니다.


void getUserInfo(char *username, struct _USER_INFO_2 info){
WCHAR unicodeUser[UNLEN+1];
MultiByteToWideChar(CP_ACP, 0, username, -1,
unicodeUser, sizeof(unicodeUser));
NetUserGetInfo(NULL, unicodeUser, 2, (LPBYTE *)&info);
}


이 함수는 unicodeUser의 크기를 문자 수가 아닌 바이트 수로 잘못 전달합니다. 따라서 MultiByteToWideChar() 호출에는 (UNLEN+1)*sizeof(WCHAR) 길이의 문자 또는 (UNLEN+1)*sizeof(WCHAR)*sizeof(WCHAR)바이트까지 (UNLEN+1)*sizeof(WCHAR)바이트만 할당된 unicodeUser 배열에 쓸 수 있습니다. username 문자열에 UNLEN 문자 넘게 포함되면 MultiByteToWideChar() 호출은 버퍼 unicodeUser 오버플로를 일으킵니다.
References
[1] Security Considerations: International Features Microsoft
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[3] Standards Mapping - CIS Microsoft Azure Foundations Benchmark partial
[4] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 1
[5] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[6] Standards Mapping - CIS Google Kubernetes Engine Benchmark integrity
[7] Standards Mapping - Common Weakness Enumeration CWE ID 176, CWE ID 251
[8] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002824
[9] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[10] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 1.3
[11] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-16 Memory Protection (P1)
[12] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-16 Memory Protection
[13] Standards Mapping - OWASP Top 10 2004 A5 Buffer Overflow
[14] Standards Mapping - OWASP Application Security Verification Standard 4.0 5.3.2 Output Encoding and Injection Prevention Requirements (L1 L2 L3)
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.5
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.2
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.2
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.2
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.2
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.2
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[23] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection
[25] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection
[26] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3590.1 CAT I
[27] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3590.1 CAT I
[28] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3590.1 CAT I
[29] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3590.1 CAT I
[30] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3590.1 CAT I
[31] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3590.1 CAT I
[32] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3590.1 CAT I
[33] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002590 CAT I
[34] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002590 CAT I
[35] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002590 CAT I
[36] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002590 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002590 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002590 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002590 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002590 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002590 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002590 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002590 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002590 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002590 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002590 CAT I
[47] Standards Mapping - Web Application Security Consortium Version 2.00 Buffer Overflow (WASC-07)
[48] Standards Mapping - Web Application Security Consortium 24 + 2 Buffer Overflow
desc.semantic.cpp.often_misused_strings.multibytewidechar