CVE-2026-119706: LMDeploy api_server runs attacker pickles sent to /update_weights, unauthenticated RCE in 0.9.0 to 0.18.0, still unfixed
InternLM LMDeploy 0.9.0 through 0.18.0 deserializes base64 pickle data sent to the api_server's /update_weights endpoint without validation, so anyone who can reach the server can run OS commands as the api_server process. The fix pull request (#4964) is still open and 0.18.0 is the latest release, so keep the server off untrusted networks and block that endpoint.
What it is
The POST /update_weights route passes the request's serialized_named_tensors field to the engine, which decodes it and calls ForkingPickler.loads on it. Loading a crafted pickle runs arbitrary Python, so this is remote code execution.
VulnCheck rates it as network-reachable with no login and no user interaction. NVD lists LMDeploy 0.9.0 through 0.18.0 as affected.
The bug report (InternLM/lmdeploy#4698) and the fix PR '[Fix] Reject pickle on HTTP /update_weights' (#4964) were both still open on 11 November 2026.
How to check
- Run pip show lmdeploy and see whether the version is between 0.9.0 and 0.18.0.
- Check whether your lmdeploy serve api_server port is reachable from anything other than localhost or a trusted internal network.
How to fix
- Bind the api_server to localhost or a private network only, and put it behind a reverse proxy that requires authentication.
- Block POST requests to /update_weights at the proxy if you don't hot-swap weights over HTTP.
- Upgrade as soon as a release that includes the #4964 fix ships.
pip show lmdeploy | grep -i ^version
# keep the server private
lmdeploy serve api_server <model> --server-name 127.0.0.1 Sources
- criticalCVE-2025-66455: LMDeploy DistServe connects to attacker ZeroMQ peers and unpickles their messages, unauthenticated RCE before 0.16.0
- criticalCVE-2025-59953: LMDeploy's ZeroMQ RPC server unpickles incoming messages, remote code execution in 0.9.1 to 0.10.1
- highCVE-2026-123818: LMDeploy is a toolkit for compressing, deploying, and serving large language models. From 0.12.3 until 0.15.0, _is_safe_url validates remote media URLs with url
- highCVE-2026-46432: LMDeploy before 0.13.0 always loads models with trust_remote_code=True, so a malicious model repo runs code