InfraFenceInfraFence

Live Security Operations

Commencer

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 :

Toute distribution Linux
sudo nice -n 19 ionice -c3 find / -xdev -type f -name 'struts2-core-*.jar' 2>/dev/null
Toute distribution Linux (nécessite unzip)
sudo 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: |"
    done

Corriger

  1. 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.
  2. Reconstruisez et redéployez l'application, puis redémarrez-la.
  3. 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-Type n'est pas un simple multipart/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é

  1. L'agent note quels ports SSH et quels sites répondent.
  2. Il écrit la règle (identifiant ModSecurity 9920007) entre ses propres marqueurs dans son fichier ModSecurity, lance apachectl configtest et recharge Apache en douceur. Un test en échec remet le fichier précédent en place.
  3. Il vérifie que SSH et les sites répondent toujours, et retire le correctif sinon.
  4. 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 DetectionOnly se 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.