ClickCease Linux Kernel의 메모리 손상 취약점 가이드

콘텐츠 표

인기 뉴스레터 구독하기

4,500명 이상의 Linux 및 오픈소스 전문가와 함께하세요!

한 달에 두 번. 스팸이 없습니다.

Linux Kernel의 메모리 손상 취약점 가이드

로한 티말시나

2023년 5월 22일 TuxCare 전문가 팀

사이버 공격은 주로 금전적 이득을 목적으로 이루어지기 때문에 공격자는 지속적으로 데이터에 액세스하기 위한 새로운 기술을 개발하게 됩니다. 이러한 공격의 빈도와 복잡성이 지속적으로 증가하고 있음에도 불구하고 메모리 손상 취약성은 40년 동안 지속되어 온 주요 문제로 남아 있습니다. 

관리자는 메모리 손상에 대한 이해를 활용하여 사이버 공격자로부터 인프라를 적극적으로 보호할 수 있습니다. 이 가이드는 관리자가 취약점 악용 시 메모리 손상과 그 여파를 이해하는 데 필요한 지식을 제공하는 것을 목표로 합니다. 

 

Linux Kernel 취약성이란 무엇인가요?

Linux Kernel은 다양한 메모리 문제에 취약합니다. 다음과 같은 메모리 기반 취약점은 공격자들이 집중적으로 노리는 취약점이며, 매달 발표되는 많은 보안 패치의 기반이 됩니다. 특정 취약점에 왜 중요한 패치가 필요한지 궁금한 적이 있다면 이러한 문제로 인해 심각한 데이터 유출이 발생할 수 있습니다.

 

버퍼 오버플로

버퍼 오버플로는 개발자가 변수에 데이터를 할당하기 전에 변수의 유효성을 검사하지 않을 때 발생합니다. 데이터가 변수의 정의된 용량을 초과하면 '오버플로'가 발생하여 공격자가 인접한 메모리 공간에 자신의 코드를 삽입할 수 있게 됩니다. 적절한 데이터 유효성 검사를 수행하지 않으면 버퍼 오버플로로 인해 공격자가 루트 액세스 권한을 얻거나 원격 코드를 실행할 수 있게 될 수 있습니다.

Linux는 C로 작성되었기 때문에 버퍼 오버플로우 공격에 취약하지 않은 Python이나 Java와 같은 다른 프로그래밍 언어와 달리 버퍼 오버플로우에 취약합니다.

CVE-2023-0179 는 버퍼 오버플로 취약점의 예시입니다. 이 문제로 인해 스택 주소와 힙 주소가 모두 유출될 수 있으며, 임의의 코드 실행을 통해 루트 사용자에게 로컬 권한 상승이 허용될 수 있습니다.

 

정수 오버플로

개발자는 사용되는 데이터 유형에 따라 정수 변수에 저장할 수 있는 최대값을 정의합니다. 예를 들어 32비트 부호 없는 정수 변수는 0에서 4,294,967,295 사이의 값을 저장할 수 있는 반면, 부호 있는 정수는 -2,147,483,648에서 2,147,483,647 사이의 값을 저장할 수 있습니다. 그러나 코드에서 변수의 최대 한도를 초과하는 값을 추가하면 '오버플로'가 발생하여 예기치 않은 결과가 발생합니다. 

예를 들어 2,147,483,647이라는 값을 저장하는 변수에 1을 더하려고 하는 문은 음수 값인 -2,147,483,648을 반환합니다. 마찬가지로 음수 정수가 오버플로되면 양수가 됩니다. 부호 없는 정수에 대한 동작은 사용되는 프로그래밍 언어에 따라 다르지만 C 언어의 경우 결과를 예측할 수 없는 경우가 많습니다.

CVE-2022-0998 은 Linux Kernel의 가상 장치 드라이버 코드에서 발견된 정수 오버플로 취약점입니다. 로컬 사용자는 이 결함을 사용하여 시스템을 충돌시키거나 잠재적으로 시스템에 대한 권한을 상승시킬 수 있습니다.

 

메모리 손상

개발자와 서버 관리자는 종종 Linux Kernel의 메모리 손상이 까다로운 문제라는 것을 알게 됩니다. 이러한 손상은 예측할 수 없는 동작으로 이어질 수 있으며, 경우에 따라서는 오류가 발생하지 않을 수도 있습니다. 이 문제는 개발자가 의도치 않게 메모리의 데이터를 변경하거나 데이터가 저장된 특정 메모리 위치를 가리키는 포인터를 수정할 때 발생합니다. 

CVE-2023-1073 는 Linux Kernel의 휴먼 인터페이스 장치(HID) 하위 시스템에서 발견된 메모리 손상 취약점의 예입니다. 로컬 공격자는 이 결함을 사용하여 시스템을 충돌시키거나 잠재적으로 시스템 내 권한을 상승시킬 수 있습니다.

서비스 거부

