1f34ea5d2f
package.json todo.txt
40 lines
2.8 KiB
Plaintext
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.
|