
CVE-2026-39973(apktool)에 대한 개념 증명(빌더)
CVE-2026-39973용 소형 C# APK 파일 빌더입니다.
CVE-2026-39973은 GitHub 저장소 iBotPeaches/Apktool의 버전 3.0.1에 영향을 미치는 경로 탐색(path traversal) 취약점입니다.
공격자는 자신만의 리소스를 생성하고 항목(entry)의 타입 내에 ..\ 시퀀스를 주입할 수 있으며, 이를 통해 위협 행위자가 ~/.bashrc 또는 Windows 시작 경로에 임의의 파일을 쓸 수 있습니다.
이 취약점은 커밋 e10a045(PR #4041)의 보안 회귀에서 비롯되었으며, 해당 커밋은 ResFileDecoder.java에서 BrutIO.detectPossibleDirectoryTraversal()을 제거합니다.
수정 전 ResFileDecoder.java#L103-L109:
String outResPath = entry.getTypeName() + entry.getConfig().getQualifiers() + "/" + entry.getName();
if (BrutIO.detectPossibleDirectoryTraversal(outResPath)) {
LOGGER.warning("Potentially malicious file path: " + outResPath + ", using instead: " + inResPath);
outResPath = inResPath;
} else if (!ext.isEmpty()) {
outResPath += "." + ext;
}
수정 후 ResFileDecoder.java#L103-L104:
String outResPath = entry.getTypeName() + entry.getConfig().getQualifiers() + "/" + entry.getName()
+ (ext.isEmpty() ? "" : "." + ext);
이 커밋은 entry.name이 이미 사전에 검사되었기 때문에(ResEntrySpec 생성자) 전체 출력 경로에 대한 "쓸모없는" 검사로 판단된 항목을 제거했습니다.
작성자는 악의적인 resources.arsc를 직접 제작하여 항목의 타입 이름이 경로 탐색의 대상이 될 수 있다는 사실을 잊었습니다.
resources.arsc는 리소스 데이터, 경로, 타입 이름 등을 포함하는 파일입니다.
Apktool을 악용하기 위해 타입 이름을 수정하거나 resource.arsc 파일을 제작하는 데 필요한 모든 정보가 여기에 저장되어 있습니다.
이 파일이 자주 등장함에도 불구하고, 직렬화에 대한 빈약하지만 만족스러운 문서만 찾을 수 있었습니다.
이 시점에서 apktool의 문서를 읽어보는 것을 강력히 권장합니다.
이 애플리케이션 전용으로 resources.arsc 파일을 빌드해야 하므로 Apktool 자체를 기반으로 작업을 시작했습니다.
인터넷에서 임의의 APK 파일을 다운로드하여 7zip으로 열었습니다. 그런 다음 resources.arsc 파일을 추출하고 Apktool의 파서 코드와 함께 데이터 구조를 연구하기 시작했습니다.
그 후 ..\ 시퀀스와 Windows 시작 폴더 경로를 포함하는 하나의 ResType과 페이로드 파일인 하나의 항목을 가진 ResTable 및 ResPackage를 작성하는 소형 C# 빌더를 만들었습니다.