
Prueba de concepto (constructor) para CVE-2026-39973 (apktool)
Este es un pequeño constructor de archivos APK en C# para CVE-2026-39973.
CVE-2026-39973 es una vulnerabilidad de path traversal dentro del repositorio de GitHub iBotPeaches/Apktool que afecta a la versión 3.0.1.
Permite a los atacantes crear sus propios recursos e inyectar una secuencia ..\ dentro del tipo de una entrada, lo que permite a un actor malicioso escribir cualquier archivo en o en la ruta de inicio de Windows.
~/.bashrcEsta vulnerabilidad proviene de una regresión de seguridad en el commit e10a045 (PR #4041) que elimina BrutIO.detectPossibleDirectoryTraversal() de ResFileDecoder.java
ResFileDecoder.java#L103-L109 ANTES:
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 DESPUÉS:
String outResPath = entry.getTypeName() + entry.getConfig().getQualifiers() + "/" + entry.getName()
+ (ext.isEmpty() ? "" : "." + ext);
Este commit eliminó una comprobación considerada "inútil" sobre toda la ruta de salida, ya que entry.name ya estaba verificado de antemano (constructor de ResEntrySpec).
El autor olvidó que el nombre del tipo de la entrada podría estar sujeto a un path traversal creando nuestro propio resources.arsc malicioso.
resources.arsc es un archivo que contiene los datos de recursos, rutas, nombres de tipos y más.
Almacena todo lo que necesitamos para poder modificar el nombre del tipo o crear un archivo resource.arsc para explotar Apktool.
A pesar de su recurrencia, solo he encontrado documentación pobre pero satisfactoria sobre la serialización.
En este punto, se recomienda encarecidamente leer la documentación de apktool.
Empecé basándome directamente en Apktool, ya que voy a necesitar construir un archivo resources.arsc exclusivamente para esta aplicación.
Descargué un archivo APK aleatorio de Internet y lo abrí con 7zip. Luego extraje el archivo resources.arsc y comencé a estudiar las estructuras de datos junto con el código del analizador de Apktool.
Después, creé un pequeño constructor en C# para el archivo resources.arsc, escribiendo un ResTable y un ResPackage con un ResType que contiene la secuencia ..\ y la ruta de la carpeta de inicio de Windows; también tiene una entrada que es el archivo de carga útil.