Skip to content
Heist/ feed
UnratedFix available

LMDeploy has Remote Code Execution by Pickle Deserialization via handle_zmq_recv in lmdeploy/lmdeploy/pytorch/disagg/conn/engine_conn.py

Type: advisorySource: OSV1 source record

## Summary 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. ## Affected components - HTTP entry point: `lmdeploy/serve/openai/endpoints/distserve.py`, `POST /distserve/p2p_connect` - Attacker-controlled peer address: `DistServeConnectionRequest.remote_engine_endpoint_info.zmq_address` - Vulnerable receiver: `lmdeploy/pytorch/disagg/conn/engine_conn.py`, `EngineP2PConnection.handle_zmq_recv()` - Unsafe operation: `recv_pyobj()`, which performs pickle deserialization ## Vulnerable data flow 1. A caller submits a DistServe P2P connection request

Announced Source revision 1
Original source ↗

PYSEC-2026-4077

Primary source · Revision 1

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:PYSEC-2026-4077

lmdeploy

Source reference: /affected/0/package/name

Affected versions
0.10.0

Source reference: /affected/0/versions

0.10.1

Source reference: /affected/0/versions

0.10.2

Source reference: /affected/0/versions

0.11.0

Source reference: /affected/0/versions

0.11.1

Source reference: /affected/0/versions

0.12.0

Source reference: /affected/0/versions

0.12.1

Source reference: /affected/0/versions

0.12.2

Source reference: /affected/0/versions

0.12.3

Source reference: /affected/0/versions

0.13.0

Source reference: /affected/0/versions

0.14.0

Source reference: /affected/0/versions

0.15.0

Source reference: /affected/0/versions

0.9.2

Source reference: /affected/0/versions

0.9.2.post1

Source reference: /affected/0/versions

Fixed versions
0.16.0

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "ECOSYSTEM",
        "events": [
          {
            "introduced": "0.9.2"
          },
          {
            "fixed": "0.16.0"
          }
        ]
      }
    ],
    "package": {
      "name": "lmdeploy",
      "purl": "pkg:pypi/lmdeploy",
      "ecosystem": "PyPI"
    },
    "versions": [
      "0.10.0",
      "0.10.1",
      "0.10.2",
      "0.11.0",
      "0.11.1",
      "0.12.0",
      "0.12.1",
      "0.12.2",
      "0.12.3",
      "0.13.0",
      "0.14.0",
      "0.15.0",
      "0.9.2",
      "0.9.2.post1"
    ],
    "database_specific": {
      "source": "https://github.com/pypa/advisory-database/blob/main/vulns/lmdeploy/PYSEC-2026-4077.yaml"
    }
  }
]
Related CVEs
CVE-2025-66455

Source reference: /aliases

Publisher severity

No explicit severity was provided.

Event
#62496 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement