자격/SW보안약점진단원

설계단계 보안설계기준-허용된 범위내 메모리 접근

Ignatius Heo 2023. 6. 27. 18:30

작성일: 230627

 

※ 본 게시글은 학습 목적으로 행정안전부·KISA의 소프트웨어 보안약점 진단 가이드, 소프트웨어 개발보안 가이드를 참고하여 작성하였습니다.

 

정리 내용: 소프트웨어 보안약점 진단 가이드(81~85p)

 

유형  입력데이터 검증 및 표현
설계항목  허용된 범위내 메모리 접근
설명
 해당 프로세스에 허용된 범위의 메모리 버퍼에서 접근하여 읽기 또는 쓰기 기능을 하도록 검증 방법 설계 및 메모리 접근요청이 허용범위를 벗어났을 때  처리방법을 설계해야 한다.

보안대책
 ① C나 C++같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계설정 또는 검사를 반드시 수행해야 한다.
 
 ② 개발시, 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 해야 한다.

연관된
구현단계
- 메모리 버퍼 오버플로우
https://cryptocurrencyclub.tistory.com/125
- 포맷 스트링 삽입
https://cryptocurrencyclub.tistory.com/126

 

가. 취약점 개요

 

ㅇ 위 내용을 볼 때, 예상 가능한 보안 위협: 메모리 버퍼오버플로우 (+ 포맷 스트링 삽입)

    - 버퍼 오버플로우: 스택(Stack)이나 힙(Heap)에 할당되는 메모리에 문자열 등이 저장될 때 최초 정의된 메모리의 크기를 초과하여 문자열을 저장하는 경우 버퍼 오버플로우가 발생한다.

    - 포맷 스트링 삽입: 공격자는 외부입력값에 포맷 문자열을 삽입하여 취약한 프로세스를 공격하거나 메모리 내용을 읽거나 쓸 수 있다. 그 결과, 공격자는 취약한 프로세스의 권한을 취득하여 임의의 코드를 실행할 수 있다.

메모리 버퍼오버플로우(출처: 소프트웨어 보안약점 진단 가이드 2021, 행정안전부·KISA)

 

 

나. 설계시 고려사항

 

① C나 C++같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계설정 또는 검사를 반드시 수행해야 한다.

  →  실행되는 시스템 Non-executable Stack, 랜덤스택(ASLR), 스택가드(StackGuard)와 같은 메모리 보호 정책이 적용되도록 해야 하며, 구현단계에 안전한 함수사용법에 대한 설명과 메모리 사용 시 경계값을 검사하고 사용할 수 있도록 시큐어코딩 규칙을 정의하여 개발자들이 준수할 수 있도록 한다.

 

 개발시, 메모리 버퍼 오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 해야 한다.

  →  메모리 버퍼오버플로우 취약성을 가지고 있는 함수들을 식별하여 개발자들이 해당 함수를 사용하지 않고 안전한 함수를 사용할 수 있도록 시큐어코딩 규칙을 정의하고 개발자가 준수할 수 있도록 한다.

 

다. 진단 세부사항

 

 ① C나 C++ 같이 메모리를 프로그래머가 관리하는 플랫폼을 사용하는 경우 메모리 버퍼의 경계값을 넘어서 메모리를 읽거나 저장하지 않도록 경계 설정 또는 검사를 반드시 수행해야 한다. 설계산출물을 검토하여 배열의 값을 다른 배열로 복사하여 넣는 경우 길이 검사 수행 방식이나 공통 함수가 설계되어 있는지 확인한다.

  ㅇ  리눅스 환경에서 ASLR(Address Space Layout Randomization), StackGuard와 같은 메모리 보호를 위한 설정을 사용하도록 설계되어 있는지 확인

  ㅇ  배열의 값을 다른 배열로 복사하여 넣는 경우, 처리되는 데이터의 길이를 검사하고 사용하도록 코딩규칙을 정의하였는지 확인

  ㅇ  할당된 메모리보다 더 큰 입력값을 사용하여 버퍼오버플로우가 발생되는지 점검할 수 있는 테스트계획의 수립 여부 확인

 

 ② 개발시, 메모리 버퍼오버플로우를 발생시킬 수 있는 취약한 API를 사용하지 않도록 통제해야 한다. 취약한 API를 정의하고 있는지 확인한다.

  ㅇ  메모리 버퍼오버플로우를 발생시킬 수 있는 API를 정의하고 사용하지 않도록 하는 코딩 규칙이 개발가이드에 정의되어 있는지 확인

 

 

끝.