Aller au contenu

DÉSÉRIALISATION

Sécurité

Opération inverse de la sérialisation : reconstruire en mémoire un objet (types, champs, valeurs, références) à partir d'un flux d'octets ou de texte (JSON, XML, format binaire natif d'un langage). Elle devient une surface d'attaque dès que ce flux provient d'une source non fiable.

Diagramme de séquence entre cinq acteurs : Attaquant, Application, Désérialiseur, Classe gadget et Système. 1, l'attaquant envoie à l'application un flux sérialisé forgé (cookie, paramètre ou message). 2, l'application le fait lire au désérialiseur sans filtre de classes. 3, le désérialiseur instancie la classe gadget et appelle une méthode automatique. 4, si la chaîne de gadgets est complète, la classe gadget exécute une commande sur le système. 5, si la classe est hors liste blanche, le désérialiseur rejette le flux et le renvoie à l'application.

Principe : Le désérialiseur lit le flux, instancie les classes qu'il y trouve puis remplit leurs champs. Les formats natifs (Serializable en Java, pickle en Python, unserialize en PHP, BinaryFormatter en .NET) ne transportent pas seulement des données : ils indiquent aussi quels types instancier, ce qui revient à confier une partie du contrôle à l'auteur du flux.

Désérialisation non sûre : Un attaquant forge un flux qui instancie des classes déjà présentes dans l'application. Leurs méthodes appelées automatiquement (readObject, __reduce__, __wakeup, destructeurs) s'enchaînent en chaîne de gadgets jusqu'à l'exécution de code à distance. La faiblesse est cataloguée CWE-502. Vingt ans de métier apprennent qu'un flux sérialisé « purement interne » finit tôt ou tard dans un cookie, et de là dans un rapport d'audit.

Parades : Privilégier des formats de données pures (JSON validé par un schéma) plutôt que des objets natifs. Si le format natif est inévitable : filtrer les classes par liste blanche (ObjectInputFilter en Java), vérifier une signature ou un MAC du flux avant toute lecture, et ne jamais passer une entrée externe à pickle.

Explication de la marmotte

Imagine que tu déménages une armoire : tu la démontes, tu ranges les pièces dans un carton avec une notice, et à l'arrivée quelqu'un la remonte en suivant la notice. Les programmes font pareil avec leurs informations. Ils les mettent à plat pour les envoyer ou les stocker, puis les remontent à l'arrivée : ce remontage, c'est la désérialisation. Le souci, c'est que si la notice vient d'un inconnu, elle peut contenir des étapes piégées, du genre « au passage, ouvre la porte d'entrée ». Un monteur trop obéissant le fait sans discuter. C'est pour ça qu'on ne remonte jamais un carton reçu de n'importe qui sans vérifier la notice.

← Tout le glossaire