CVE-2026-105192 (GCVE-0-2026-105192)
Vulnerability from cvelistv5
Published
2026-10-07 09:40
Modified
2026-10-29 10:24
Severity ?
VLAI Severity ?
EPSS score ?
CWE
Summary
LMCache multiprocess mode, also called distributed mode, opens an unauthenticated ZeroMQ ROUTER so worker processes can register and share KV cache blocks. Messages on that socket are msgpack. Extension code 1 is passed to DeviceIPCWrapper.Deserialize, which calls pickle.loads, while the server is still decoding request arguments and before the handler runs. A single unauthenticated ZMQ DEALER message to the transport port (default 5555) therefore executes code as the user the LMCache process runs as. Official container images run that process as root. The transport binds to localhost unless the operator sets a routable address with --host, which is how multi-node deployments let peers connect. The decode path shipped in v0.3.9 and is present through v0.5.5, including the v0.5.6 release candidates. v0.5.6, published on 2026-10-14, removes pickle.loads from this path.
References
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-105192",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "total"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-10-07T17:47:55.401134Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-10-07T17:48:50.681Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://pypi.org/project/lmcache/",
"defaultStatus": "unaffected",
"packageName": "lmcache",
"product": "LMCache",
"programFiles": [
"lmcache/v1/multiprocess/transport/zmq_impl/mq.py",
"lmcache/v1/multiprocess/mq.py",
"lmcache/v1/multiprocess/custom_types.py",
"lmcache/v1/platform/base/ipc_wrapper.py",
"lmcache/v1/platform/base_ipc_wrapper.py"
],
"repo": "git://github.com/LMCache/LMCache",
"vendor": "LMCache",
"versions": [
{
"lessThan": "0.5.6",
"status": "affected",
"version": "0.3.9",
"versionType": "python"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Yuval Moravchick"
},
{
"lang": "en",
"type": "coordinator",
"value": "JFrog Security Research"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eLMCache multiprocess mode, also called distributed mode, opens an unauthenticated ZeroMQ ROUTER so worker processes can register and share KV cache blocks. Messages on that socket are msgpack. Extension code 1 is passed to DeviceIPCWrapper.Deserialize, which calls pickle.loads, while the server is still decoding request arguments and before the handler runs. A single unauthenticated ZMQ DEALER message to the transport port (default 5555) therefore executes code as the user the LMCache process runs as. Official container images run that process as root. The transport binds to localhost unless the operator sets a routable address with --host, which is how multi-node deployments let peers connect. The decode path shipped in v0.3.9 and is present through v0.5.5, including the v0.5.6 release candidates. v0.5.6, published on 2026-10-14, removes pickle.loads from this path.\u003c/p\u003e"
}
],
"value": "LMCache multiprocess mode, also called distributed mode, opens an unauthenticated ZeroMQ ROUTER so worker processes can register and share KV cache blocks. Messages on that socket are msgpack. Extension code 1 is passed to DeviceIPCWrapper.Deserialize, which calls pickle.loads, while the server is still decoding request arguments and before the handler runs. A single unauthenticated ZMQ DEALER message to the transport port (default 5555) therefore executes code as the user the LMCache process runs as. Official container images run that process as root. The transport binds to localhost unless the operator sets a routable address with --host, which is how multi-node deployments let peers connect. The decode path shipped in v0.3.9 and is present through v0.5.5, including the v0.5.6 release candidates. v0.5.6, published on 2026-10-14, removes pickle.loads from this path."
}
],
"metrics": [
{
"cvssV3_1": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "HIGH",
"baseScore": 9.8,
"baseSeverity": "CRITICAL",
"confidentialityImpact": "HIGH",
"integrityImpact": "HIGH",
"privilegesRequired": "NONE",
"scope": "UNCHANGED",
"userInteraction": "NONE",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H",
"version": "3.1"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "Multiprocess mode bound to a routable address, the documented multi-node deployment"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-502",
"description": "CWE-502: Deserialization of Untrusted Data",
"lang": "en",
"type": "CWE"
}
]
},
{
"descriptions": [
{
"cweId": "CWE-306",
"description": "CWE-306: Missing Authentication for Critical Function",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-10-29T10:24:45.984Z",
"orgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
"shortName": "JFROG"
},
"references": [
{
"name": "LMCache repository",
"tags": [
"product"
],
"url": "https://github.com/LMCache/LMCache"
},
{
"name": "lmcache on PyPI",
"tags": [
"product"
],
"url": "https://pypi.org/project/lmcache/"
},
{
"name": "DeviceIPCWrapper.Deserialize calls pickle.loads (v0.5.5)",
"tags": [
"technical-description"
],
"url": "https://github.com/LMCache/LMCache/blob/v0.5.5/lmcache/v1/platform/base/ipc_wrapper.py"
},
{
"name": "msgpack extension code 1 decoded with pickle (v0.3.9)",
"tags": [
"technical-description"
],
"url": "https://github.com/LMCache/LMCache/blob/v0.3.9/lmcache/v1/multiprocess/custom_types.py"
},
{
"name": "JFrog Security Research advisory JFSA-2026-001694382",
"tags": [
"vendor-advisory"
],
"url": "https://research.jfrog.com/vulnerabilities/lmcache-is-vulnerable-to-unauthenticated-remote-code-execution-via-pickle-deserialization-on-the-multiprocess-zmq-transport-cve-2026-105192-jfsa-2026-001694382/"
},
{
"name": "LMCache update on CVE-2026-105192",
"tags": [
"vendor-advisory"
],
"url": "https://blog.lmcache.ai/en/2026/10/13/an-update-on-cve-2026-105192/"
},
{
"name": "GHSA-w5f2-9q9c-ff4h",
"tags": [
"vendor-advisory"
],
"url": "https://github.com/LMCache/LMCache/security/advisories/GHSA-w5f2-9q9c-ff4h"
},
{
"name": "PR #5644: replace pickle in device IPC descriptors",
"tags": [
"patch"
],
"url": "https://github.com/LMCache/LMCache/pull/5644"
},
{
"name": "LMCache v0.5.6",
"tags": [
"patch",
"release-notes"
],
"url": "https://github.com/LMCache/LMCache/releases/tag/v0.5.6"
},
{
"name": "PR #5684: bind example Kubernetes deployment to localhost",
"tags": [
"mitigation"
],
"url": "https://github.com/LMCache/LMCache/pull/5684"
},
{
"name": "PR #5685: run official images as a non-root user",
"tags": [
"mitigation"
],
"url": "https://github.com/LMCache/LMCache/pull/5685"
}
],
"solutions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eUpgrade to LMCache 0.5.6 or later. That release replaces pickle in device IPC descriptors with versioned, typed MessagePack descriptors. Descriptors are validated before use, the wrapper type is chosen from a fixed local allowlist, and there is no pickle fallback. The change covers the ZeroMQ and gRPC paths. The wire format changed, so upgrade workers and servers together. The fix is PR #5644 and it is in the v0.5.6 tag. PR #5684, which binds the example Kubernetes deployment to localhost, and PR #5685, which runs the official images as a non-root user, were merged after the v0.5.6 tag was cut and are included in v0.5.7rc2. The v0.5.6 example deployment still passes --host 0.0.0.0, and the v0.5.6 images still run as root.\u003c/p\u003e"
}
],
"value": "Upgrade to LMCache 0.5.6 or later. That release replaces pickle in device IPC descriptors with versioned, typed MessagePack descriptors. Descriptors are validated before use, the wrapper type is chosen from a fixed local allowlist, and there is no pickle fallback. The change covers the ZeroMQ and gRPC paths. The wire format changed, so upgrade workers and servers together. The fix is PR #5644 and it is in the v0.5.6 tag. PR #5684, which binds the example Kubernetes deployment to localhost, and PR #5685, which runs the official images as a non-root user, were merged after the v0.5.6 tag was cut and are included in v0.5.7rc2. The v0.5.6 example deployment still passes --host 0.0.0.0, and the v0.5.6 images still run as root."
}
],
"source": {
"discovery": "EXTERNAL"
},
"timeline": [
{
"lang": "en",
"time": "2025-10-29T21:47:00.000Z",
"value": "LMCache v0.3.9 ships the multiprocess ZMQ transport and the pickle-backed msgpack extension"
},
{
"lang": "en",
"time": "2026-10-12T06:22:00.000Z",
"value": "PR #5644 merged: pickle removed from device IPC descriptors"
},
{
"lang": "en",
"time": "2026-10-14T22:21:00.000Z",
"value": "LMCache v0.5.6 released, the first version that includes the fix"
}
],
"title": "LMCache Unauthenticated RCE in multiprocess mode via pickle deserialization",
"x_generator": {
"engine": "Vulnogram 1.0.5"
}
}
},
"cveMetadata": {
"assignerOrgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
"assignerShortName": "JFROG",
"cveId": "CVE-2026-105192",
"datePublished": "2026-10-07T09:40:11.449Z",
"dateReserved": "2026-10-04T11:50:41.213Z",
"dateUpdated": "2026-10-29T10:24:45.984Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-105192\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"yes\"}, {\"Technical Impact\": \"total\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-10-07T17:47:55.401134Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-10-07T17:48:33.165Z\"}}], \"cna\": {\"title\": \"LMCache Unauthenticated RCE in multiprocess mode via pickle deserialization\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Yuval Moravchick\"}, {\"lang\": \"en\", \"type\": \"coordinator\", \"value\": \"JFrog Security Research\"}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV3_1\": {\"scope\": \"UNCHANGED\", \"version\": \"3.1\", \"baseScore\": 9.8, \"attackVector\": \"NETWORK\", \"baseSeverity\": \"CRITICAL\", \"vectorString\": \"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H\", \"integrityImpact\": \"HIGH\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"LOW\", \"availabilityImpact\": \"HIGH\", \"privilegesRequired\": \"NONE\", \"confidentialityImpact\": \"HIGH\"}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"Multiprocess mode bound to a routable address, the documented multi-node deployment\"}]}], \"affected\": [{\"repo\": \"git://github.com/LMCache/LMCache\", \"vendor\": \"LMCache\", \"product\": \"LMCache\", \"versions\": [{\"status\": \"affected\", \"version\": \"0.3.9\", \"lessThan\": \"0.5.6\", \"versionType\": \"python\"}], \"packageName\": \"lmcache\", \"programFiles\": [\"lmcache/v1/multiprocess/transport/zmq_impl/mq.py\", \"lmcache/v1/multiprocess/mq.py\", \"lmcache/v1/multiprocess/custom_types.py\", \"lmcache/v1/platform/base/ipc_wrapper.py\", \"lmcache/v1/platform/base_ipc_wrapper.py\"], \"collectionURL\": \"https://pypi.org/project/lmcache/\", \"defaultStatus\": \"unaffected\"}], \"timeline\": [{\"lang\": \"en\", \"time\": \"2025-10-29T21:47:00.000Z\", \"value\": \"LMCache v0.3.9 ships the multiprocess ZMQ transport and the pickle-backed msgpack extension\"}, {\"lang\": \"en\", \"time\": \"2026-10-12T06:22:00.000Z\", \"value\": \"PR #5644 merged: pickle removed from device IPC descriptors\"}, {\"lang\": \"en\", \"time\": \"2026-10-14T22:21:00.000Z\", \"value\": \"LMCache v0.5.6 released, the first version that includes the fix\"}], \"solutions\": [{\"lang\": \"en\", \"value\": \"Upgrade to LMCache 0.5.6 or later. That release replaces pickle in device IPC descriptors with versioned, typed MessagePack descriptors. Descriptors are validated before use, the wrapper type is chosen from a fixed local allowlist, and there is no pickle fallback. The change covers the ZeroMQ and gRPC paths. The wire format changed, so upgrade workers and servers together. The fix is PR #5644 and it is in the v0.5.6 tag. PR #5684, which binds the example Kubernetes deployment to localhost, and PR #5685, which runs the official images as a non-root user, were merged after the v0.5.6 tag was cut and are included in v0.5.7rc2. The v0.5.6 example deployment still passes --host 0.0.0.0, and the v0.5.6 images still run as root.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eUpgrade to LMCache 0.5.6 or later. That release replaces pickle in device IPC descriptors with versioned, typed MessagePack descriptors. Descriptors are validated before use, the wrapper type is chosen from a fixed local allowlist, and there is no pickle fallback. The change covers the ZeroMQ and gRPC paths. The wire format changed, so upgrade workers and servers together. The fix is PR #5644 and it is in the v0.5.6 tag. PR #5684, which binds the example Kubernetes deployment to localhost, and PR #5685, which runs the official images as a non-root user, were merged after the v0.5.6 tag was cut and are included in v0.5.7rc2. The v0.5.6 example deployment still passes --host 0.0.0.0, and the v0.5.6 images still run as root.\u003c/p\u003e\", \"base64\": false}]}], \"references\": [{\"url\": \"https://github.com/LMCache/LMCache\", \"name\": \"LMCache repository\", \"tags\": [\"product\"]}, {\"url\": \"https://pypi.org/project/lmcache/\", \"name\": \"lmcache on PyPI\", \"tags\": [\"product\"]}, {\"url\": \"https://github.com/LMCache/LMCache/blob/v0.5.5/lmcache/v1/platform/base/ipc_wrapper.py\", \"name\": \"DeviceIPCWrapper.Deserialize calls pickle.loads (v0.5.5)\", \"tags\": [\"technical-description\"]}, {\"url\": \"https://github.com/LMCache/LMCache/blob/v0.3.9/lmcache/v1/multiprocess/custom_types.py\", \"name\": \"msgpack extension code 1 decoded with pickle (v0.3.9)\", \"tags\": [\"technical-description\"]}, {\"url\": \"https://research.jfrog.com/vulnerabilities/lmcache-is-vulnerable-to-unauthenticated-remote-code-execution-via-pickle-deserialization-on-the-multiprocess-zmq-transport-cve-2026-105192-jfsa-2026-001694382/\", \"name\": \"JFrog Security Research advisory JFSA-2026-001694382\", \"tags\": [\"vendor-advisory\"]}, {\"url\": \"https://blog.lmcache.ai/en/2026/10/13/an-update-on-cve-2026-105192/\", \"name\": \"LMCache update on CVE-2026-105192\", \"tags\": [\"vendor-advisory\"]}, {\"url\": \"https://github.com/LMCache/LMCache/security/advisories/GHSA-w5f2-9q9c-ff4h\", \"name\": \"GHSA-w5f2-9q9c-ff4h\", \"tags\": [\"vendor-advisory\"]}, {\"url\": \"https://github.com/LMCache/LMCache/pull/5644\", \"name\": \"PR #5644: replace pickle in device IPC descriptors\", \"tags\": [\"patch\"]}, {\"url\": \"https://github.com/LMCache/LMCache/releases/tag/v0.5.6\", \"name\": \"LMCache v0.5.6\", \"tags\": [\"patch\", \"release-notes\"]}, {\"url\": \"https://github.com/LMCache/LMCache/pull/5684\", \"name\": \"PR #5684: bind example Kubernetes deployment to localhost\", \"tags\": [\"mitigation\"]}, {\"url\": \"https://github.com/LMCache/LMCache/pull/5685\", \"name\": \"PR #5685: run official images as a non-root user\", \"tags\": [\"mitigation\"]}], \"x_generator\": {\"engine\": \"Vulnogram 1.0.5\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"LMCache multiprocess mode, also called distributed mode, opens an unauthenticated ZeroMQ ROUTER so worker processes can register and share KV cache blocks. Messages on that socket are msgpack. Extension code 1 is passed to DeviceIPCWrapper.Deserialize, which calls pickle.loads, while the server is still decoding request arguments and before the handler runs. A single unauthenticated ZMQ DEALER message to the transport port (default 5555) therefore executes code as the user the LMCache process runs as. Official container images run that process as root. The transport binds to localhost unless the operator sets a routable address with --host, which is how multi-node deployments let peers connect. The decode path shipped in v0.3.9 and is present through v0.5.5, including the v0.5.6 release candidates. v0.5.6, published on 2026-10-14, removes pickle.loads from this path.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eLMCache multiprocess mode, also called distributed mode, opens an unauthenticated ZeroMQ ROUTER so worker processes can register and share KV cache blocks. Messages on that socket are msgpack. Extension code 1 is passed to DeviceIPCWrapper.Deserialize, which calls pickle.loads, while the server is still decoding request arguments and before the handler runs. A single unauthenticated ZMQ DEALER message to the transport port (default 5555) therefore executes code as the user the LMCache process runs as. Official container images run that process as root. The transport binds to localhost unless the operator sets a routable address with --host, which is how multi-node deployments let peers connect. The decode path shipped in v0.3.9 and is present through v0.5.5, including the v0.5.6 release candidates. v0.5.6, published on 2026-10-14, removes pickle.loads from this path.\u003c/p\u003e\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-502\", \"description\": \"CWE-502: Deserialization of Untrusted Data\"}]}, {\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-306\", \"description\": \"CWE-306: Missing Authentication for Critical Function\"}]}], \"providerMetadata\": {\"orgId\": \"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d\", \"shortName\": \"JFROG\", \"dateUpdated\": \"2026-10-29T10:24:45.984Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2026-105192\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-10-29T10:24:45.984Z\", \"dateReserved\": \"2026-10-04T11:50:41.213Z\", \"assignerOrgId\": \"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d\", \"datePublished\": \"2026-10-07T09:40:11.449Z\", \"assignerShortName\": \"JFROG\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.
Loading…
Loading…