Innledning¶
Denne artikkelen er fokusert på å gi klare, praktisk veiledning for trygg deserializing upålitelige data i dine programmer.
Hva er Deserialisering¶
Serialisering er prosessen med å slå noen gjenstand inn i et dataformat som kan gjenopprettes senere. Folk ofte serialisere objekter for å spare dem for lagring, eller til å sende som en del av kommunikasjonen.,
Deserialisering er motsatt av prosessen, ta strukturerte data fra noen format, og gjenoppbygge det til et objekt. I dag, den mest populære data formater for serializing data er JSON. Før det var det XML.
Imidlertid mange programmeringsspråk tilbyr en innfødt evne til serializing objekter. Disse innfødte formater som vanligvis tilbyr flere funksjoner enn JSON eller XML, inkludert customizability av bedriften prosessen.
Dessverre har disse native deserialisering mekanismer kan være ombygginger for skadelig effekt når de opererer i upålitelige data., Angrep mot deserializers har blitt funnet å tillate tjenestenekt (denial-of-service, tilgang kontroll og ekstern kjøring av kode (RCE) angrep.
Veiledning på Deserializing Objekter Trygt¶
følgende språk-spesifikk veiledning forsøk på å spesifisere trygge metoder for deserializing data som ikke kan være klarert.
PHP¶
WhiteBox Gjennomgang¶
merk av for bruk av unserialize () – funksjonen, og se hvordan eksterne parametre er akseptert., Bruk en trygg, standard data interchange format som JSON (via json_decode()
og json_encode()
) hvis du trenger å passere serialisert data til brukeren.
Python¶
BlackBox Gjennomgang¶
Hvis trafikkdata som inneholder symbolet dot .
på slutten, det er meget sannsynlig at de data som ble sendt i bedriften.
WhiteBox Gjennomgang¶
følgende API i Python vil være sårbare for serialisering angrep. Søk koden for mønsteret nedenfor.,
- bruk av
pickle/c_pickle/_pickle
medload/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
– >
- bruk av
PyYAML
medload
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
– >
- bruk av
jsonpickle
medencode
ellerstore
metoder.
Java¶
følgende teknikker er alt bra for å hindre angrep mot deserialisering mot Java er Serialiserbare format.,
Implementering råd:
- I koden din, overstyrer
ObjectInputStream#resolveClass()
metode for å unngå vilkårlig klasser fra å være deserialized. Dette trygt atferd kan være pakket inn i et bibliotek som SerialKiller. - Bruk en trygg erstatning for generisk
readObject()
metode som du ser her. Merk at dette adresser «milliarder ler» type angrep ved å kontrollere input lengde og antall objekter deserialized.
WhiteBox Gjennomgang¶
Vær oppmerksom på følgende Java-API bruker for potensielle serialisering sårbarhet.,
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 som ble sendt i Java-serialisering bekker
-
AC ED 00 05
i Hex -
rO0
i Base64 -
Content-type
topptekst av en HTTP-respons satt tilapplication/x-java-serialized-object
Forhindre Data Lekkasje og Pålitelige Feltet Jobben¶
Hvis det er data som er medlemmer av et objekt som bør aldri være kontrollert av sluttbrukere under deserialisering eller utsatt for brukere i bedriften, skal de bli erklært som transient
søkeord (§Beskytte Sensitiv Informasjon).,
For en klasse som er definert som Serialiserbare, sensitiv informasjon variabel bør bli erklært som private transient
.
For eksempel, klasse myAccount, variabelen ‘resultat’ og ‘marg’ ble erklært som forbigående å unngå å være serialisert:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
Hindre Deserialisering av Domene Objekter¶
Noen av søknaden objekter kan bli tvunget til å gjennomføre Serialiserbare på grunn av deres hierarki., For å garantere at din søknad objekter kan ikke være deserialized, en readObject()
metoden bør deklareres (med en final
modifier) som alltid kaster et unntak:
Herde Din Egen java.io.ObjectInputStream¶
java.io.ObjectInputStream
klasse brukes til å deserialisere objekter. Det er mulig å stivne sin oppførsel av subclassing det., Dette er den beste løsningen hvis:
- Du kan endre koden som gjør deserialisering
- Du vet hvilke klasser du forventer å deserialisere
Den generelle ideen er å overstyre ObjectInputStream.html#resolveClass()
for å begrense hvilke klasser er det tillatt å være deserialized.
Fordi denne samtalen skjer før en readObject()
er kalt, kan du være sikker på at ingen deserialisering aktivitet vil skje med mindre typen er en som du ønsker å tillate.,
Et enkelt eksempel på dette er vist her, der LookAheadObjectInputStream
klassen er garantert ikke å deserialisere noen annen type foruten Bicycle
class:
Mer komplett implementering av denne tilnærmingen har blitt foreslått av ulike medlemmer:
- NibbleSec – et bibliotek som lar whitelisting og svartelister av klasser som det er tillatt å deserialized
- IBM – seminal beskyttelse, skriftlig år før de mest ødeleggende utnyttelse scenariene var tenkt.,
- Apache Commons IO klasser
Herde Alle java.io.ObjectInputStream Bruk med en Agent¶
Som nevnt ovenfor, java.io.ObjectInputStream
klasse brukes til å deserialisere objekter. Det er mulig å stivne sin oppførsel av subclassing det. Imidlertid, hvis du ikke har koden, eller ikke kan vente på en patch, ved å bruke en agent til å veve i hardner til java.io.ObjectInputStream
er den beste løsningen.,
Globalt endre ObjectInputStream
er bare trygt for svartelister kjente skadelige typer, fordi det ikke er mulig å vite for alle programmer hva de forventet klasser for å være deserialized er. Heldigvis er det svært få klasser som trengs i svarteliste for å være sikker fra alle de kjente angrepsvektorer, i dag.
Det er uunngåelig at mer «gadget» klassene vil bli oppdaget som kan misbrukes. Men, det er en utrolig mengde av sårbare programvare utsatt i dag, er i behov av en fix., I noen tilfeller vil «fikse» sikkerhetsproblemet kan innebære re-architecting meldinger systemer og bryte bakoverkompatibilitet som utviklere til å bevege seg mot ikke aksepterer serialisert objekter.
for Å aktivere disse midlene, bare legge til en ny JVM-parameter:
-javaagent:name-of-agent.jar
Agenter tar denne tilnærmingen har blitt utgitt av ulike medlemmer:
- rO0 av Kontrast Sikkerhet
En lignende, men mindre skalerbar tilnærming ville være å manuelt patch og bootstrap din JVM er ObjectInputStream. Veiledning på denne tilnærmingen er tilgjengelig her.
.,Netto CSharp¶
WhiteBox Gjennomgang¶
Søk kildekoden for følgende vilkår:
TypeNameHandling
JavaScriptTypeResolver
Se etter noen serializers der typen er satt av en bruker kontrollert variabel.,
BlackBox Gjennomgang¶
Søk etter følgende base64-kodet innhold som starter med:
AAEAAAD/////
Søke etter innhold med følgende tekst:
TypeObject
$type:
Generelle Forsiktighetsregler¶
ikke tillat datastrømmen til å definere hvilken type objekt som strømmen vil være deserialized til. Du kan forhindre dette ved for eksempel bruk av DataContractSerializer
eller XmlSerializer
hvis du på alle mulige måter.,
Der JSON.Net
brukes, kontroller TypeNameHandling
er bare satt til None
.
TypeNameHandling = TypeNameHandling.None
Hvis JavaScriptSerializer
brukes til, så ikke bruk det med en JavaScriptTypeResolver
.
Hvis du må deserialise datastrømmer som definerer sin egen type, og deretter begrense typer som er tillatt å være deserialized. Man bør være klar over at dette er fortsatt risikabelt som mange innfødte .Netto typer potensielt farlig i seg selv. eksempelvis.,
System.IO.FileInfo
FileInfo
objekter som refererer til faktisk filer på serveren kan når deserialized, endre egenskaper for disse filene f.eks. å lese-bare, å skape en potensiell tjenestenekt (denial of service angrep.
Selv om du har begrenset typer som kan være deserialised huske at noen typer har egenskaper som er risikabelt. System.ComponentModel.DataAnnotations.ValidationException
, for eksempel har en egenskap Value
type Object
., hvis denne typen er den type som er tillatt for deserialisering deretter en angriper kan angi Value
eiendom til hvilken som helst objekttype de velger.
Angriperne skal være forhindret fra å styre type som vil bli startet. Hvis dette er mulig så selv DataContractSerializer
eller XmlSerializer
kan bli undergravd f.eks.
// 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);
Gjennomføring kan skje innenfor visse .Netto typer under deserialisering. Opprette en kontroll som det er vist 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}
For BinaryFormatter
og JSON.Net
det er mulig å skape en sikrere form av hvit liste styre ved hjelp av en tilpasset SerializationBinder
.
Prøv å holde up-to-date på kjent .Netto usikre deserialisering gadgets og vær spesielt oppmerksom der hvor slike typer kan bli opprettet av din deserialisering prosesser. En deserializer kan bare instantiate typer som den vet om.
Prøv å holde en kode som kan forårsake en potensiell gadgets atskilt fra all kode som har internett-tilkobling., Som et eksempel System.Windows.Data.ObjectDataProvider
brukt i WPF applikasjoner er en kjent dings som lar vilkårlig metode bruken. Det ville være risikabelt å ha dette som en henvisning til denne forsamlingen i RESTEN service prosjekt som deserializes upålitelige data.
Kjent .,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 å bytte til en pure data format som JSON eller XML, kan du redusere sjansen for tilpasset deserialisering logikk blir ombygginger mot skadelige ender.
Mange programmer er avhengige av en data-overføring objekt mønster som innebærer å opprette et eget domene av objekter for den uttrykkelige hensikt å overføre data. Selvfølgelig, det er fortsatt mulig at programmet vil gjøre security feil etter en ren data objektet er analysert.,
Bare Deserialisere Signerte Data¶
Hvis programmet vet før deserialisering hvilke meldinger som trenger å bli behandlet, vil de kunne signere dem som en del av bedriften prosessen. Programmet kan deretter velge ikke å deserialisere alle meldinger som ikke har en godkjent signatur.,
Avbøtende Verktøy/Biblioteker¶
- Java sikre deserialisering bibliotek
- SWAT (Seriell Hviteliste Programmet Trener)
- NotSoSerial
gjenkjenningsverktøy¶
- Java deserialisering jukse ark med sikte på penn testere
- Et proof-of-concept verktøy for å generere nyttelaster som utnytter usikre Java-objekt deserialisering.
- Java-De-serialisering verktøysett
- Java-de-serialisering verktøy
- .,n
- JavaSerialKiller
- Java Deserialisering Scanner
- Raper-ysoserial
- SuperSerial
- SuperSerial-Aktiv
Referanser¶
- Java-Deserialisering-Cheat-Ark
- Deserialisering av ikke-klarerte data
- Java Deserialisering Angrep – tysk OWASP Dag 2016
- AppSecCali 2015 – hensyn til formidlinger Pickles
- FoxGlove Sikkerhet – Sårbarhet Kunngjøring
- Java deserialisering jukse ark med sikte på penn testere
- Et proof-of-concept verktøy for å generere nyttelaster som utnytter usikre Java-objekt deserialisering.,
- Java-De-serialisering verktøysett
- Java-de-serialisering verktøy
- Raper Suite extension
- Java sikre deserialisering bibliotek
- Serianalyzer er en statisk bytecode analyzer for deserialisering
- Nyttelast generator
- Android Java Deserialisering Sårbarhet Testing
- Raper Suite Extension
- JavaSerialKiller
- Java Deserialisering Scanner
- Raper-ysoserial
- SuperSerial
- SuperSerial-Aktiv
- .Net
- Alvaro Muñoz: .,NETTO Bedriften: å Oppdage og å forsvare sårbare endepunkter
- James Forshaw – Black Hat USA 2012 – Er Du Min Type? Å bryte .netto Sandkasser Gjennom Serialisering
- Jonathan Bjerk BlueHat v17 – Farlig Innhold – Sikring .Netto Deserialisering
- Alvaro Muñoz & Oleksandr Mirosh – fredag den 13.: Angripe JSON – AppSecUSA 2017