Akamai, LayerX 인수로 모든 브라우저에서 AI 사용 제어 강화. 자세한 정보

XZ Utils Backdoor - 알아야 할 모든 것과 대응 방법

Akamai Wave Blue

에 의해 작성

Akamai Security Intelligence Group

April 01, 2024

CVE-2024-3094는 오픈 소스 라이브러리 XZ Utils에서 발견된 취약점으로, 해당 라이브러리의 관리자가 라이브러리에 푸시한 악성 코드에서 비롯됩니다.
CVE-2024-3094는 오픈 소스 라이브러리 XZ Utils에서 발견된 취약점으로, 해당 라이브러리의 관리자가 라이브러리에 푸시한 악성 코드에서 비롯됩니다.

요약 보고서

  • CVE-2024-3094는 오픈 소스 라이브러리 XZ Utils에서 발견된 취약점으로, 해당 라이브러리의 관리자가 라이브러리에 푸시한 악성 코드에서 비롯됩니다.

  • 이 취약점은 원래 SSH 인증 우회 백도어로 보고되었지만, 추가 분석에 따르면 백도어가 실제로 원격 코드 실행(RCE)을 가능하게 하는 것으로 나타났습니다.

  • 공격자는 약 2년 전부터 XZ 프로젝트에 참여하기 시작했으며, 관리자의 책임이 주어질 때까지 천천히 신뢰를 쌓았습니다. 이러한 장기적인 운영은 일반적으로 국가가 후원하는 공격자들과 비슷하지만, 현재 구체적인 배후는 밝혀지지 않았습니다.

  • 이 백도어는 최신 XZ Utils 릴리스에 영향을 미치므로 손상되지 않은 릴리스로 다운그레이드하는 것이 좋습니다. 이 블로그 게시물에서는 공격의 폭발 반경을 제한할 수 있는 기타 방어 방법을 제안합니다.

백스토리

XZ Utils와 그 기본 라이브러리인 liblzma는 lzma 압축 및 압축 해제를 구축하는 오픈 소스 프로젝트입니다. 많은 Linux 배포판에 기본으로 포함되어 있고, 개발자들에게 매우 인기 있으며 Linux 생태계 전반에서 광범위하게 사용되고 있습니다.

약 2년 전, Jia Tan이라는 이름의 개발자는 해당 프로젝트에 참여해 다양한 버그 수정이나 개선에 대한 풀 리퀘스트를 열기 시작했습니다. 이때까지는 특이 사항이 없었습니다. 오픈소스 세계에서는 보통 이런 식으로 일이 진행되니까요. 이렇게 신뢰와 믿음을 쌓은 Jia Tan은 리포지토리에 대한 권한을 받기 시작해 처음에는 커밋 권한, 나중에는 릴리스 관리자 권한까지 얻게 되었습니다.

권한을 얻기 위한 노력의 일환으로 Jia Tan은 흥미로운 형태의 소셜 엔지니어링을 사용했습니다. 가짜 계정을 사용해 수많은 기능 요청과 버그에 대한 불만을 보내 원래 관리자를 압박했고, 결국 리포지토리에 다른 관리자를 추가해야 하는 상황이 발생했습니다.

Jia Tan은 약 2년간 코드에 기여한 후 2023년 릴리스 5.6.0에 포함된 몇 가지 변경 사항을 XZ에 도입했습니다. 그러한 변경 사항 중에는 정교한 백도어도 포함되어 있었습니다.

백도어

백도어는 상당히 복잡합니다. 우선, xz GitHub 리포지토리에서는 찾을 수 없습니다(현재 비활성화되어 있지만 중요한 것은 아닙니다). 악성 관리자는 탐지를 피하기 위해 백도어의 일부를 공개 Git 리포지토리에 푸시하는 대신, 소스 코드 타르볼 릴리스에만 포함시켰습니다. 이로 인해 백도어의 일부가 상대적으로 숨겨진 채, 종속 프로젝트의 빌드 프로세스에 여전히 사용되고 있었습니다.

백도어는 여러 요소로 구성되어 수차례에 걸쳐 도입되었습니다.

  • 멀웨어로 심볼 확인 기능을 탈취하는 데 사용되도록 빌드 프로세스에 IFUNC 사용

  • 테스트 파일에 숨겨진 난독화된 공유 오브젝트 포함

  • 라이브러리 빌드 프로세스 중에 공유 오브젝트를 추출하는 스크립트 세트 실행(리포지토리가 아닌 릴리스에만 포함되었으나, .gitignore에 추가됨)

  • 프로세스 권한을 제한하는 보안 기능인 랜드록킹 비활성화

실행 체인도 여러 단계로 구성되어 있습니다.

  • 악성 스크립트 build-to-host.m4는 라이브러리의 빌드 프로세스 중에 실행되고 "테스트" 파일인 bad-3-corrupt_lzma2.xz를 Bash 스크립트로 디코딩합니다.

  • 이때 이 Bash 스크립트는 다른 "테스트" 파일인 good-large_compressed.lzma에서 보다 복잡한 디코딩 프로세스를 수행해 다른 스크립트로 디코딩합니다.

  • 그러면 이 스크립트는 공유 오브젝트 liblzma_la-crc64-fast.o를 추출합니다. 이 오브젝트는 liblzma의 컴파일 프로세스에 추가됩니다.

이 과정은 분명 이해하기 어렵습니다. 심층 분석에 도움이 되는 유용한 시각 자료로, 토마스 로키아(Thomas Roccia)인포그래픽을 읽어보시기 바랍니다.

