Serializarea și deserializarea în Java: explicarea Java deserialize vulnerabilitate

serializare Java este un mecanism de a transforma un obiect într-un flux de octeți. Deserializarea Java este exact invers și ne permite să recreăm un obiect dintr-un flux de octeți. Serializarea Java—și mai precis deserializarea în Java-este, de asemenea, cunoscută sub numele de „darul care continuă să dea”. Aceasta se referă la numeroasele probleme de securitate și la alte probleme pe care le-a produs de-a lungul anilor.,

ce este serializarea în Java?

în Java, creăm obiecte. Aceste obiecte trăiesc în memorie și sunt îndepărtate de colectorul de gunoi odată ce nu mai sunt folosite. Dacă dorim să transferăm un obiect, de exemplu, să îl stocăm pe un disc sau să îl trimitem într-o rețea, trebuie să îl transformăm într-un flux de octeți. Pentru a face acest lucru, clasa acelui obiect trebuie să implementeze interfața Serializable. Serializarea este transformarea stării unui obiect într-un flux de octeți. Acest flux de octeți nu conține codul real.,

ce este deserializarea în Java?

deserializarea este tocmai opusul serializării. Odată cu deserializarea, aveți un flux de octeți și recreați obiectul în aceeași stare ca atunci când l-ați serializat. Aceasta înseamnă că trebuie să aveți definiția reală a obiectului pentru a realiza recrearea.

cum funcționează serializarea Java?

Java serializare utilizează reflecție pentru a razi toate datele din câmpurile obiectului care trebuie să fie serializate. Aceasta include câmpuri private și finale., Dacă un câmp conține un obiect, acel obiect este serializat recursiv. Chiar dacă este posibil să aveți getteri și setteri, aceste funcții nu sunt utilizate atunci când serializați un obiect în Java.

cum funcționează deserializarea Java?

când deserializing un flux de octet înapoi la un obiect nu utilizează constructorul. Creează un obiect gol și folosește reflecția pentru a scrie datele în câmpuri. La fel ca în cazul serializării, sunt incluse și câmpuri private și finale.

ce este o vulnerabilitate Java deserialize?,o vulnerabilitate Java deserialize este o vulnerabilitate de securitate care apare atunci când un utilizator rău intenționat încearcă să introducă un obiect serializat modificat în sistem care compromite în cele din urmă sistemul sau datele sale. Gândiți-vă la executarea arbitrară a codului care poate fi declanșată atunci când deserializați un obiect serializat. Pentru a explica mai bine vulnerabilitățile Java deserialize, trebuie mai întâi să explorăm cum funcționează deserializarea în Java.

explicarea Java deserialize vulnerabilități

un obiect serializat în Java este o matrice octet cu informații de stat., Acesta conține numele obiectului la care se referă și datele câmpului. Dacă te uiți la un obiect serializat stocate cu un hex-editor, puteți anexați și manipula informațiile rapid.

știm deja că Java deserialization nu folosește constructorul pentru a crea un obiect, ci mai degrabă folosește reflexia pentru a încărca câmpurile. Aceasta înseamnă că toate verificările de validare efectuate în constructor nu sunt niciodată apelate la recrearea obiectului. Vă puteți gândi la verificări precum Data de început înainte de data de sfârșit atunci când descrieți o perioadă., Când deserializing un obiect Java, acest nou obiect poate avea o stare nevalidă.

Să ne uităm la următorul exemplu din Java deserialize vulnerabilitate unde am serializa un obiect dintr-un serializable clasa ValueObject:

atunci Când citesc fișierul ValueObject.ser conține serializat un obiect cu un hex-editor de ieșire este acest lucru.

Acum pot manipula cu ușurință valoare șir. Mai jos am schimba de la Hi la Hallo.,

Când deserializing ajustat fișier binar, vom afla că obiectul e value s-a schimbat. De asemenea, vedem că marca de timp nu s-a schimbat, dovedind că constructorul nu este niciodată apelat. Deci, dacă o aplicație acceptă obiecte serializate, este relativ ușor de temperat cu valorile. Prin modificarea obiectelor serializate, putem crea obiecte nevalide, mizerie cu integritatea datelor, sau chiar mai rău.,

executarea arbitrară a codului, gadgeturile și lanțurile

