Invisible Safety,

Proven by Intelligence

보이지 않는 안전을 인텔리전스로 증명하다.

기술 노트
IT 산업의 변화를 이끄는 MDS인텔리전스의
기술 인사이트를 만나보세요.
시스템 소프트웨어 개발
[CodeSonar] CWE-658/659 정복하기(4)
2026년 01월 09일

CWE - 658/659 정복하기 (4)


 l CWE-129: Improper Validation of Array Index


CWE-129는 신뢰할 수 없는 외부 입력 값을 통해 배열의 인덱스를 지정할 때, 인덱스의 유효성을 검사하지 않거나 잘못된 검사를 수행하는 문제를 말합니다.

아래 예제 코드는 메일 서버로부터 각 메시지의 번호와 크기를 입력 받아 저장하는 함수입니다.
그러나 입력된 메시지 번호에 대한 별도의 검증을 수행하지 않고 시스템 메모리에 정보를 저장하고 있습니다.
만일 버퍼로부터 얻은 메시지의 번호 num 값이 sizes 배열의 크기보다 크거나 음수일 경우, 버퍼 오버 플로우나 잘못된 영역의 메모리 접근으로 시스템 충돌이 발생할 수 있습니다.





이처럼 외부나 입력을 통해 전달되는 값이 배열의 인덱스로 참조되는 경우에는 항상 유효성 검사를 수행하는 것이 좋습니다.
예를 들어, num값이 sizes배열의 인덱스로 참조되기 전 허용 가능한 범위를 검사하는 조건 구문을 추가하여 취약점 발생을 사전에 예방할 수 있습니다.


​또는 자동화 정적 분석 도구를 사용하는 것도 사전에 문제를 예방하는 방법 중 하나입니다.

소스 코드 기반의 분석을 수행하는 CodeSonar는 data flow 분석을 수행하여 프로그램에서 사용되는 모든 변수에 대한 타입과 참조 등 모든 흐름을 검사합니다.
이에 범위를 벗어난 데이터의 참조, 인덱스 사용 등을 검사하고 오버 플로우가 발생할 수 있는 경로를 탐색하여 사용자에게 알려줍니다.
이러한 자동화 도구의 사용은 CWE에서 제시하는 다양한 취약점을 코드 개발 단계나 실행 전 사전에 검사하여 제거할 수 있도록 도와줍니다.


 l CWE-130: Improper Handling of Length Parameter Inconsistency


CWE-130은 메시지나 구조체에 저장된 데이터 파싱 시, 실제 데이터 길이와 다른 잘못된 길이로 작업이 수행되는 위험을 말합니다.

아래 예제 함수는 소켓을 통해 입력된 메시지를 buffer에 저장한 뒤 이를 메시지 길이와 body로 이루어진 구조체의 데이터를 파싱(Parsing)합니다. 메시지의 body를 저장하는 과정 중 선 수행되는 for 문의 조건에 검증되지 않은 메시지 길이 변수인 msgLength를 사용하고 있는데, 이는 인해 버퍼 사이즈를 초과한 데이터 참조 및 읽기 문제의 원인이 됩니다.


​아래 예제와 같이 공격자는 데이터의 잘못된 길이를 프로그램에 주입하여 임의 코드 실행, 버퍼 오버 플로우와 같은 문제를 발생시킵니다. 이러한 문제를 회피하기 위해서는 데이터 길이에 대한 유효성 검증과 외부에서 입력된 값에 대한 검증을 수행해야 합니다.





 l CWE-131: Incorrect Calculation of Buffer Size


CWE-131은 버퍼 할당 시 잘못된 사이즈 인자 사용으로 버퍼 오버 플로우 문제가 발생하는 위험을 말합니다.

잘못된 계산으로 도출된 값을 메모리 할당의 사이즈 인자로 사용할 경우, 의도한 것보다 작거나 큰 메모리가 생성되어 범위 밖의 데이터에 접근하는 문제가 발생합니다.
이전 포스팅에서 안내된 것처럼 잘못된 메모리 접근은 시스템 충돌이나 오작동과 같은 SW 실행 관련 문제와 중요 정보 노출과 같은 보안 문제를 유발합니다.


아래 예제 코드는 배열에 서로 다른 3개의 식별 숫자를 저장하는 코드입니다.

개발자는 malloc() 함수를 통해 할당된 동적 메모리에 3개의 서로 다른 정수를 저장하기 위해 동적 메모리를 할당 받은 후 데이터를 저장합니다.
그러나 id_sequence[0]인 배열의 첫번째 메모리 위치에 데이터 저장 시 오버 플로우가 발생합니다.
이는 매우 간단한 개발자의 실수로 인해 발생한 문제로, 메모리 할당 시 입력한 잘못된 사이즈 인자가 문제의 원인입니다.
아래 코드는 숫자 3’을 통해 메모리 할당을 시도하여3byte 크기의 메모리를 할당 받았으나, 개발자의 의도에 맞춰 코드 실행을 위해서는 int 타입 크기의 3배의 해당하는 byte 만큼의 메모리가 필요합니다. 즉 할당 함수의 사이즈 인자에는 숫자 ‘3’이 아닌 sizeof(int)*3인 크기를 사용해야 올바른 메모리 할당과 저장이 수행됩니다.




