시스템에 대한 버퍼 오버플로 공격 식별, 완화 및 방지
버퍼 오버플로 취약점은 여전히 사이버 범죄자들이 컴퓨터 시스템에 불법적으로 액세스하는 일반적인 경로입니다. 버퍼 오버플로 취약점이 매년 꾸준히 증가함에 따라 문제도 커지고 있습니다.
이는 오래된 문제이기도 합니다. 잘 모르실 수도 있지만 버퍼 오버플로 공격은 가장 오래된 공격 벡터 중 하나입니다. - 버퍼 오버플로 는 1972년에 보안 침해 위험으로 처음 확인되었습니다..
하트블리드와 같은 심각한 사례를 포함하여 알려진 버퍼 오버플로 취약점이 수만 개에 달하기 때문에 개발자와 시스템 관리자는 버퍼 오버플로 공격을 탐지, 완화하고 예방하는 방법을 잘 파악하고 있어야 합니다.
버퍼 오버플로 공격이 무엇인지, 그리고 이러한 위협을 막기 위해 조직이 할 수 있는 일은 무엇인지 알아보세요.
버퍼 오버플로 공격이란 무엇인가요?
먼저 컴퓨터 소프트웨어 측면에서 버퍼가 무엇인지 이해해야 합니다. 버퍼는 데이터를 저장하는 영역으로, 프로그램이 실행되는 동안 데이터가 보관되는 임시 저장 영역입니다. 애플리케이션을 포함한 상호 연결된 시스템이 항상 동기화되어 있지 않기 때문에 버퍼가 필요합니다.
즉, 한 지점에서 다른 지점으로 정보를 전송할 때 수신자가 준비되지 않아 정보가 어딘가에서 대기해야 하는 경우가 있습니다. 이것이 바로 버퍼가 사용되는 이유입니다: 버퍼는 조정을 지원합니다. 이는 두 지점이 서로 다른 속도로 작동하거나 우선순위가 다르기 때문일 수 있습니다.
버퍼 오버플로 이해하기
컴퓨터 메모리는 유한하므로 프로그래머는 버퍼 크기를 포함하여 저장 공간을 유한한 크기로 정의해야 합니다. 예를 들어, 프로그래머는 8자 비밀번호를 8바이트로 저장하기 위해 버퍼를 정의합니다. 비밀번호가 작성되어 버퍼로 전송될 때 비밀번호의 길이가 8자를 넘지 않으므로 버퍼에 맞는다고 가정합니다.
버퍼 오버플로는 8자 비밀번호 대신 10자 비밀번호가 버퍼로 전송될 때 발생합니다. 이 경우 컴퓨터 프로그램은 데이터를 어딘가에 강제로 보관해야 하며, 그 결과 초과 데이터가 다른 버퍼에 저장됩니다. 경우에 따라 추가 두 문자가 중요한 데이터나 프로그램 코드를 덮어쓰는 어딘가에 저장될 수 있습니다.
물론 프로그래머는 버퍼 길이를 초과하는 입력을 확인하도록 코드를 설계하거나 다양한 완화 도구를 사용하여 이러한 일이 발생하지 않도록 방지해야 합니다. 그러나 프로그래머가 입력이 항상 버퍼 크기와 일치할 것이라는 가정에만 의존하는 경우 버퍼 오버플로 취약점이 발생할 수 있으며, 이는 버퍼 오버플로 공격으로 이어질 수 있습니다.
버퍼 오버플로 공격의 작동 방식
간단히 말해서, 버퍼 오버플로 공격에서 해커는 의도적으로 버퍼 크기를 초과하는 데이터를 버퍼 크기를 초과하는 데이터를 버퍼에 기록하여 - 버퍼 오버플로를 유발합니다. 애플리케이션을 다운시키거나 악성 데이터(실행 코드 포함)를 원하는 데이터 저장 공간에 쓰기 위한 의도일 수 있습니다.
예를 들어, 공격자가 버퍼 오버플로를 올바르게 조정하면 실행 코드가 있는 표적 공간에 악성 코드를 작성한 다음 자신의 코드를 실행할 수 있습니다. 마찬가지로 해커는 버퍼 오버플로를 사용하여 버퍼 데이터를 덮어쓰고 프로그램의 동작을 변경할 수 있습니다.
버퍼 오버플로 공격에는 기본적으로 두 가지 유형이 있습니다:
- 스택 버퍼 오버플로 공격 은 가장 일반적인 유형의 버퍼 오버플로 공격으로, 프로그램 실행 중에 사용되는 스택 메모리를 덮어쓰는 것을 포함합니다. 해커는 버퍼에 과도한 데이터를 기록함으로써 거의 항상 그 옆에 있는 버퍼의 데이터를 손상시키는 데 성공합니다.
- 힙 오버플로 는 해커가 프로그램에 할당된 메모리 공간을 현재 실행 중인 작업에 사용되는 것보다 더 많이 채우려고 시도하는 공격과 관련이 있습니다. 이는 실행 중인 애플리케이션이 내부 구조를 덮어쓰는 방식으로 데이터를 손상시킵니다.
이 두 가지 공격 전략은 모두 시스템 손상, 데이터 손실, 서비스 중단으로 이어질 수 있습니다.
버퍼 오버플로 공격의 위험은 무엇인가요?
버퍼 오버플로는 수많은 공격 벡터 중 하나일 뿐이며, 그 의도는 다른 많은 취약점 익스플로잇과 겹칩니다.
버퍼 오버플로 공격으로 원격 코드 실행이 너무 어려운 경우에도 해커는 버퍼 오버플로를 사용하여 단순히 애플리케이션 충돌 및 서비스 거부(DoS) 상태를 유발하여 다른 결과를 초래할 수 있다는 점에 유의할 필요가 있습니다.
또한 버퍼 오버플로 공격은 최종 목표가 원격 코드 실행, 권한 상승 등 훨씬 더 복잡한 공격 계획의 첫 단계에 불과한 경우가 많다고 주장할 수 있습니다.
물론 버퍼 오버플로 공격에는 고유한 특성이 있지만 일반적으로 해커는 다음 목적 중 하나를 달성하기 위해 버퍼 오버플로 공격을 사용할 것으로 예상할 수 있습니다:
- 서비스 중단: 해커는 버퍼 오버플로 공격을 사용하여 서비스 중단을 일으킬 수 있습니다. 버퍼 오버플로 취약점을 사용하여 애플리케이션을 충돌시켜 애플리케이션이 지원하는 서비스를 중단시키는 것은 비교적 쉽습니다.
- 무단 액세스: 악의적인 공격자는 버퍼 오버플로 취약점을 사용하여 컴퓨팅 인프라에 불법적으로 액세스할 수 있으며, 이는 무한한 침해의 문을 열어줄 수 있습니다.
- 코드 실행: 버퍼 오버플로 공격을 통해 공격자가 범죄 이득을 위해 작성한 코드를 실행하기 위해 시스템을 사용할 수 있습니다.
- 데이터 손실: 버퍼 오버플로 공격은 애플리케이션 동작을 조작하여 데이터를 빼돌린 다음 출력을 리디렉션하고 데이터 흐름을 불법적으로 캡처하는 데 사용될 수 있습니다.
크게 보면 버퍼 오버플로 취약점의 위험은 대부분의 취약점과 유사하며, 그 심각성 역시 마찬가지입니다.
버퍼 오버플로 취약점의 실제 사례
이 글의 서두에서 버퍼 오버플로 취약점이 1972년에 처음 발견되었다는 사실을 언급했습니다. 얼마 지나지 않아 공격에 성공한 사례도 있었지만, 50여 년 전의 컴퓨팅 세계는 지금처럼 널리 퍼져 있거나 노출된 상태는 아니었습니다.
광범위한 버퍼 오버플로 공격의 첫 번째 주요 사례는 모리스 웜입니다. 1988년, 이 웜은 초기 인터넷을 통해 이동하여 단 이틀 만에 당시 '인터넷'의 10%를 다운시켰습니다. 이 컴퓨터 웜은 2년에 걸쳐 6만 대의 컴퓨터에 영향을 미쳤습니다.
가장 널리 알려진 버퍼 오버플로 취약점은 아마도 하트블리드일 것입니다. 이 취약점은 2014년에 널리 사용되는 소프트웨어의 심각한 취약점으로 드러났습니다: OpenSSL입니다. 야후와 같은 유명 기업에서 운영하는 수많은 인터넷 서버가 OpenSSL 암호화 라이브러리를 사용하여 TLS(전송 계층 보안) 프로토콜을 구현했습니다.
이 버퍼 오버플로 취약점 역시 단순한 오류로 인해 발생했습니다. 이 취약점은 OpenSSL의 컴퓨터 코드에서 바운드를 확인하지 않는 전형적인 오류였습니다. 물론 OpenSSL은 결국 패치를 통해 수정되었지만 를 통해 수정되었지만, 이 취약점으로 인해 광범위한 경보와 피해(.
이러한 위험은 인터넷의 기술적 구석에만 국한되지 않습니다. 인기 채팅 앱인 WhatsApp은 2019년 5월에 CVE-2019-3568로 신고된 버퍼 오버플로 취약점을 가지고 있습니다. 이 경우 공격자는 음성 통화가 시작될 때 패킷을 조작하여 사용자의 모바일 디바이스에서 악성 코드를 실행하는 데 이 취약점을 사용할 수 있었습니다.
다른 예로는 다음과 같은 것들이 있습니다:
- 2010년의 스턱스넷 웜: 이란 핵 프로그램을 표적으로 삼은 이 공격은 Windows 운영 체제의 버퍼 오버플로 취약점을 악용했습니다.
- 2014년 소니 픽처스 해킹 사건: 공격자는 회사 네트워크에서 버퍼 오버플로 익스플로잇을 사용하여 민감한 정보에 액세스하고 광범위한 혼란을 야기했습니다.
- 2017년 5월 워너크라이 랜섬웨어 공격: 이 공격은 Microsoft Windows의 버퍼 오버플로 취약점을 악용하여 150개국에서 20만 대 이상의 컴퓨터에 영향을 미쳤습니다.
- 2020년 12월 솔라윈즈 공급망 공격: 공격자는 SolarWinds Orion 네트워크 관리 소프트웨어의 버퍼 오버플로 익스플로잇을 사용하여 여러 조직의 네트워크에 액세스했습니다.
- 2021년 11월 Zscaler 제로데이 익스플로잇: 이 공격은 버퍼 오버플로 취약점을 사용하여 임의의 코드를 실행함으로써 지스케일러의 클라우드 기반 보안 서비스에 영향을 미쳤습니다.
버퍼 오버플로 공격 완화 및 방지
시간이 지남에 따라 버퍼 오버플로우 환경이 조금씩 변화하여 가장 기본적인 버퍼 오버플로 위험은 이제 자동으로 완화되고 있습니다. OS 및 소프트웨어 공급업체와 프로그래머는 근본적인 취약점이 있는 경우에도 버퍼 오버플로를 제한하는 관행을 구현하는 경향이 있습니다.
소프트웨어 공급업체와 소프트웨어 사용자 모두 버퍼 오버플로 위험을 인지하고 적절히 대응해야 합니다. 하지만 버퍼 오버플로 공격으로부터 환경을 보호하기 위해 사용자가 할 수 있는 일은 제한적입니다. 소프트웨어를 안전하게 프로그래밍하고 필요할 때 신속하게 패치를 적용하는 것은 공급업체의 몫입니다.
공급업체 측의 예방
버퍼 오버플로 취약성을 방지할 책임은 궁극적으로 소프트웨어 공급업체에 있습니다. 버퍼 제약을 악용할 수 있는 기회가 존재하는지 여부는 종종 소프트웨어의 소프트웨어의 특성.
사용하는 프로그래밍 언어의 한계와 그 언어에 내재된 위험을 인식하는 것만큼이나 간단할 수 있습니다: C와 C++에는 버퍼 오버플로우에 대한 보호 기능이 내장되어 있지 않은 반면, Java, PERL, C#에는 몇 가지 안전 메커니즘이 마련되어 있습니다.
다음은 공급업체가 취할 수 있는 몇 가지 구체적인 접근 방식입니다:
- 가정을 조심하세요: 프로그래머는 애플리케이션의 작동과 관련하여 특정 사실을 가정할 수 있지만 공격자는 이러한 가정을 악용할 수 있습니다. 따라서 프로그래머는 가정을 위반할 수 있다는 점을 염두에 두고 코딩해야 합니다. 입력이 버퍼 크기를 초과하지 않는지 확인하는 바운드 검사가 대표적인 예입니다.
- 주소 공간 레이아웃 무작위화(ASLR): 많은 버퍼 오버플로 공격은 주소 공간의 위치에 대한 지식에 의존합니다. 주소 공간의 레이아웃을 무작위로 변경하면 대상 위치가 지속적으로 무작위로 이동하기 때문에 버퍼 오버플로우를 조정하기가 더 어려워집니다.
- 실행 제한: 스택을 실행 불가능한 것으로 구성하면 공격자가 버퍼 오버플로를 사용하여 스택에서 악성 코드를 실행할 수 없습니다.
- 프로그래밍 오류를 피하세요: 버퍼 오버플로 기회는 대부분 특정 컴퓨터 코드에 기인하는 경우가 많습니다. 프로그래머는 양심적으로 행동하고 공격자가 악용할 수 있는 오류를 범하지 않아야 합니다.
위의 사항을 통해 버퍼 오버플로 공격의 위험을 완화할 수 있지만 궁극적으로 실수는 불가피하게 발생합니다.
사용자 측면에서의 완화
버퍼 오버플로 공격으로부터 소프트웨어를 강화하기 위해 공급업체가 활용할 수 있는 옵션에 대해 논의하면서 한 가지 중요한 점을 남겼습니다. 버퍼 오버플로 취약점은 소프트웨어가 이미 배포된 후에야 발견되는 경우가 많다는 점입니다.
이 시나리오는 드문 일이 아니며 일반적으로 취약점이 발견될 때 발생하는 상황을 반영합니다. 공급업체가 버퍼 오버플로 취약점을 수정하는 패치를 릴리스하고 최종 사용자가 패치를 설치하여 취약점을 완화하는 간단한 해결책이 있습니다.
최종 사용자가 버퍼 오버플로 취약성으로부터 워크로드를 보호하려는 동기가 있는 경우, 가장 효과적인 방법은 항상 정기적이고 일관된 패치 적용입니다. 그러나 패치는 업무 중단과 리소스 집약적일 수 있기 때문에 효과적인 패치 적용은 말처럼 쉬운 일이 아닙니다.
KernelCare와 같은 도구를 통해 재부팅 없이 자동화된 패치를 적용하면 와 같은 도구를 통한 자동화된 재부팅 없는 패치는 리소스 요구 사항을 줄이고 서버 중단을 방지하는 데 도움이 됩니다. 하지만 버퍼 오버플로 취약점이 알려지지 않았거나 효과적인 패치가 없는 경우도 있습니다. 사용자가 사용할 수 있는 몇 가지 옵션은 다음과 같습니다:
- 비정상적인 동작을 모니터링하세요: 다른 익스플로잇을 주의 깊게 관찰하는 것처럼 서버 및 네트워크 성능과 로그를 면밀히 관찰하여 침입자의 활동을 포착하세요.
- 권한 관리: 공격자는 느슨하게 관리되는 권한과 권한을 이용하는 경우가 많습니다. 애플리케이션과 사용자가 최소한의 액세스 권한으로 운영되도록 하여 공격자가 에스컬레이션할 기회를 갖지 못하도록 하세요.
- 위협 방지 도구: 제로데이 취약점은 빠르게 악용될 수 있지만 웹 애플리케이션 방화벽과 같은 자동화된 도구는 의심스러운 행동 패턴을 모니터링하고 의심스러운 소스로부터의 트래픽을 차단함으로써 일부 공격을 막을 수 있습니다.
마지막으로, 최종 사용자는 OS 및 소프트웨어 공급업체를 신중하게 선택하여 워크로드를 보호할 것을 제안합니다. 소프트웨어 보안과 관련하여 공급업체의 평판은 어떤가요? 취약점이 발견되면 공급업체가 신속하게 패치를 릴리스하나요?
버퍼 오버플로 취약점은 본질적으로 프로그래밍 문제이므로 취약점을 관리하는 것은 공급업체의 몫이며, 최종 사용자는 어떤 공급업체와 협력하는지 신중하게 검토하여 스스로를 보호할 수 있습니다.
마무리
버퍼 오버플로 취약성을 완화할 책임은 궁극적으로 소프트웨어 공급업체에 있습니다. 결국 애플리케이션 코드에 달려 있습니다. 다행히도 공급업체는 보통 버퍼 오버플로를 악용할 수 있는 기회를 제거하는 패치를 배포하는 방식으로 대응합니다.
조직에서는 새로운 패치를 신속하게 도입하는 것이 매우 중요합니다. KernelCare Enterprise와 같은 자동화된 도구는 와 같은 자동화된 도구는 패치 적용의 마찰을 제거하여 도움을 줍니다. 그럼에도 불구하고 다른 사이버 위협과 마찬가지로 기업은 버퍼 오버플로 취약점 및 전반적인 취약점의 위험을 제한하기 위해 더 광범위한 사이버 위생 조치를 구현해야 합니다.