스택오버플로우 공격 (Stack Overflow Attack)
한 줄 정의: 함수 호출 시 사용되는 스택 영역의 버퍼 경계를 넘어서는 데이터를 입력하여 반환 주소 등 인접 메모리를 덮어써 실행 흐름을 조작하는 공격입니다.
쉽게 풀면
프로그램이 함수를 실행할 때는 임시로 사용할 정보를 스택이라는 정해진 크기의 공간에 차곡차곡 쌓아둡니다. 이 공간에 원래 담아야 할 양보다 훨씬 많은 데이터를 억지로 밀어 넣으면, 넘친 데이터가 옆 칸까지 흘러넘쳐 원래 있던 중요한 정보를 덮어씁니다. 공격자는 이 원리를 이용해 함수가 끝난 뒤 돌아가야 할 주소 정보를 자신이 원하는 값으로 바꿔치기하여 악성 코드를 실행시킬 수 있습니다.
왜 중요한가
스택오버플로우 공격은 오랜 기간 소프트웨어 보안에서 가장 대표적인 메모리 손상 공격으로 다루어져 왔으며, 시스템 및 운영체제 보안 연구에서 방어 기법인 스택 카나리, 주소 공간 배치 난수화 등의 필요성을 설명하는 기본 사례로 사용됩니다.
논문에서는 이렇게 쓰입니다
"경계 검사가 없는 문자열 복사 함수를 사용하는 코드는 스택오버플로우 공격에 취약한 것으로 분석되었다."
취약한 함수 사용과 공격 가능성을 연결짓는 예문입니다.
"스택 카나리와 주소 공간 배치 난수화를 함께 적용한 환경에서는 스택오버플로우 공격의 성공률이 크게 낮아진다."
방어 기법의 효과를 다루는 연구 문맥입니다.
조금 더 깊게 보면
스택오버플로우 공격은 대체로 반환 주소를 덮어써 프로그램의 실행 흐름을 공격자가 지정한 코드로 이동시키는 방식으로 이루어집니다. 이를 방어하기 위해 반환 주소 앞에 무작위 값을 배치해 변조 여부를 검사하는 스택 카나리, 메모리 주소를 실행마다 무작위로 배치하는 주소 공간 배치 난수화, 스택 영역의 코드 실행을 막는 비실행 스택 등의 기법이 함께 연구됩니다.
주의할 점
현대의 컴파일러와 운영체제는 여러 방어 기법을 기본 적용하고 있어 단순한 스택오버플로우 공격은 성공 가능성이 낮아졌지만, 방어 기법의 우회 기법도 함께 연구되고 있어 완전히 해결된 문제는 아닙니다.