분산 서비스 거부(DDoS) 공격은 공격자가 여러 대의 하이재킹된 디바이스를 활용하여 대상에 트래픽을 폭주시켜 서버 다운을 초래하는 것으로 널리 알려져 있습니다. 

그러나 서비스를 방해하는 모든 공격을 서비스 거부(DoS) 공격이라고 합니다. 부적절한 메모리 관리는 리소스 고갈 공격으로 알려진 메모리 기반 DoS 공격을 유발하는 경우가 많습니다. 이러한 취약점은 서버에 존재할 경우 수천 명의 사용자에게 영향을 미치는 심각한 서비스 충돌로 이어질 수 있습니다.

CVE-2023-1390 은 Linux Kernel의 TIPC Kernel 모듈에서 발견된 원격 서비스 거부 취약점의 예시입니다. 이 결함으로 인해 원격 공격자는 서비스 거부를 일으킬 수 있습니다.

 

NULL 포인터 역참조

C 프로그래밍에서 포인터는 값 자체가 아니라 값의 메모리 주소를 저장하는 변수입니다. 이를 통해 개발자는 해당 위치에 연결된 변수가 범위를 벗어난 경우에도 특정 메모리 위치에 저장된 값을 조작할 수 있습니다. 

NULL 포인터 역참조는 애플리케이션이 유효하다고 가정하지만 실제로는 NULL인 포인터를 통해 메모리 위치에 액세스하려고 할 때 발생합니다. 이로 인해 애플리케이션이 예기치 않게 충돌하거나 종료될 수 있습니다.

CVE-2022-47929 는 Linux Kernel의 네트워크 큐 규율 구현에서 발견된 NULL 포인터 역참조 취약점입니다. 이 취약점으로 인해 로컬 공격자는 서비스 거부(시스템 충돌)를 일으킬 수 있습니다.

 

초기화 전 사용

함수에서 변수를 사용하여 데이터를 수정하거나 생성할 때는 먼저 변수 자체를 값으로 초기화해야 합니다. 변수에 값이 할당되지 않으면 초기화되지 않은 것으로 간주되어 프로그램에서 참조할 때 정의되지 않은 동작이 발생합니다.

초기화되지 않은 데이터의 정의되지 않은 동작은 C 컴파일러가 오류를 진단하거나 던질 필요가 없기 때문에 감지하기 어렵습니다. 대부분의 개발자는 테스트 또는 퍼징 도구를 사용하여 정의되지 않은 오류 문제를 일으킬 수 있는 초기화되지 않은 데이터를 식별합니다.

CVE-2022-29968 는 Linux Kernel에서 발견된 사용 전 초기화 취약점의 예시로, io_uring 서브시스템에서 kiocb->private의 초기화가 누락되어 있습니다. 이 결함으로 인해 로컬 공격자는 민감한 정보(Kernel 메모리)를 노출할 수 있습니다.

 

가장 위험한 메모리 취약점은 무엇인가요?

매년 MITRE는 가장 위험한 소프트웨어 취약점 상위 25개 보고서. 이 보고서에는 웹 기반 공격이 포함되어 있지만 가장 일반적이고 위험한 메모리 취약점 3가지는 다음과 같습니다:

  • 버퍼 오버플로
  • 버퍼 오버플로로 이어지는 정수 오버플로
  • 포인터 역참조(포인터 검사 누락)

세 가지 취약점 모두 심각한 데이터 유출로 이어질 수 있습니다. 메모리 손상 취약점은 지금까지 발생한 가장 큰 데이터 유출 사고의 원인이었습니다. 최근 인텔리전스 보고서의 최근 인텔리전스 보고서 에 따르면 공격의 약 72%가 애플리케이션별 및 웹 애플리케이션 공격이라는 사실이 밝혀졌습니다. 오픈 소스 프로그램은 종속 코드에 포함되거나 주요 애플리케이션 자체로 사용되는 경우가 많기 때문에 공격자는 코드의 문제를 식별하고 취약점을 악용하는 익스플로잇을 만들 수 있습니다.

보고서의 세 번째 흥미로운 통계는 공격의 21%가 기술 부문을 표적으로 삼는다는 것입니다. 기술 부문에서는 민감한 정보를 저장, 네트워크 연결, 보호 및 전송해야 합니다. 공격자는 이 부문에 집중함으로써 데이터를 저장하는 인프라에 액세스하고 이를 은밀하게 악용하여 회사를 수개월 동안 노출시킬 수 있습니다.

 

메모리 손상 취약점을 어떻게 식별하나요?

메모리 손상은 일반적으로 개발자 오류로 인해 발생하지만, 단일 컴퓨터에서 여러 애플리케이션이 실행되는 시나리오에서는 어떤 애플리케이션이 문제를 일으키는지 식별하기가 어려울 수 있습니다. Linux에서 오류를 식별하는 한 가지 방법은 운영 체제에서 문제를 감지하는 시스템 로그를 확인하는 것입니다. 

