X-Content-Type-Options est un en-tête de réponse HTTP qui n'a qu'une seule valeur valide : nosniff. Il indique au navigateur de suivre strictement le type MIME déclaré dans l'en-tête Content-Type et de ne jamais tenter de deviner le type de contenu par lui-même. Cela empêche une catégorie d'attaques qui exploitent le comportement de sniffing de type MIME des navigateurs.
De tous les en-têtes de sécurité, X-Content-Type-Options est le plus simple à comprendre et à mettre en œuvre. Il ne nécessite qu'une ligne de configuration, n'a pas de directives complexes, et il n'y a essentiellement aucune raison de ne pas l'utiliser. Pourtant, un nombre étonnant de sites web ne l'envoient toujours pas.
Qu'est-ce que le sniffing de type MIME et pourquoi les navigateurs le font
Pour comprendre pourquoi cet en-tête existe, un peu d'histoire est utile. Aux débuts du web, de nombreux serveurs étaient mal configurés et envoyaient des en-têtes Content-Type incorrects. Un serveur pouvait servir un fichier HTML en tant que text/plain, ou une image en tant que application/octet-stream. Si les navigateurs avaient strictement suivi le type déclaré, ces pages auraient été affichées sous forme de texte brut ou auraient déclenché un téléchargement au lieu de s'afficher correctement.
Pour contourner cela, les navigateurs ont commencé à « renifler » le contenu réel des fichiers afin de déterminer le type véritable. Le navigateur examinait les premiers octets d'une réponse, recherchait des signatures connues (comme les balises <html>, les en-têtes d'image ou les motifs JavaScript) et remplaçait le type déclaré par le serveur si le contenu semblait différent. Internet Explorer était particulièrement agressif à ce sujet. Si IE détectait quelque chose qui ressemblait à du HTML ou du JavaScript dans un fichier servi en text/plain, il l'affichait ou l'exécutait sans hésitation.
C'était une solution de contournement raisonnable pour les serveurs mal configurés, mais cela créait une grave faille de sécurité.
Comment le sniffing MIME permet des attaques
Voici un scénario d'attaque concret qui cible un site WordPress avec téléversement de fichiers :
Supposons que votre site WordPress permette aux utilisateurs de téléverser des photos de profil. Votre gestionnaire de téléversement vérifie l'extension du fichier et n'autorise que .jpg, .png et .gif. Un attaquant crée un fichier qui commence par des en-têtes d'image valides (les premiers octets ressemblent à un JPEG correct) mais contient du code JavaScript intégré après l'en-tête de l'image. Il le nomme avatar.jpg et le téléverse.
Votre serveur stocke le fichier et le sert avec Content-Type: image/jpeg. Jusqu'ici, tout semble correct. Mais maintenant, l'attaquant établit un lien vers ce fichier depuis une page, peut-être dans un message de forum ou un commentaire, en utilisant une balise script :
<script src="https://votresite.com/uploads/avatar.jpg"></script>Sans X-Content-Type-Options, un navigateur effectuant le sniffing MIME pourrait examiner le fichier, remarquer qu'il contient du contenu ressemblant à du JavaScript et l'exécuter en tant que script malgré le type de contenu image/jpeg. Le JavaScript de l'attaquant s'exécute alors dans le contexte de votre site, avec accès aux cookies et aux données de session de vos visiteurs.
Avec l'en-tête nosniff, le navigateur respecte le type image/jpeg déclaré et refuse d'exécuter le fichier en tant que JavaScript. L'attaque échoue.
Sniffing MIME et téléversements de médias WordPress
WordPress dispose d'un système de téléversement de médias qui gère beaucoup de fichiers : images, PDF, documents, audio, vidéo. Chacun d'entre eux est servi avec un type MIME spécifique. Le cœur de WordPress effectue déjà certaines validations sur les téléversements (vérification des types de fichiers par rapport à une liste autorisée, vérification que le contenu du fichier correspond à l'extension), mais ces vérifications ne sont pas infaillibles.
Plusieurs facteurs rendent WordPress particulièrement pertinent ici :
- Plusieurs points de téléversement : la médiathèque, Gravity Forms, Contact Form 7, les images de produits WooCommerce, les pièces jointes de forum bbPress et de nombreuses autres extensions gèrent toutes le téléversement de fichiers. Chacune est un point d'entrée potentiel pour des fichiers malveillants.
- Contenu généré par les utilisateurs : sur les sites avec des fonctionnalités d'adhésion ou de communauté, vous pouvez autoriser des utilisateurs relativement non fiables à téléverser des fichiers. Plus vous avez de sources de téléversement, plus il est important que le navigateur traite les fichiers exactement comme déclarés.
- Gestionnaires de téléversement des extensions : toutes les extensions ne valident pas les téléversements aussi soigneusement que le cœur de WordPress. Une extension mal écrite peut accepter des fichiers avec des types incohérents, créant exactement les conditions que les attaques de sniffing MIME exploitent.
- Environnements d'hébergement mutualisé : sur un hébergement mutualisé, les fichiers d'autres sites du même serveur pourraient potentiellement être servis avec des en-têtes incorrects. La directive
nosniffajoute une couche de défense indépendamment de la qualité de la configuration côté serveur.
L'en-tête de sécurité le plus simple à mettre en œuvre
Ajouter X-Content-Type-Options ne prend qu'une ligne. Il n'y a pas de directives à choisir, pas de valeurs à ajuster et aucun risque de casser les fonctionnalités. Contrairement à la CSP (qui peut casser les scripts en ligne), HSTS (qui peut vous bloquer si votre certificat expire) ou Referrer-Policy (qui peut affecter les analyses), X-Content-Type-Options n'a effectivement aucun inconvénient.
Pour Apache (.htaccess ou config d'hôte virtuel) :
Header always set X-Content-Type-Options "nosniff"Pour Nginx :
add_header X-Content-Type-Options "nosniff" always;Via PHP dans WordPress :
add_action('send_headers', function() {
header('X-Content-Type-Options: nosniff');
});WordPress envoie déjà lui-même X-Content-Type-Options: nosniff pour les pages d'administration et les réponses de l'API REST depuis la version 4.8. Cependant, les pages front-end de la plupart des installations WordPress n'incluent pas cet en-tête, sauf si vous l'ajoutez au niveau du serveur ou via une extension de sécurité.
Comment les navigateurs modernes gèrent le sniffing MIME
Le comportement des navigateurs s'est considérablement amélioré au fil des années. Les versions modernes de Chrome, Firefox, Safari et Edge sont beaucoup moins agressives en matière de sniffing MIME que les navigateurs de l'ère Internet Explorer. Chrome, par exemple, bloque déjà les scripts qui ont un type MIME non-script dans de nombreuses situations, même sans l'en-tête nosniff.
Cependant, il existe encore des cas particuliers où le sniffing se produit, et les anciens navigateurs peuvent encore être vulnérables. L'en-tête nosniff fournit une instruction claire et définitive qui supprime toute ambiguïté. C'est une bonne pratique quels que soient les navigateurs utilisés par vos visiteurs.
Interaction avec d'autres en-têtes de sécurité
X-Content-Type-Options fonctionne bien aux côtés d'autres en-têtes de sécurité et il n'y a aucun conflit à craindre :
- Combiné à la CSP, il offre une défense en profondeur : la CSP contrôle quelles sources sont autorisées, tandis que
nosniffgarantit que les fichiers provenant de sources autorisées sont traités selon leur type déclaré. - Avec HSTS, vous garantissez des connexions chiffrées, et avec
nosniff, vous garantissez en plus l'intégrité du contenu. - Contrairement à d'autres en-têtes,
nosniffn'interagit avec aucun autre en-tête et n'en remplace aucun. Il est purement additif.
Ce que vérifie InspectWP
InspectWP vérifie si votre site WordPress envoie l'en-tête X-Content-Type-Options: nosniff. Comme cet en-tête n'a qu'une seule valeur valide et aucune complexité de configuration, il n'y a vraiment aucune raison qu'il soit absent. Si cet en-tête manque sur votre site, c'est l'un des gains de sécurité les plus rapides que vous puissiez obtenir. L'ajouter prend moins d'une minute et offre une protection significative contre les attaques par confusion de type MIME, en particulier sur les sites qui gèrent des téléversements de fichiers.