CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-27794

Cache Me If You Can: LangGraph RCE via Pickle

Amit Schendel
Amit Schendel
Senior Security Researcher

Feb 26, 2026·5 min read·63 visits

Executive Summary (TL;DR)

LangGraph's checkpointing system enabled `pickle_fallback=True` by default. Attackers who can write to the cache (Redis/Filesystem) can inject malicious pickle payloads. When the application reads the cache, the payload executes, resulting in RCE.

LangGraph, the brain behind many stateful LLM agents, contained a critical deserialization vulnerability in its caching layer. By defaulting to Python's insecure `pickle` module for fallback serialization, the library opened a backdoor for attackers with write access to the cache backend (like Redis) to execute arbitrary code on the application server. It turns out that trusting serialized data from your cache is just as dangerous as trusting user input directly.

The Hook: Building Brains with Glass Skulls

LangGraph is the cool kid on the block for building stateful, multi-actor applications with LLMs. It manages the "memory" of your AI agents, allowing them to pause, resume, and loop through complex tasks. To make this performant, developers often use caching. You don't want your expensive LLM to re-think the same thought twice, right?

So, LangGraph provides a BaseCache interface. It sits there, quietly storing node states and results in backends like Redis, Postgres, or the filesystem. It’s the perfect optimization. But as with all optimizations in software engineering, there is a trade-off. In this case, the trade-off was security for convenience.

The library's developers wanted to ensure that anything you threw at the cache could be stored. JSON is great, but it can't handle complex Python objects. The solution? Allow the cache to fall back to Python's built-in pickle serialization if JSON fails. If you know anything about Python security, you know that pickle is essentially eval() in a trench coat.

The Flaw: A Serial Killer in the Library

The vulnerability (CWE-502) lies in the langgraph-checkpoint package. Specifically, the BaseCache class initialized its serializer with a fatal configuration default. The JsonPlusSerializer was told to use pickle_fallback=True.

Here is the logic: The application tries to read data from the cache. The serializer attempts to parse it as JSON or msgpack. If that fails, or if the data has specific magic bytes indicating a pickle stream, it passes the data to pickle.loads(). This is a classic "Insecure Deserialization" flaw.

Why is this bad? Because pickle allows object reconstruction to trigger arbitrary code execution during the unpickling process. It doesn't wait for you to call a method on the object; the mere act of loading it triggers the payload. If an attacker can poison the cache—say, by compromising a shared Redis instance or writing to a shared file—they can turn that cache read into a Remote Code Execution (RCE) event.

The Code: The Smoking Gun

Let's look at the diff. It’s almost comical how small the change is versus how massive the implication is. The vulnerable code lived in libs/checkpoint/langgraph/cache/base/__init__.py.

The Vulnerable Code (< 4.0.0):

class BaseCache(ABC, Generic[ValueT]):
    """Base class for a cache."""
    # The road to hell is paved with good intentions (and defaults)
    serde: SerializerProtocol = JsonPlusSerializer(pickle_fallback=True)

That True flag is the culprit. It tells the serializer: "If you don't understand these bytes, just execute them as Python code." It’s the equivalent of a bouncer letting someone into a club just because they're speaking a language the bouncer doesn't understand.

The Fix (>= 4.0.0):

class BaseCache(ABC, Generic[ValueT]):
    """Base class for a cache."""
    # Door slammed shut.
    serde: SerializerProtocol = JsonPlusSerializer(pickle_fallback=False)

The fix was simply to invert the boolean. Now, if the serializer encounters data it can't handle with JSON/msgpack, it raises an error instead of executing it.

The Exploit: Poisoning the Well

This is a post-compromise or infrastructure-escalation exploit. You can't hit this directly from the public internet unless the cache is also exposed (which, honestly, happens more often than it should with Redis).

The Attack Chain:

  1. Recon: The attacker gains access to the Redis instance used by the LangGraph application. This could be via a weak password, an SSRF vulnerability in another service, or lateral movement in the cluster.
  2. Weaponization: The attacker generates a standard pickle bomb using the __reduce__ method.
import pickle
import os
 
class RCE:
    def __reduce__(self):
        # The classic reverse shell or command execution
        return (os.system, ("id > /tmp/pwned",))
 
payload = pickle.dumps(RCE())
  1. Injection: The attacker identifies the key schema used by LangGraph (usually containing the run ID and node ID) and sets the value of that key to the payload bytes in Redis.
  2. Execution: The next time the LangGraph agent runs and attempts to retrieve that node's state from the cache, pickle.loads() detonates the payload. The application server executes the command with the privileges of the LangGraph process.

The Impact: From Cache to Shell

Why should you care if someone needs Redis access to exploit this? Because in modern microservices architectures, we often treat the cache as "internal" and therefore "safe." We might have strict firewall rules for the app server, but leave Redis wide open within the VPC.

This vulnerability turns a data-layer compromise into an application-layer compromise. If an attacker can write to your cache, they no longer just see your data—they own your execution flow.

Impacts include:

  • Full RCE: Complete control over the server running the LLM agent.
  • Secret Theft: Access to environment variables, including OpenAI/Anthropic API keys, database credentials, and AWS tokens.
  • Lateral Movement: Using the compromised host to pivot further into the network.
  • Data Poisoning: Aside from RCE, an attacker could subtly alter the state of the agent, causing it to hallucinate or perform incorrect actions defined by the attacker.

The Fix: Turning off the Magic

