Overview Techniques Gadget Chains Tools Statistics Demo Detection Prevention Legal Resources

Deserialization Attacks Guide

What are Deserialization Attacks?

Insecure deserialization attacks occur when an application deserializes untrusted data (serialized objects) without proper validation. Attackers craft malicious serialized payloads containing gadget chains that execute arbitrary code (RCE), perform privilege escalation, or cause denial of service (DoS). Deserialization vulnerabilities affect many languages: Java (Apache Commons Collections, Spring, Vaadin), Python (pickle, PyYAML), PHP (unserialize), .NET (BinaryFormatter, Json.NET), Ruby (YAML, Marshal), and Node.js (node-serialize). Log4Shell (CVE-2021-44228) was a deserialization vulnerability. 35% of Java applications have deserialization vulnerabilities (Veracode).

Deserialization Statistics: 35% of Java applications have deserialization vulnerabilities. Average CVSS score: 8.1 (High). Log4Shell (2021) affected 100,000+ applications. ysoserial has 40+ gadget chains for Java.

35%
Java Apps Vulnerable
8.1
Average CVSS Score
40+
Java Gadget Chains

Common deserialization targets:

Deserialization Attack Techniques

Java Deserialization (ysoserial)

Most common deserialization target. Gadget chains: CommonsCollections1-7, Spring, Groovy, Vaadin, BeanShell, JBOSS, Jython. ysoserial generates payloads for RCE (calc.exe, reverse shell).

Most Common

Python Pickle (pickle.loads)

Python pickle is inherently insecure. __reduce__ method executes arbitrary code. ysoserial for Python exists (Pker). Used in Flask sessions, Django, PySpark.

PHP unserialize

PHP unserialize vulnerability. Gadget chains in popular frameworks (Laravel, Symfony, Doctrine). __wakeup, __destruct magic methods execute code.

.NET Deserialization

BinaryFormatter, LosFormatter, ObjectStateFormatter are vulnerable. ysoserial.net generates gadget chains for RCE (TypeConfuseDelegate, WindowsIdentity, ActivitySurrogateSelector).

Deserialization Gadget Chains

// Java deserialization gadget chain (CommonsCollections1) // Vulnerable library: Apache Commons Collections 3.1-3.2.1 // Gadget chain: HashMap → AnnotationInvocationHandler → Runtime.exec() // ysoserial payload generation java -jar ysoserial.jar CommonsCollections1 "calc.exe" // Base64-encoded serialized payload (truncated) rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAAAx3CAAAABAAAAAB... // Python pickle gadget chain (__reduce__) import pickle import os class Exploit(object): def __reduce__(self): return (os.system, ('calc.exe',)) payload = pickle.dumps(Exploit()) pickle.loads(payload) # Executes calc.exe // PHP unserialize gadget chain (Laravel) // O:35:"Illuminate\Broadcasting\PendingBroadcast":1:{s:12:"*events";O:28:"Illuminate\Events\Dispatcher":1:{s:8:"listeners";a:1:{s:4:"*";a:1:{i:0;O:25:"Illuminate\Bus\Dispatcher":1:{s:6:"*";C;}}}}}

Deserialization Attack Tools

ysoserial (Java)

Generates Java deserialization payloads for 40+ gadget chains (CommonsCollections, Spring, Groovy, Vaadin). Supports RCE, reverse shell, file write.

ysoserial.net (.NET)

.NET deserialization payload generator (BinaryFormatter, LosFormatter, ObjectStateFormatter). Gadget chains: TypeConfuseDelegate, ActivitySurrogateSelector, WindowsIdentity.

PHPGGC (PHP)

PHP unserialize payload generator for popular frameworks (Laravel, Symfony, Doctrine, Magento, WordPress). RCE gadget chains.

Pker (Python Pickle)

Python pickle payload generator. __reduce__ gadget chains for RCE (os.system, subprocess.Popen).

Burp Suite (Deserialization Scanner)

