
Projet de vérification des conditions d'impact local, correctif par mise à jour de version et retest pour Spring Framework CVE-2022-22965
Ce projet permet d'apprendre et de valider la vulnérabilité CVE-2022-22965 du framework Spring, également connue sous le nom de Spring4Shell, en ce qui concerne les conditions d'impact, les manifestations de risque, les méthodes de correction et le processus de re-test après correction.
Le projet a été réalisé dans un environnement local autorisé et mis en place personnellement. L'accent n'est pas mis sur l'attaque de cibles réelles, mais sur la construction d'environnements de test Spring MVC avant et après correction, la vérification point par point des conditions d'impact liées à la vulnérabilité, et l'observation sécurisée et en lecture seule des différences dans les chemins de propriétés internes du binding de données Spring avant et après la mise à niveau de version.
Ce projet a réalisé les étapes suivantes :
Ce projet est destiné uniquement à un environnement local personnel ou à un environnement de test de sécurité explicitement autorisé.
Le projet n'effectue aucune analyse, détection ou exploitation de vulnérabilité sur des sites web publics, serveurs ou systèmes métier tiers, et ne contient aucune donnée utilisateur réelle ni donnée métier réelle.
Pendant le test, les opérations suivantes n'ont pas été effectuées :
Il est interdit d'utiliser les méthodes de test de ce projet sur une cible non autorisée.
CVE-2022-22965, communément appelée Spring4Shell, est une vulnérabilité d'exécution de code à distance liée au mécanisme de liaison de données (data binding) des paramètres de requête dans le framework Spring.
Spring MVC permet de lier automatiquement les paramètres de requête HTTP aux propriétés des objets Java. Par exemple, ce projet reçoit les paramètres de nom et d'email via :
@ModelAttribute("profile") UserProfile profile
Normalement, les paramètres de requête name et email sont liés à l'objet UserProfile en fonction du nom de la propriété.
Dans les versions affectées, les restrictions d'accès à certains chemins de propriétés internes ne sont pas assez strictes. Lorsque l'on utilise JDK 9 ou une version ultérieure et que des conditions spécifiques de conteneur Servlet, de mode de déploiement et de liaison de données sont remplies, les paramètres de requête externes peuvent suivre l'objet métier normal pour accéder à des objets internes liés à la classe Java, au module, au chargeur de classe ou au conteneur.
Dans un environnement exploitable particulier, un attaquant pourrait modifier la configuration du serveur ou écrire des fichiers sur le serveur, créant ainsi un risque d'exécution de code à distance.
Ce projet n'effectue pas d'exploitation de code à distance complète, mais utilise le chemin de propriété suivant pour un diagnostic de différence sécurisé et en lecture seule :
class.module.name
Ce projet a été réalisé dans un environnement expérimental isolé sur VMware local.
127.0.0.1Données de test des fonctionnalités normales :
Alice[email protected]Chemin de propriété pour le diagnostic de sécurité :
class.module.name
spring4shell-local-verification-lab/
README.md : Présentation du projet, approche de test, résultats de validation et explications de correctiondocs/ : Rapport de vérification des conditions d'impact locales de Spring4Shell, correction et re-testimages/ : Captures d'écran de l'environnement du projet, du processus de test et du re-testvulnerable-demo/ : Projet avant correction utilisant Spring Framework 5.3.17fixed-demo/ : Projet après correction utilisant Spring Framework 5.3.18notes/ : Notes d'apprentissage et enregistrement du processusStructure principale du code source :
config/ : Classes de configuration Spring MVC et classe d'initialisation de l'applicationcontroller/ : Contrôleur de traitement de formulaire et de diagnostic de chemin de propriétémodel/ : Classe UserProfile pour recevoir les paramètres de nom et d'emailWEB-INF/views/ : Pages JSP pour la page d'accueil, le résultat de soumission et le résultat de diagnosticCe projet a créé deux applications Spring MVC, l'une avant correction et l'autre après correction.
Répertoire du projet :
vulnerable-demo
Version utilisée :
Spring Framework 5.3.17
Fichier WAR généré :
spring4shell-vulnerable-demo.war
Adresse d'accès :
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
Page de diagnostic :
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
Répertoire du projet :
fixed-demo
Version utilisée :
Spring Framework 5.3.18
Fichier WAR généré :
spring4shell-fixed-demo.war
Adresse d'accès :
http://127.0.0.1:8080/spring4shell-fixed-demo/
Page de diagnostic :
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
Le projet de test fournit un simple formulaire de profil utilisateur, comprenant :
Le contrôleur reçoit les paramètres de requête via :
@ModelAttribute("profile") UserProfile profile
Lorsque l'utilisateur soumet le nom et l'email, Spring MVC lie automatiquement les paramètres name et email à l'objet UserProfile.
La page de résultat lit l'objet lié et affiche le nom et l'email soumis par l'utilisateur.