La désérialisation non sécurisée

Contexte

La sérialisation implique la conversion de structures de données complexes, telles que les objets et leurs champs, en un format plus simple qui peut être transmis sous forme de flux d'octets. Ce processus simplifie considérablement l'écriture de données complexes dans diverses sources de stockage et facilite l'envoi de données complexes sur les réseaux et entre différentes parties d'une application.

Lorsqu'un objet est sérialisé, son état est préservé, ce qui signifie que ses attributs et leurs valeurs sont également stockés. Pour restaurer cet objet dans son état d'origine, on utilise la désérialisation qui permet de recréer l'objet initial à partir du flux d'octets.

De nombreux langages de programmation prennent en charge la sérialisation, et la méthode exacte de sérialisation dépend du langage utilisé. Les objets peuvent être sérialisés dans des formats binaires ou de chaînes, avec des degrés de lisibilité humaine différents. Il est important de noter que tous les attributs de l'objet d'origine sont stockés dans le flux de données sérialisées, y compris les champs privés, sauf s'ils sont explicitement marqués comme "transient" dans la déclaration de la classe.

Lorsque vous travaillez avec différents langages de programmation, vous pouvez rencontrer les termes "marshalling" (pour Ruby) ou "pickling" (pour Python) qui sont synonymes de la sérialisation dans ce contexte.

Désérialisation non sécurisée

La désérialisation non sécurisée est une vulnérabilité de sécurité qui peut avoir des conséquences graves pour les sites Web. Cette vulnérabilité se produit lorsque des données contrôlables par l'utilisateur sont désérialisées, c'est-à-dire qu'elles sont transformées en objets ou structures de données à partir d'un flux binaire ou d'une chaîne de caractères.

Lorsqu'une telle désérialisation est effectuée sans contrôles de sécurité suffisants, un attaquant peut exploiter cette vulnérabilité pour injecter des données malveillantes dans l'application. Cette injection peut se faire en manipulant les objets sérialisés, ce qui peut entraîner une exécution de code non autorisée, une élévation de privilèges, un accès non autorisé aux données sensibles ou même une attaque par déni de service.

L'ampleur des conséquences potentielles de la désérialisation non sécurisée est due à plusieurs facteurs. Tout d'abord, la désérialisation d'un objet peut permettre à l'attaquant de modifier l'état de l'objet et ainsi de manipuler le code d'application. De plus, lors de la désérialisation d'un objet, tous les attributs de l'objet sont également désérialisés, y compris les champs privés. Cela signifie que l'attaquant peut exploiter des objets de n'importe quelle classe disponible sur le site Web, même si cette classe n'est pas attendue par l'application.

Un autre facteur important est la difficulté de valider les données désérialisées. Les données peuvent être validées et nettoyées avant la désérialisation, mais il est difficile de prévoir toutes les éventualités. Les contrôles effectués après la désérialisation peuvent également être inefficaces car l'attaque peut être lancée avant que la validation ou le nettoyage ne soit effectué.

En outre, la désérialisation non sécurisée est souvent causée par un manque de compréhension de la part des développeurs de l'importance de la sécurité de la désérialisation. Les propriétaires de sites Web peuvent également penser qu'ils sont protégés car ils ont mis en place des contrôles de sécurité supplémentaires sur les données désérialisées. Cependant, ces contrôles sont souvent inefficaces car il est presque impossible de prévoir toutes les éventualités et de nettoyer toutes les données malveillantes.

Pour éviter la désérialisation non sécurisée, il est important de mettre en place des contrôles de sécurité appropriés, tels que la validation et le nettoyage des données avant la désérialisation, la limitation des classes qui peuvent être désérialisées et la mise en œuvre de contrôles d'accès pour les objets désérialisés. Il est également important de sensibiliser les développeurs à l'importance de la sécurité de la désérialisation et de fournir une formation adéquate à cet égard.

Comment prévenir les vulnérabilités

La désérialisation de l'entrée utilisateur doit être évitée autant que possible, sauf en cas d'absolue nécessité. Les risques de cette opération sont élevés et les avantages sont souvent minimes.

Si vous devez désérialiser des données provenant de sources non fiables, il est essentiel de mettre en place des mesures solides pour vérifier que les données n'ont pas été falsifiées. Vous pouvez, par exemple, implémenter une signature numérique pour vérifier l'intégrité des données. Toutefois, il est crucial de rappeler que ces vérifications doivent avoir lieu avant de commencer le processus de désérialisation. Autrement, elles ne seront d'aucune utilité.

Dans la mesure du possible, évitez d'utiliser des méthodes génériques de désérialisation. Les données sérialisées dans ces méthodes contiennent tous les attributs de l'objet d'origine, y compris les champs privés, qui peuvent contenir des informations sensibles. À la place, vous pouvez créer des méthodes de sérialisation spécifiques à la classe afin de pouvoir au moins contrôler les champs exposés.

Enfin, rappelez-vous que la vulnérabilité se situe au niveau de la désérialisation de l'entrée utilisateur et non dans la présence de chaînes de gadgets qui traitent ensuite les données. Il n'est pas pratique d'essayer d'éliminer toutes les chaînes de gadgets identifiées lors des tests, car il existe souvent un réseau de dépendances entre bibliothèques sur votre site Web. De plus, il existe toujours un risque de vulnérabilité causée par des exploits de corruption de mémoire documentés publiquement, ce qui signifie que votre application peut être vulnérable même si vous avez pris toutes les mesures de précaution nécessaires.

En résumé, la désérialisation de l'entrée utilisateur doit être utilisée avec précaution et, si possible, évitée. Si elle est absolument nécessaire, vous devez mettre en place des mesures de sécurité solides pour vous protéger contre les vulnérabilités potentielles.

Developpeur et architecte passionné, qui souhaite partagé son univers et ses découvertes afin de rendre les choses plus simple pour chacun