Introduktion¶
Denne artikel er fokuseret på at levere klare, handlingsrettede vejledning til sikker deserializing upålidelige data i dine applikationer.
Hvad er deserialisering
serialisering er processen med at omdanne et objekt til et dataformat, der kan gendannes senere. Folk ofte serialisere objekter for at gemme dem til opbevaring, eller at sende som en del af kommunikation.,deserialisering er det modsatte af denne proces, idet der tages data struktureret fra et eller andet format og genopbygges til et objekt. I dag er det mest populære dataformat til serialisering af data JSON. Før det var det XML.
imidlertid tilbyder mange programmeringssprog en indbygget evne til serialisering af objekter. Disse native formater tilbyder normalt flere funktioner end JSON eller .ml, herunder tilpasning af serialiseringsprocessen.
desværre, funktionerne i disse indfødte deserialisering mekanismer kan repurposed for ondsindet effekt, når der opererer på upålidelige data., Angreb mod deserialiizersers har vist sig at tillade denial-of-service, adgangskontrol, og fjernkørsel af programkode (RCE) angreb.
vejledning i deserialisering af objekter sikkert
følgende Sprogspecifikke vejledning forsøger at opregne sikre metoder til deserialisering af data, der ikke kan stole på.
PHP
Whithitebo.Revie.
Kontroller brugen af unseriali functione() funktion og gennemgå, hvordan de eksterne parametre accepteres., JSON (via json_decode()
og json_encode()
), hvis du har brug for at videregive serialiserede data til brugeren.
Python
Blackbo.Revie.
Hvis trafikdataene indeholder symbolet dot .
i slutningen er det meget sandsynligt, at dataene blev sendt i serialisering.
Whithitebo.Revie.
følgende API i Python vil være sårbar over for serialisering angreb. Søg kode for mønsteret nedenfor.,
- anvendelser af
pickle/c_pickle/_pickle
medload/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- Anvendelser af
PyYAML
medload
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- Anvendelser af
jsonpickle
medencode
ellerstore
metoder.
Java
følgende teknikker er alle gode til at forhindre angreb mod deserialisering mod Javas Serialiserbare format.,
Implementeringsråd:
- i din kode tilsidesættes
ObjectInputStream#resolveClass()
metoden for at forhindre vilkårlige klasser i at blive deserialiseret. Denne sikker adfærd kan pakkes ind i et bibliotek som SerialKiller. - brug en sikker erstatning for den generiske
readObject()
metode som set her. Bemærk, at dette adresser “milliarder griner” type angreb ved at kontrollere input længde og antal objekter deseriali .ed.
Whithitebo.Revie.
Vær opmærksom på følgende Java API-anvendelser til potentiel serialiseringssårbarhed.,
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 kan tyde på, at de data, der blev sendt i Java-serialisering vandløb
-
AC ED 00 05
i Hex -
rO0
i Base64 -
Content-type
overskriften på en HTTP-svar indstillet tilapplication/x-java-serialized-object
Forhindre datalækage og Tillid Felt Clobbering¶
Hvis der er data, der er medlemmer af et objekt, der bør aldrig være kontrolleret af slutbrugere i deserialization eller udsat for brugere i løbet af serialisering, de skal være erklæret som transient
søgeord (afsnit Beskytte Følsomme Oplysninger).,
for en klasse, der defineres som Serialiserbar, skal den følsomme informationsvariabel angives som private transient
.
For eksempel, class myAccount, variablen “profit” og “margin” blev erklæret som forbigående, for at undgå at føljeton:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
Undgå Deserialisering af Domæne Objekter¶
Nogle af din ansøgning objekter kan blive tvunget til at implementere Serializable på grund af deres hierarki., For at sikre, at din ansøgning objekter kan ikke være deserialized, en readObject()
metode bør være angivet (med en final
modifier), som altid kaster en undtagelse:
Hærde Din Egen java.io.ObjectInputStream¶
java.io.ObjectInputStream
class er brugt til at deserialisere objekter. Det er muligt at hærde sin adfærd ved at underklasse den., Dette er den bedste løsning, hvis:
- Du kan ændre den kode, der gør deserialization
- Du ved, hvilke klasser du forventer at deserialisere
Den generelle idé er, at tilsidesætte ObjectInputStream.html#resolveClass()
for at begrænse, hvilke klasser, der har lov til at være deserialized.
da dette opkald sker før et readObject()
kaldes, kan du være sikker på, at der ikke forekommer deserialiseringsaktivitet, medmindre typen er en, du ønsker at tillade.,
Et simpelt eksempel på dette er vist her, hvor den LookAheadObjectInputStream
class er garanteret ikke at deserialisere enhver anden type udover Bicycle
class:
Mere komplet implementeringer af denne tilgang er blevet foreslået af forskellige medlemmer af fællesskabet:
- NibbleSec – et bibliotek, som gør det muligt at whiteliste og blackliste af klasser, der får lov til at være deserialized
- IBM – de skelsættende beskyttelse, skrevet mange år, før de mest ødelæggende udnyttelse scenarier blev forestillet sig.,
- Apache Commons IO klasser
Hærde, og Alle java.io.ObjectInputStream Brug med en Agent¶
Som nævnt ovenfor, den java.io.ObjectInputStream
class er brugt til at deserialisere objekter. Det er muligt at hærde sin adfærd ved at underklasse den. Men hvis du ikke ejer koden eller ikke kan vente på en patch, er det den bedste løsning at bruge en agent til at væve i hærdning til java.io.ObjectInputStream
.,
globalt skiftendeObjectInputStream
er kun sikkert for blacklisting kendte ondsindede typer, fordi det ikke er muligt at vide for alle applikationer, hvad de forventede klasser, der skal deserialiseres, er. Heldigvis er der meget få klasser, der er nødvendige på sortlisten for at være sikre fra alle de kendte angrebsvektorer, i dag.
det er uundgåeligt, at flere “gadget” klasser vil blive opdaget, der kan misbruges. Der er dog en utrolig mængde sårbar soft .are udsat i dag, der har brug for en løsning., I nogle tilfælde,” fastsættelse ” sårbarheden kan involvere re-architecting messaging-systemer og bryde bagudkompatibilitet som udviklere bevæger sig i retning af ikke at acceptere føljeton objekter.
for At gøre det muligt for disse agenter, blot tilføje en ny JVM parameter:
-javaagent:name-of-agent.jar
Agenter tager denne tilgang er blevet frigivet af forskellige medlemmer af fællesskabet:
- rO0 Derimod Sikkerhed
En lignende, men mindre skalerbar tilgang ville være at manuelt patch og bootstrap din JVM ‘ s ObjectInputStream. Vejledning om denne tilgang er tilgængelig her.
.,Net CSharp¶
WhiteBox Gennemgang¶
Søg kildekoden til følgende vilkår:
TypeNameHandling
JavaScriptTypeResolver
Se alle serializers, hvor typen er angivet af en bruger kontrollerede variable.,
BlackBox Gennemgang¶
Søg for følgende base64-kodet indhold, der starter med:
AAEAAAD/////
Søg efter indhold, med følgende tekst:
TypeObject
$type:
Generelle Forholdsregler¶
lad ikke datastream at definere den type objekt, at strøm vil blive deserialized til. Du kan forhindre dette ved for eksempel at bruge DataContractSerializer
eller XmlSerializer
hvis det overhovedet er muligt.,
hvor JSON.Net
bruges Sørg for, at TypeNameHandling
kun er indstillet til None
.
TypeNameHandling = TypeNameHandling.None
Hvis JavaScriptSerializer
skal anvendes, må det ikke anvendes sammen med en JavaScriptTypeResolver
.
Hvis du skal deserialisere datastrømme, der definerer deres egen type, skal du begrænse de typer, der må deserialiseres. Man skal være opmærksom på, at dette stadig er risikabelt, da mange indfødte.Net-typer potentielt farlige i sig selv. f. eks.,
System.IO.FileInfo
FileInfo
objekter, der henviser til filer, der faktisk findes på serveren, kan, når de deserialiseres, ændre egenskaberne for disse filer, f.eks. til skrivebeskyttet, hvilket skaber et potentielt lammelsesangreb.
selvom du har begrænset de typer, der kan deserialiseres, skal du huske, at nogle typer har egenskaber, der er risikable. System.ComponentModel.DataAnnotations.ValidationException
, for eksempel har en egenskab Value
af typen Object
., hvis denne type er den type, der er tilladt for deserialisering, kan en angriber indstille egenskabenValue
til enhver objekttype, de vælger.
angribere bør forhindres i at styre den type, der vil blive instantieret. Hvis dette er muligt, selv DataContractSerializer
eller XmlSerializer
kan blive undergravet fx
// 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);
Udførelse kan der forekomme inden for visse .Net-typer i deserialization. Oprettelse af en kontrol som den, der vises nedenfor, er ineffektiv.,
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}
BinaryFormatter
og JSON.Net
det er muligt at skabe en mere sikker form for hvide liste kontrol ved hjælp af en brugerdefineret SerializationBinder
.
prøv at holde dig opdateret om kendte.Net usikre deserialisering gadgets og være særlig opmærksom, hvor sådanne typer kan oprettes ved din deserialisering processer. En deserialiizerer kan kun instantiere typer, som den ved om.
prøv at holde enhver kode, der kan skabe potentielle gadgets adskilt fra enhver kode, der har internetforbindelse., Som et eksempel System.Windows.Data.ObjectDataProvider
bruges i applicationspf applikationer er en kendt gadget, der tillader vilkårlig metode påkaldelse. Det ville være risikabelt at have dette en henvisning til denne forsamling i et REST service-projekt, der deserialiserer ikke-betroede data.
kendt .,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., Ved at skifte til et rent dataformat som JSON eller .ml, mindsker du chancen for, at Brugerdefineret deserialiseringslogik bliver genoptaget mod ondsindede ender.
mange applikationer er afhængige af et dataoverførselsobjektmønster, der involverer oprettelse af et separat domæne af objekter til den eksplicitte formål dataoverførsel. Selvfølgelig er det stadig muligt, at applikationen vil begå sikkerhedsfejl, efter at et rent dataobjekt er analyseret.,
kun Deserialializee signerede Data
Hvis applikationen før deserialisering ved, hvilke meddelelser der skal behandles, kan de underskrive dem som en del af serialiseringsprocessen. Ansøgningen kunne derefter vælge ikke at deserialializee enhver meddelelse, som ikke havde en godkendt underskrift.,
Afbødning Værktøjer/Biblioteker¶
- Java sikker deserialization bibliotek
- SWAT (Seriel Whitelist Ansøgning Træner)
- NotSoSerial
registreringsværktøjer¶
- Java deserialization cheat sheet med henblik på pen testere
- Et proof-of-concept-værktøj til at generere nyttelast at udnytte usikker Java-objekt deserialisering.
- Java-De-serialisering toolkits
- Java-de-serialisering af
- .,n
- JavaSerialKiller
- Java Deserialization Scanner
- Bøvs-ysoserial
- SuperSerial
- SuperSerial-Aktiv
Referencer¶
- Java-Deserialization-Cheat-Sheet
- Deserialisering af upålidelige data
- Java Deserialization Angreb – tyske OWASP Dag 2016
- AppSecCali 2015 – Dirigering Pickles
- FoxGlove Sikkerhed – Sårbarhed Meddelelse
- Java deserialization cheat sheet med henblik på pen testere
- Et proof-of-concept-værktøj til at generere nyttelast at udnytte usikker Java-objekt deserialisering.,
- Java-De-serialisering toolkits
- Java-de-serialisering af
- Burp Suite udvidelse
- Java sikker deserialization bibliotek
- Serianalyzer er en statisk bytecode analyzer til deserialisering
- Nyttelast generator
- Android Java Deserialization Sårbarhed Tester
- Burp Suite Forlængelse
- JavaSerialKiller
- Java Deserialization Scanner
- Bøvs-ysoserial
- SuperSerial
- SuperSerial-Aktiv
- .Net
- Alvaro Muñoz: .,NET serialisering: opdage og forsvare sårbare endpoints
- James forsha? – Black Hat USA 2012-er du min Type? At bryde .net Sandboxes Gennem Serialisering
- Jonathan Birk BlueHat v17 – Farligt Indhold – Sikring .Net Deserialization
- Alvaro Muñoz & Oleksandr Mirosh – fredag 13: Angriber JSON – AppSecUSA 2017