범위 종료 후 스택 메모리 사용

스코프가 끝난 뒤 스택 저장소가 사용됩니다.

설명

지역 변수의 주소가 해당 블록 범위를 벗어난 뒤에도 포인터나 참조를 통해 사용될 때 발생하는 취약점입니다.

잠재적 영향

  • 이미 무효화된 스택 위치를 읽거나 써서 잘못된 데이터 처리나 크래시가 발생할 수 있습니다.
  • 같은 스택 프레임의 다른 값이 오염될 수 있습니다.

해결 방법

  1. 지역 변수의 주소를 블록 밖에서 보관하거나 사용하지 않습니다.
  2. 더 긴 수명이 필요하면 호출자가 소유한 버퍼나 명확한 동적 할당 객체를 사용합니다.
  3. C++에서는 소유권과 수명을 표현할 수 있는 안전한 타입을 우선 사용합니다.

예시

변경 전

c
void run(void) {
    int *p;
    {
        int value = 1;
        p = &value;
    }
    *p = 2;
}

변경 후

c
void run(void) {
    int value = 1;
    int *p = &value;
    *p = 2;
}

설명:

  • 변경 전: value는 내부 블록이 끝난 뒤 더 이상 유효하지 않지만 p로 사용됩니다.
  • 변경 후: 포인터 사용이 대상 변수의 수명 안에서만 이루어집니다.

참조