The remediation is straightforward, but it requires action. The LangChain AI team released patched versions that disable the pickle fallback by default.

Immediate Steps:

  1. Upgrade langgraph-checkpoint to version 4.0.0 or higher.
  2. Upgrade langgraph to version 1.0.6 or higher.
  3. If you are using specific storage backends like langgraph-checkpoint-postgres or sqlite, update those to their latest versions (3.0.3 and 3.0.2 respectively).

If you absolutely must use pickle (and please, ask yourself why), you have to explicitly opt-in now by passing your own serializer configuration. But for 99% of users, the default safe behavior is what you want.

Lesson Learned: Never implement a "fallback" that lowers security standards. Fail secure, not convenient.

Official Patches

LangChain AIPull Request disabling pickle fallback

Fix Analysis (1)

Technical Appendix

CVSS Score
6.6/ 10
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H

Affected Systems

LangGraph applications using cachingSystems using langgraph-checkpoint < 4.0.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
langgraph-checkpoint
langchain-ai
< 4.0.04.0.0
langgraph
langchain-ai
< 1.0.61.0.6
AttributeDetail
CWE IDCWE-502 (Deserialization of Untrusted Data)
CVSS v3.16.6 (Medium)
VectorAV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:H
Attack VectorNetwork (via Cache Backend)
Privileges RequiredHigh (Write access to cache)
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1059Command and Scripting Interpreter
Execution
T1557Adversary-in-the-Middle
Credential Access
T1203Exploitation for Client Execution
Execution
CWE-502
Deserialization of Untrusted Data

The application deserializes untrusted data without sufficient verification, which can result in the execution of arbitrary code.

Known Exploits & Detection

GitHub AdvisoryVendor advisory describing the pickle fallback vulnerability.

Vulnerability Timeline

Fix commit merged to master
2026-01-12
Public Disclosure (GHSA and NVD)
2026-02-25
Patch v4.0.0 released
2026-02-25

References & Sources

  • [1]GitHub Security Advisory GHSA-mhr3-j7m5-c7c9
  • [2]NVD CVE-2026-27794 Detail

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•3 days ago•CVE-2026-9354
6.9

CVE-2026-9354: Arbitrary Mass Mention Bypass in NousResearch hermes-agent Slack and Mattermost Adapters

A vulnerability in the Slack and Mattermost platform adapters for NousResearch hermes-agent permits an unauthenticated remote attacker to execute arbitrary mass mentions. By leveraging prompt injection, an attacker can bypass output sanitization logic and trigger workspace-wide notification exhaustion.

Alon Barad
Alon Barad
25 views•6 min read
•3 days ago•CVE-2026-9306
6.3

CVE-2026-9306: Unauthenticated Insecure Direct Object Reference (IDOR) in QuantumNous new-api Midjourney Relay

CVE-2026-9306 is a critical unauthenticated Insecure Direct Object Reference (IDOR) vulnerability located in the QuantumNous new-api application, affecting versions up to and including 0.12.1. The flaw is caused by improper middleware ordering combined with a lack of object-level authorization checks. This allows remote, unauthenticated attackers to retrieve sensitive Midjourney images belonging to other users by supplying a valid task identifier.

Amit Schendel
Amit Schendel
12 views•5 min read
•4 days ago•GHSA-GGXF-37HM-9WQF
6.5

GHSA-GGXF-37HM-9WQF: Session Leakage via Unsafe Challenge Path Parsing in instagrapi

The instagrapi library prior to version 2.6.9 contains an improper input validation vulnerability within its challenge handling mechanism. Maliciously crafted server responses can manipulate the client into forwarding session cookies and credentials to an external attacker-controlled domain.

Amit Schendel
Amit Schendel
20 views•6 min read
•4 days ago•GHSA-QQQM-5547-774X
9.1

GHSA-QQQM-5547-774X: Unauthenticated Path Traversal in FileBrowser Quantum PATCH Handler

GHSA-QQQM-5547-774X is a critical path traversal vulnerability in the FileBrowser Quantum application, specifically within the Go backend package. The vulnerability resides in the HTTP handler responsible for processing bulk file modifications via the public API. Unauthenticated attackers can exploit an order-of-operations flaw in the path sanitization logic to bypass intended directory restrictions. This allows adversaries to arbitrarily read, move, and overwrite files on the underlying filesystem by supplying specially crafted HTTP PATCH requests.

Alon Barad
Alon Barad
5 views•6 min read
•4 days ago•CVE-2026-8723
5.3

CVE-2026-8723: Synchronous Denial of Service in qs npm Package via TypeError

The qs query string parsing and serialization library for Node.js is vulnerable to a synchronous Denial of Service (DoS) attack. The vulnerability manifests as a process-terminating TypeError when processing arrays with null or undefined elements under specific configuration parameters.

Amit Schendel
Amit Schendel
35 views•7 min read
•4 days ago•GHSA-7M8F-HGJQ-8GC9
7.5

GHSA-7M8F-HGJQ-8GC9: Pre-Authentication Denial of Service via Insecure Deserialization Order in aiosend

The aiosend library prior to version 3.0.6 contains a pre-authentication Denial of Service (DoS) vulnerability in its webhook handling mechanism. The software processes and deserializes incoming JSON payloads before verifying the cryptographic signature, allowing unauthenticated attackers to exhaust server CPU and memory resources by sending large, complex payloads.

Amit Schendel
Amit Schendel
3 views•6 min read