이러한 문제는 모든 입력이나 데이터에 대한 유효성 검사와 sizeof() 함수를 통해 데이터의 적절한 사이즈를 찾아 사용할 수 있도록 사전에 예방하는 것이 중요합니다.


 l CWE-134: Use of Externally-Controllded Format String


CWE-134는 외부 입력 또는 전달로 이루어진 포맷 스트링이 함수의 인자로 사용될 때의 위험에 대해 말합니다.

흔히 포맷 스트링 공격 또는 포맷 스트링 취약점이라고 하는데, 외부에서 제어가 가능한 값을 통해 수정 또는 변형된 값을 포맷 스트링으로 입력하여 잘못된 메모리를 참조하거나 시스템 내부에 저장된 정보에 접근하여 이를 출력하는 중요 정보 탈취 등의 문제를 발생시킵니다.




위 예제 코드는 main 함수의 인자로 입력된 값을 스택 메모리에 저장 후, printWrapper() 함수 내 구현된 printf() 함수로 출력합니다. 그러나 출력 함수에 사용된 포맷 스트링은 확인되지 않은 외부 입력으로 포맷 스트링 공격에 매우 취약합니다. 그러나 SW 개발 과정에서 다양한 방법을 통해 사전 예방이 가능합니다. 


​예를 들어, 요구 사항 설립 단계에서는 개발 언어에 대한 선정 시 취약한 언어를 사용하지 않도록 하고, 코드 개발 시에는 포맷 스트링 값에 사용자가 제어 불가한 정적 문자열을 사용하거나 포맷 스트링 내 ‘%n’을 사용하지 않도록 합니다. (‘%n’은 출력한 문자열의 바이트 수를 스택에 저장하는 지시자로 내부 데이터 노출에 취약합니다.)
소스 코드 컴파일 및 빌드 단계에서는 컴파일러나 링커에서 출력되는 에러 메시지를 통해 코드 내 오류가 없는지 검토하는 것도 하나의 방법입니다.


 l CWE-135: Incorrect Calculation of Multi-Byte String Length


CWE-135은 멀티 바이트(Multi-byte)와 와이드(Wide) 문자가 포함된 문자열의 잘못된 길이 계산에 대한 위험을 말합니다.

일반적으로 문자 표현 시 사용되는1바이트 자료형 char 타입은 아스키 코드로 -128~127까지 표현이 가능하나 그 이상의 범위를 넣으면 문자가 깨지게 됩니다.
이처럼 1바이트로 표현하기 어려운 데이터를 위해 멀티 바이트 문자나 와이드 바이트 문자 Set이 존재하는데, 대표적으로wide type인 wchar_t 타입은 2바이트 자료형으로 유니코드 0~65535까지 표현이 가능합니다.

그러나 문자 데이터 처리 시 잘못된 길이 계산으로 시스템 crash 나 보안 서비스 중단 등의 심각한 SW 문제가 발생할 수 있습니다.


예를 들어, 아래 예제 코드와 같이 와이드 문자 타입으로 선언된 문자열은 strlen()이 아닌 와이드 타입형에 대한 함수 wcslen()을 사용해야 문자의 올바른 길이를 확인할 수 있습니다.
잘못된 길이 계산은 이후 해당 정보를 통해 데이터를 참조하거나 사용할 때 부적절한 값의 사용의 원인이 됩니다.
또한 이는 범위 밖의 메모리를 참조하는 오버 플로우를 유발하여 시스템 중단이나 중요 정보 탈취 등의 문제가 발생할 수 있습니다.
개발자는 소스 코드 내 사용된 데이터 타입에 대한 정보를 확인하고 데이터 길이나 사이즈 확인 시 적절한 함수를 사용하는 등의 활동을 지속적으로 수행해야 합니다.
혹은 잘못된 길이 계산으로 인해 오버 플로우를 유발하는 표준 라이브러리 함수의 경우 사용을 지양함으로써 이러한 문제를 사전에 예방할 수 있습니다.




CodeSonar와 같은 자동화된 정적 분석 도구는 잘못된 메모리 영역의 참조뿐만 아니라 사용자가 지정한 위험한 표준 라이브러리 함수 사용 등의 문제를 쉽고 빠르게 검사하여, CWE-135과 같은 SW 결함 및 보안 취약점 등 같은 다양한 문제를 사전에 제거할 수 있도록 도와줍니다.


출처 : CWE 웹사이트 (http://cwe.mitre.org/index.html)


MDS 인텔리전스
소프트웨어 버그 및 취약점 검출 솔루션 CodeSonar
E.codesonar@mdsit.co.kr