CVE-2025-66455: LMDeploy: pickle deserialization RCE in DistServe
GHSA-2vh9-42vm-xmv2CRITICALCISA: TRACK*LMDeploy's PyTorch DistServe (prefill/decode disaggregation) control plane deserializes ZeroMQ messages with pickle, and the peer address comes from the unauthenticated POST /distserve/p2p_connect endpoint, so a remote attacker can make the server connect to their endpoint and run arbitrary code (CVSS 9.8, CWE-502). Real-world risk is narrower than the score suggests: only deployments that enable DistServe/PD-disaggregation are exposed, EPSS is low (0.007, around the 49th percentile), the CVE is not in CISA KEV, and no public exploit or Nuclei template exists. However, SSVC rates it TRACK*, the package has 9 other CVEs, and LLM serving nodes typically hold GPU capacity, model weights and cloud credentials. Upgrade to LMDeploy 0.16.0 now. Where that is not possible, block untrusted access to /distserve/* and the ZeroMQ ports, enable API-key authentication, and block outbound ZeroMQ connections from serving nodes.
What is the risk?
Severity is critical on paper (network, low complexity, no privileges, no user interaction), but exposure is limited to DistServe-enabled PyTorch backend deployments, which are a niche, advanced configuration. API-key authentication is off by default, so affected deployments are unauthenticated unless the operator configured it. Exploitation likelihood is currently low (EPSS 0.00693, no public PoC, not in KEV), but pickle deserialization is trivial to weaponize once the advisory details are known. Overall risk: HIGH for exposed DistServe clusters, LOW for standard LMDeploy deployments. Only 1 known downstream dependent was tracked, so supply-chain blast radius is small.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| LMDeploy | pip | >= 0.9.2, < 0.16.0 | 0.16.0 |
Do you use LMDeploy? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade lmdeploy to 0.16.0 or later (affected range >= 0.9.2, < 0.16.0). 2) If you cannot upgrade, block untrusted clients from reaching /distserve/* endpoints at the reverse proxy or firewall. 3) Restrict the DistServe HTTP and ZeroMQ control-plane ports to trusted cluster networks or a dedicated VLAN. 4) Configure API-key authentication on the API server. 5) Apply egress filtering so serving nodes cannot open arbitrary outbound ZeroMQ/TCP connections. 6) Detection: monitor access logs for POST /distserve/p2p_connect from unexpected sources, outbound connections from serving processes to unknown hosts, and unexpected child processes spawned by the LMDeploy Python process. 7) Inventory whether any deployment actually enables PD-disaggregation to scope exposure. These workarounds reduce exposure but do not make pickle deserialization safe.
What does CISA's SSVC say?
Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2025-66455?
LMDeploy's PyTorch DistServe (prefill/decode disaggregation) control plane deserializes ZeroMQ messages with pickle, and the peer address comes from the unauthenticated POST /distserve/p2p_connect endpoint, so a remote attacker can make the server connect to their endpoint and run arbitrary code (CVSS 9.8, CWE-502). Real-world risk is narrower than the score suggests: only deployments that enable DistServe/PD-disaggregation are exposed, EPSS is low (0.007, around the 49th percentile), the CVE is not in CISA KEV, and no public exploit or Nuclei template exists. However, SSVC rates it TRACK*, the package has 9 other CVEs, and LLM serving nodes typically hold GPU capacity, model weights and cloud credentials. Upgrade to LMDeploy 0.16.0 now. Where that is not possible, block untrusted access to /distserve/* and the ZeroMQ ports, enable API-key authentication, and block outbound ZeroMQ connections from serving nodes.
Is CVE-2025-66455 actively exploited?
No confirmed active exploitation of CVE-2025-66455 has been reported, but organizations should still patch proactively.
How to fix CVE-2025-66455?
1) Upgrade lmdeploy to 0.16.0 or later (affected range >= 0.9.2, < 0.16.0). 2) If you cannot upgrade, block untrusted clients from reaching /distserve/* endpoints at the reverse proxy or firewall. 3) Restrict the DistServe HTTP and ZeroMQ control-plane ports to trusted cluster networks or a dedicated VLAN. 4) Configure API-key authentication on the API server. 5) Apply egress filtering so serving nodes cannot open arbitrary outbound ZeroMQ/TCP connections. 6) Detection: monitor access logs for POST /distserve/p2p_connect from unexpected sources, outbound connections from serving processes to unknown hosts, and unexpected child processes spawned by the LMDeploy Python process. 7) Inventory whether any deployment actually enables PD-disaggregation to scope exposure. These workarounds reduce exposure but do not make pickle deserialization safe.
What systems are affected by CVE-2025-66455?
This vulnerability affects the following AI/ML architecture patterns: model serving, LLM inference clusters, disaggregated prefill/decode serving, GPU inference infrastructure.
What is the CVSS score for CVE-2025-66455?
CVE-2025-66455 has a CVSS v3.1 base score of 9.8 (CRITICAL). The EPSS exploitation probability is 1.27%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0010.001AI SoftwareAML.T0049Exploit Public-Facing ApplicationAML.T0050Command and Scripting InterpreterAML.T0072Reverse ShellCompliance Controls Affected
What are the technical details?
Original Advisory
LMDeploy is a toolkit for compressing, deploying, and serving large language models. Starting in version 0.9.2 and prior to version 0.16.0, LMDeploy's PyTorch DistServe/PD-disaggregation control plane used `recv_pyobj()` to deserialize messages received through a ZeroMQ PULL socket. PyZMQ implements `recv_pyobj()` using Python pickle deserialization, which can execute arbitrary code while reconstructing an object. The peer address used by the receiver was supplied through the `POST /distserve/p2p_connect` HTTP endpoint. An attacker who could reach an affected DistServe API server could cause the server to connect to an attacker-controlled ZeroMQ endpoint and deserialize a crafted pickle payload. API-key authentication is not enabled unless the operator explicitly configures it. As a result, affected DistServe deployments without API keys allowed unauthenticated remote code execution with the privileges of the LMDeploy serving process. This issue affects the PyTorch backend when PD-disaggregation/DistServe is enabled. Ordinary deployments that do not use the affected disaggregated-serving path do not expose this data flow. The fix was released in LMDeploy 0.16.0. Users who cannot upgrade immediately should prevent untrusted clients from reaching `/distserve/*` endpoints, restrict the DistServe HTTP and ZeroMQ control planes to trusted cluster networks, configure API-key authentication, and block arbitrary outbound ZeroMQ connections from serving nodes. These measures reduce exposure but do not make pickle deserialization safe.
Exploitation Scenario
An attacker scans for exposed LMDeploy API servers and finds one with DistServe enabled and no API key. They host a ZeroMQ PUSH endpoint that serves a crafted pickle payload with a malicious __reduce__ method. They send POST /distserve/p2p_connect with their endpoint as the peer address. The server connects to the attacker's endpoint and calls recv_pyobj(), which unpickles the payload and runs the attacker's commands as the serving user. The attacker then steals model weights and cloud credentials, opens a reverse shell, and moves laterally to other nodes in the inference cluster.
Weaknesses (CWE)
CWE-502Deserialization of Untrusted DataPrimaryCWE-502Deserialization of Untrusted DataPrimaryCWE-502Deserialization of Untrusted DataCWE-502 — Deserialization of Untrusted Data: The product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid.
- [Architecture and Design, Implementation] If available, use the signing/sealing features of the programming language to assure that deserialized data has not been tainted. For example, a hash-based message authentication code (HMAC) could be used to ensure that data has not been modified.
- [Implementation] When deserializing data, populate a new object rather than just deserializing. The result is that the data flows through safe input validation and that the functions are safe.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:HReferences
Timeline
Related Vulnerabilities
CVE-2025-599539.8LMDeploy: unsafe pickle deserialization allows RCE
Same package: lmdeployCVE-2026-768509.8LMDeploy: RCE via unauth pickle deserialization
Same package: lmdeployCVE-2026-1197069.8LMDeploy: unauthenticated RCE via pickle in /update_weights
Same package: lmdeployCVE-2025-677298.8lmdeploy: Deserialization enables RCE
Same package: lmdeployCVE-2026-336258.8LMDeploy: eval() injection via malicious model config
Same package: lmdeploy