6.7 Insecure Deserialization
Serializace a Deserializace
Serializace je proces převodu objektu (z aplikační paměti) do formátu, který lze uložit (např. do souboru nebo poslat po síti), uchovávajíc přitom jak data, tak datovou strukturu.
Deserializace je opačný postup, kdy se ze serializovaného formátu objekt staví znovu do objektové struktury v paměti aplikace.
Deserializace je opačný postup, kdy se ze serializovaného formátu objekt staví znovu do objektové struktury v paměti aplikace.
Zranitelnost nebezpečné deserializace
Problém nastává v okamžiku, kdy server deserializuje vstup od uživatele bez toho, aniž by validoval neporušenost obsahu. Útočník může do serializovaného bloku vložit své vlastní (zákeřné) objekty. Ty během deserializace vyvolají řetězení vnitřních logických struktur – tzv. "Gadget Chains". Výsledkem bývá Remote Code Execution (RCE) neboli spuštění kódu útočníka přímo na straně serveru.
Nástroje a formáty u různých jazyků
Existuje velké množství programovacích jazyků a knihoven, u kterých je možné RCE docílit přes nebezpečnou deserializaci. Obvykle se používají specializované payloadové balíčky:
- Java: Objekty začínají nejčastěji na znaky
ac edv hexadecimálním tvaru a jakorO0v Base64. Zneužívá se knihovnajava.io.ObjectInputStream. Pro útok na Javu se nejčastěji používá komplexní generátor payloadů zvaný ysoserial (využívá moduly známých knihoven jako CommonsCollections apod. pro sestavení smrtících gadgetových chains). - PHP: Používá se pro útok funkce
unserialize(), jenž často vede přes PHP Magické metody na RCE. Populární je nástroj PHPGGC (PHP Generic Gadget Chains). Zranitelnými CMS jsou např. WordPress, Magento, Laravel, Doctrine apod. - Python: U modulu
picklevede k RCE užitímpickle.loads(). - Node.js: Knihovny
serialize-javascript / node-serializevedou k Prototype Pollution či k RCE. Dokonce i v samotném Next.js a React Server Components existoval podobný kritický deserializační problém s názvem React2Shell s masivním dosahem a skóre 10.0 (CVE-2025-55182).
Příklad použití ysoserial (Java)
Příkaz k vygenerování RCE payloadu v Javě, který přečte citlivý soubor a vytvoří tak nebezpečný base64 serializovaný blob:
Nové verze Javy (např. verze 21) ale začaly masivně přecházet na přísná zabezpečení, takže generování a zneužití přes ysoserial často vyžaduje spuštění s explicitním flagy pro uvolnění modulárních omezení (např.
java -jar ysoserial-all.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64 -w 0Nové verze Javy (např. verze 21) ale začaly masivně přecházet na přísná zabezpečení, takže generování a zneužití přes ysoserial často vyžaduje spuštění s explicitním flagy pro uvolnění modulárních omezení (např.
--add-opens), které se u moderních projektů postupně potlačují.