| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| deserializacija [2026/06/16 16:26] – stilske i sadržajne ispravke mbunic | deserializacija [2026/06/17 15:40] (current) – formatiranje i sadržaj dvaju podpoglavlja mbunic |
|---|
| |
| **Serijalizacija** je proces pretvaranja složenijih tipova podataka u jednostavniji oblik. Svrha je pohraniti podatke u obliku u kojem se oni mogu zapisati u datoteku, slati mrežom ili pohraniti u bazu podataka. Primjeri formata za serijalizirane podatke su binarni zapis, JSON (//JavaScript Object Notation//) i XML (//Extensible Markup Language//). \\ | **Serijalizacija** je proces pretvaranja složenijih tipova podataka u jednostavniji oblik. Svrha je pohraniti podatke u obliku u kojem se oni mogu zapisati u datoteku, slati mrežom ili pohraniti u bazu podataka. Primjeri formata za serijalizirane podatke su binarni zapis, JSON (//JavaScript Object Notation//) i XML (//Extensible Markup Language//). \\ |
| | |
| |
| **Deserijalizacija** je obrnut proces. Iz sažetog zapisa podataka rekonstruira se objekt koji je prethodno bio serijaliziran. Deserijaliziran objekt mora biti jednak originalnom, obuhvatiti sve njegove funkcionalnosti i omogućiti nastavak rada s objektom kao i prije serijalizacije. | **Deserijalizacija** je obrnut proces. Iz sažetog zapisa podataka rekonstruira se objekt koji je prethodno bio serijaliziran. Deserijaliziran objekt mora biti jednak originalnom, obuhvatiti sve njegove funkcionalnosti i omogućiti nastavak rada s objektom kao i prije serijalizacije. |
| | |
| | |
| | **Izvorne serijalizacije** (engl. //native//) pojedinih programskihi jezika (npr. unutar PHAR datoteka kod PHP-a ili Pickle kod Pythona) serijaliziraju programske objekte i njihova stanja u binarni format. Njihovo korištenje uključuje više mogućnosti izvršavanja programskog koda, pogotovo tijekom deserijalizacije, zbog čega je površina napada znatno veća. Za razliku od njih, formati poput JSON-a i XML-a pohranjuju samo podatke i njihovu strukturu. |
| |
| **Nesigurna deserijalizacija** (eng. //Insecure deserialization//) javlja se kada web aplikacije deserijaliziraju podatke koje unose korisnici. U idealnom slučaju, nikad se ne bi trebalo izravno deserijalizirati korisnički unos jer svaki korisnik može biti zlonamjeran i unijeti podatke koji mogu izazvati štetu. | **Nesigurna deserijalizacija** (eng. //Insecure deserialization//) javlja se kada web aplikacije deserijaliziraju podatke koje unose korisnici. U idealnom slučaju, nikad se ne bi trebalo izravno deserijalizirati korisnički unos jer svaki korisnik može biti zlonamjeran i unijeti podatke koji mogu izazvati štetu. |
| |
| ===Magične metode=== | ===Magične metode=== |
| U PHP-u i još nekim programskim jezicima postoje tzv. **magične metode**. To su metode koje se automatski pozivaju u određenim situacijama. Objektno orijentirani jezici (primjerice Java), u modeliranju rješenja problema koriste se objektima. Objekti se mogu stvarati i uništavati te svako stvaranje objekta potakne pozivanje metode - **konstruktora**. U Pythonu je to //%%__init__%%//, u PHP-u //construct()// itd. Konstruktor je, dakle, jedan od primjera magičnih metoda. Sâmo postojanje magičnih metoda ne predstavlja ranjivost, no problem je kad se one izravno koriste podatcima koje unose korisnici jer se pozivanje tih metoda ne može spriječiti. Još je veći problem kad postoje magične metode prilikom deserijalizacije podataka kao što je slučaj u PHP-u. Metoda //unserialize()// automatski poziva metodu //%%__wakeup()%%//. Dakle, čak i ako neki podatci neće proći deserijalizaciju (primjerice, ako metoda //unserialize()// prepozna grešku), i dalje je moguće da se pokrene poziv metode //%%__wakeup()%%// i da se napravi šteta. | |
| | U PHP-u i još nekim programskim jezicima postoje tzv. **magične metode**. To su metode koje se automatski pozivaju u određenim situacijama. Objektno orijentirani jezici (primjerice Java), u modeliranju rješenja problema koriste se objektima. Objekti se mogu stvarati i uništavati te svako stvaranje objekta potakne pozivanje metode - **konstruktora**. U Pythonu je to //%%__init__%%//, u PHP-u //construct()// itd. Konstruktor je, dakle, jedan od primjera magičnih metoda. |
| | |
| | Sâmo postojanje magičnih metoda ne predstavlja ranjivost, no problem je kad se one izravno koriste podatcima koje unose korisnici jer se pozivanje tih metoda ne može spriječiti. Još je veći problem kad postoje magične metode prilikom deserijalizacije podataka kao što je slučaj u PHP-u. Metoda //unserialize()// automatski poziva metodu //%%__wakeup()%%//. Dakle, čak i ako neki podatci neće proći deserijalizaciju (primjerice, ako metoda //unserialize()// prepozna grešku), i dalje je moguće da se pokrene poziv metode //%%__wakeup()%%// i da se napravi šteta. |
| |
| ===Umetanje nasumičnih objekata=== | ===Umetanje nasumičnih objekata=== |
| U objektno orijentiranim jezicima objekt pripada nekoj klasi. Klasa se može shvatiti kao vrsta objekta, a objekt je instanca klase. Primjerice, drveće bi se moglo modelirati klasom, a svako drvo za sebe jednim objektom. Svako drvo ima grane, listove i deblo te svako može raditi iste stvari (stvarati grane, pupove listova, odbaciti listove, promijeniti boju lista...). Na isti način, svaka klasa u programskom jeziku ima definirane atribute i metode koje se mogu zvati nad objektima koji pripadaju toj klasi. Atributi su osobine objekta, ono što on posjeduje, a metode su akcije koje objekt može obaviti ili koje se mogu obaviti nad njime.\\ | |
| Napadač može manipulirati koje će klase biti objekt poslan na deserijalizaciju. Kažemo da je umetnut //nasumičan// objekt jer u pravilu u svakoj stranici postoji mnogo klasa objekata koje se koriste pa je teško predvidjeti koju će od njih napadač odabrati da bi izazvao grešku. Uobičajeno programski jezici imaju mehanizme prepoznavanja neočekivanih tipova podataka pa će slanje objekta neke druge klase obično izazvati grešku (//error//) ili iznimku (//exception//). Ipak, to ne mora uvijek biti dovoljna zaštita jer je moguće da je objekt već ušao u sustav. | U objektno orijentiranim jezicima objekt pripada nekoj klasi. Klasa se može shvatiti kao vrsta objekta, a objekt je instanca klase. Svaka klasa u programskom jeziku ima definirane atribute i metode koje se mogu zvati nad objektima koji pripadaju toj klasi. Atributi su osobine objekta, ono što on posjeduje, a metode su akcije koje objekt može obaviti ili koje se mogu obaviti nad njime. |
| | |
| | Napadač može manipulirati koje će klase biti objekt poslan na deserijalizaciju. Kažemo da je umetnut //nasumičan// objekt jer u pravilu u svakoj aplikaciji postoji mnogo klasa objekata koje se koriste pa je teško predvidjeti koju će od njih napadač odabrati da bi izazvao grešku. Uobičajeno programski jezici imaju mehanizme prepoznavanja neočekivanih tipova podataka pa će slanje objekta neke druge klase obično izazvati grešku (//error//) ili iznimku (//exception//). Ipak, to ne mora uvijek biti dovoljna zaštita jer je moguće da je objekt već ušao u sustav. |
| \\ | \\ |
| \\ | \\ |
| \\ | \\ |
| \\ | \\ |
| ===Mjere zaštite=== | ===Prevencija nesigurne deserijalizacije=== |
| Za sigurniju deserijalizaciju preporučljivo je koristiti se formatima koji imaju dobro definirana pravila deserijaliziranja, primjerice JSON ili XML. Na taj se način smanjuje vjerojatnost da će netko unijeti neku dodatnu logiku prilikom deserijalizacije jer je već mnogo toga jasno definirano.\\ | |
| Poželjno je složiti aplikaciju tako da ona pri serijalizaciji označi svaki podatak nekom vrstom potpisa. Zatim prije deserijalizacije treba provjeriti postoji li taj potpis te, ako ga nema, odbaciti podatak jer je vjerojatno maliciozan. Tako se može spriječiti ubacivanje štetnih podataka od strane napadača.\\ | Radi prevencije nesigurne deserijalizacije preporučuje se koristiti formate koji pohranjuju samo podatke i strukturu (poput JSON-a ili XML-a) umjesto izvornih serijalizacija programskih jezika kada je to moguće. Na taj se način znatno smanjuje površina napada. |
| Neki jezici implementiraju zaštitu podataka koji se serijaliziraju. Primjerice, u Javi postoji sučelje //Serializable// koje mora implementirati svaka klasa objekata ako se oni serijaliziraju. Ako postoje podatci koji se ne smiju serijalizirati, njih treba označiti kao //private transient//. //Private// znači da se taj podatak ne bi trebao vidjeti niti u jednoj klasi izvan one u kojoj je definiran. //Transient// je ono što zapravo sprečava serijalizaciju podatka. \\ | |
| Postoje mnogi alati i biblioteke čija je zadaća osigurati deserijalizaciju, primjerice Javini //SerialKiller// i //NotSoSerial// te //Serial Whitelist Application Trainer// (SWAT) i mnogi drugi. | Kada se izvorna serijalizacija ne može izbjeći, preporučuje se ograničiti skup klasa koje se smiju deserijalizirati (whitelist pristup). Ako se tijekom deserijalizacije pronađe klasa koja nije na popisu dopuštenih, odbacuje se ili se cijeli postupak deserijalizacije prekida uz grešku. |
| | |
| | Poželjno je koristiti kriptografske potpise serijaliziranih podataka. Prije deserijalizacije treba provjeriti postojanje i validnost potpisa, te odbaciti podatke ako potpis nije važeći. |
| | |
| | Programski jezici pružaju mehanizme za kontrolu procesa serijalizacije. Primjerice, u Javi postoji sučelje //Serializable// koje mora implementirati svaka klasa objekata ako se oni serijaliziraju. Ako postoje podatci koji se ne smiju serijalizirati, njih treba označiti kao //transient//, što označava da se taj podatak ne uključuje u proces serijalizacije. |
| | |
| | Postoje mnogi alati i biblioteke čija je zadaća zaštititi proces deserijalizacije, primjerice Javini //SerialKiller// i //NotSoSerial// te //Serial Whitelist Application Trainer// (SWAT) i mnogi drugi. |
| |
| | |