eresus-deser-audit — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited eresus-deser-audit (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Perform a targeted audit of deserialization attack surfaces across any language. This skill provides structured knowledge of dangerous deserialization sinks, safe alternatives, gadget chain indicators, and a step-by-step exploitation methodology.
This is a depth-first specialist skill — it goes deeper on deserialization than the general eresus-manual-security-audit skill. Use it when the target application processes serialized data from untrusted sources.
Search the codebase for functions that convert serialized data back into objects. Use grep_search with these patterns per language:
Java: ObjectInputStream, readObject, XStream, fromXML, Kryo, readClassAndObject Python: pickle.load, pickle.loads, yaml.load, marshal.loads, shelve.open Ruby: Marshal.load, YAML.load, Oj.load, Ox.load PHP: unserialize, simplexml_load_string .NET: BinaryFormatter, SoapFormatter, NetDataContractSerializer, LosFormatter Node.js: node-serialize, funcster, cryo
For each sink found, trace backwards to determine:
The key question: can the attacker control which class/type gets instantiated?
it is almost certainly exploitable
yaml.safe_load), it may be safeLook for classes on the classpath/load path that have dangerous side effects during deserialization:
__reduce__ / readObject / marshal_load methodsprocesses attacker-controlled types
| Sink | Risk | Safe Alternative |
|---|---|---|
ObjectInputStream.readObject() | Critical — arbitrary class instantiation | ObjectInputFilter (Java 9+), allowlist |
XStream.fromXML() | Critical — without type allowlist | XStream.allowTypes() or XStream.setupDefaultSecurity() |
Kryo.readObject() | High — without registration | kryo.setRegistrationRequired(true) |
Jackson @JsonTypeInfo(use=CLASS) | Critical — arbitrary class | @JsonTypeInfo(use=NAME) with allowlist |
SnakeYAML.load() | Critical — arbitrary class via !! tags | new SafeConstructor() |
Gadget chain indicators in Java:
Serializable with readObject() or readResolve()InvocationHandler, DynamicProxy| Sink | Risk | Safe Alternative |
|---|---|---|
pickle.loads(data) | Critical — arbitrary code execution | json.loads(), Pydantic models |
pickle.load(file) | Critical — arbitrary code execution | json.load(), Protocol Buffers |
yaml.load(data) | Critical — arbitrary object instantiation | yaml.safe_load(data) |
shelve.open(path) | Critical — uses pickle internally | Custom JSON-based storage |
marshal.loads(data) | High — code object creation | json.loads() |
Gadget chain indicators in Python:
__reduce__() or __reduce_ex__() methodsos.system, subprocess.Popen classes are directly invokable via __reduce__pickle can execute arbitrary code with just __reduce__ returning (os.system, ('cmd',))| Sink | Risk | Safe Alternative |
|---|---|---|
Marshal.load(data) | Critical — RCE via universal gadget chain | JSON.parse(data) |
YAML.load(data) | Critical — RCE via Psych engine | YAML.safe_load(data) |
Oj.load(data, mode: :object) | Critical — arbitrary object instantiation | Oj.load(data, mode: :strict) |
Ox.load(data, mode: :object) | Critical — arbitrary object instantiation | Ox.load(data, mode: :generic) |
Ruby universal gadget chain (works up to Ruby 3.3.x):
zip command via GTFOBins technique| Sink | Risk | Safe Alternative |
|---|---|---|
unserialize($data) | Critical — POP chain exploitation | json_decode($data) |
simplexml_load_string($data) | High — XXE | libxml_disable_entity_loader(true) |
Gadget chain indicators in PHP:
__wakeup(), __destruct(), __toString(), __call() magic methods| Sink | Risk | Safe Alternative |
|---|---|---|
BinaryFormatter.Deserialize() | Critical — banned in .NET 9+ | System.Text.Json |
SoapFormatter.Deserialize() | Critical | System.Text.Json |
NetDataContractSerializer | Critical | DataContractSerializer with known types |
ObjectStateFormatter | Critical — ViewState attacks | Encrypted/signed ViewState |
LosFormatter | Critical | System.Text.Json |
JsonSerializer with TypeNameHandling.All | Critical | TypeNameHandling.None |
Gadget chain indicators in .NET:
ISerializableOnDeserializing / OnDeserialized attributesSystem.Windows.Data.ObjectDataProvider, System.Activities.*| Sink | Risk | Safe Alternative |
|---|---|---|
node-serialize.unserialize() | Critical — direct eval() | JSON.parse() |
funcster.deepDeserialize() | Critical — function reconstruction | JSON.parse() |
cryo.parse() | High — object reconstruction | JSON.parse(), superjson |
When reviewing any deserialization code, check for these red flags:
pickle, Marshal, BinaryFormatter, or ObjectInputStream with user datayaml.load() instead of yaml.safe_load()@JsonTypeInfo, TypeNameHandling)Use ONLY these tools:
view_file — read source code to trace deserialization flowsgrep_search — find deserialization sinks across the codebaseDo NOT use terminal commands like grep, rg, cat, sed, or any shell tools.
Use this skill when eresus-manual-security-audit or eresus-sast-scanner identifies a deserialization entry point that needs deeper analysis.
This skill complements eresus-serialization-review which focuses on the broader serialization attack surface (format confusion, schema validation, etc.).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.