Validation approximative : pourquoi le laxisme avec vos uploads de fichiers est un cauchemar pour la sécurité
La semaine qui a révélé une faille tenace
En l'espace de quelques jours, trois hébergeurs web ont révélé des vulnérabilités critiques dans leurs systèmes d'upload de fichiers. Des failles permettant des téléversements sans authentification. Les chercheurs en sécurité ont vite compris : ces trois cas avaient la même origine. Un problème vieux comme le développement web lui-même.
Cette histoire n'est pas terminée. Elle se répète, encore et encore.
Le validateur flemmard
Concrètement, quand un développeur implémente un système d'upload, il cherche souvent la solution la plus simple. Extension qui a l'air correcte ? MIME type acceptable ? Taille raisonnable ? Ces vérifications ne sont pas absurdes en soi. Elles sont simplement… insuffisantes.
C'est ce que j'appelle le validateur flemmard. Celui qui fait le minimum et suppose que le fichier est clean. Comme quelqu'un qui vérifie qu'un colis n'a pas l'air suspect avant de l'ouvrir, sans jamais l'inspecter vraiment.
Le problème ? Les attaquants maîtrisent l'art de créer des fichiers qui satisfont ces contrôles de façade tout en cachant du code malveillant.
Ce qu'on a découvert la semaine dernière
Les trois vulnérabilités suivaient le même schéma :
Des extensions mal validées — Les fichiers pouvaient passer avec des doubles extensions (malicious.php.jpg) ou des extensions moins connues (.phtml, .phar).
Aucun contrôle du contenu réel — Le fichier n'était jamais analysé. Des polyglottes pouvaient passer pour des images tout en exécutant du code.
Un stockage mal sécuriser — Les fichiers atterrissaient dans des répertoires accessibles depuis le web.
Pas de blocage d'exécution — La configuration serveur ne bloquait rien.
Résultat : un attaquant sans compte pouvait uploader puis exécuter du code arbitraire. Accès total.
Pourquoi ça continue ?
Comprendre la source du problème aide à le résoudre.
La pression du temps — Les environnements de production réclament des déploiements rapides. Une validation complète semble être du temps perdu quand "ça fonctionne avec nos fichiers de test."
La confiance trompeuse — Les environnements de test utilisent des fichiers sains. Tout passe, jusqu'à la rencontre avec la réalité.
L'ignorance des menaces — Pas tous les développeurs ont une formation sécurité. Ils ne mesurent pas à quel point les attaquants peuvent être créatifs.
La foi aveugle en d'autres protections — Certaines équipes comptent sur les WAF, le hardening serveur, etc. C'est Optimiste, limite naïf.
Comment sécuriser un système d'upload
La vraie protection, c'est une défense en profondeur.
Vérifier le type par le contenu, pas par l'extension
Le problème classique :
# Mauvais - fait confiance à l'entrée utilisateur
if file.filename.endswith('.jpg'):
save_file(file)
La bonne approche :
# Bon - valide le contenu réel
import magic
mime_type = magic.from_buffer(file.read(1024), mime=True)
file.seek(0)
if mime_type in ALLOWED_MIME_TYPES:
save_file(file)
Utilisez python-magic ou libmagic pour analyser ce qu'il y a vraiment dans le fichier.
Générer des noms de fichiers sécurisés
Ne gardez jamais le nom d'origine. Générez quelque chose de neuf :
import uuid
import os
secure_filename = f"{uuid.uuid4().hex}.{allowed_extension}"
filepath = os.path.join(UPLOAD_DIR, secure_filename)
Stocker hors du web root
C'est non négociable pour les applications sensibles. Si l'accès est nécessaire, utilisez un script de téléchargement qui valide l'autorisation sans exposer le chemin réel.
Configurer le serveur contre l'exécution
# Apache - bloque les scripts dans uploads
<Directory "/var/www/uploads">
<FilesMatch "\.(php|phtml|phar|py|pl|exe)$">
Order Deny,Allow
Deny from all
</FilesMatch>
</Directory>
Superposer les validations
- Signature de fichier : vérifiez les bytes magiques
- Assainissement des images : ré-encodage via imagemagick pour retirer tout code embarqué
- Limites strictes : taille ET dimensions pour les images
- Rate limiting : empêcher les uploads massifs
Le coût humain des raccourcis
Derrière ces failles techniques, il y a des gens :
- Les clients dont les données sont compromises
- Les entreprises facing regulatory fines and lawsuits
- Les développeurs whose careers suffer from preventable mistakes
- Les utilisateurs finaux qui font confiance à des services qui les trahissent
La sécurité n'est pas une fonctionnalité. C'est une responsabilité.
Ce que les hébergeurs doivent faire maintenant
- Auditer le code existant à la recherche de raccourcis
- Implémenter une vérification sérieuse du type de contenu
- Déplacer les fichiers uploadés hors des répertoires web-accessibles
- Ajouter des règles WAF en couche supplémentaire
- Préparer des plans de réponse aux incidents
- Investir dans la formation sécurité des équipes
En conclusion
Les failles de la semaine dernière ne sont pas nées d'attaques sophistiquées ni d'exploits inconnus. Elles viennent de développeurs qui ont pris des raccourcis. Bonne nouvelle : les solutions existent et sont accessibles.
La sécurité n'est pas forcément lente ou douloureuse. Elle demande juste de passer du "ça devrait suffire" à une approche sérieuse et multicouche. La vraie question n'est pas "mon application sera-t-elle testée ?" mais "réussira-t-elle le test ?"
Prenez le temps de bien valider. Vos utilisateurs comptent là-dessus.
Tu as déjà croisé des validations bancales dans tes projets ? Raconte-moi en commentaires.