Cybreach Consulting Prendre RDV
Retour aux articles
Vulnérabilités

Empoisonnement du cache web

Le cache web stocke des réponses HTTP pour les réutiliser lors de requêtes ultérieures identiques. Le cache décide de mettre en cache une réponse en se basant sur une "cache key" : généralement l'URL et la méthode HTTP. L'empoisonnement exploite le fait que certains en-têtes de requête influencent la réponse sans faire partie de la cache key. L'attaquant peut ainsi injecter une charge dans la réponse qui sera ensuite servie à d'autres utilisateurs.

Paramètres non keyed

Un "unkeyed input" est une valeur qui influence la réponse mais n'est pas incluse dans la cache key. Exemples courants : l'en-tête X-Forwarded-Host utilisé par l'application pour construire des URLs absolues (ex. dans les liens canoniques ou les redirections), l'en-tête X-Forwarded-Scheme, des paramètres de requête ignorés par le cache mais traités par l'application.

Exemple : empoisonnement via X-Forwarded-Host

# L'attaquant envoie :
GET / HTTP/1.1
Host: vulnerable.com
X-Forwarded-Host: attacker.com

# Si l'application utilise X-Forwarded-Host pour construire le lien du script :
<script src="https://attacker.com/app.js"></script>

# Et si cette réponse est mise en cache (X-Forwarded-Host n'est pas dans la cache key),
# tous les visiteurs suivants reçoivent la page avec le script de l'attaquant.

Empoisonnement via HTTP request smuggling

Le request smuggling peut être combiné avec le cache poisoning pour amplifier l'impact. L'attaquant smuggle une requête qui empoisonne une entrée de cache populaire. La réponse empoisonnée (contenant par exemple un payload XSS) est ensuite servie à tous les utilisateurs qui demandent la ressource correspondante.

Prévention

La prévention agit sur plusieurs niveaux. Ne pas utiliser les en-têtes X-Forwarded-* pour construire des URLs dans la réponse sans les ajouter à la cache key, ou configurer le cache pour les inclure. Valider et restreindre les en-têtes acceptés par le proxy ou le CDN. Désactiver la mise en cache pour les réponses qui dépendent d'en-têtes variables. Utiliser Vary pour inclure les en-têtes pertinents dans la cache key.

Inclure des en-têtes dans la cache key avec Vary

# Si la réponse varie selon l'en-tête Accept-Language :
Vary: Accept-Language

# Si l'application utilise X-Forwarded-Host pour construire la réponse :
Vary: X-Forwarded-Host
# (ou mieux : ne pas utiliser X-Forwarded-Host dans la réponse du tout)

Une question après la lecture ?

Votre application utilise un CDN ou un cache HTTP ? Envoyez un message.

Ou réservez directement un cadrage de 30 minutes

Réserver un appel