sérialisation et désérialisation en Java: explication de la vulnérabilité Java deserialize

la sérialisation Java est un mécanisme permettant de transformer un objet en un flux d’octets. La désérialisation Java est exactement l’inverse et nous permet de recréer un objet à partir d’un flux d’octets. La sérialisation Java—et plus spécifiquement la désérialisation en Java-est également connue sous le nom de « le cadeau qui continue à donner”. Cela concerne les nombreux problèmes de sécurité et autres problèmes qu’il a Produits au fil des ans.,

qu’est-Ce que la sérialisation en Java?

En Java, nous créons des objets. Ces objets vivent en mémoire et sont supprimés par le garbage collector une fois qu’ils ne sont plus utilisés. Si nous voulons transférer un objet, par exemple, le stocker sur un disque ou l’envoyer sur un réseau, nous devons le transformer en un flux d’octets. Pour ce faire, la classe de cet objet doit implémenter l’interface Serializable. La sérialisation convertit l’état d’un objet en un flux d’octets. Ce flux d’octets ne contient pas le code réel.,

qu’est-Ce que la désérialisation en Java?

la désérialisation est précisément le contraire de la sérialisation. Avec la désérialisation, vous avez un flux d’octets et vous recréez l’objet dans le même état que lorsque vous l’avez sérialisé. Cela signifie que vous devez avoir la définition réelle de l’objet pour accomplir la récréation.

Comment fonctionne la sérialisation Java de travail?

la sérialisation Java utilise la réflexion pour extraire toutes les données des champs de l’objet qui doivent être sérialisés. Cela inclut les champs privé et final., Si un champ contient un objet, cet objet est sérialisé récursivement. Même si vous pouvez avoir des getters et des setters, ces fonctions ne sont pas utilisées lors de la sérialisation d’un objet en Java.

Comment Java désérialisation de travail?

Lors de la désérialisation d’un flux d’octets dans un objet, il n’utilise pas le constructeur. Il crée un objet vide et utilise la réflexion pour écrire les données dans les champs. Tout comme pour la sérialisation, les champs privé et final sont également inclus.

qu’est-Ce que Java désérialiser vulnérabilité?,

Une vulnérabilité Java deserialize est une vulnérabilité de sécurité qui se produit lorsqu’un utilisateur malveillant tente d’insérer un objet sérialisé modifié dans le système, ce qui compromet éventuellement le système ou ses données. Pensez à l’exécution de code arbitraire qui peut être déclenchée lors de la désérialisation d’un objet sérialisé. Pour mieux expliquer les vulnérabilités Java deserialize, nous devons d’abord explorer le fonctionnement de la désérialisation en Java.

Expliquant Java désérialiser des vulnérabilités

Un objet sérialisé en Java, un tableau d’octets avec l’information de l’état., Il contient le nom de l’objet auquel il se réfère et les données du champ. Si vous regardez un objet sérialisé stocké avec un éditeur hexadécimal, Vous pouvez entourer et manipuler les informations rapidement.

Nous savons déjà que la désérialisation Java n’utilise pas le constructeur pour créer un objet mais utilise plutôt la réflexion pour charger les champs. Cela signifie que toutes les vérifications de validation effectuées dans le constructeur ne sont jamais appelées lors de la recréation de l’objet. Vous pouvez penser à des vérifications comme la date de début avant la date de fin lorsque vous décrivez une période., Lors de la désérialisation d’un objet Java, ce nouvel objet peut avoir un état invalide.

regardons l’exemple suivant de Java désérialiser vulnérabilité où nous sérialiser un objet d’une classe sérialisable ValueObject:

Lors de la lecture du fichier ValueObject.ser contenant l’objet sérialisé avec un éditeur hexadécimal, la sortie est cela.

Maintenant je peut facilement manipuler la chaîne de valeur. Ci-dessous je l’ai changer de Hi de Hallo.,

Lors de la désérialisation d’ajustement d’un fichier binaire, nous constatons que l’objet de la value changé. Nous voyons également que l’horodatage n’a pas changé, prouvant que le constructeur n’est jamais appelé. Ainsi, si une application accepte des objets sérialisés, il est relativement facile de tempérer avec les valeurs. En modifiant les objets sérialisés, nous pouvons créer des objets invalides, nuire à l’intégrité des données, ou pire encore.,

