désérialisation Cheat Sheet¶

Introduction¶

Cet article vise à fournir des conseils clairs et exploitables pour désérialiser en toute sécurité des données non fiables dans vos applications.

Qu’est-ce que la désérialisation¶

la sérialisation est le processus de transformation d’un objet en un format de données qui peut être restauré ultérieurement. Les gens sérialisent souvent des objets afin de les enregistrer dans le stockage ou pour les envoyer dans le cadre de communications.,

la désérialisation est l’inverse de ce processus, en prenant des données structurées à partir d’un format et en les reconstruisant en un objet. AUJOURD’hui, le format de données le plus populaire pour la sérialisation des données est JSON. Avant cela, C’était XML.

cependant, de nombreux langages de programmation offrent une capacité native pour sérialiser des objets. Ces formats natifs offrent généralement plus de fonctionnalités que JSON ou XML, y compris la personnalisation du processus de sérialisation.

malheureusement, les fonctionnalités de ces mécanismes de désérialisation natifs peuvent être réutilisées pour des effets malveillants lorsqu’ils fonctionnent sur des données non fiables., Les attaques contre les désérialiseurs permettent des attaques par déni de service, contrôle d’accès et exécution de code à distance (RCE).

conseils pour désérialiser des objets en toute sécurité¶

Les conseils spécifiques au langage suivants tentent d’énumérer des méthodologies sûres pour désérialiser des données qui ne peuvent pas être fiables.

PHP¶

Whitebox Review¶

Vérifiez l’utilisation de la fonction unserialize() et vérifiez comment les paramètres externes sont acceptés., Utilisez un format d’échange de données standard et sûr tel que JSON (via json_decode() Et json_encode()) si vous devez transmettre des données sérialisées à l’utilisateur.

Python¶

Blackbox Review¶

Si les données de trafic contiennent le symbole dot. à la fin, il est très probable que les données aient été envoyées en sérialisation.

Whitebox Review¶

L’API suivante en Python sera vulnérable aux attaques de sérialisation. Code de recherche pour le modèle ci-dessous.,

  1. Les utilisations de pickle/c_pickle/_pickle par load/loads:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
  1. Utilise des PyYAML par load:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
  1. Utilise des jsonpickle par encode ou store méthodes.

Java¶

Les techniques suivantes sont toutes bonnes pour empêcher les attaques contre la désérialisation contre le format sérialisable de Java.,

conseils D’implémentation:

  • dans votre code, remplacez la méthodeObjectInputStream#resolveClass() pour empêcher la désérialisation de classes arbitraires. Ce comportement sûr peut être enveloppé dans une bibliothèque comme SerialKiller.
  • utilisez un remplacement sûr pour la méthode génériquereadObject() comme on le voit ici. Notez que cela résout les attaques de type « milliards de rires » en vérifiant la longueur d’entrée et le nombre d’objets désérialisés.

Whitebox Review¶

soyez conscient des utilisations suivantes de L’API Java pour la vulnérabilité potentielle de sérialisation.,

XMLdecoder with external user defined parameters

XStream with fromXML method (xstream version <= v1.46 is vulnerable to the serialization issue)

ObjectInputStream with readObject

4.,rns peut suggérer que les données ont été envoyées dans des flux de sérialisation Java

  • AC ED 00 05 dans Hex
  • rO0 dans Base64
  • Content-type en-tête d’une réponse HTTP définie sur application/x-java-serialized-object

prévenir les fuites de données et le blocage des champs de confiance¶

S’il y a des membres de données d’un objet qui ne doivent jamais être contrôlés par les utilisateurs finaux pendant la désérialisation ou exposés aux utilisateurs pendant la sérialisation, ils doivent être déclarés comme transient ,

pour une classe définie comme sérialisable, la variable d’information sensible doit être déclarée commeprivate transient.

Par exemple, la classe myAccount, la variable ‘profit’ et ‘margin’ ont été déclarées transitoires pour éviter d’être sérialisées:

public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....

empêcher la désérialisation des objets de domaine¶

certains de vos objets d’application peuvent être contraints d’implémenter Serializable en raison de leur hiérarchie., Pour garantir que vos objets d’application ne peuvent pas être désérialisés, une méthode readObject() doit être déclarée (avec un modificateur final) qui lève toujours une exception:

durcissez votre propre java.Io.ObjectInputStream¶

Le java.io.ObjectInputStream class est utilisé pour désérialiser les objets. Il est possible de durcir son comportement en le sous-classant., C’est la meilleure solution si:

  • Vous pouvez changer le code qui fait la désérialisation
  • Vous savez quelles classes vous attendez de désérialiser

