계: Input Validation and Representation
입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
String Termination Error
Abstract
적절한 문자열 종료를 사용하면 buffer overflow가 발생할 수 있습니다.
Explanation
String termination error는 다음 경우에 발생합니다.
1. 데이터가 출력을 null로 끝내지 않는 함수를 통해 프로그램에 입력됩니다.
2. 입력을 null로 끝내야 하는 함수에 데이터를 전달합니다.
예제 1: 다음 코드는
예제 2: 다음 코드에서
예제 3: 다음 코드는
전통적으로 문자열은
악의적인 사용자는 보통 예기치 못한 크기나 내용의 데이터를 응용 프로그램에 삽입하여 이런 유형의 취약점을 익스플로이트합니다. 악성 입력을 프로그램 입력으로 직접적으로 제공하거나 구성 파일과 같은 응용 프로그램 리소스를 수정하여 간접적으로 제공합니다. 공격자가 응용 프로그램이 버퍼 범위를 넘어서 읽도록 만드는 경우 공격자는 그 결과로 발생하는 buffer overflow를 이용하여 시스템에 임의의 코드를 삽입하여 실행할 수도 있습니다.
1. 데이터가 출력을 null로 끝내지 않는 함수를 통해 프로그램에 입력됩니다.
2. 입력을 null로 끝내야 하는 함수에 데이터를 전달합니다.
예제 1: 다음 코드는
cfgfile
에서 읽어 strcpy()
를 사용하여 입력을 inputbuf
에 복사합니다. 코드는 inputbuf
에 항상 null 종결자가 있다고 잘못 가정합니다.
#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null-terminate
strcpy(pathbuf,inputbuf); //requires null-terminated input
...
Example 1
의 코드는 cfgfile
에서 읽은 데이터가 예상대로 디스크에서 null로 끝나면 정확하게 동작합니다. 하지만 공격자가 이 입력을 예상하는 null
문자를 포함하지 않도록 수정할 수 있다면 strcpy()
호출은 임의의 null
문자를 만날 때까지 계속 메모리에서 복사합니다. 이는 대상 버퍼에 오버플로를 일으킬 가능성이 크며, 공격자가 inputbuf
바로 다음의 메모리 내용을 제어할 수 있게 되면 응용 프로그램이 buffer overflow 공격에 취약해질 수 있습니다.예제 2: 다음 코드에서
readlink()
는 버퍼 path
에 저장된 심볼 링크의 이름을 확장하여 심볼 링크에서 참조하는 파일의 절대 경로가 버퍼 buf
에 포함되도록 합니다. 그런 다음, 결과 값의 길이를 strlen()
을 사용하여 계산합니다.
...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...
Example 2
의 코드는 readlink()
를 통해 buf
로 읽은 값이 null로 끝나지 않기 때문에 올바로 동작하지 않습니다. 테스트에서 buf
및 버퍼 바로 다음 메모리의 사용되지 않는 내용이 null
일 수 있기 때문에 이런 취약점을 발견하지 못할 수 있으므로 strlen()
이 올바로 동작하는 것처럼 보입니다. 하지만, 실제 상황에서는 strlen()
이 스택에서 임의의 null
문자를 발견할 때까지 계속 메모리를 탐색하기 때문에 결국 buf
의 크기보다 훨씬 큰 length
값이 발생하고 이후에 이 값을 사용하면 buffer overflow가 발생할 수 있습니다.예제 3: 다음 코드는
snprintf()
를 사용하여 사용자 입력 문자열을 복사하고 여러 출력 문자열에 넣습니다. sprintf()
와 비교하여 추가 가드레일, 특히 최대 출력 크기의 지정을 제공함에도 불구하고 snprintf()
함수는 지정된 출력 크기가 예상 입력보다 큰 경우 여전히 문자열 종료 오류가 발생할 수 있습니다. 문자열 종료 오류는 메모리 누수 또는 buffer overflow와 같은 다운스트림 문제로 이어질 수 있습니다.
...
char no_null_term[5] = getUserInput();
char output_1[20];
snprintf(output_1, 20, "%s", no_null_term);
char output_2[20];
snprintf(output_2, 20, "%s", no_null_term);
printf("%s\n", output_1);
printf("%s\n", output_2);
...
Example 3
의 코드는 메모리 누수를 보여줍니다. output_2
가 no_null_term
으로 채워진 경우 snprintf()
는 null 문자가 나타나거나 지정된 크기 제한에 도달할 때까지 no_null_term
위치에서 읽어야 합니다. no_null_term
에서 종료 문자가 없으므로 snprintf
는 결국 snprintf()
의 첫 번째 호출에서 제공되는 null로 종료되는 문자에 도달하는 output_1
의 데이터를 계속해서 읽습니다. 메모리 누수는 output_2
의 printf()
에서 보여 주며, 여기에는 no_null_term
의 문자 시퀀스가 두 번 포함됩니다.전통적으로 문자열은
null
문자로 끝나는 데이터를 포함한 메모리의 한 부분으로 표현합니다. 이전 문자열 처리 메서드는 자주 이 null
문자를 사용하여 문자열 길이를 결정합니다. null 종결자가 없는 버퍼가 이 함수 중 하나로 전달될 경우, 해당 함수는 버퍼의 끝을 지나 계속 읽습니다.악의적인 사용자는 보통 예기치 못한 크기나 내용의 데이터를 응용 프로그램에 삽입하여 이런 유형의 취약점을 익스플로이트합니다. 악성 입력을 프로그램 입력으로 직접적으로 제공하거나 구성 파일과 같은 응용 프로그램 리소스를 수정하여 간접적으로 제공합니다. 공격자가 응용 프로그램이 버퍼 범위를 넘어서 읽도록 만드는 경우 공격자는 그 결과로 발생하는 buffer overflow를 이용하여 시스템에 임의의 코드를 삽입하여 실행할 수도 있습니다.
References
[1] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press
[2] Standards Mapping - Common Weakness Enumeration CWE ID 170, CWE ID 665
[3] Standards Mapping - Common Weakness Enumeration Top 25 2024 [12] CWE ID 020
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754, CCI-002824
[5] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[6] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 1.3
[7] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Directive 4.14, Rule 1.3, Rule 21.17
[8] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2008 Rule 0-3-1
[9] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2023 Rule 4.1.3
[10] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1), SI-16 Memory Protection (P1)
[11] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation, SI-16 Memory Protection
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - OWASP Top 10 2004 A5 Buffer Overflow
[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.1 Requirement 6.5.2
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.2
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.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 Data Security Standard Version 4.0.1 Requirement 6.2.4
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[25] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[26] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.3.2 - Web Software Attack Mitigation
[27] Standards Mapping - SANS Top 25 2009 Risky Resource Management - CWE ID 665
[28] Standards Mapping - SANS Top 25 2010 Risky Resource Management - CWE ID 665
[29] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I, APP3590.1 CAT I
[30] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I, APP3590.1 CAT I
[31] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I, APP3590.1 CAT I
[32] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I, APP3590.1 CAT I
[33] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I, APP3590.1 CAT I
[34] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I, APP3590.1 CAT I
[35] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I, APP3590.1 CAT I
[36] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[50] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[51] Standards Mapping - Web Application Security Consortium Version 2.00 Buffer Overflow (WASC-07)
[52] Standards Mapping - Web Application Security Consortium 24 + 2 Buffer Overflow
desc.dataflow.cpp.string_termination_error.master