Téléchargement d’images – problèmes de sécurité

Je développe une application Web ASP.NET et j’aimerais que l’utilisateur puisse télécharger une image à partir de son système local ou transmettre une URL à une image. L’image peut être un fichier JPG ou PNG. Quels problèmes de sécurité devrais-je m’inquiéter de faire cela? J’ai déjà vu différentes manières d’incorporer du code dans des fichiers JPG. Existe-t-il des méthodes en C # (ou des bibliothèques externes) pouvant confirmer qu’un fichier est un fichier JPG / PNG, sinon une erreur est générée? À tout le moins, je rend le répertoire contenant les images téléchargées non-navigable et limitant la taille maximale à 1 Mo, mais j’aimerais implémenter des vérifications supplémentaires.

Merci pour tout conseil.

Existe-t-il des méthodes en C # (ou des bibliothèques externes) pouvant confirmer qu’un fichier est un fichier JPG / PNG, sinon une erreur est générée?

Peut-être, mais cela n’aide pas vraiment en soi. Vous pouvez facilement créer un fichier qui est à la fois un format d’image valide et contenant un contenu HTML / script actif pour le reniflage de contenu IE. Vous pouvez également vous inquiéter des règles d’origine Java et Flash rompues, qui peuvent avoir le même effet de script dans le contexte de sécurité de votre serveur.

  1. Si vous traitez l’image (par exemple, rognez, redimensionnez) et que vous enregistrez à nouveau, il devient très, très difficile de mener des attaques de contrebande de contenu. Cependant, vous devez toujours vous assurer que vos outils côté serveur sont à jour, car des vulnérabilités dans les bibliothèques de traitement d’images risquent de vous exposer à un exploit côté serveur.

  2. Si vous ne pouvez pas faire cela, votre meilleur pari pour atténuer tous les problèmes d’injection de contenu est de servir vos images à partir d’un [sous] domaine différent qui n’a access à aucune des informations d’identification sensibles (cookies, authentification de base). du site principal.

  3. Si vous utilisez un sous-domaine à cette fin, tel que images.example.com , votre site principal ne devrait être accessible que par www.example.com et non par example.com . Sinon, le contenu injecté dans images.example.com peut accéder aux cookies de example.com dans IE. example.com devrait 301-redirect vers www.example.com pour éviter les fuites de cookies indésirables en général.

  4. Ajoutez l’en-tête X-Content-Type-Options: nosniff à la réponse pour bloquer les attaques de contrebande de contenu à partir d’IE8. (N’aide pas avec les versions précédentes, hélas.)

Également:

  1. La désinfection des noms de fichiers spécifiés par l’utilisateur est difficile , en particulier si votre application est probablement exécutée sur un serveur Windows où les règles relatives aux noms de fichiers utilisables sont effectivement compliquées. Un bon sharepoint départ consiste à n’autoriser que les caractères alphanumériques et à append votre propre extension de fichier et préfixe. (Un préfixe est nécessaire pour éviter les noms de fichiers réservés par Windows et le nom de fichier vide.)

  2. Mieux: stockez le nom de fichier fourni par l’utilisateur dans la firebase database au lieu de l’utiliser comme un nom de fichier réel.

Voir cette question pour plus de détails sur les problèmes de sécurité liés au téléchargement de fichiers.

C’est un champ de mines absolu. Quelque chose à prendre en compte (pas nécessairement une liste exhaustive, aucune garantie, etc.).

  • Certaines personnes utilisent des expressions régulières pour l’parsing, il est donc impossible de savoir si le fichier contient du code. Les fichiers ZIP ont leur répertoire à la fin. Sun / Oracle Java PlugIn / WebStart vérifie maintenant que le fichier commence par un numéro magique d’en-tête / entrée local ZIP pour éviter les attaques “GIFAR”.
  • Servir à partir d’un domaine différent, pour éviter les problèmes de même origine.
  • Servir à partir d’une adresse IP différente, pour éviter les problèmes de même origine.
  • Il est un peu difficile de vérifier si le fichier exploite, par exemple, un dépassement de mémoire tampon de 0 jour. Cela pourrait même exploiter une boucle infinie pour créer un DoS.
  • Il est préférable de ré-encoder l’image.
  • Attention au nom de l’URL / chemin du fichier. Si vous donnez une option, utilisez la vérification de la liste blanche. En particulier, les caractères NUL sont “amusants”. Voir aussi Attaques de traversée de répertoire. En général, être capable de placer un fichier de contenu donné dans un emplacement connu est, au moins, un gros problème.
  • Ou des images que vous voudrez peut-être vérifier que la taille est saine. Décompresser une image énorme pourrait bien conduire à un DoS. Notez également que les algorithmes de compression permettent souvent de compresser des données sortingviales par d’ énormes facteurs.

Ne laissez pas l’utilisateur déterminer le nom du fichier à utiliser sur votre serveur. Utilisez plutôt [généré généré] .jpg et mettez le nom de fichier qu’ils ont utilisé dans une table de firebase database si vous en avez besoin.

Voir le # 12 ici: http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

Contrôle externe du nom de fichier ou du chemin d’access Lorsque vous utilisez une entrée externe lors de la construction d’un nom de fichier, le chemin résultant peut pointer en dehors du répertoire prévu. Un attaquant pourrait combiner plusieurs séquences “..” ou des séquences similaires afin de permettre au système d’exploitation de sortir du répertoire restreint. Les autres attaques liées aux fichiers sont simplifiées par le contrôle externe d’un nom de fichier, tel que le suivi du lien symbolique, ce qui oblige votre application à lire ou à modifier des fichiers auxquels l’attaquant ne peut accéder directement. Il en va de même si votre programme fonctionne avec des privilèges élevés et accepte les noms de fichiers en tant qu’entrée. Des règles similaires s’appliquent aux URL et permettent à un tiers de spécifier des URL arbitraires.

Faites également attention avec l’URL, assurez-vous qu’il s’agit d’une URL externe absolue afin qu’ils ne puissent pas utiliser votre propre serveur Web pour copier un fichier confidentiel de votre réseau local dans une zone à laquelle ils peuvent accéder car vous allez charger cette URL à partir de. code fonctionnant sur votre serveur Web.

Vous pouvez utiliser Infrastructure en tant que service pour gérer les images, par exemple notre solution – Uploadcare:

https://uploadcare.com

Si vous appliquez l’une des opérations d’image à l’image téléchargée, celle-ci est modifiée et, par conséquent, tout code éventuellement incorporé dans le fichier est détruit.