버퍼 오버플로우 공격 (Buffer Overflow Exploitation)
쉽게 풀면
버퍼는 데이터를 담기 위해 미리 정해둔 크기의 그릇과 같습니다. 그런데 그릇에 담을 수 있는 양보다 더 많은 물을 부으면 넘쳐서 옆에 있는 다른 그릇까지 오염시킬 수 있습니다. 버퍼 오버플로우 공격은 프로그램이 정해둔 메모리 공간보다 훨씬 긴 데이터를 일부러 입력해서, 그 옆에 있던 다른 중요한 정보(예: 함수가 다음에 실행할 위치를 가리키는 값)를 덮어써버리는 방식입니다. 공격자는 이 넘친 부분에 자신이 원하는 값을 채워 넣어 프로그램이 자신이 의도한 코드를 실행하게 만들 수 있습니다.
왜 중요한가
버퍼 오버플로우는 수십 년 전부터 보고된 매우 오래된 취약점 유형이지만, C나 C++처럼 메모리를 직접 다루는 언어로 작성된 소프트웨어에서 여전히 반복적으로 발견되고 있습니다. 원격 코드 실행이나 시스템 장악으로 이어질 수 있는 파급력 때문에 정보보안학에서 취약점 분석과 완화 기법 연구의 기본 사례로 지속적으로 다뤄집니다.
논문에서는 이렇게 쓰입니다
함수 실행이 끝난 뒤 돌아갈 주소값을 덮어써서 공격자가 원하는 코드가 실행되도록 유도하는 전형적인 공격 방식을 설명하고 있습니다.
메모리 손상을 조기에 감지하는 보호 장치가 있으면 이런 공격이 성공하기 더 어려워진다는 실험 결과를 나타냅니다.
조금 더 깊게 보면
버퍼 오버플로우는 발생 위치에 따라 스택 오버플로우와 힙 오버플로우로 나뉘며, 각각 공격 기법과 방어 방식이 조금씩 다릅니다. 이를 막기 위한 완화 기법으로는 스택 카나리, 주소공간배치 무작위화(ASLR), 데이터 실행 방지(DEP/NX) 등이 있으며, 이런 방어를 우회하기 위해 return-to-libc나 ROP(Return-Oriented Programming) 같은 고급 공격 기법도 함께 연구되어 왔습니다.
주의할 점
여러 완화 기법이 널리 적용되면서 단순한 형태의 버퍼 오버플로우 공격은 성공하기 어려워졌지만, 이는 위협이 사라졌다는 뜻이 아니라 공격 기법이 더 정교해졌다는 의미로 이해해야 합니다.