Un téléversement de fichiers sécurisé repose sur plusieurs contrôles appliqués de concert, et l'OWASP File Upload Cheat Sheet les recense. Cet article parcourt cette liste, signale les points faciles à négliger et la transforme en tests que vous pouvez exécuter sur chaque endpoint de téléversement.
Ce contre quoi vous vous défendez
La cheat sheet regroupe les menaces sous l'appellation « fichiers malveillants ». La première est une attaque contre le logiciel qui traite le fichier. Un attaquant fournit un fichier qui exploite une vulnérabilité du parseur ou du module de traitement, et la cheat sheet cite l'exploit ImageTrick et XXE en exemple.
La deuxième est le phishing. La cheat sheet prend l'exemple d'un formulaire de candidature : le téléversement devient alors un moyen de placer un fichier hostile sous les yeux des personnes qui l'ouvrent.
La troisième concerne la disponibilité. Les ZIP bombs, les XML bombs (l'attaque « billion laughs ») et les simples fichiers de très grande taille peuvent saturer l'espace de stockage du serveur et nuire à sa disponibilité.
Valider avant d'accepter
La cheat sheet impose un ordre : appliquer la validation des entrées avant de valider l'extension, puis travailler à partir d'une allowlist.
- Lister les extensions autorisées. N'autorisez que les extensions sûres dont la fonction métier a besoin. Un formulaire de photo de profil n'a aucune raison d'accepter autre chose que quelques types d'images.
- Valider le type de fichier. Ne vous fiez pas au
Content-Typedéclaré, car il peut être falsifié. Validez le type et la signature du fichier avant d'accepter le téléversement. - Définir une longueur maximale de nom de fichier et, si possible, restreindre les caractères autorisés.
- Définir une taille maximale de fichier.
Si un fichier échoue à l'un de ces contrôles, rejetez-le.
Soigner le nom et l'emplacement
La cheat sheet préconise de remplacer le nom de fichier fourni par l'utilisateur par un nom généré par l'application. Faites-le pour chaque téléversement, quel que soit le type de fichier.
L'endroit où le fichier est stocké compte autant que sa nature. Stockez les fichiers téléversés sur un serveur distinct si vous le pouvez. Si ce n'est pas possible, stockez-les en dehors du webroot.
Lorsque des fichiers doivent être accessibles publiquement, utilisez un handler au sein de l'application qui associe un identifiant à un fichier (someid vers file.ext) plutôt que d'exposer le chemin de stockage.
Deux autres points de la liste sont faciles à oublier :
- Seuls les utilisateurs autorisés doivent pouvoir téléverser des fichiers.
- Protégez le téléversement contre les attaques CSRF.
Analyser et traiter ce que vous conservez
La validation vérifie qu'un fichier a l'apparence attendue. La cheat sheet ajoute une étape : passer le fichier dans un moteur antivirus ou une sandbox, si l'un d'eux est disponible, afin de valider qu'il ne contient aucune donnée malveillante.
Pour les types de documents concernés, comme PDF et DOCX, envisagez le CDR (Content Disarm & Reconstruct) comme étape de traitement supplémentaire.
La cheat sheet précise aussi que toutes les bibliothèques utilisées doivent être configurées de façon sécurisée et tenues à jour. Les vulnérabilités des parseurs figurant parmi les menaces citées, c'est le point à confier à une personne nommément désignée, avec une date de revue.
Tester chaque endpoint
La cheat sheet énumère des contrôles, pas des cas de test. Chaque ligne ci-dessous est notre propre dérivation à partir de sa checklist, et la troisième colonne indique de quel point elle provient. Exécutez les tests sur chaque endpoint de téléversement, y compris les outils d'administration et ceux ajoutés pour un seul client.
| Test | Résultat attendu | Base |
|---|---|---|
| Téléverser un fichier script renommé avec une extension autorisée | Rejeté après la validation du type de fichier | Dérivé : valider le type de fichier |
Envoyer un fichier non autorisé avec un Content-Type autorisé | Toujours rejeté | Dérivé : ne pas se fier à l'en-tête Content-Type |
| Soumettre un nom de fichier très long | Rejeté, ou remplacé par un nom généré | Dérivé : longueur maximale du nom de fichier, noms générés |
| Téléverser un fichier dépassant la limite de taille | Refusé | Dérivé : taille maximale de fichier |
| Demander le fichier stocké en devinant son chemin | Inaccessible, sauf via le handler | Dérivé : emplacement de stockage, handler d'association |
| Téléverser sans session, ou sans jeton CSRF | Refusé | Dérivé : utilisateurs autorisés, protection CSRF |
| Téléverser une ZIP ou XML bomb dans un environnement de test | Le service reste disponible | Dérivé : menace sur la disponibilité |
Pour une référence plus large, l'OWASP Web Security Testing Guide se présente comme la ressource de référence en matière de tests de cybersécurité pour les développeurs d'applications web et les professionnels de la sécurité. L'OWASP Application Security Verification Standard propose des exigences numérotées à vérifier. Si vous en citez une dans un ticket ou un rapport, indiquez la version, par exemple v5.0.0-1.2.5, car les identifiants peuvent changer d'une version du standard à l'autre.
Par où commencer
- Recensez tous les endpoints qui acceptent un fichier, y compris les outils d'administration, les fonctions d'import et les anciens plugins.
- Pour chacun, définissez les extensions autorisées, la taille maximale de fichier et la longueur maximale du nom de fichier, et appliquez la validation des entrées avant le contrôle de l'extension.
- Remplacez les noms de fichiers fournis par les utilisateurs par des noms générés. Déplacez le stockage vers un serveur distinct ou en dehors du webroot, et servez les fichiers publics via un handler qui associe des identifiants à des noms de fichiers.
- Ajoutez la validation du type et de la signature des fichiers, une étape antivirus ou sandbox, et du CDR pour les types de documents que vous acceptez. Vérifiez que les bibliothèques de parsing sont à jour et configurées de façon sécurisée.
- Transformez le tableau de tests en vérifications scriptées et exécutez-les avant chaque release. Si vous souhaitez une revue externe du résultat, notre service de tests d'intrusion peut tester les endpoints, et notre accompagnement au développement logiciel sécurisé peut vous aider si la fonctionnalité en est encore à la phase de conception. Les recommandations OWASP sur le téléversement de fichiers servent de checklist de revue dans les deux cas.