Burp extension for detecting deserialization vulnerabilities (Java, .NET, PHP). Scans for gadget chain signatures.

Deserialization Attack Statistics

// Deserialization attack statistics (2023-2024) - 35% of Java applications have deserialization vulnerabilities (Veracode) - 50% of Java deserialization vulnerabilities are in Apache Commons Collections - 70% of Java applications use vulnerable libraries (Commons Collections, Spring, Groovy) - Log4Shell (CVE-2021-44228) affected 100,000+ applications (JNDI deserialization) - Average CVSS score: 8.1 (High - Critical) - 40+ gadget chains available in ysoserial for Java - 30+ gadget chains for .NET (ysoserial.net) - 20+ gadget chains for PHP (PHPGGC) // Most vulnerable deserialization formats 1. Java serialization (ObjectInputStream): 50% 2. PHP unserialize: 25% 3. Python pickle: 15% 4. .NET BinaryFormatter: 10% // Top vulnerable libraries (Java) 1. Apache Commons Collections: 40% 2. Spring Framework: 20% 3. Groovy: 10% 4. Vaadin: 8% 5. JBOSS: 7% 6. BeanShell: 5%

Deserialization Attack Simulation (Java ysoserial)

This demonstration simulates a Java deserialization attack using ysoserial payload (CommonsCollections1):

Click "Exploit Deserialization" to see Java deserialization attack

This is a simulated demonstration. Real deserialization attacks (ysoserial, PHPGGC) can achieve remote code execution. Defenses: Avoid deserializing untrusted data. Use allowlists (SerialKiller, Look-Ahead Java Deserialization). Use safe formats (JSON, YAML with safe parsers). Implement integrity checks (HMAC, digital signatures). Use Java's Look-Ahead Deserialization (ObjectInputFilter).

Detecting Deserialization Vulnerabilities

Static Analysis (FindSecBugs, SpotBugs)

Static analysis detects unsafe deserialization calls (ObjectInputStream, readObject, unserialize, pickle.loads). Flags vulnerable libraries.

Burp Suite (Deserialization Scanner)

Burp extension detects Java, .NET, PHP deserialization vulnerabilities. Sends gadget chain payloads, monitors responses.

Dependency Scanning (OWASP Dependency-Check)

Detects vulnerable libraries (Apache Commons Collections, Spring, Groovy). Flags CVEs (CVE-2015-6420, CVE-2017-15095).

Preventing Deserialization Attacks

Avoid Deserializing Untrusted Data

Never deserialize data from untrusted sources (user input, HTTP requests, network sockets). Use safe formats (JSON, YAML, XML) instead of binary serialization.

Most Effective

Use Allowlists (SerialKiller, ObjectInputFilter)

Java's ObjectInputFilter (Java 9+) allows only safe classes. SerialKiller (Java 6-8) provides class allowlisting/denylisting.

Use Look-Ahead Java Deserialization

Look-Ahead pattern validates class names before deserialization. Prevents gadget chain exploitation.

Implement Integrity Checks (HMAC)

Sign serialized objects with HMAC (Hash-based Message Authentication Code). Verify signature before deserialization. Prevents tampering.

Best Practice - Avoid Deserializing Untrusted Data + Use Allowlists: Never deserialize untrusted data (user input, HTTP requests). Use safe formats (JSON, YAML) instead of binary serialization. Implement allowlists (Java ObjectInputFilter, SerialKiller) to restrict deserializable classes. Use integrity checks (HMAC) to verify serialized data hasn't been tampered. Keep vulnerable libraries (Apache Commons Collections, Spring, Groovy) updated.

Further Resources

ysoserial GitHub Repository

Java deserialization payload generator (40+ gadget chains).

OWASP Deserialization Cheat Sheet

Prevention techniques for Java, .NET, PHP, Python, Ruby deserialization.

SerialKiller (Java Deserialization Whitelist)

Tool for preventing Java deserialization attacks (class allowlisting).

← Back to Knowledge Base