CVE-2017-5638 : RCE Apache Struts 2 via Content-Type, vérifier et corriger
Dernière mise à jour:
Dans Apache Struts 2, le parseur multipart Jakarta construit son message d'erreur à partir de l'en-tête Content-Type d'un upload en échec, et l'évalue comme OGNL. Un attaquant envoie une requête avec une expression OGNL dans cet en-tête et exécute des commandes sur le serveur, sans se connecter.
Elle a été exploitée dans la nature à partir de mars 2017 et utilisée dans de grandes fuites de données. De vieilles applications Struts tournent encore dans de nombreuses entreprises, et les scans continuent donc.
En bref
- CVE
- CVE-2017-5638
- Logiciel
- Apache Struts 2
- Versions concernées
- 2.3.5 à 2.3.31, 2.5 à 2.5.10
- Corrigé dans
- 2.3.32, 2.5.10.1
- Score CVSS
- 9.8 Critique (NVD, CVSS 3.1) ·
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H - CISA Known Exploited Vulnerabilities
- Oui, ajoutée le 3 novembre 2021
- Publiée par le NVD
- 11 mars 2017
- Correctif virtuel InfraFence
vp-cve-2017-5638(ModSecurity id 9920007)
Ce qui est concerné
Selon le bulletin S2-045 d'Apache : Struts 2.3.5 à 2.3.31 et 2.5 à 2.5.10, avec le parseur multipart Jakarta par défaut. Struts est une bibliothèque à l'intérieur des applications web Java (struts2-core-*.jar), pas un paquet système.
Vérifier si un serveur l'a
Cherchez la bibliothèque et les applications qui l'embarquent ; la version figure dans le nom :
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'struts2-core-*.jar' 2>/dev/nullsudo nice -n 19 ionice -c3 find / -xdev -type f \( -name '*.war' -o -name '*.ear' \) 2>/dev/null \
| while read -r f; do
unzip -l "$f" 2>/dev/null | grep -oE 'struts2-core-[0-9][^/ ]*\.jar' | sed "s|^|$f: |"
doneCorriger
- Passez Struts au moins à 2.3.32 ou 2.5.10.1, les versions qui l'ont corrigée. Les deux branches ne sont plus prises en charge depuis longtemps : prévoyez le passage à une version de Struts prise en charge, qui ferme aussi les vulnérabilités ultérieures.
- Reconstruisez et redéployez l'application, puis redémarrez-la.
- Si vous ne pouvez pas mettre à niveau tout de suite, le bulletin d'Apache donne deux contournements : un filtre de servlet qui rejette les requêtes dont le
Content-Typen'est pas un simplemultipart/form-data, ou le passage à un autre parseur multipart.
Attention: Une application qui faisait tourner un Struts vulnérable sur internet a pu être compromise il y a des années : cherchez des comptes inconnus, des tâches planifiées et des web shells.
Comment InfraFence la bloque pendant que vous mettez à jour
Le correctif virtuel pour CVE-2017-5638 est une règle ModSecurity sur l'en-tête de requête Content-Type : il bloque un en-tête qui contient %{ ou ${, le début d'une expression OGNL. Un vrai Content-Type ne contient jamais ni l'un ni l'autre.
Remarque: Le même bug peut aussi être atteint via les en-têtes Content-Disposition et Content-Length d'un upload (CVE-2017-5638 les couvre ; le bulletin S2-046 d'Apache les décrit). Le correctif ne vérifie que Content-Type, la forme exploitée dans la nature. La mise à niveau les couvre tous.
Comment le correctif est appliqué
- L'agent note quels ports SSH et quels sites répondent.
- Il écrit la règle (identifiant ModSecurity 9920007) entre ses propres marqueurs dans son fichier ModSecurity, lance
apachectl configtestet recharge Apache en douceur. Un test en échec remet le fichier précédent en place. - Il vérifie que SSH et les sites répondent toujours, et retire le correctif sinon.
- Il vérifie que ModSecurity bloque réellement avec la règle, au moyen d'une requête de sonde locale inoffensive. Un ModSecurity en
DetectionOnlyse contente de journaliser : le correctif est alors retiré et signalé comme inefficace, jamais comme appliqué.
Chaque requête bloquée par le correctif est signalée avec CVE-2017-5638 (agent 1.0.37 ou ultérieur) : vous voyez les tentatives dans l'activité du serveur et sur la page Exploitation du tableau de bord, et vous savez ainsi que la vulnérabilité est tentée contre vous.
Attention: Un correctif virtuel bloque la forme connue de l'attaque sur les requêtes qui passent par Apache sur ce serveur. Il ne remplace pas la mise à jour : installez la version corrigée, puis retirez le correctif depuis Activité avec Annuler si vous n'en avez plus besoin.
Les correctifs virtuels nécessitent Apache avec ModSecurity, le réglage Autoriser les modifications de la configuration du serveur web, et aucun panneau d'hébergement ni outil de gestion de configuration aux commandes du serveur web ; ils font partie du plan Pro et d'AutoMode. Une personne les applique depuis l'analyse IA, ou AutoMode le fait. Voir Correctifs virtuels.
Sources
Les faits de cette page viennent de ces sources ; consultez-les pour les mises à jour.
Essayez gratuitement sur 1 serveur
Starter est gratuit pour un serveur, avec la protection complète et le blocage automatique. Sans carte bancaire.
Installez l'agent en root, avec votre jeton à la place de <TOKEN> :
curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>Le jeton se crée dans le tableau de bord, dans Serveurs › Ajouter un serveur.
