피드로 돌아가기
Ghost in the Stack (Part 1): Why uninitialized variables remember old data
Dev.toDev.to
Security

Stack Frame 재사용으로 인한 Uninitialized Variable 데이터 잔존 분석

Ghost in the Stack (Part 1): Why uninitialized variables remember old data

Chisom2026년 5월 23일4intermediate

Context

C 언어의 지역 변수 미초기화 시 이전 함수 호출의 데이터가 출력되는 Undefined Behaviour 현상 분석. Stack Pointer 이동만으로 메모리를 해제하는 구조적 특성으로 인한 잔류 데이터 노출 문제 발생.

Technical Solution

  • Function Return 시 Stack Frame 내 데이터를 명시적으로 삭제하지 않는 컴파일러 최적화 전략 채택
  • Stack Pointer(%rsp) 조작을 통한 메모리 영역 가용 상태 전환으로 연산 오버헤드 제거
  • 후속 함수 호출 시 이전 함수와 동일한 Stack Offset(-0x4, -0x8, -0x4 등)을 할당하는 메모리 재사용 구조
  • 초기화되지 않은 변수 참조 시 해당 Offset에 잔존하는 이전 메모리 바이트를 그대로 로드하는 동작 원리
  • 성능 향상을 위해 메모리 Zeroing 과정을 생략한 Low-level 메모리 관리 방식 적용

- 지역 변수 선언 시 반드시 명시적 초기화 수행하여 Undefined Behaviour 방지 - 보안 민감 데이터 처리 후에는 memset 등으로 Stack 영역을 강제 삭제하는 Zeroing 로직 검토 - 컴파일러 최적화 레벨(-O0 vs -O2)에 따른 Stack Layout 변경 및 변수 생존 주기 차이 확인

원문 읽기