IgnatiusHeo

구현단계 보안약점 제거 기준-해제된 자원 사용 본문

자격/SW보안약점진단원

구현단계 보안약점 제거 기준-해제된 자원 사용

Ignatius Heo 2023. 7. 6. 14:55

작성일: 230706

 

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

 

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

구분 - 코드오류
설계단계  
개요 C언어에서 동적 메모리 관리는 보안 취약점을 유발하는 대표적인 프로그램 결함의 원인이다.

해제한 메모리를 참조하게 되면 예상치 못한 값 또는 코드를 실행하게 되어 의도하지 않은 결과가 발생하게
된다.
진단 세부사항
(설계단계)
 
보안대책
(구현단계)
동적으로 할당된 메모리를 해제한 후 그 메모리를 참조하고 있던 포인터를 참조 추적이나 형 변환, 수식에서의 피연산자 등으로 사용하여 해제된 메모리에 접근하도록 해서는 안된다.
또한, 메모리 해제 후, 포인터에 널(Null)값을 저장하거나 다른 적절한 값을 저장하면 의도하지 않은 코드의 실행을 막을 수 있다.
진단방법
(구현단계)
소스코드 상에 메모리나 파일과 같은 자원을 사용하는 코드를 사용하는지 확인한다.

이 때, 자원을 사용하는 코드의 앞에서 자원의 해제가 발생하면 취약하다고 판단하며, 자원의 해제 후 모든 경우의 제어 흐름이 자원을 사용하는 코드로 도달하지 않을 경우 안전하다고 판단한다. 또한 자원을 참조 하는 포인터변수에 연산 작업을 수행하는 경우 보다 정밀하게 올바른 값을 참조하는지 검사해야 하며, 사용이 완료된 포인터 변수의 초기화가 이루어지는지 확인한다.

 

다. 코드예제

 

ㅇ 분석

1: int main(int argc, const char *argv[]) {
2: char *temp;
3: temp = (char *)malloc(BUFFER_SIZE);
4: ……
5: free(temp);
6: //해제한 자원을 사용하고 있어 의도하지 않은 결과가 발생하게 된다.
7: stmcpy(temp, argv[1], BUFFER_SIZE-1);
8: }

ㅇ 수정

1: int main(int argc,const char *argv[]) {
2: char *temp;
3: temp = (char *)malloc(BUFFER_SIZE);
4: ……
5: //할당된 자원을 최종적으로 사용하고 해제하여야 한다.
6: stmcpy(temp,argv[1], BUFFER_SIZE-1);
7: free(temp);
8: }

ㅇ 분석

1: char *data;
2: int data_type
3: if (data_type==val_1) { free(data); }
4: ……
5: // 이미 해제된 자원을 이중 해제하여 문제가 발생한다.
6: if (data_type==val_2) { free(data); }

ㅇ 내용

1. 해제된 자원을 다시 해제하면 문제가 되나봄...

 

ㅇ 수정

1: char *data;
2: int data_type
3: if (data_type==val_1) {
4: free(data);
5: // 메모리를 해제한 후 항상 포인터에 NULL을 할당하여 이중 해제하더라도 무시되게 한다.
6: data = NULL;
7: }
8: ……
9: if (data_type==val_2) {
10: free(data);
11: // 메모리를 해제한 후 항상 포인터에 NULL을 할당하여 이중 해제하더라도 무시되게 한다.
12: data = NULL;
13: }

ㅇ 내용

1. 해제된 자원에 NULL을 할당

 

 

 

 

끝.