En date du 30 mars 2022, une vulnérabilité sur le framework Spring a été publiée. La CVE-2022-22965 « Spring Framework RCE via Data Binding on JDK 9+ » classée ‘Critique’ par le fournisseur a déjà été utilisé par des attaquants.
La Purple Team de Gatewatcher s’est mobilisée pour vous fournir le plus rapidement possible des signatures testées et validées en conditions réelles permettant de détecter l’exploitation de cette vulnérabilité.
Notre solution dispose d’ores et déjà de 5 règles de détection dédiées à cette vulnérabilité. Deux nouvelles règles vous sont ici proposées pour compléter votre capacité de détection.
Il est néanmoins fortement recommandé d’appliquer les mises à jour disponibles par le constructeur ou, à défaut, d’appliquer les remédiations proposées par celui-ci le temps des mises à jour.
Détection
Les signatures suivantes sont fournies par défaut depuis le 01 Avril 2022 et permettent la détection de cette vulnérabilité :
- 2035674 ET EXPLOIT Possible SpringCore RCE/Spring4Shell Stage 1 Pattern Set Inbound (Unassigned)
- 2035675 ET EXPLOIT Possible SpringCore RCE/Spring4Shell Stage 2 Suffix Set Inbound (Unassigned)
- 2035676 ET EXPLOIT Possible SpringCore RCE/Spring4Shell Stage 3 Directory Set Inbound (Unassigned)
- 2035677 ET EXPLOIT Possible SpringCore RCE/Spring4Shell Stage 4 Prefix Set Inbound (Unassigned)
- 2035678 ET EXPLOIT Possible SpringCore RCE/Spring4Shell Inbound (Unassigned)
Il sera également possible de détecter des tentatives d’exploitation avec les règles suivantes :
- alert http any any -> any any (msg: “ATTACK [PTsecurity] Spring Core RCE aka Spring4Shell Attempt”; flow: established; content: “pipeline.first.pattern”; nocase; content: “getRuntime”; nocase; distance:0; content: “exec”; nocase; pcre: “/(?:%25|%)(?:%7B|{)/i”; pcre:”/(?:%7D|})i/i”; reference: url, github.com/ptresearch/AttackDetection;reference: url, www.cyberkendra.com/2022/03/springshell-rce-0-dayvulnerability.html; classtype: attempted-admin; sid: 10007107; rev: 1;)
- alert http any any -> any any (msg: “SPRING4SHELL CURRENT_EVENT Spring Core RCE aka Spring4Shell Attempt”; flow: established,to_server; content: “pipeline.first.pattern”; nocase; pcre: “/(?:%25|%)(?:%7B|{)/Ri”; pcre:”/(?:%7D|})i/Ri”; reference: url, www.cyberkendra.com/2022/03/springshellrce-0-day-vulnerability.html; classtype: attempted-admin; sid: 10007108;rev: 1;)
La première issue des règles de PTSecurity permettra de détecter les cas les plus évidents correspondant aux informations connues à ce jour sur la vulnérabilité.
La seconde, plus large, effectuera une détection sur l’utilisation des variables dans le payload suivant pipeline.first.pattern ce qui permettra de détecter des requêtes semblables à la seconde requête présentée ci-dessous.
Important : Comme pour toute mise en place de règles il est nécessaire d’évaluer ces règles en préproduction afin d’en évaluer l’impact.
La vulnérabilité
Une partie des réactions sont liées au souvenir de la vulnérabilité Log4Shell, l’autre partie est liée à la confusion liée à la publication de différentes vulnérabilités au cours de la semaine sur le framework.
- CVE-2022-22963 : Il s’agit également d’une exécution de code à distance (RCE) , mais qui concerne Spring Cloud.
- CVE-2022-22950 : Concerne Spring framework, mais il s’agit d’une condition de déni de service (Dos).
La vulnérabilité qui va nous intéresser ici est la CVE-2022-22965 Spring Framework RCE via Data Binding on JDK 9+ classée ‘Critique’ par le fournisseur qui a été vue par différents acteurs comme d’ores et déjà utilisé par des attaquants.
Des informations communiquées par le fournisseur, ainsi que par les différentes observations, la vulnérabilité semble, pour le moment, limitée à un certain nombre de conditions :
- L’utilisation de JDK9 ou supérieur
- Un déploiement dans Apache Tomcat en tant que WAR
- L’utilisation de spring-webmvc ou spring-webflux
- Le framework Spring dans une version 5.3.0 à 5.3.17 ou 5.2.0 à 5.2.19 ou antérieure.
Un correctif a été publié par le fournisseur dans les versions suivantes :
- 5.3.18
- 5.2.20
Note : une mise à jour de Spring Boot qui dépend de Spring a également été mise à disposition.
Pour résumer cette vulnérabilité, la problématique se situe dans la manière dont Spring convertit les paramètres HTTP en objet, plus précisément en Plain Old Java Object (POJO). Si la liste des paramètres n’est pas gérée correctement, il est possible d’accéder au module classLoader. Une fois ce module accédé il est possible de faire énormément de choses. Dans les Proof-of-concept publié, il s’agit d’obtenir l’accès au contexte catalina et modifier la journalisation afin de créer un webshell en jsp.
Proof of Concept
Les ressources disponibles permettent d’avoir un exemple d’exploitation de cette vulnérabilité.
La vulnérabilité viendrait de la manière dont sont gérés les champs non attendus (comme indiqué dans la documentation Spring).
Ainsi, la vulnérabilité peut être exploitée de la manière suivante :
Dans le cas du POC utilisé, on notera également des messages dans les journaux de l’application du type
- 2022-03-31 16:02:23.169 INFO 1 — [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet ‘dispatcherServlet’
- 2022-03-31 16:02:23.174 INFO 1 — [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 3 ms
- 31-Mar-2022 16:02:27.964 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/ROOT]
- 31-Mar-2022 16:02:28.000 INFO [Catalina-utility-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/tomcat/webapps/ROOT] has finished in [36] ms
Le payload ci-dessus, permet de déposer un webshell.
Un autre POC (https://github.com/lunasec-io/Spring4Shell-POC) montre une autre méthode :
On note ici l’utilisation de headers spécifiques et de l’utilisation de ces headers dans le payload. Cela ouvre donc la porte à diverses variantes telles que :
Auteur : Purple Team Gatewatcher