반응형
https://www.kisa.or.kr/public/laws/laws3.jsp
구현 단계 시큐어코딩 가이드 - 입력 데이터 검증 및 표현 - 메모리 버퍼 오버플로우
가. 개요
- 메모리 버퍼 오버플로우 보안약점은 연속된 메모리 공간을 사용하는 프로그램에서 할당된 메모리의 범위를 넘어선 위치에 자료를 읽거나 쓰려고 할 때 발생한다. 메모리 버퍼 오버플로우는 프로그램의 오동작을 유발하거나, 악의적인 코드를 실행시킴으로써 공격자 프로그램을 통제할 수 있는 권한을 획득하게 한다.
- 메모리 버퍼 오버플로우에는 스택 메모리 버퍼 오버플로우와 힙 메모리 버퍼 오버플로우가 있다.
- 다음은 스택 메모리 버퍼 오버플로우를 발생시키는 코드이다.
void foo(){
int num = 10;
char message[40];
gets(message);5:
}
- 정상적인 프로그램의 실행은 다음과 같은 메모리 구조를 가지며, 함수 foo()의 스택 공간 끝에는 복귀 주소가 보관된다.
- gets()와 같은 함수는 문자열을 크기와 상관없이 연속된 기억공간에 저장시키는 함수이므로, 공격자는 정상적인 문자열대신 공격코드를 입력하고 스택의 시작 주소 0xAABB를 반복 입력한다. 이 경우 다음과 같은 메모리 구조에 의해 프로그램은 정상 주소로 복귀하는 대신 공격코드의 시작 주소로 복귀하여 공격코드를 수행하게 된다.
나. 보안대책
- 프로그램 상에서 메모리 버퍼를 사용할 경우 적절한 버퍼의 크기를 설정하고, 설정된 범 위의 메모리 내에서 올바르게 읽거나 쓸 수 있게 통제하여야 한다. 특히, 문자열 저장 시 널(Null) 문자로 종료하지 않으면 의도하지 않은 결과를 가져오게 되므로 널(Null) 문자를 버퍼 범위 내에 삽입하여 널(Null) 문자로 종료되도록 해야 한다
다. 코드예제
C
더보기
다음 코드는 포인터 구조체의 개별 필드에 특정 문자열을 복사하는 프로그램이다. 잘못 계산된 데이터 크기 sizeof(cv_struct)로 인해 프로그램은 연속된 메모리 공간인 포인터 y를 덮어쓰는 버퍼 오버플로우를 발생시킨다. 또한 프로그램은 복사된 문자열에 대해 종료 문자를 첨가시키지 않았기 때문에 문자열의 참조 시 잘못된 결과를 가져올 수 있다.
안전한 코드가 되기 위해서는 첫째, 문자열 복사는 구조체 내의 필드 값 x에 한정되는 것이므로 정확한 문자열 계산인 sizeof(cv_struct.x)을 통해 허용된 범위의 인덱스만을 사용하도록 수정한다. 둘째, 복사된 문자열은 올바른 널(Null) 정보를 가져야 하므로 복사된 값을 가진 cv_struct.x 배열의 가장 마지막 인덱스를 계산하여 널(Null) 문자를 패딩해야 한다.
참고자료
- CWE-119 Improper Restriction of Operations within the Bounds of a Memory Buffer, MITRE,
http://cwe.mitre.org/data/definitions/119.html - Buffer overflow attack, OWASP,
https://www.owasp.org/index.php/Buffer_overflow_attack
반응형
'공부 > KISA' 카테고리의 다른 글
적절한 인증 없는 중요기능 허용 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
---|---|
포맷 스트링 삽입 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
보안기능 결정에 사용되는 부적절한 입력값 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
정수형 오버플로우 - KISA 소프트웨어 개발 보안 가이드 (0) | 2020.07.20 |
HTTP 응답분할 - KISA 소프트웨어 개발 보안 가이드 (1) | 2020.07.20 |
댓글