앵하니의 더 나은 보안
XZ Utils Backdoor(CVE-2024-3094) 본문
3월 말에 터져버렸던 xz utils backdoor에 대해 기술적으로 자세히 알아보자
XZ Utils Backdoor의 감염 및 명령 수행 과정
잘 정리해놓은 그림을 보면서 설명하겠다.
- xz 라이브러리가 빌드될 때 xz 패키지에 있던 m4 macro가 실행되는데, 이때 아래 명령이 수행됨
- 변조 대상은 tests/files/bad-3-corrupt_lzma2.xz이고 이 파일의 바이너리 데이터가
각각 아래 규칙에 의해 변조됨
0x09(\t) > 0x20
0x20 > 0x09
0x2d(-) > 0x5f
0x5f(_) > 0x2d - 그럼 변조된 bad-3-corrupt_lzma2.xz가 bash 스크립트로 디코딩되고 해당 스크립트를 통해 또 다시 tests/files/good-large_compressed.lzma 파일을 악성 프로그램으로 변조
- 변조된 파일을 liblzma 라이브러리에 악성코드로 삽입
- 악성코드가 심어진 liblzma 라이브러리는 sshd(ssh daemon)이 실행될 때 load됨
- liblzma에 의해 openssl의 RSA_public_decrypt 함수의 포인터가 liblzma 내에 존재하는 함수의 포인터로 대체되어 liblzma가 연결요청 패킷을 가로채게 되고, 이때 특정 Ed448 개인키를 가진 ssh 연결요청이 발생하고, 그에 맞는 공개키로 복호화가 가능한 경우, 악성의도를 가진 패킷이라 판단, system 권한을 사용한 명령을 발생시킴
공격임을 탐지하기 위해 트리거 해놓은 공격자의 Ed448 키 값
0a 31 fd 3b 2f 1f c6 92 92 68 32 52 c8 c1 ac 28
34 d1 f2 c9 75 c4 76 5e b1 f6 88 58 88 93 3e 48
10 0c b0 6c 3a be 14 ee 89 55 d2 45 00 c7 7f 6e
20 d3 2c 60 2b 2c 6d 31 00
감염된 liblzma에서는 공격자의 키 값임을 확인하면, 이후 공격자가 보내온 명령을 수행하게 된다.
어떻게 root 권한으로 명령을 수행할 수 있는걸까?
답은 sshd가 root 권한으로 실행되는데에 있다. sshd는 사용자 인증, 포트 바인딩 등의 작업을 수행하기 때문에 root권한이 필요하다. 따라서 sshd 데몬이 liblzma 라이브러리를 로드하면, 이 라이브러리도 sshd와 동일한 root 권한을 갖게된다. 결국 liblzma에서 수행시키는 명령은 root권한을 가진 명령이 된다.
liblzma는 어떻게 sshd가 실행될 때 로드되게 한걸까?
liblzma 라이브러리는 원래 sshd가 실행될 때 같이 로드되는 친구다.
근데 xz utils backdoor를 통해 변조되어 백도어 명령을 수행할 뿐
sshd에서 systemd 기능을 추가하기위해 libsystemd를 사용
> libsystemd에서는 liblzma 라이브러리를 사용하는 구조
왜 RSA_Public_Decrypt 함수의 포인터를 대체했을까?
https와는 다르게 ssh 연결은 양방향 인증이 요구된다. 즉 클라이언트만 서버의 무결성을 검증하는 것이 아니라 서버 또한 클라이언트 정보에 대한 무결성을 검증한다. 이 과정에서 클라이언트의 개인키로 암호화된 데이터를 클라이언트의 공개키로 복호화 하기 위해 RSA_Public_Decrypt 함수를 사용하게 된다.
클라이언트의 공개키를 확인하는 적절한 타이밍에 적절히 데이터를 가로채기 좋았을 듯 하다.
신기방기
시연해보고자 한다면 아래 도커를 사용해 xz-utils-backdoor poc하는 링크에서 과정을 따라가보면 된다.
그리고 이건 xz utils backdoor에 취약한 시스템에 root 명령을 수행시킬 수 있는 프로그램 xzbot
참고
'보안 기술 > ETC' 카테고리의 다른 글
딥러닝으로 OTP 추측이 가능할까 (0) | 2024.08.14 |
---|---|
Log4shell(CVE-2021-44228) (0) | 2024.06.23 |
(reversing.kr) Easy CrackMe (2) | 2023.11.22 |
(reversing.kr) Easy Keygen (2) | 2023.11.22 |
AWS Pentesting tool PACU (0) | 2022.11.10 |