manipularea datelor dintr-un obiect este deja dăunătoare. Totuși, acest lucru poate duce și la executarea codului dacă setul corect de obiecte este deserializat. Pentru a explica acest lucru, trebuie mai întâi să explic gadgeturile și lanțurile.

Gadget-uri

Un gadget—cum este utilizat de către Lawrence & Frohoff în lor de a vorbi Marschalling Zeama de la AppSecCali 2015—este o clasă sau funcție care are deja existente cod executabil prezent în vulnerabili proces. Acest cod executabil existent poate fi reutilizat în scopuri rău intenționate., Dacă ne uităm la obiecte serializabile Java, unele metode magice—cum ar fi metoda privată readObject()—sunt numite reflectiv atunci când deserializăm.

să ne uităm la gadgetul simplificat de mai jos:

această clasă gadget înlocuiește metoda implicită readObject. Ca rezultat, de fiecare dată când un obiect gadget de clasă este deserializat, comanda obiect Runnable este executată. Atunci când o clasă de comandă arată ceva de genul exemplul de mai jos, este ușor de manipulat acest obiect serializat și de a efectua injecție de cod.,de asemenea, rețineți că, dacă o aplicație acceptă obiecte serializate, obiectul este deserializat mai întâi înainte de a fi aruncat la tipul dorit. Aceasta înseamnă că, chiar dacă turnarea nu reușește, deserializarea este deja finalizată și metoda readObject() este executată. un atac tipic de deserializare constă dintr-un lanț inteligent de gadgeturi. Un atacator caută un gadget care este utilizabil pentru lansarea unui atac și lanțuri mai multe execuții care se termină cu executarea de cod arbitrar, de exemplu.,
În exemplul nostru:

Gadget -> readObject() -> command.run() -> Runtime.getRuntime().exec()

pentru un exemplu mai real, aruncați o privire la implementarea java.util.HashMap. Această clasă are o implementare personalizată a metodei readObject()care declanșează funcția hashcode() a fiecărei taste.

biblioteci

este bine de știut că orice lanțuri de gadgeturi sunt disponibile în aplicația dvs., nu are legătură cu codul dvs., Deoarece importăm o mulțime de cod din biblioteci și cadre, numărul de clase importate de dependențele dvs. (tranzitive) influențează posibilitatea anumitor lanțuri de gadgeturi. Deși crearea unui astfel de malware gadget lanț este foarte greu și forței de muncă intensivă, Java deserializarea vulnerabilități sunt un veritabil și periculos risc de securitate.

cum de a preveni o vulnerabilitate Java deserialize?

cel mai bun mod de a preveni o vulnerabilitate Java deserialize este de a preveni serializarea Java în general. Dacă aplicația dvs. nu acceptă deloc obiecte serializate, nu vă poate face rău.,cu toate acestea, dacă trebuie să implementați interfața Serializabilă din cauza moștenirii, puteți trece peste readObject(), așa cum se vede mai jos, pentru a preveni deserializarea reală.

Dacă aplicația dvs. se bazează pe obiecte serializate, puteți lua în considerare inspectarea ObjectInputStream înainte de deserializare. O bibliotecă care vă poate ajuta în acest sens este biblioteca Apache Commons IO. Această bibliotecă oferă un ValidatedObjectInputStream unde puteți permite în mod explicit obiectele pe care doriți să le deserializați. Acum Preveniți că tipurile neașteptate sunt deserializate deloc.,

un instrument ca ysoserial este, de asemenea, extrem de util în găsirea Java deserialize vulnerabilități în codul. Este un instrument care generează sarcină utilă pentru a descoperi lanțuri de gadgeturi în bibliotecile Java comune care pot, în condițiile potrivite, să exploateze aplicațiile Java care efectuează deserializarea nesigură a obiectelor.

rețineți că vulnerabilitățile de deserializare Java nu sunt exclusive pentru implementarea serializării personalizate a Java. Deși acest articol se concentrează doar pe această parte, aceleași vulnerabilități există în serializarea sau marshaling cadre care se ocupă de acest lucru pentru tine., Dacă există un cadru care creează Magic POJO din XML, JSON, yaml sau formate similare, probabil că folosește reflecția în același mod ca cel descris mai sus. Aceasta înseamnă că există aceleași probleme.

Author: admin

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *