Introducere¶
Acest articol este axat pe furnizarea de îndrumări clare, acționabile pentru deserializarea în siguranță a datelor care nu sunt de încredere în aplicațiile dvs.
ce este deserializarea¶
serializarea este procesul de transformare a unui obiect într-un format de date care poate fi restaurat ulterior. Oamenii serializează adesea obiecte pentru a le salva în stocare sau pentru a le trimite ca parte a comunicațiilor.,deserializarea este inversul acelui proces, luând date structurate dintr-un anumit format și reconstruindu-l într-un obiect. Astăzi, cel mai popular format de date pentru serializarea datelor este JSON. Înainte de asta, era XML.cu toate acestea, multe limbaje de programare oferă o capacitate nativă pentru serializarea obiectelor. Aceste formate native oferă de obicei mai multe caracteristici decât JSON sau XML, inclusiv personalizarea procesului de serializare.din păcate, caracteristicile acestor mecanisme native de deserializare pot fi repurposed pentru un efect rău intenționat atunci când operează pe date care nu sunt de încredere., S-a constatat că atacurile împotriva dezerializatorilor permit atacuri de tip denial-of-service, Control acces și executare la distanță a codului (RCE).
Ghid privind deserializarea obiectelor în siguranță¶
următoarele îndrumări specifice limbii încearcă să enumere metodologii sigure pentru deserializarea datelor care nu pot fi de încredere.
PHP¶
WhiteBox Review¶
Verificați utilizarea funcției unserialize() și examinați modul în care sunt acceptați parametrii externi., Utilizați un seif, un standard de schimb de date în format, cum ar fi JSON (prin json_decode()
și json_encode()
) dacă aveți nevoie pentru a trece serializat de date pentru utilizator.
Python¶
Blackbox Review¶
dacă datele de trafic conțin simbolul dot .
la sfârșit, este foarte probabil ca datele să fi fost trimise în serializare.
WhiteBox Review¶
următorul API în Python va fi vulnerabil la atac serializare. Codul de căutare pentru modelul de mai jos.,
- foloseste de
pickle/c_pickle/_pickle
cuload/loads
:
import pickledata = """ cos.system(S'dir')tR. """pickle.loads(data)
- Foloseste de
PyYAML
cuload
:
import yamldocument = "!!python/object/apply:os.system "print(yaml.load(document))
- Foloseste de
jsonpickle
cuencode
saustore
metode.
Java¶
următoarele tehnici sunt toate bune pentru prevenirea atacurilor împotriva deserializării împotriva formatului Serializabil Java.,
sfaturi de implementare:
- în codul dvs., înlocuiți metoda
ObjectInputStream#resolveClass()
pentru a împiedica deserializarea claselor arbitrare. Acest comportament sigur poate fi înfășurat într-o bibliotecă ca SerialKiller. - utilizați un înlocuitor sigur pentru metoda generică
readObject()
așa cum se vede aici. Rețineți că acest lucru se adresează atacurilor de tip „billion laughs” prin verificarea lungimii de intrare și a numărului de obiecte deserializate.
WhiteBox Review¶
fiți conștienți de următoarele Java API utilizează pentru vulnerabilitate potențială serializare.,
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 poate sugera că datele au fost trimise în serializare Java fluxuri
-
AC ED 00 05
în Hex -
rO0
în Base64 -
Content-type
antet de răspuns HTTP setat laapplication/x-java-serialized-object
a Preveni Scurgerea de Date și de Încredere în Domeniul Platesti¶
Dacă există date de membrii unui obiect care nu ar trebui să fie controlate de către utilizatorii finali în timpul deserializarea sau expuse la utilizatori, în timpul serializare, acestea ar trebui să fie declarată drept transient
cuvinte cheie (secțiunea Protejarea Informațiilor Sensibile).,
pentru o clasă definită ca Serializabilă, variabila de informații sensibile ar trebui declarată ca private transient
.
De exemplu, clasa myAccount, variabila „profit” și „marjă” au fost declarate ca fiind tranzitorii pentru a evita să fie serializat:
public class myAccount implements Serializable{ private transient double profit; // declared transient private transient double margin; // declared transient ....
a Preveni Deserializarea de Domeniu Obiecte¶
Unele dintre obiectele de aplicație poate fi obligat să pună în aplicare Serializabile din cauza lor ierarhie., Pentru a garanta că aplicația obiecte nu pot fi deserialized, un readObject()
metodă ar trebui să fie declarate (cu un final
modificator), care întotdeauna aruncă o excepție:
se Intareasca Propriul java.io.ObjectInputStream¶
java.io.ObjectInputStream
clasa este folosit pentru a deserialize obiecte. Este posibil să-i întăriți comportamentul subclasându-l., Aceasta este cea mai bună soluție în cazul în care:
- puteți schimba codul care face deserializarea
- nu știu ce cursuri ai aștepta să deserialize
ideea generală este de a suprascrie ObjectInputStream.html#resolveClass()
în scopul de a restricționa care clasele sunt permise pentru a fi deserialized.
Pentru acest apel se întâmplă înainte ca un readObject()
este numit, puteți fi sigur că nu deserializarea activitatea va avea loc doar dacă tipul este una pe care doriți să le permiteți.,
Un exemplu simplu în acest sens se arată aici, unde LookAheadObjectInputStream
clasa este garantat să nu deserialize orice alt tip de pe lângă Bicycle
clasa:
Mai multe implementări complete a acestei abordări au fost propuse de diverși membri ai comunității:
- NibbleSec – o bibliotecă care vă permite lista albă și lista neagră de clase care sunt permise a fi deserialized
- IBM – seminale protecție, scrisă de ani înainte de cel mai devastator scenarii de exploatare au fost prevazute.,
- Apache Commons IO clase
Intareasca Toate java.io.ObjectInputStream Utilizare cu un Agent¶
după Cum sa menționat mai sus, java.io.ObjectInputStream
clasa este folosit pentru a deserialize obiecte. Este posibil să-i întăriți comportamentul subclasându-l. Cu toate acestea, dacă nu dețineți codul sau nu puteți aștepta un patch, utilizarea unui agent pentru a lega întărirea la java.io.ObjectInputStream
este cea mai bună soluție.,
la nivel Global în schimbare ObjectInputStream
este numai în condiții de siguranță pentru lista neagră malware cunoscute tipuri, pentru că nu e posibil să știi pentru toate aplicațiile ce clase de așteptat să fie deserialized sunt. Din fericire, există foarte puține clase necesare în lista neagră pentru a fi în siguranță de toți vectorii de atac cunoscuți, astăzi.este inevitabil ca mai multe clase” gadget ” vor fi descoperite care pot fi abuzate. Cu toate acestea, există o cantitate incredibilă de software vulnerabil expus astăzi, care au nevoie de o soluție., În unele cazuri, „fixare” vulnerabilitatea poate implica re-arhitectura sisteme de mesagerie și de rupere de compatibilitate ca dezvoltatorii muta spre a nu accepta obiecte serializate.
Pentru a activa aceste agenții, pur și simplu adăugați un nou JVM parametru:
-javaagent:name-of-agent.jar
Agenți această abordare au fost eliberate de către diverși membri ai comunitatii:
- rO0 prin Contrast Securitate
Un similare, dar mai scalabile abordare ar fi să manual patch-uri și bootstrap JVM ta e ObjectInputStream. Îndrumări privind această abordare sunt disponibile aici.
.,Net CSharp¶
WhiteBox Revizuire¶
Căutare în codul sursă pentru următorii termeni:
TypeNameHandling
JavaScriptTypeResolver
Uita-te pentru orice serializers în cazul în care tipul este setată de către utilizator controlat de variabila.,
BlackBox Revizuire¶
Căutare pentru următoarele base64 codificat conținut care începe cu:
AAEAAAD/////
Căutare pentru conținut cu următorul text:
TypeObject
$type:
măsuri Generale de Precauție¶
nu permite fluxul de date pentru a defini tipul de obiect pe care fluxul va fi deserialized sa. Puteți preveni acest lucru prin, de exemplu, folosind DataContractSerializer
sau XmlSerializer
dacă este posibil.,
Unde JSON.Net
este folosit asigurați-vă că TypeNameHandling
este setat numai pentru None
.
TypeNameHandling = TypeNameHandling.None
Dacă JavaScriptSerializer
este pentru a fi utilizate atunci nu-l folosesc cu un JavaScriptTypeResolver
.dacă trebuie să deserializați fluxurile de date care definesc propriul tip, atunci restricționați tipurile care pot fi deserializate. Unul ar trebui să fie conștient de faptul că acest lucru este încă riscant, deoarece multe tipuri native.Net potențial periculoase în sine. de exemplu.,
System.IO.FileInfo
FileInfo
obiecte de referință fișiere de fapt pe server când deserialized, modifica proprietățile de aceste fișiere, de exemplu, pentru a citi doar, crearea unui potențial atac denial of service.chiar dacă ați limitat tipurile care pot fi deserializate, amintiți-vă că unele tipuri au proprietăți riscante. System.ComponentModel.DataAnnotations.ValidationException
, de exemplu, are o proprietate Value
de tip Object
., dacă acest tip este tipul permis pentru deserializare, atunci un atacator poate seta proprietatea Value
la orice tip de obiect pe care îl alege.
atacatorii ar trebui împiedicați să direcționeze tipul care va fi instanțiat. Dacă acest lucru este posibil atunci chiar DataContractSerializer
sau XmlSerializer
poate fi subminat de exemplu,
// 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);
Executarea poate avea loc în termen anumit .Net tipuri timpul deserializarea. Crearea unui control, cum ar fi cel prezentat mai jos, este ineficientă.,
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}
Pentru BinaryFormatter
și JSON.Net
este posibil să se creeze un mediu mai sigur formă de listă albă de control folosind un custom SerializationBinder
.încercați să fiți la curent cu gadgeturile de deserializare nesigure. Net cunoscute și acordați o atenție deosebită în cazul în care astfel de tipuri pot fi create de procesele dvs. de deserializare. Un deserializer poate instanți doar tipuri pe care le știe despre.încercați să păstrați orice cod care ar putea crea gadget-uri potențiale separat de orice cod care are conectivitate la internet., Ca exemplu System.Windows.Data.ObjectDataProvider
folosit in aplicatiile WPF este un gadget cunoscut care permite invocarea arbitrara a metodei. Ar fi riscant să avem o referință la această adunare într-un proiect de servicii REST care deserializează date de încredere.
cunoscut .,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., Prin trecerea la un format de date pur, cum ar fi JSON sau XML, reduceți șansa ca logica de deserializare personalizată să fie repurposed către scopuri rău intenționate.multe aplicații se bazează pe un model de obiect de transfer de date care implică crearea unui domeniu separat de obiecte pentru transferul de date scop explicit. Desigur, este încă posibil ca aplicația să facă greșeli de securitate după ce un obiect de date pur este analizat.,
doar Deserializați datele semnate¶
Dacă aplicația știe înainte de deserializare ce mesaje vor trebui procesate, le-ar putea semna ca parte a procesului de serializare. Aplicația ar putea apoi să aleagă să nu deserializeze niciun mesaj care nu avea o semnătură autentificată.,
Instrumente de Atenuare/Biblioteci¶
- Java asigura deserializarea bibliotecă
- SWAT (Serial de Aplicare Albă Antrenor)
- NotSoSerial
Instrumente de Detectare¶
- Java deserializarea foaie de ieftin care vizează pen testere
- Un proof-of-concept instrument pentru generarea de sarcini care exploatează nesigur Java obiect deserializarea.
- Java De-serializarea seturi de instrumente
- Java de-serializarea instrument
- .,n
- JavaSerialKiller
- Java Deserializarea Scanner
- Burp-ysoserial
- SuperSerial
- SuperSerial-Active
Referințe¶
- Java-Deserializarea-Ieftin-Foaie
- Deserializarea de încredere de date
- Java Deserializarea Atacuri – German OWASP Zi 2016
- AppSecCali 2015 – Triaj Muraturi
- FoxGlove de Securitate Vulnerabilitate Anunț
- Java deserializarea foaie de ieftin care vizează pen testere
- Un proof-of-concept instrument pentru generarea de sarcini care exploatează nesigur Java obiect deserializarea.,
- Java De-serializarea seturi de instrumente
- Java de-serializarea instrument
- Burp Suite extensia
- Java asigura deserializarea bibliotecă
- Serianalyzer este un statice bytecode analizor pentru deserializarea
- sarcina utila generator
- Android Java Deserializarea Vulnerabilitate Tester
- Burp Suite Extensia
- JavaSerialKiller
- Java Deserializarea Scanner
- Burp-ysoserial
- SuperSerial
- SuperSerial-Active
- .Net
- Alvaro Muñoz: .,Serializare netă: detectarea și apărarea punctelor finale vulnerabile
- James Forshaw-Black Hat USA 2012-ești tipul meu? De rupere .net Nisipuri Prin Serializare
- Jonathan Mesteacan BlueHat v17 – Periculos Cuprins – Asigurarea .Net Deserializarea
- Alvaro Muñoz & Oleksandr Mirosh – vineri 13: Ataca JSON – AppSecUSA 2017