- Microsoft의 Andres Freund가 Debian 시스템의 SSH 성능 이상을 추적하다가, 거의 모든 Linux/Unix 계열 환경에 쓰이는 xz Utils에 심어진 백도어를 발견함
- 악성 코드는 xz Utils 5.6.0과 5.6.1에 들어갔고, 특정 개인 키를 가진 공격자가 SSH 로그인 인증서에 코드를 숨겨 백도어가 있는 장치에서 실행할 수 있게 설계됨
- 공격자는 GitHub 소스가 아닌 릴리스 tarball, 테스트 파일, 빌드 스크립트, glibc IFUNC를 이용해 liblzma를 거쳐 sshd 인증 루틴을 후킹하려 함
- 백도어는 amd64/x86_64, glibc, Debian 또는 Red Hat 계열 패키지 빌드 조건을 확인했으며 Fedora Rawhide, Fedora 41, Debian testing/unstable/experimental, openSUSE Tumbleweed/MicroOS, Kali Linux 일부 기간 릴리스에 포함됨
- Jia Tan이라는 개발자 페르소나는 수년에 걸쳐 xz Utils 유지보수에 관여했고, 사건은 CVE-2024-3094로 추적되며 Binarly 검사 페이지와 xzbot 같은 탐지·분석 도구가 나옴
발견과 영향 범위
- Andres Freund는 Microsoft의 PostgreSQL 관련 작업을 하던 개발자이자 엔지니어로, Debian 시스템에서 SSH 로그인이 CPU를 과도하게 사용하고 valgrind 오류를 내는 현상을 조사하다가 이상 징후를 발견함
- 원인은 xz Utils 업데이트였고, Freund는 Open Source Security List에 이 업데이트가 압축 소프트웨어에 의도적으로 심어진 백도어라고 공개함
- xz Utils는 Linux를 포함한 거의 모든 Unix 계열 운영체제에서 손실 없는 데이터 압축과 해제를 제공하며, 레거시 .lzma 형식도 지원함
- Filippo Valsorda는 이를 “공개적으로 설명된 공급망 공격 중 가장 잘 실행된 사례일 수 있으며, 널리 쓰이는 라이브러리의 악의적이고 유능하며 권한 있는 upstream이라는 악몽 같은 시나리오”라고 평가함
백도어가 노린 동작
- 악성 코드는 xz Utils 5.6.0과 5.6.1에 추가되어 소프트웨어 동작 방식을 바꿈
- 백도어는 원격 SSH 연결에 쓰이는 실행 파일인 sshd를 조작함
- 사전에 정해진 암호화 키를 가진 사람은 SSH 로그인 인증서에 원하는 코드를 숨기고, 이를 업로드한 뒤 백도어가 있는 장치에서 실행할 수 있음
- 실제로 업로드된 코드는 확인되지 않아 공격자가 어떤 코드를 실행하려 했는지는 알려지지 않음
- 이론적으로는 암호화 키 탈취나 악성코드 설치를 포함해 거의 어떤 작업도 가능할 수 있음
압축 라이브러리가 SSH에 닿은 경로
- 라이브러리는 자신과 링크된 실행 파일의 내부 동작을 조작할 수 있음
- OpenSSH의 대표적인 sshd 구현은 기본적으로 liblzma와 링크하지 않음
- Debian과 여러 Linux 배포판은 sshd를 systemd와 연결하는 패치를 추가함
- systemd는 부팅 중 여러 서비스를 로드하는 프로그램임
- systemd는 liblzma에 링크됨
- 이 연결 경로 때문에 xz Utils가 sshd에 영향을 줄 수 있었음
수년에 걸친 준비 정황
- 2021년 JiaT75라는 사용자가 오픈소스 프로젝트에 처음으로 알려진 커밋을 남김
- libarchive 프로젝트에서 safe_fprint 함수를 더 덜 안전한 것으로 오래 알려진 변형으로 바꾼 변경이었고, 당시에는 아무도 알아차리지 못함
- 2022년 JiaT75는 xz Utils 메일링 리스트에 패치를 제출함
- 곧 Jigar Kumar라는 신규 참여자가 Lasse Collin이 xz Utils를 충분히 자주 또는 빠르게 업데이트하지 않는다고 압박함
- Dennis Ens와 다른 신규 참여자들도 Collin에게 추가 유지보수자를 들이라고 압박함
- 2023년 1월 JiaT75는 xz Utils에 첫 커밋을 남겼고, Jia Tan이라는 이름으로 xz Utils 업무에 더 깊게 관여함
- oss-fuzz의 Collin 연락처를 자신의 연락처로 바꿈
- oss-fuzz 테스트 중 IFUNC 기능을 비활성화해, 이후 xz Utils에 들어갈 악성 변경을 탐지하지 못하게 하는 변경을 요청함
- 2024년 2월 Tan은 xz Utils 5.6.0과 5.6.1 커밋을 냈고, 이 업데이트가 백도어를 구현함
- 이후 Tan 또는 다른 사람들이 Ubuntu, Red Hat, Debian 개발자들에게 해당 업데이트를 운영체제에 병합하라고 요청함
포함된 배포판과 실행 조건
- Tenable에 따르면 백도어 버전 또는 관련 업데이트는 다음 릴리스에 들어감
- Fedora Rawhide: Fedora Linux의 개발 배포판
- Fedora 41
- Debian testing, unstable, experimental: 5.5.1alpha-0.1부터 5.6.1-1
- openSUSE Tumbleweed와 openSUSE MicroOS: 3월 7일부터 3월 28일 사이 백도어 xz 버전 포함
- Kali Linux: 3월 26일부터 3월 28일 사이 xz-utils 5.6.0-0.2 포함
- Sam James의 분석에 따르면 악성 스크립트는 빌드 대상이 amd64/x86_64인지, linux-gnu 이름을 쓰는지, GCC와 GNU ld를 쓰는지 확인함
- 또한 Debian 패키지 빌드인지 또는 RPM_ARCH가 x86_64인지 확인함
- 공격은 amd64 시스템에서 glibc를 사용하고 Debian 또는 Red Hat 파생 배포판을 빌드하는 환경을 겨냥한 것으로 보임
- 다른 시스템이 취약한지는 당시 알려지지 않음
구현 방식과 은닉 기법
- Sam James는 백도어가 여러 구성요소로 이뤄졌다고 정리함
- upstream이 배포한 릴리스 tarball은 GitHub의 코드와 같지 않음
- 릴리스 tarball의 build-to-host.m4는 GitHub upstream의 것과 크게 다름
- git 저장소의 tests/ 폴더에는 조작된 테스트 파일이 있음
tests/files/bad-3-corrupt_lzma2.xztests/files/good-large_compressed.lzma
- build-to-host.m4가 호출한 스크립트가 악성 테스트 데이터를 풀고 빌드 과정을 수정함
- glibc의 IFUNC가 OpenSSH 인증 루틴을 런타임 후킹 또는 리다이렉션하는 데 사용됨
- HD Moore는 최종 백도어 단계가 amd64에서 라이브러리를 빌드하고 Debian 또는 RPM 패키지를 만들 때만 실행된다고 확인함
- 연구자들의 분석에 따르면 SSH 공개 키 검증 과정에서 특정 fingerprint 함수와 공개 키가 맞으면, 공개 키를 실제 검증하기 전에 사전 공유 키로 키 내용을 복호화함
- 복호화된 내용은 특정 형식에 맞을 때
system으로 직접 전달됨 - fingerprint가 맞지 않거나 복호화된 내용이 형식에 맞지 않으면 일반 키 검증으로 돌아가며, 사용자는 차이를 알아차리기 어려움
Akamai가 정리한 실행 체인
- Akamai 연구자들은 백도어가 xz GitHub 저장소가 아니라 소스 코드 tarball 릴리스에만 포함되어 탐지를 피하려 한 것으로 봄
- 백도어는 여러 커밋에 걸쳐 구성됨
- 빌드 과정에서 IFUNC를 사용해 악성코드가 심볼 해석 함수를 가로챌 수 있게 함
- 테스트 파일 안에 난독화된 공유 객체를 숨김
- 라이브러리 빌드 과정에서 공유 객체를 추출하는 스크립트를 실행함
- 프로세스 권한을 제한하는 보안 기능인 landlocking을 비활성화함
- 실행 체인은 여러 단계로 이어짐
build-to-host.m4가 라이브러리 빌드 중 실행되어bad-3-corrupt_lzma2.xz를 bash 스크립트로 디코딩함- 이 bash 스크립트가
good-large_compressed.lzma를 더 복잡한 방식으로 디코딩해 또 다른 스크립트를 만듦 - 그 스크립트가
liblzma_la-crc64-fast.o공유 객체를 추출하고, 이를 liblzma 컴파일 과정에 추가함
- 이 공유 객체는 liblzma에 컴파일되어 일반 함수 이름 해석 과정을 대체함
- 악성 라이브러리는 OpenSSH의
RSA_public_decrypt함수 포인터를 자신이 만든 악성 함수로 바꿀 수 있음 - Filippo Valsorda의 분석에 따르면 이 악성 함수는 인증 클라이언트의 인증서에서 명령을 추출하고, 위협 행위자임을 확인한 뒤
system()으로 넘겨 인증 전 원격 코드 실행을 달성함
Jia Tan과 남은 의문
- Jia Tan에 대해 알려진 정보는 매우 적음
- 이 개발자 페르소나는 지난 몇 년 동안 수십 개의 다른 오픈소스 소프트웨어에도 관여함
- Jia Tan이라는 사용자명 뒤에 실제 인물이 있었는지, 완전히 조작된 인물인지는 알려지지 않음
- 추가 기술 분석은 Filippo Valsorda의 Bluesky 스레드, Kevin Beaumont의 분석, Freund의 금요일 공개 자료에서 확인할 수 있음
CVE와 확인 도구
- 이 취약점의 추적 식별자는 CVE-2024-3094임
- Binarly의 xz.fail 페이지는 IFUNC 구현을 탐지하며 행동 분석을 기반으로 함
- 유사한 백도어가 다른 곳에 심어졌을 때도 불변 조건을 자동 탐지할 수 있음
- xzbot은 분석과 실험용 기능을 제공함
- honeypot: 익스플로잇 시도를 탐지하기 위한 가짜 취약 서버
- ed448 patch: 자체 ED448 공개 키를 사용하도록
liblzma.so패치 - backdoor format: 백도어 페이로드 형식
- backdoor demo: ED448 개인 키를 알고 있다고 가정하고 RCE를 트리거하는 CLI