공유 오브젝트 자체는 liblzma로 컴파일되며, 일반적인 함수 이름 확인 프로세스를 대체합니다. 함수 이름은 (모든) 프로세스 로딩 중에 프로세스 메모리의 바이너리 코드를 가리키는 실제 포인터로 확인됩니다. 악성 라이브러리는 함수 확인 프로세스를 방해해 OpenSSH 함수 RSA_public_decrypt의 함수 포인터를 대체할 수 있습니다(그림 1).

그러면 대체된 포인터가 해당 함수가 아닌 자체적인 악성 함수를 가리키게 됩니다. 필리포 발소르다(Filippo Valsorda)가 발표한 연구 결과에 따르면 이 악성 함수는 인증하는 클라이언트가 공격자임을 확인한 후, 그 인증서에서 명령어를 추출하고 실행을 위해 system() 함수로 전달함으로써 인증 전에 RCE를 달성합니다.

악성 라이브러리는 함수 확인 프로세스를 방해해 OpenSSH 함수 RSA_public_decrypt의 함수 포인터를 대체할 수 있습니다(그림 1). 그림 1: liblzma 후킹 프로세스

백도어 부분에 대한 자세한 설명은 안드레스 프룬트(Andres Freund)openwall 관련 게시물을 참조하세요.

발생 가능한 영향

현재 이 백도어는 취약한 머신의 SSH 데몬에 추가되어 원격 공격자가 임의의 코드를 실행할 수 있는 것처럼 보입니다. 즉, SSH를 인터넷에 노출하는 취약한 패키지가 있는 모든 머신이 취약해질 가능성이 있습니다.

이 백도어는 SolarWinds 백도어를 능가하는 가장 중요한 침입 수단 중 하나가 될 뻔했습니다. 공격자는 감염된 배포판을 실행하는 모든 Linux 머신에 즉시 접속할 수 있었고, 여기에는 Fedora, Ubuntu, Debian이 포함됩니다. 이 사태가

일어나지 않도록 막은 사람이 바로 안드레스 프룬트였습니다. 안드레스는 소프트웨어 업데이트 후 발생한 500밀리초 지연 문제를 조사한 후, 이 문제를 xz 패키지로 추적해 결국 백도어를 찾아내는 데 성공했습니다.

정말 많은 우려가 발생할 상황이었지만 운이 좋았습니다. 호기심 많은 엔지니어가 백도어를 발견하지 못했다면 얼마나 오랫동안 활성 상태로 남아 있었을까요?

이전에도 이런 일이 있었다면 어떻게 되었을지도 매우 우려스럽습니다.

탐지 및 방어

버전 관리

CISA(Cybersecurity and Infrastructure Security Agency)에서는 5.4.6 등의 감염되지 않은 버전으로 다운그레이드하는 조치를 권장합니다.

Akamai Guardicore Segmentation Insight에서 다음 쿼리를 실행해 liblzma 라이브러리의 로드된 인스턴스를 검색하면 현재 시스템에 어떤 버전의 XZ Utils 또는 liblzma가 설치되어 있는지 확인할 수 있습니다(그림 2).

  SELECT DISTINCT path AS liblzma_path
  FROM process_memory_map
  WHERE LOWER(path) LIKE "%liblzma%"
Akamai Guardicore Segmentation Insight에서 다음 쿼리를 실행해 liblzma 라이브러리의 로드된 인스턴스를 검색하면 현재 시스템에 어떤 버전의 XZ Utils 또는 liblzma가 설치되어 있는지 확인할 수 있습니다(그림 2). 그림 2: 로드된 liblzma 인스턴스 쿼리하기

또는 다음 쿼리를 실행해 설치된 버전의 패키지 관리자를 찾을 수 있습니다.

  SELECT name AS vulnerable_item, 'DEB' AS type, version
  FROM deb_packages
  WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')

  UNION

  SELECT name AS vulnerable_item, 'RPM' AS type, version
  FROM rpm_packages
  WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')

물론 취약한 자산만 표시하도록 필터링할 수도 있습니다.

  SELECT path AS vulnerable_item, "Loaded Library" AS type, '5.6%' AS version
  FROM process_memory_map
  WHERE LOWER(path) LIKE "%liblzma%5.6%"
  SELECT name AS vulnerable_item, 'DEB' AS type, version
  FROM deb_packages
  WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
  AND version LIKE '5.6.%'

  UNION

  SELECT name AS vulnerable_item, 'RPM' AS type, version
  FROM rpm_packages
  WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
  AND version LIKE '5.6.%'

위협 헌팅

백도어는 인증만 허용하는 것이 아니라 실제로 시스템 명령을 실행하기 때문에, 프로세스 추적을 통해 이 동작을 탐지할 수 있습니다.

일반적으로 로그온하는 동안 해당 사용자를 위해 새 셸이 생성되고 기본 셸 프로세스(예: bash)가 실행됩니다. 그러나 이 백도어를 사용하면 실제로 SSH 데몬 프로세스인 sshd에 의해 악성 명령어가 실행되어 비정상을 트리거할 수 있습니다.

Akamai의 위협 헌팅 서비스인 Akamai Hunt는 프로세스 활동과 해당 하위 프로세스의 기준선을 지속적으로 추적하는 등의 방법으로 비정상을 탐지할 수 있는 체계를 갖추고 있습니다.

킬 스위치

해당 백도어에 대한 일부 분석에 따르면 환경 변수 킬 스위치가 있는 것으로 보입니다. yolAbejyiejuvnup=Evjtgvsh5okmkAvj 키를 시스템의 환경 변수에 추가하면 백도어를 비활성화할 수 있습니다.

참조



Akamai Wave Blue

에 의해 작성

Akamai Security Intelligence Group

April 01, 2024