# AUDIT SÉCURITÉ — dvf — 2026-06-21 # Stack: service Node (CLI one-shot d'import — pas de serveur HTTP, pas de controller, pas de service Docker) # Méthode: revue de code statique. Findings réels uniquement (conventions stack acceptées exclues). # Note: outil CLI lancé à la main (sync.js / parse.js). Pas de Dockerfile, pas de .drone.yml, # absent du docker-compose.yml racine => aucune surface réseau exposée. # .env présent sur disque MAIS git-ignored (.gitignore: .env + .env*) et NON git-tracké # (git ls-files .env => vide). Donc pas de secret committé. Le .env contient néanmoins # le mot de passe root MySQL de la prod flatbay.fr (mysql://root:...@flatbay.fr/dvf). ## 🔴 CRITIQUE (exploitable à distance / fuite de données / RCE) RAS ## 🟠 ÉLEVÉ RAS ## 🟡 MOYEN [ ] Identifiant de colonne non échappé dans l'INSERT (injection SQL via en-tête CSV) — sync.js:69 (+85-87) Risque: `columns` vient des clés du CSV distant, simplement entouré de backticks (`\`${col}\``) au lieu de `connection.escapeId(col)`. Un nom de colonne contenant un backtick casse l'identifiant et permettrait d'injecter du SQL dans `INSERT INTO dvf (...)`. Les VALEURS sont en placeholders `?` (sûres) — seul l'en-tête est concerné. Source = data.gouv.fr (de confiance), import CLI non exposé : exploitabilité réelle faible, mais le projet possède déjà la bonne primitive (parse.js:48 utilise escapeId). À aligner. Reco: `columns = Object.keys(record).map(col => connection.escapeId(col))` dans sync.js, et valider que les colonnes attendues correspondent au schéma `dvf` (whitelist) avant insert. ## 🔵 DURCISSEMENT (faible) [ ] .env en clair contient le root MySQL de la prod flatbay.fr — .env:1 Risque: `mysql://root:Y3458mo_gppp@flatbay.fr/dvf`. Non committé (bien), mais c'est le compte root prod posé en clair sur le host de dev. Compromission du host = accès root BDD prod. Reco: utiliser un user MySQL dédié `dvf` à privilèges restreints (INSERT/SELECT sur la base `dvf` uniquement), pas root. Confirmer que ce mot de passe n'a jamais transité par un commit (historique git du repo Gitea) et le faire tourner s'il a fuité ailleurs. [ ] Téléchargement distant sans vérification d'intégrité — sync.js:48 / downloadYear Risque: `fetch(url)` sur files.data.gouv.fr puis insertion directe en BDD prod, sans contrôle de hash/taille. Source publique de confiance (URL en dur, pas d'input user => pas de SSRF), mais un MITM/empoisonnement DNS empoisonnerait les données importées. Risque théorique. Reco: vérifier un checksum publié si disponible, ou au minimum la taille/cohérence du fichier. # Audit: pas de RCE/SSRF/command-injection/route exposée. Surface = un script d'import CLI.