설명
지역 변수의 주소가 해당 블록 범위를 벗어난 뒤에도 포인터나 참조를 통해 사용될 때 발생하는 취약점입니다.
잠재적 영향
- 이미 무효화된 스택 위치를 읽거나 써서 잘못된 데이터 처리나 크래시가 발생할 수 있습니다.
- 같은 스택 프레임의 다른 값이 오염될 수 있습니다.
해결 방법
- 지역 변수의 주소를 블록 밖에서 보관하거나 사용하지 않습니다.
- 더 긴 수명이 필요하면 호출자가 소유한 버퍼나 명확한 동적 할당 객체를 사용합니다.
- 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로 사용됩니다. - 변경 후: 포인터 사용이 대상 변수의 수명 안에서만 이루어집니다.