가. 취약점 개요
사례1 : 버퍼 오버플로우
스택(Stack)이나 힙(Heap)에 할당되는 메모리에 문자열 등이 저장될 때 최초 정의된 메모리의 크기를 초과하여 문자열을 저장하는 경우 버퍼 오버플로우가 발생한다.
사례2 : 포맷 스트링 삽입
공격자는 외부입력값에 포맷 문자열을 삽입하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있다. 그 결과, 공격자는 취약한 프로세스의 권한을 취득하여 임의의 코드를 실행할 수 있다.
나. 설계 시 고려사항
① C나 C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계설정 또는 검사를 반드시 수행해야 한다.
실행되는 시스템 Non-executable Stack, 랜덤스택(ASLR), 스택가드(StackGuard)와 같은 메모리 보호 정책이 적용되도록 해야 하며, 구현단계에 안전한 함수사용법에 대한 설명과 메모리 사용시 경계값을 검사하고 사용할 수 있도록 시큐어코딩 규칙을 정의하여 개발자들이 준수할 수 있도록 한다.
② 개발시, 메모리 버퍼 오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 해야 한다.
메모리 버퍼오버플로우 취약성을 가지고 있는 함수들을 식별하여 개발자들이 해당 함수를 사용 하지 않고 안전한 함수를 사용할 수 있도록 시큐어코딩 규칙을 정의하고 개발자가 준수할 수 있도록 한다.
다. 진단 세부사항
요구사항 ①
C나 C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계 설정 또는 검사를 반드시 수행해야 한다.
설계산출물을 검토하여 배열의 값을 다른 배열로 복사하여 넣는 경우 길이 검사 수행 방식이나 공통 함수가 설계되어 있는지 확인한다.
요구사항 ②
개발시, 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 통제해야 한다. 취약한 API를 정의하고 있는지 확인한다.
[테스트 문제]
문제: 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 통제해야 한다.
정답: O
문제: 보안대책을 서술하시오.
정답:
① 메모리 버퍼의 경계값 검증(ASLR, 스택가드, DEP, NX)
② 안전한 API 사용(fgets, scanf_s, strncpy_s, strncat_s)
문제: 빈칸을 채우시오.
사례1 : 버퍼 오버플로우
스택(Stack)이나 힙(Heap)에 할당되는 메모리에 문자열 등이 저장될 때 최초 정의된 메모리의 크기를 (ㄱ)하여 문자열을 저장하는 경우 버퍼 오버플로우가 발생한다.
사례2 : 포맷 스트링 삽입
공격자는 외부입력값에 포맷 문자열을 삽입하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있다. 그 결과, 공격자는 취약한 프로세스의 권한을 취득하여 (ㄴ)를 실행할 수 있다.
나. 설계 시 고려사항
① C나 C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 (ㄷ)을 넘어서 메모리를 읽거나 저장하지 않도록 (ㄹ)를 반드시 수행해야 한다.
실행되는 시스템 (ㅁ), (ㅂ), (ㅅ)와 같은 메모리 보호 정책이 적용되도록 해야 하며, 구현단계에 안전한 함수사용법에 대한 설명과 메모리 사용시 경계값을 검사하고 사용할 수 있도록 시큐어코딩 규칙을 정의하여 개발자들이 준수할 수 있도록 한다.
② 개발시, 메모리 버퍼 오버플로우를 발생시킬 수 있는 (ㅇ)를 사용하지 않도록 해야 한다.
메모리 버퍼오버플로우 취약성을 가지고 있는 함수들을 식별하여 개발자들이 해당 함수를 사용 하지 않고 안전한 함수를 사용할 수 있도록 시큐어코딩 규칙을 정의하고 개발자가 준수할 수 있도록 한다.
다. 진단 세부사항
요구사항 ①
C나 C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계 설정 또는 검사를 반드시 수행해야 한다.
설계산출물을 검토하여 배열의 값을 다른 배열로 복사하여 넣는 경우 길이 검사 수행 방식이나 공통 함수가 설계되어 있는지 확인한다.
요구사항 ②
개발시, 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 통제해야 한다. 취약한 API를 정의하고 있는지 확인한다
정답:
ㄱ: 초과
ㄴ: 임의의 코드
ㄷ: 메모리 버퍼의 경계값을
ㄹ: 경계설정 또는 검사
ㅁ: ASLR
ㅂ: 스택가드
ㅅ: LX(non-execute), DEP
ㅇ: 취약한 API
허용된 범위내 메모리 접근 | |
입력데이터 검증 및 표현 | 메모리 버퍼 오버플로우 |
입력데이터 검증 및 표현 | 포맷 스트링 삽입 |