Files
dvf/todo.txt
T
2026-06-21 08:10:01 +02:00

40 lines
2.8 KiB
Plaintext

# 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.