l’idée générale est de remplacer ObjectInputStream.html#resolveClass() afin de restreindre les classes autorisées à être désérialisées.

étant donné que cet appel se produit avant qu’unreadObject() ne soit appelé, vous pouvez être sûr qu’aucune activité de désérialisation ne se produira sauf si le type est celui que vous souhaitez autoriser.,

un exemple simple de ceci montré ici, où la classe LookAheadObjectInputStream est garantie de ne désérialiser aucun autre type que la classe Bicycle:

des implémentations plus complètes de cette approche ont été proposées par divers membres de la communauté:

  • NibbleSec – une bibliothèque qui liste noire des classes qui peuvent être désérialisées
  • IBM – la protection séminale, écrite des années avant que les scénarios d’exploitation les plus dévastateurs ne soient envisagés.,
  • Apache Commons IO classes

durcir toute utilisation de java.Io.ObjectInputStream avec un Agent¶

comme mentionné ci-dessus, la classejava.io.ObjectInputStream est utilisée pour désérialiser les objets. Il est possible de durcir son comportement en le sous-classant. Cependant, si vous ne possédez pas le code ou si vous ne pouvez pas attendre un patch, utiliser un agent pour tisser le durcissement en java.io.ObjectInputStream est la meilleure solution.,

changer globalementObjectInputStream n’est sûr que pour mettre sur liste noire les types malveillants connus, car il n’est pas possible de savoir pour toutes les applications quelles sont les classes attendues à désérialiser. Heureusement, il y a très peu de classes nécessaires dans la liste noire pour être à l’abri de tous les vecteurs d’attaque connus, aujourd’hui.

Il est inévitable que plus de classes « gadget » soient découvertes qui peuvent être abusées. Cependant, il y a une quantité incroyable de logiciels vulnérables exposés aujourd’hui, dans le besoin d’un correctif., Dans certains cas, » réparer  » la vulnérabilité peut impliquer de réorganiser les systèmes de messagerie et de rompre la rétrocompatibilité à mesure que les développeurs s’orientent vers la non-acceptation des objets sérialisés.

pour activer ces agents, ajoutez simplement un nouveau paramètre JVM:

-javaagent:name-of-agent.jar

Les Agents utilisant cette approche ont été publiés par divers membres de la communauté:

  • rO0 by Contrast Security

Une approche similaire, mais moins évolutive, consisterait à patcher manuellement et à bootstrap ObjectInputStream de votre JVM. Des conseils sur cette approche sont disponibles ici.

.,Net CSharp¶

WhiteBox Examen¶

Rechercher dans le code source, les termes suivants:

  1. TypeNameHandling
  2. JavaScriptTypeResolver

Regarder pour tous les sérialiseurs où le type est défini par un utilisateur de la variable contrôlée.,

BlackBox Examen¶

la Recherche pour le suivant, encodé en base64 contenu qui commence par:

AAEAAAD/////

pour Rechercher du contenu par le texte suivant:

  1. TypeObject
  2. $type:

Généralités Précautions¶

Ne pas permettre le flux de données pour définir le type d’objet que le flux désérialisé pour. Vous pouvez éviter cela en utilisant par exemple la balise DataContractSerializer ou XmlSerializer si possible.,

JSON.Net est utilisé assurez-vous que le TypeNameHandling correspond à None.

TypeNameHandling = TypeNameHandling.None

Si JavaScriptSerializer doit être utilisée alors ne l’utilisez pas avec un JavaScriptTypeResolver.

Si vous devez désérialiser les flux de données qui définissent leur propre type, restreignez les types qui peuvent être désérialisés. Il faut savoir que cela est toujours risqué car de nombreux types. Net natifs sont potentiellement dangereux en eux-mêmes. par exemple,

System.IO.FileInfo

FileInfo les objets qui référencent des fichiers réellement sur le serveur peuvent, lorsqu’ils sont désérialisés, modifier les propriétés de ces fichiers, par exemple en lecture seule, créant une attaque potentielle par déni de service.

même si vous avez limité les types qui peuvent être désérialisés, rappelez-vous que certains types ont des propriétés risquées. System.ComponentModel.DataAnnotations.ValidationException, par exemple, a une propriété Value de type Object., si ce type est le type autorisé pour la désérialisation, un attaquant peut définir la propriétéValue sur n’importe quel type d’objet de son choix.

les attaquants doivent être empêchés de diriger le type qui sera instancié. Si cela est possible, alors même DataContractSerializer ou XmlSerializer peut être subverti, par exemple

// Action below is dangerous if the attacker can change the data in the databasevar typename = GetTransactionTypeFromDatabase();var serializer = new DataContractJsonSerializer(Type.GetType(typename));var obj = serializer.ReadObject(ms);

