
Look for untrusted data entering pickle.loads, binary blobs in logs, or unexpected process spawns. Verify data signatures, reject binary formats in transit, and use safe serialization libraries like JSON for human-readable data to prevent automatic code execution.
What pickle deserialization actually does
Python pickle is a serialisation mechanism that converts Python objects into a byte stream. The reverse process, deserialization, reconstructs these objects from the stream. Unlike JSON or XML, pickle does not just store data values. It stores instructions on how to recreate objects. These instructions can include calls to arbitrary Python functions. When you load a pickle file, the interpreter executes these instructions. This means that any untrusted pickle data can run code on your system with the same permissions as the Python process. The mechanism treats data as code.
Signs people notice first
The most obvious indicator is an error trace involving pickle.loads or pickle.load. Security teams often see these in application logs when a malformed stream is processed. Another visible sign is the presence of .pkl or .pickle files in directories that should only contain configuration or text data. If your application handles user uploads, finding binary files with these extensions is a red flag. These files are not human-readable. You cannot inspect their contents with a standard text editor. The binary nature of the format hides the malicious intent from casual review.
Signs that are easy to miss
Subtle signs often hide in network traffic or memory usage. Pickle streams are binary, so they appear as random data in packet captures. You might see unusual spikes in CPU usage when an application processes incoming data. This happens because the deserializer is executing code, not just parsing text. Another hidden sign is the creation of temporary files in unexpected locations. Malicious pickle payloads often write files to disk as part of their execution chain. If you see new files appearing in /tmp or similar directories during data processing, investigate the source. The code execution happens silently, without standard logging.
The hidden cost of trust
Many applications assume that data coming from internal services is safe. This assumption fails when an attacker compromises one microservice and sends a malicious pickle object to another. The receiving service trusts the data source and deserialises it. The result is lateral movement within your infrastructure. This risk is higher in distributed systems where services communicate frequently. The attack surface expands with every service that uses pickle for inter-process communication. You cannot rely on network segmentation alone to stop this threat. The data itself carries the weapon.
| Sign | What it usually means | What to do |
|---|---|---|
pickle.loads in stack trace | Application is deserialising untrusted data | Replace with JSON or validate source strictly |
| Binary blobs in API logs | Data is serialised in a non-text format | Inspect headers for application/octet-stream |
| Unexpected temp files | Code execution created side effects | Kill process and audit deserialization points |
| High CPU on data ingest | Complex object reconstruction is running | Profile the application for heavy deserialization |
.pkl files in uploads | User data contains serialised Python objects | Block file extension and scan for binary content |
Immediate containment steps
When you identify a potential pickle deserialization vulnerability, stop the affected service immediately. Do not attempt to analyse the payload further on the live system. The code may have already established persistence or exfiltrated data. Isolate the network segment to prevent lateral movement. Check for new user accounts or modified system binaries. Review recent deployments for any introduction of pickle usage. If the vulnerability is in a third-party library, check for updates. Many libraries have patched known deserialization flaws. Do not restart the service until you have verified the integrity of the system.
See also: How VPN Appliance Vulnerabilities Expose Your Network to Silent Intrusion
Long term mitigation strategies
The only complete fix is to stop using pickle for untrusted data. Replace it with safe serialization formats like JSON, YAML, or MessagePack. These formats do not execute code during parsing. They only reconstruct data structures. If you must use pickle for internal performance reasons, restrict its use to trusted, internal channels only. Implement strict access controls around these channels. Use cryptographic signatures to verify data integrity before deserialization. This ensures that the data has not been tampered with in transit. Even then, the risk remains if the signing key is compromised. Consider the trade-off between performance and security.
Integration with broader security
Pickles are just one vector in a larger set of deserialization risks. Understanding CWE-502, which covers deserialization of untrusted data, helps contextualise this threat. It is not unique to Python. Java, .NET, and PHP face similar issues. Your vulnerability management program should include checks for unsafe deserialization across all languages. This aligns with risk-based vulnerability management principles. You prioritise fixes based on exploitability and impact. Deserialization flaws are high impact because they allow remote code execution. Treat them with the same urgency as SQL injection or cross-site scripting.
Never assume that data from internal services is safe. An attacker who compromises one service can use pickle to pivot to others. Trust boundaries must be enforced at the data level, not just the network level.

Checklist for secure serialisation
- Audit all uses of
picklein your codebase. - Identify all data sources that feed into pickle loaders.
- Replace pickle with JSON for any user-facing data.
- Implement input validation for all binary data streams.
- Monitor logs for unexpected process creation.
- Review third-party libraries for known deserialization flaws.
- Ensure your deployment pipeline blocks unsafe dependencies.
Key takeaways
- Pickle modules execute arbitrary Python code during the deserialization process, not just data reconstruction.
- Binary data streams in application logs often indicate pickle usage, which is opaque and difficult to inspect manually.
- Replacing pickle with JSON or MessagePack eliminates the automatic code execution risk entirely for most use cases.
Python pickle executes code during data reconstruction, making any untrusted input a direct path to remote code execution. Replace pickle with JSON or other safe formats to eliminate this risk entirely.
Frequently asked questions
Can I safely use pickle if I validate the input?
No, input validation is insufficient because the pickle format allows arbitrary code execution. Validation cannot fully inspect the binary stream for malicious instructions.
Is JSON completely safe from deserialization attacks?
JSON is safe from automatic code execution during parsing. However, you must still validate data types and lengths to prevent denial-of-service attacks.
How do I find pickle usage in a large codebase?
Search for imports of the `pickle` module and calls to `pickle.loads` or `pickle.load`. Static analysis tools can also detect these patterns automatically.
What if I need the performance of pickle?
Use pickle only for trusted, internal data. Never expose pickle endpoints to users or untrusted services. Consider MessagePack as a faster, safer alternative.
How this guide was produced: written by the Payload Report editorial team with AI assistance, checked against the public references listed below, and reviewed when the facts change. See our editorial policy or report an error.



