소프트웨어 개발보안 가이드 분석(2021) : 해제된 자원 사용

해제된 자원 사용이란?

해제된 자원 사용 취약점은 프로그램에서 이미 해제된 메모리나 자원을 참조할 때 발생하는 보안 취약점입니다. 이러한 취약점은 예상치 못한 프로그램 동작이나 시스템의 보안 위협으로 이어질 수 있습니다.

 

공격 메커니즘

해제된 자원 사용 취약점의 공격 메커니즘은 주로 다음과 같습니다

  1. 메모리 조작: 해제된 메모리 영역을 재사용하거나 덮어쓰기를 통해 악의적인 코드 실행이 가능합니다.
  2. 시스템 호출 변조: 해제된 자원을 이용해 시스템 호출을 변조하거나 악의적인 행위를 수행할 수 있습니다.
  3. 데이터 유출: 해제된 메모리에 남아 있는 민감한 정보를 유출할 수 있습니다. 이는 개인 정보 유출로 이어질 수 있습니다.

 

취약한 웹 애플리케이션의 예

다음 코드는 메모리 해제 후 재참조하는 취약한 코드의 예시입니다.

#include <stdlib.h>

int main() {
    int *ptr = (int*)malloc(sizeof(int));    // 메모리를 동적으로 할당
    free(ptr); // 할당받은 메모리 해제
    *ptr = 10; // 이미 해제된 메모리를 참조하여 값을 할당
    return 0;
}

위 코드는 malloc 함수를 사용하여 정수형 변수 하나의 크기만큼 메모리를 동적으로 할당한 후, free 함수를 사용하여 할당받은 메모리를 해제합니다. 그런 다음, 이미 해제된 메모리 영역에 접근하여 값을 할당하려고 합니다. 이러한 행위는 이미 해제된 메모리 영역을 참조하게 되어 예기치 않은 결과나 시스템의 보안 취약점으로 이어질 수 있습니다.

 

시큐어코딩 적용 방법

이러한 취약점을 방어하기 위해서는 다음고 같은 방법이 있습니다.

  1. NULL 포인터 사용: 메모리 해제 후 포인터를 NULL로 설정하여 잘못된 참조를 방지합니다.
  2. 자원 관리 강화: 프로그램 내에서 사용한 자원을 철저히 관리하며, 해제된 자원을 다시 사용하지 않도록 합니다.

메모리 해제 후 포인터를 NULL로 설정하는 것은 잘못된 메모리 접근을 방지하는 기본적이면서도 중요한 방법입니다.

다음은 코드는 메모리 해체 후 포인터를 NULL로 설정한 코드의 예시 입니다.

#include <stdlib.h>

int main() {
    int *ptr = (int*)malloc(sizeof(int));    // 메모리를 동적으로 할당
    if (ptr != NULL) {
        free(ptr); // 할당받은 메모리 해제
        ptr = NULL; // 포인터를 NULL로 설정
    }
    return 0;
}

해당 코드는 malloc 함수를 사용해 정수형 변수의 메모리를 동적으로 할당합니다. sizeof(int)를 통해 정확한 크기의 메모리 할당을 보장합니다. 할당 후, 메모리가 NULL이 아닌지 확인하여 할당 성공 여부를 검증합니다. 사용이 끝난 메모리는 free 함수로 해제하며, 메모리 누수를 방지하는 핵심 단계입니다. 메모리 해제 후 포인터를 NULL로 초기화해 해제된 메모리 영역을 더 이상 가리키지 않도록 하여 잘못된 메모리 접근을 방지합니다. 이러한 자원 해제 절차는 메모리 관리의 안정성을 높이고, 잠재적인 보안 취약점을 줄이는 데 중요합니다. 동적 메모리 할당과 해제는 프로그램의 효율성과 안정성을 결정짓는 핵심 요소로, malloc과 free 함수 사용 시 주의 깊게 관리해야 합니다.

  • 이전 소프트웨어 개발보안 가이드 분석(2021) : 부적절한 자원 해제
  • 다음 소프트웨어 개발보안 가이드 분석(2021) : 초기화되지 않은 변수 사용