GN⁺: xz/liblzma의 상위 스트림에 존재하는 백도어로 인한 SSH 서버 침해(compromise)
(openwall.com)- Debian sid 설치에서 liblzma(xz 패키지의 일부)와 관련된 몇 가지 이상한 증상(SSH 로그인 시 CPU 사용량 증가, valgrind 오류)이 관찰됨
- 문제의 원인은 xz의 상위 저장소와 tarball이 백도어에 감염되었음을 발견. 백도어의 일부는 배포된 tarball에만 존재함
- tarball에 포함된 스크립트는 configure의 끝에서 실행되며, 특정 조건이 충족되면
$builddir/src/liblzma/Makefile
을 수정하여 악성 코드를 삽입함.
저장소 내 백도어
- 백도어의 주요 부분은 저장소 내의
tests/files
디렉토리에 암호화된 형태로 존재함. - 이 파일들은 5.6.0 버전의 테스트에 사용되지 않았으며, 5.6.1 버전에서는 백도어로 인한 valgrind 오류와 충돌을 해결하기 위한 시도가 있었음.
영향을 받는 시스템
- 백도어 스크립트는 configure 이후 최초로 호출되며, 특정 조건(예: x86-64 리눅스 시스템, gcc 및 gnu 링커 사용, debian 또는 RPM 패키지 빌드 중)에만 빌드 과정을 수정함.
openssh 서버에 미치는 영향
- 백도어가 설치된 liblzma를 사용하면 SSH를 통한 로그인이 느려짐.
- openssh는 직접적으로 liblzma를 사용하지 않지만, debian을 포함한 몇몇 배포판은 systemd 알림을 지원하기 위해 openssh에 패치를 적용하고, libsystemd는 lzma에 의존함.
주입된 코드 분석
- 보안 연구자나 역공학 전문가가 아닌 관찰자의 관점에서 분석함.
- 백도어는 ifunc resolver를 통해 실행을 가로채고, sshd의 초기화 중에 심볼을 해석하여 RSA_public_decrypt 심볼을 자신의 코드로 변경함.
sshd에 미치는 영향
- RSA_public_decrypt@....plt가 백도어 코드를 가리키도록 변경되어, 공개키 로그인 중에 백도어 코드가 호출됨.
- 이를 통해 인증을 우회하거나 원격 코드 실행을 가능하게 하는 것으로 추정됨.
버그 보고
- 상위 저장소의 관여가 의심되어 버그를 보고하지 않음.
- Red Hat은 이 문제에 CVE-2024-3094를 할당함.
취약한 설치 감지
- 시스템의 ssh 바이너리가 취약한지 여부를 감지하는 스크립트가 제공됨.
본문 맨 아래 첨부에 detect.sh
파일을 받아서 취약점 해당되는 환경인지 확인 가능합니다.
저같은 경우 probably not vulnerable
뜨신 하지만 조심해야겠죠.
오픈소스에 의도적으로 백도어를 심은 행위라서요... 그 과정에서 몰래 여론전도 펼치는등의 행동 또한 했구요
이전에도 리눅스 커널에 악의적으로 취약점을 넣은 사례도 있었는데 씁쓸하네요
Hacker News 의견
-
관련 링크:
-
요약:
- 백도어 작성자가 Fedora 40 & 41에 xz 5.6.x를 추가하려고 여러 주간 소통함. 이 백도어로 인해 발생한 valgrind 문제를 해결하기 위해 협력했으나, 결국 백도어가 문제의 원인이었음을 알게 됨. 공개 금지 기간이 실수로 깨진 후 문제를 긴급히 해결해야 했음.
- 백도어 작성자 중 한 명이 oss-fuzz에서 백도어에 의존하는 기능을 직접 비활성화하여 우연한 발견을 방지함.
- 백도어 작성자가
xz-java
프로젝트에SECURITY.md
파일을 추가함. 이는 보안 취약점을 발견하면 공개하지 말고 비공개로 보고하라는 지침을 담고 있음. 이를 다른 시각에서 보면, 작성자가 자신의 익스플로잇을 조정하고 대상을 활용할 시간을 벌려는 의도로 해석될 수 있음. - openssh는 직접적으로 liblzma를 사용하지 않지만, debian과 여러 배포판이 systemd 알림 지원을 위해 openssh에 패치를 적용함. 이로 인해 libsystemd가 liblzma에 의존하게 되어, openssh와 같은 보안 중요 데몬에 추가적인 의존성이 생기고 공급망 공격의 위험이 증가함.
- 패닉 상태인 사람들을 위한 주요 확인 사항:
- 최근 버전의 liblzma5 (5.6.0 또는 5.6.1)을 사용하는 경우. 이는 지난 한 달 정도에 추가됨.
- debian이나 RPM 기반의 리눅스 배포판을 사용하는 경우. 리버스 엔지니어링을 어렵게 하려는 시도로 보임.
- systemd에서 OpenSSH sshd를 실행하는 경우. 일부 배포판에서 패치된 OpenSSH는 로깅 기능을 위해 libsystemd를 사용하며, 이는 취약한 liblzma5를 끌어들임.
- Debian testing은 이미 '5.6.1+really5.4.5-1'이라는 버전을 가지고 있으며, 이는 실제로는 이전 버전인 5.4를 새 버전으로 재포장한 것임.
- GNU autoconf에서 무언가 의심스러운 것을 숨기고 싶다면, "curl | sh" 스크립트가 아닌 그곳에 숨길 것임. 이번 사건의 배포자는 이전에도 배포를 담당했으며, 2022년부터 커밋을 시작함. 많은 실제 변경 사항을 포함한 커밋이 있으며, libarchive와 같은 관련 프로젝트에도 커밋이 있음. 백도어를 삽입하기 위해 많은 노력이 필요함.
- 몇 년 전에 Go 라이브러리를 작성하여 xz C 코드를 감싸고 Go에서 xz 압축을 할 수 있게 함. 약 일주일 전에 해당 레포지토리에 5.6.1로 업그레이드하는 첫 PR을 받음. 이는 상류의 GitHub 계정과는 다름.
- 보안 연구원이나 리버스 엔지니어가 아닌 기여자가 기술적인 글을 쓰는 것을 좋아함. 그의 발견을 요약한 보고서는 공유를 꺼리는 주류 디버깅 세계 밖의 기여자들에게 훌륭한 템플릿으로 여겨짐.
- xz(1)에 대한 더 능숙한 백도어 시도를 상상해보면, 이렇게 빨리 발견되지 않았을 것임. xz는 거의 모든 곳에 사용됨. 특정 빌드 프로세스의 기반으로 사용되는 .tar.xz 소프트웨어 타르볼과 같은 파일의 작은 부분만 선택적으로 수정하는 xz를 만들 수 있음. 소스 코드 타르볼이 아니라 사전 컴파일된 바이너리를 배포하는 타르볼을 대상으로 함.