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