← Retour au blog

Une dépendance piégée peut faire tomber tout votre pipeline de données

Lucian BLETAN

La récente découverte d’une vulnérabilité critique (CVE-2025-12345) dans la librairie fast-csv-parser, très utilisée dans les pipelines de données, est un rappel brutal : votre sécurité est aussi faible que le plus faible de vos maillons. Une simple dépendance, nichée au creux de votre requirements.txt, peut devenir une porte d’entrée pour un attaquant. L’incident a montré comment un fichier CSV malicieusement forgé pouvait permettre une exécution de code à distance sur le serveur qui le traitait. Plutôt que de pointer du doigt une librairie, cet événement doit nous pousser à adopter une hygiène de sécurité systématique sur notre chaîne d’approvisionnement logicielle.

comment l’attaque fonctionnait

La faille n’était pas complexe. Elle exploitait une faille de type “deserialization” où le parser, en essayant d’interpréter un type de donnée complexe encodé dans le CSV, exécutait du code arbitraire.

attaquant dépose un fichier csv piégé dans un s3

le pipeline etl lit le fichier

la librairie `fast-csv-parser` tente de parser le fichier

🔴 exécution de code à distance sur le serveur etl

la défense: un modèle en 4 étapes

Se protéger ne consiste pas à tout interdire, mais à vérifier et à tracer chaque étape.

  1. Connaître ses dépendances (SBOM): Savoir exactement ce qui tourne dans votre application.
  2. Scanner en continu: Chercher les vulnérabilités connues dans ces dépendances.
  3. Vérifier l’intégrité: S’assurer que le paquet que vous installez est bien celui que vous attendez.
  4. Limiter les permissions: Exécuter les pipelines avec le moins de privilèges possible.

étape 1: générer un inventaire (SBOM)

Un SBOM (Software Bill of Materials) est une liste de toutes les dépendances de votre projet. C’est la base de toute analyse de sécurité. Des outils comme syft peuvent le générer automatiquement.

# Générer une SBOM au format JSON à partir d'une image Docker
syft mon-pipeline-etl:1.2.0 -o json > sbom.json

étape 2: scanner les vulnérabilités

Une fois que vous avez la liste des ingrédients, vous pouvez la comparer à une base de données de vulnérabilités connues. grype est un outil parfait pour cela.

# Scanner la SBOM générée pour trouver des vulnérabilités connues
# La commande échouera si une vulnérabilité "haute" ou "critique" est trouvée.
grype sbom:sbom.json --fail-on high

étape 3: figer et vérifier les dépendances

Ne laissez jamais pip installer la “dernière” version d’une librairie. Utilisez un fichier requirements.txt avec des versions exactes et, surtout, les hashes des paquets. Cela garantit que vous installez toujours le même binaire et vous protège contre les substitutions malveillantes.

# Extrait d'un requirements.txt avec hashes
fast-csv-parser==1.2.3 \
    --hash=sha256:abcdef123... \
    --hash=sha256:fedcba456...

étape 4: isoler et limiter les permissions

Vos pipelines de données n’ont pas besoin d’un accès root. Exécutez-les dans des conteneurs non-privilégiés, avec des permissions réseau limitées et des rôles IAM qui ne leur donnent accès qu’aux ressources strictement nécessaires.

erreurs à éviter

  • Le requirements.txt “flexible”: Utiliser des opérateurs comme >= au lieu de == est une porte ouverte aux mauvaises surprises. Figez toujours vos versions.
  • Ignorer les dépendances transitives: Votre librairie A dépend de B, qui dépend de C. Une vulnérabilité dans C vous impacte. Un bon outil de scan doit analyser tout l’arbre de dépendances.
  • Laisser les secrets dans l’environnement: Même si votre code est sûr, si le conteneur a accès à des clés d’API puissantes, un attaquant qui réussit à y entrer peut faire d’énormes dégâts. Utilisez un gestionnaire de secrets.

faq

  • Dois-je faire tourner ces scans sur chaque machine de développeur ? Non, ce serait trop lourd. L’endroit critique pour ces vérifications est la CI/CD. Aucun code ne doit être mergé, et aucune image ne doit être construite si les scans de sécurité échouent.

  • Comment gérer une vulnérabilité critique dans une dépendance que je ne peux pas mettre à jour immédiatement ? C’est une “exception de sécurité”. Vous devez la documenter, évaluer le risque réel dans votre contexte (est-ce que la fonction vulnérable est réellement utilisée ?), mettre en place des mesures de mitigation (ex: un filtre en amont) et planifier la mise à jour avec une date limite.

  • Un proxy de paquets privé (comme Artifactory, Nexus) est-il vraiment nécessaire ? Pour une petite équipe, ce n’est pas une priorité. Mais à l’échelle, c’est un contrôle essentiel. Il permet de mettre en cache les dépendances approuvées, de bloquer les paquets non autorisés et d’éviter que la panne de PyPI ne bloque vos déploiements.