L’exécution peut se produire dans certains types.net pendant la désérialisation. La création d’un contrôle tel que celui illustré ci-dessous est inefficace.,

var suspectObject = myBinaryFormatter.Deserialize(untrustedData);//Check below is too late! Execution may have already occurred.if (suspectObject is SomeDangerousObjectType){ //generate warnings and dispose of suspectObject}

Par BinaryFormatter et JSON.Net il est possible de créer une forme plus sûre de blanc liste de contrôle à l’aide d’un custom SerializationBinder.

essayez de rester à jour sur les gadgets de désérialisation.net non sécurisés connus et portez une attention particulière lorsque de tels types peuvent être créés par vos processus de désérialisation. Un désérialiseur ne peut instancier que les types qu’il connaît.

essayez de séparer tout code susceptible de créer des gadgets potentiels de tout code doté d’une connectivité internet., A titre d’exemple System.Windows.Data.ObjectDataProvider utilisé dans les applications WPF est un gadget connu qui permet l’invocation de méthodes arbitraires. Il serait risqué d’avoir ceci une référence à cet assembly dans un projet de service REST qui désérialise des données non fiables.

Connu .,NET RCE Gadgets¶

  • System.Configuration.Install.AssemblyInstaller
  • System.Activities.Presentation.WorkflowDesigner
  • System.Windows.ResourceDictionary
  • System.Windows.Data.ObjectDataProvider
  • System.Windows.Forms.BindingSource
  • Microsoft.Exchange.Management.SystemManager.WinForms.ExchangeSettingsProvider
  • System.Data.DataViewManager, System.Xml.XmlDocument/XmlDataDocument
  • System.Management.Automation.PSObject

Language-Agnostic Methods for Deserializing Safely¶

Using Alternative Data Formats¶

A great reduction of risk is achieved by avoiding native (de)serialization formats., En passant à un format de données pur comme JSON ou XML, vous réduisez les chances que la logique de désérialisation personnalisée soit réorientée vers des fins malveillantes.

de nombreuses applications reposent sur un modèle d’objet de transfert de données qui implique la création d’un domaine distinct d’objets dans le but explicite de transfert de données. Bien sûr, il est toujours possible que l’application commette des erreurs de sécurité après l’analyse d’un objet de données pur.,

désérialiser uniquement les données signées¶

Si l’application sait avant la désérialisation quels messages devront être traités, elle peut les signer dans le cadre du processus de sérialisation. L’application pouvait alors choisir de ne pas désérialiser tout message qui n’avait pas de signature authentifiée.,

des Outils d’Atténuation des Bibliothèques/¶

  • Java secure désérialisation bibliothèque
  • SWAT (de Série de la liste Blanche d’Applications Formateur)
  • NotSoSerial

des Outils de Détection¶

  • Java désérialisation feuille de triche visant à stylo testeurs
  • Une preuve de concept de l’outil pour générer des charges qui exploitent Java dangereux de désérialisation des objets.
  • boîtes à outils de désérialisation Java
  • outil de désérialisation Java
  • .,n
    • JavaSerialKiller
    • scanner de désérialisation Java
    • Burp-ysoserial
    • SuperSerial-Active

références¶

  • Java-désérialisation-Cheat-Sheet
  • désérialisation de données non fiables
  • Java attaques de désérialisation – journée allemande OWASP 2016
  • Appseccali2015 – marshalling Pickles
  • Foxglove security – annonce de vulnérabilité
  • feuille de triche de désérialisation Java destinée aux testeurs de stylo
  • Un outil de preuve de concept pour générer des charges utiles qui exploitent la désérialisation d’objets Java non sécurisés.,
  • outils de désérialisation Java
  • outil de désérialisation Java
  • extension de suite Burp
  • bibliothèque de désérialisation sécurisée Java
  • Serianalyzer est un analyseur de bytecode statique pour la désérialisation
  • générateur de charge utile
  • Testeur de vulnérabilité de désérialisation Java Android
  • Extension de suite Burp
    • JavaSerialKiller l s’agit d’un scanner de désérialisation java .net
      • Alvaro Muñoz:.,Sérialisation NET: détection et défense des points de terminaison vulnérables
      • James Forshaw – Black Hat USA 2012 – Êtes-vous mon Type? Briser les bacs à sable. net grâce à la sérialisation
      • Jonathan Birch BlueHat v17 – contenu dangereux-sécurisation de la désérialisation. Net
      • Alvaro Muñoz& Oleksandr Mirosh – vendredi 13: attaquer JSON – AppSecUSA 2017

Laisser un commentaire

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

Aller à la barre d’outils