
CVE-2025-62518에 대한 PoC로, tokio-tar PAX 헤더 구문 분석을 통한 tar 아카이브 스머글링을 시연하며, 악성 페이로드와 취약한 추출기를 생성하여 공급망 주입을 보여줍니다.
동영상: https://youtu.be/EYBB4BHsp9E
./output에 추출합니다.malicious.tar 아카이브를 생성하며, 밀반입된 콘텐츠의 예시를 포함합니다. 주석은 단계별 및 블록별로 수행되는 작업을 설명합니다.제공된 재현 스크립트를 사용하거나 수동으로 수행하세요.
malicious-payload를 실행하여 페이로드 malicious.tar를 생성합니다.
이 파일을 vulnerable-extract 앱에 전달하면 다음과 같습니다:
/vulnerable-extract$ ll output/
total 12
drwxrwxr-x 2 airinei airinei 4096 Jan 19 22:40 ./
drwxrwxr-x 5 airinei airinei 4096 Jan 19 22:40 ../
-rw-rw-r-- 1 airinei airinei 0 Jan 1 1970 benign_file.txt
-rw-rw-r-- 1 airinei airinei 18 Jan 1 1970 sh_profile_hijack
반면, OS에서 제공하는 tar 유틸리티(이 경우 (GNU tar) 1.35)를 실행하면 다음과 같습니다:
malicious-payload$ tar -tvf malicious.tar
---------- 0/0 1024 1970-01-01 02:00 benign_file.txt
파일 크기가 1024로 표시됨에 유의하세요.
또는 중단된 tokio-tar 0.3.1 대신 astral-tokio-tar 0.5.6을 사용하면 아카이브를 올바르게 추출합니다.
CVE-2025-62518 (TARmageddon)은 tokio-tar Rust 라이브러리에서 발견된 보안 취약점입니다(Rust 취약점 😮). 이는 tar 형식의 헤더가 구문 분석되는 방식의 논리 오류로, 공격자가 파일을 밀반입할 수 있게 합니다.
결함은 PAX 확장 헤더를 처리하는 논리에 존재합니다. TAR 아카이브에는 다양한 헤더 유형이 있습니다:
USTAR: 파일명, 권한, 크기를 포함하는 표준 헤더.PAX (Type x): 아카이브의 다음 파일에 대한 메타데이터(예: 매우 큰 파일 크기)를 제공하는 확장 헤더.PAX 헤더가 있을 경우 파서는 PAX 메타데이터를 표준 USTAR 헤더보다 우선시하여 파일의 실제 크기를 결정해야 합니다.
하지만 왜 같은 것을 위한 우선순위를 가진 2가지 유형의 헤더가 존재할까요? TAR 형식이 오래되었기 때문입니다(1988년에 표준화). USTAR에는 제한이 있습니다(크기 최대 8GB, 파일명 최대 256자). 이는 문제였기 때문에 2001년에 PAX 헤더가 추가되어 더 큰 파일과 더 긴 파일명을 허용할 수 있게 되었습니다.
취약한 버전의 tokio-tar에서 파서는 파일 콘텐츠 리더를 위해 PAX 헤더의 크기를 올바르게 채택하지만, 다음 파일 헤더가 시작되는 위치를 결정하기 위해 USTAR 헤더의 크기를 잘못 사용합니다.
문제의 핵심은 포인터 불일치입니다. 취약한 라이브러리가 파일을 처리할 때 스트림을 읽기 위해 두 개의 다른 내부 "헤드"를 사용합니다:
일반 아카이브에서는 이 두 헤드가 일치합니다. TARmageddon에서는 서로 불일치하도록 강제합니다. PAX 크기를 1024로, USTAR 크기를 0으로 설정하여 역설을 만듭니다:
benign_file.txt에 넣습니다.0을 보고 *"이미 파일 끝에 도달했습니다."*라고 생각합니다. 정확히 그 위치에 남아 있습니다.결과적으로 파서 헤드는 1024바이트 블록 내부의 데이터를 다음 명령어 집합으로 취급합니다. 해당 데이터가 유효한 TAR 헤더처럼 보이면 라이브러리는 아카이브의 전체 구조에 따르면 기술적으로 존재하지 않는 두 번째 파일을 "발견"하고 추출합니다.
밀반입 페이로드:
페이로드는 512바이트 블록의 시퀀스로 제작됩니다. malicious-payload 생성기에서 사용된 레이아웃은 다음과 같습니다:
| 블록 | 역할 | 설명 |
|---|---|---|
| 1 & 2 | PAX 메타데이터 | 다음 파일이 1024바이트 길이라고 주장합니다. |
| 3 | 기본 헤더 | benign.txt. 결정적으로 크기를 0으로 설정합니다. |
| 4 | 밀반입된 헤더 | backdoor.sh. "데이터" 영역 안에 숨겨져 있습니다. |
| 5 | 밀반입된 데이터 | 악성 콘텐츠(예: 셸 별칭). |
| 6 & 7 | EOF | 표준 널 블록 종료. |
표준 도구(예: GNU tar)는 PAX 크기를 올바르게 따르기 때문에 블록 4와 5를 benign_file.txt에 속하는 무해한 이진 데이터로 봅니다. 블록 4의 헤더를 "실행"하지 않습니다.
이 크레이트의 취약점이 어떻게 악용될 수 있으며, 아카이브에 파일이 밀반입되는 것이 왜 중요한가요?
공격자는 빌드 시스템에 악성 파일을 밀반입합니다. 개발 목적이나 CI 머신에서 이를 추출하면 합법적인 빌드 파일을 덮어쓸 수 있으며, 해당 머신을 손상시키고 빌드 시스템이 악성 파일에 서명하도록 속일 수도 있습니다.
스캐너가 .tar 파일을 검사할 때 올바른 모드로만 스캔하면, 추출 시 원치 않는 파일이 존재할 수 있지만 스캔되지 않습니다.
이 분석에서 영감을 받았습니다.