예를 들어 Linux는 BIOS를 위해 처음 64KB의 메모리를 예약하며, 이 메모리 공간에 대한 모든 수정 사항은 운영 체제에서 검사합니다. Linux에서 이 예약 메모리에 대한 변경 사항을 감지하면 관리자가 문제를 해결할 수 있도록 경고를 기록합니다.

Linux는 오픈 소스 운영체제이기 때문에 연구자들이 메모리 기반 취약점을 많이 보고하고 있습니다. 최근에 발견된 취약점 중 하나는 "BleedingTooth" 취약점으로, 공격자가 대상 시스템의 bd 주소를 가지고 있으면 시스템을 충돌시켜 서비스 거부(DoS)를 유발하고 권한을 상승시키며 암호화 키에 액세스할 수 있게 됩니다.

보안 연구원은 코드를 주의 깊게 검토하고 퍼징과 같은 스캔 도구를 사용하여 개발자에게 보고할 수 있는 오류를 트리거하는 등 다양한 도구와 기법을 사용하여 소프트웨어의 버그를 찾습니다. 취약점을 파악한 후 개발자는 코드를 패치하고 문제를 해결하기 위한 보안 업데이트를 릴리스합니다.

 

메모리 손상은 어떻게 해결하나요?

다행히 Linux는 Kernel 주소 공간 레이아웃 무작위화, 제어 흐름 무결성, Kernel 페이지 테이블 격리 등 메모리 손상을 방지하는 데 도움이 되는 여러 보안 기능을 구현하고 있습니다. 그러나 이러한 완화 기능에도 불구하고 운영 체제와 그 종속성은 여전히 공격에 취약합니다.

완화 기술은 발견된 취약점에 따라 다르지만 임시 해결책에는 종종 중요한 구성 요소를 비활성화하는 것이 포함됩니다. 예를 들어, 하트블리드 사고 당시 관리자는 클라이언트와 서버 간의 통신을 위해 OpenSSL에서 사용되는 하트비트를 비활성화할 수 있었습니다. 이렇게 하면 일시적으로 문제가 해결되었지만 서버의 하트비트 신호가 필요한 모든 애플리케이션에서 충돌이나 서비스 거부와 같은 예기치 않은 결과가 발생했을 것입니다.

그러나 일시적인 완화 기술은 영구적이지 않으며, 취약점 악용을 영구적으로 차단하려면 패치를 적용해야 합니다. 보안 패치는 코드를 업데이트하지만 시스템을 재부팅해야 하므로 다운타임이 발생합니다. 따라서 시스템 관리자는 유지보수 기간이 확보될 때까지 취약점 패치를 미루는 경우가 많으며, 이로 인해 현재까지 가장 심각한 데이터 유출 사고가 발생하기도 합니다.

 

메모리 손상 취약점으로부터 인프라를 보호하는 방법은 무엇인가요?

관리자는 개발자의 자비에 맡겨져 있기 때문에 공격자를 막기 위해 올바른 조치를 취하는 것이 중요합니다. 코드를 제어할 수는 없지만 관리자는 올바른 조치를 취하여 네트워크의 공격 표면을 최소화하고 다음 공격 대상이 되지 않도록 할 수 있습니다. 다음은 관리자가 메모리 기반 공격을 막을 수 있는 몇 가지 방법입니다:

  • 정기적으로 취약성 검사를 실행하세요. 취약점 스캔은 이미 공개적으로 보고된 문제를 포함하여 문제를 식별합니다. 취약점이 발견되면 패치를 설치할 수 있습니다.
  • 타사 애플리케이션을 프로덕션 서버로 승격하기 전에 철저한 테스트를 수행하세요.
  • 사용 KernelCare의 실시간 패치 적용 를 사용하여 재부팅할 필요 없이 최신 보안 패치를 빠르게 적용하세요.

 

결론

메모리 기반 취약점을 탐지하는 것은 어려운 일이며, 오류에 대한 최적의 보호 기능을 제공하려면 즉각적인 패치가 중요합니다. KernelCare Enterprise 는 관리자가 패치를 지연할 필요가 없는 실시간 패치 서비스를 제공합니다. 가동 중단이나 중단 없이 다양한 버전의 Linux에 자동으로 패치를 적용하여 유지보수 기간을 기다리는 동안 중요한 인프라가 취약성에 노출되지 않도록 보장합니다.

요약
Linux Kernel의 메모리 손상 취약점 가이드
기사 이름
Linux Kernel의 메모리 손상 취약점 가이드
설명
이 블로그 게시물을 읽고 메모리 손상 취약점의 위협과 그 원인, 시스템을 보호하는 방법에 대해 알아보세요.
작성자
게시자 이름
TuxCare
게시자 로고

Kernel 재부팅, 시스템 다운타임 또는 예정된 유지 보수 기간 없이 취약성 패치를 자동화하고 싶으신가요?

TuxCare로 라이브 패치에 대해 알아보기

TuxCare 게스트 작가 되기

시작하기

메일

가입

4,500

Linux & 오픈 소스
전문가!


뉴스레터 구독하기