From 804b04816fd5ab14fe645992e518df664ac81ab3 Mon Sep 17 00:00:00 2001 From: Guillaume DENIS Date: Wed, 8 Jul 2026 16:48:28 +0200 Subject: [PATCH] =?UTF-8?q?fix(cert-server):=20autorise=20le=20backslash?= =?UTF-8?q?=20dans=20les=20noms=20de=20fichiers=20(DN=20=C3=A9chapp=C3=A9s?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les fichiers nommés d'après un DN contenant une virgule échappée (ex: « O=Thales\, DIS ») incluent un backslash, que le filtre bloquait. Sous Linux « \ » est un caractère de nom valide (pas un séparateur), donc le garde est réduit au strict minimum anti-traversal : on rejette seulement « / », « . », « .. », les noms vides et l'octet nul. Tout le reste passe (backslash, virgule, espaces insécables, Unicode). Co-Authored-By: Claude Opus 4.8 --- cert-generator/cert_server.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cert-generator/cert_server.py b/cert-generator/cert_server.py index 6347ed7..94fec8e 100644 --- a/cert-generator/cert_server.py +++ b/cert-generator/cert_server.py @@ -23,15 +23,13 @@ ROOT = os.path.dirname(SCRIPT_DIR) # racine projet WORK = os.path.join(SCRIPT_DIR, "LISTS_ALL_CERT") # dossier de travail (disque) ARCH = os.path.join(WORK, "archives") -# Blacklist plutôt que whitelist : on autorise tout nom (DN avec « , = » et -# espaces, y compris insécables/Unicode venant de Windows) SAUF ce qui permet -# de sortir du dossier ou de casser le FS. +# Filtre minimal : on accepte n'importe quel nom (DN complet avec « , = \ », +# espaces, Unicode…). On NE bloque QUE ce qui permet de sortir du dossier de +# travail : « / » (séparateur, déjà découpé en amont), « . »/« .. » et l'octet +# nul. « \ » n'est pas un séparateur sous Linux → autorisé (DN à virgule échappée). def safe_name(n): n = (n or "").strip() - if (not n or n in (".", "..") - or "/" in n or "\\" in n - or "\x00" in n - or any(ord(c) < 32 or ord(c) == 0x7f for c in n)): # caractères de contrôle + if not n or n in (".", "..") or "/" in n or "\x00" in n: raise ValueError("nom invalide: %r" % n) return n