
Notepad++ CVE-2026-52886 — session.xml backupFilePath starts_with() path traversal (GHSA-rqfm-pw34-r7j6)
starts_with()Notepad++ — Lecture arbitraire de fichier via traversée de backupFilePath dans session.xml
PowerEditor/src/Notepad_plus.cpp (restauration de session — validation de backupFilePath)session.xml)Notepad++ valide l'attribut backupFilePath lors de la restauration de session en utilisant une comparaison de préfixe sur la chaîne brute via std::wstring::starts_with(), sans normaliser le chemin au préalable. Un chemin contrefait qui commence par le préfixe légitime du répertoire de sauvegarde mais contient des séquences de traversée ..\ passe la vérification, mais se résout vers un emplacement arbitraire lorsque le système d'exploitation ouvre le fichier — chargeant le contenu de n'importe quel fichier lisible dans un onglet de l'éditeur.
Au démarrage avec le mode instantané (sauvegarde) activé, Notepad++ restaure la session précédente depuis session.xml. Le backupFilePath de chaque entrée est censé se trouver sous le répertoire de sauvegarde de l'application. Le contrôle d'intégrité vérifie uniquement que le chemin stocké commence par la chaîne attendue du répertoire de sauvegarde. Comme la comparaison s'effectue sur la chaîne brute, non normalisée, un attaquant préfixe le préfixe légitime puis sort du répertoire avec des séquences ..\.
La vérification teste un préfixe textuel ; l'utilisation ouvre le chemin résolu par le système d'exploitation. Les deux divergent dès que ..\ est présent.
| Opération | Source | Comportement |
|---|---|---|
| VÉRIFICATION | Chaîne backupFilePath brute | starts_with(backupDir) — passe si le préfixe correspond |
| UTILISATION | Chemin résolu par l'OS |
Condition préalable : accès en écriture à session.xml, mode instantané/sauvegarde activé.
Étapes :
session.xml en injectant un backupFilePath contrefait :
<backupDir>\..\..\..\..\Users\victim\.ssh\id_rsa<backupDir>\ satisfait starts_with(), la validation passe donc...\ ; le fichier cible est ouvert.Résultat : exfiltration en lecture seule — le contenu du fichier cible est visible dans l'éditeur, y compris les fichiers sensibles tels que les clés SSH, les fichiers de configuration d'environnement et les coffres d'identifiants.
.env / de configuration, coffres d'identifiants — tout fichier lisible par l'utilisateurPrérequis :
session.xmlbackupFilePath : préfixe du répertoire de sauvegarde + séquences de traversée ..\ + chemin du fichier cibleL'injection du chemin contrefait et le lancement de l'application chargent le fichier cible dans un onglet de l'éditeur.
Le correctif (commit 7e66f36) effectue une normalisation appropriée du chemin avant la validation, de sorte que les séquences ..\ sont réduites avant la comparaison de préfixe — le chemin vérifié et le chemin utilisé correspondent désormais.
Les séquences ..\ se résolvent vers un emplacement arbitraire |