exécution arbitraire de code, gadgets et chaînes

la falsification des données d’un objet est déjà nuisible. Cependant, cela peut également conduire à l’exécution de code si l’ensemble correct d’objets est désérialisé. Pour expliquer cela je dois d’abord expliquer les gadgets et les chaînes.

Gadgets

Un gadget—tel qu’utilisé par Lawrence& Frohoff dans leur conférence Marschalling Pickle à Appseccali2015—est une classe ou une fonction qui a déjà du code exécutable existant présent dans le processus vulnérable. Ce code exécutable existant peut être réutilisé à des fins malveillantes., Si nous regardons les objets sérialisables Java, certaines méthodes magiques—comme la méthode privée readObject() – sont appelées de manière réfléchie lors de la désérialisation.

regardons le gadget simplifié ci-dessous:

Cette classe de gadget remplace la méthodereadObject par défaut. En conséquence, chaque fois qu’un objet de la classe Gadget est désérialisé, la commande Runnable object est exécutée. Lorsqu’une classe de commande ressemble à l’exemple ci-dessous, il est facile de manipuler cet objet sérialisé et d’effectuer une injection de code.,

notez également que si une application accepte des objets sérialisés, l’objet est d’abord désérialisé avant d’être converti au type souhaité. Cela signifie que même si le casting échoue, la désérialisation est déjà terminée et la méthode readObject() est exécutée.

attaque de désérialisation des chaînes de gadgets

une attaque de désérialisation typique consiste en une chaîne de gadgets intelligemment conçue. Un attaquant recherche un gadget utilisable pour lancer une attaque et enchaîne plusieurs exécutions qui se terminent par une exécution de code arbitraire, par exemple.,
Dans notre exemple:

Gadget -> readObject() -> command.run() -> Runtime.getRuntime().exec()

Pour un exemple, prenons un coup d’oeil à la mise en œuvre de java.util.HashMap. Cette classe a une implémentation personnalisée de la méthodereadObject() qui déclenche la fonctionhashcode() de chaque clé.

bibliothèques

Il est bon de savoir que les chaînes de gadgets disponibles dans votre application ne sont pas liées à votre code., Parce que nous importons beaucoup de code à partir de bibliothèques et de frameworks, le nombre de classes importées par vos dépendances (transitives) influence la possibilité de certaines chaînes de gadgets. Bien que la création d’une telle chaîne de gadgets malveillants soit très difficile et exige beaucoup de main-d’œuvre, les vulnérabilités de désérialisation Java constituent un risque de sécurité réel et dangereux.

comment empêcher une vulnérabilité Java deserialize?

la meilleure façon d’empêcher une vulnérabilité Java deserialize est d’empêcher la sérialisation Java dans son ensemble. Si votre application n’accepte pas du tout les objets sérialisés, elle ne peut pas vous nuire.,

cependant, si vous devez implémenter l’interface sérialisable en raison de l’héritage, vous pouvez remplacer lereadObject(), comme indiqué ci-dessous, pour empêcher la désérialisation réelle.

Si votre application repose sur des objets sérialisés, vous pouvez envisager d’inspecter votreObjectInputStream avant de désérialiser. Une bibliothèque qui peut vous aider est la bibliothèque Apache Commons IO. Cette bibliothèque fournit une ValidatedObjectInputStream où vous pouvez autoriser explicitement les objets que vous souhaitez désérialiser. Maintenant, vous empêchez que les types inattendus soient désérialisés du tout.,

un outil comme ysoserial est également extrêmement utile pour trouver des vulnérabilités Java deserialize dans votre code. C’est un outil qui génère de la charge utile pour découvrir des chaînes de gadgets dans des bibliothèques Java communes qui peuvent, dans les bonnes conditions, exploiter des applications Java effectuant une désérialisation dangereuse des objets.

notez que les vulnérabilités de désérialisation Java ne sont pas exclusives à L’implémentation de sérialisation personnalisée de Java. Bien que cet article se concentre uniquement sur cette partie, les mêmes vulnérabilités existent dans les frameworks de sérialisation ou de marshaling qui gèrent cela pour vous., S’il existe un framework qui crée magiquement des POJO à partir de formats XML, JSON, yaml ou similaires, il utilise probablement la réflexion de la même manière que décrit ci-dessus. Cela signifie que les mêmes problèmes existent.

Author: admin

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *