버퍼 오버플로우 공격 (Buffer Overflow Exploitation)

정보보안학
한 줄 정의: 프로그램이 할당한 메모리 공간보다 많은 데이터를 입력받아 인접 메모리를 덮어씀으로써 프로그램의 흐름을 조작하는 공격 기법입니다.

쉽게 풀면

버퍼는 데이터를 담기 위해 미리 정해둔 크기의 그릇과 같습니다. 그런데 그릇에 담을 수 있는 양보다 더 많은 물을 부으면 넘쳐서 옆에 있는 다른 그릇까지 오염시킬 수 있습니다. 버퍼 오버플로우 공격은 프로그램이 정해둔 메모리 공간보다 훨씬 긴 데이터를 일부러 입력해서, 그 옆에 있던 다른 중요한 정보(예: 함수가 다음에 실행할 위치를 가리키는 값)를 덮어써버리는 방식입니다. 공격자는 이 넘친 부분에 자신이 원하는 값을 채워 넣어 프로그램이 자신이 의도한 코드를 실행하게 만들 수 있습니다.

왜 중요한가

버퍼 오버플로우는 수십 년 전부터 보고된 매우 오래된 취약점 유형이지만, C나 C++처럼 메모리를 직접 다루는 언어로 작성된 소프트웨어에서 여전히 반복적으로 발견되고 있습니다. 원격 코드 실행이나 시스템 장악으로 이어질 수 있는 파급력 때문에 정보보안학에서 취약점 분석과 완화 기법 연구의 기본 사례로 지속적으로 다뤄집니다.

논문에서는 이렇게 쓰입니다

"스택 기반 버퍼 오버플로우 공격을 통해 반환 주소를 조작하여 임의 코드 실행을 시도하였다."

함수 실행이 끝난 뒤 돌아갈 주소값을 덮어써서 공격자가 원하는 코드가 실행되도록 유도하는 전형적인 공격 방식을 설명하고 있습니다.

"스택 카나리(stack canary)와 같은 완화 기법이 적용된 환경에서 버퍼 오버플로우 공격의 성공률이 유의미하게 감소하였다."

메모리 손상을 조기에 감지하는 보호 장치가 있으면 이런 공격이 성공하기 더 어려워진다는 실험 결과를 나타냅니다.

조금 더 깊게 보면

버퍼 오버플로우는 발생 위치에 따라 스택 오버플로우와 힙 오버플로우로 나뉘며, 각각 공격 기법과 방어 방식이 조금씩 다릅니다. 이를 막기 위한 완화 기법으로는 스택 카나리, 주소공간배치 무작위화(ASLR), 데이터 실행 방지(DEP/NX) 등이 있으며, 이런 방어를 우회하기 위해 return-to-libc나 ROP(Return-Oriented Programming) 같은 고급 공격 기법도 함께 연구되어 왔습니다.

주의할 점

여러 완화 기법이 널리 적용되면서 단순한 형태의 버퍼 오버플로우 공격은 성공하기 어려워졌지만, 이는 위협이 사라졌다는 뜻이 아니라 공격 기법이 더 정교해졌다는 의미로 이해해야 합니다.

관련 용어