Agent skill · security · jeremylongshore

detecting-insecure-deserialization

Scan a source tree for unsafe-by-default deserialization APIs: Python pickle.loads / cPickle / shelve / dill, Ruby Marshal.load / YAML.load (pre-3.1 default), Java ObjectInputStream.readObject, PHP unserialize, .NET BinaryFormatter / NetDataContractSerializer, Node.js node-serialize, JavaScript JSON.parse with reviver containing eval. Use when: pre-commit gate on services that accept binary blobs, audit of legacy job-queue code (workers deserializing tasks), post-bug-report when "we accept user-uploaded archives." Threshold: any call to a known-unsafe deserialization API on data that originates from user input, network, file upload, or untrusted storage. Trigger with: "scan deserialization", "pickle audit", "java readObject scan", "yaml.load check".

Why this skill is useful

Adds a script for scanning source trees for insecure deserialization APIs, which is critical for security assessments and not commonly known.

What it needs

Requires python3 installed locally. About 3k tokens when loaded. Last updated 2026-08-07. 2,604 stars on the source repository.

What this skill does

Detecting Insecure Deserialization Overview Insecure deserialization (CWE-502, OWASP A08:2021) is the highest- severity injection class in many language stacks because it directly maps to RCE. Pickle, Java serialization, PHP unserialize, and BinaryFormatter all execute object-construction code during deserialization. If that code includes reduce / readObject / wakeup / OnDeserialization callbacks that the attacker controls, the deserialization step IS code execution. Most legitimate use cases have safer alternatives (JSON for data, YAML with safe-load, Protocol Buffers, Avro). The remaining cases need explicit type allow-lists and HMAC-signed payloads. When the skill produces findings Finding Severity Threshold Affected control --- --- --- --- Python pickle.loads(...) CRITICAL always (untrusted input) CWE-502 Python pickle.load(file) CRITICAL always CWE-502 Python dill.loads CRITICAL always CWE-502 Python yaml.load(...) without Loader= CRITICAL unsafe legacy default CWE-502 Python yaml.unsafeload(...) CRITICAL explicit unsafe CWE-502 Python shelve.open(...) HIGH pickle-backed; user-controllable filename CWE-502 Java ObjectInputStream.readObject() CRITICAL always CWE-502 PHP unserialize($input) CRITICAL non-literal input CWE-502 .NET BinaryFormatter.Deserialize(...) CRITICAL deprecated unsafe API CWE-502 .NET NetDataContractSerializer CRITICAL also unsafe CWE-502 .NET LosFormatter.Deserialize CRITICAL ViewState path CWE-502 Ruby Marshal.load(...) CRITICAL non-literal CWE-502 Ruby YAML.load(...) (pre-3.1 Psych) CRITICAL safe in Psych 4.0+; needs version check CWE-502 Node.js node-serialize.unserialize CRITICAL known-vulnerable lib CWE-502 Node.js serialize-javascript reviver HIGH if used to deserialize untrusted CWE-502 Prerequisites Python 3.9+ Source tree on local filesystem Instructions Run Options same as previous skills: --output, --format, --min-severity, --include-tests, --languages. …

How to use it

Reference it in AdaL, Claude Code, Cursor or any coding agent — nothing to install:

@skills jeremylongshore/detecting-insecure-deserialization--60a1d5

View the source on GitHub

Browse the @skills marketplace