Summary
CVE-2026-92971 is a reachable assertion vulnerability (CWE-617) in InternLM’s LMDeploy, an open-source toolkit for serving large language models. The flaw resides in LMDeploy’s DistServe prefill/decode disaggregation feature, where an unauthenticated attacker can send a crafted request to a Decode node’s OpenAI-compatible API to crash the inference engine’s main loop. The issue affects LMDeploy through version 0.17.0 and carries a high severity rating (8.7).
Technical details
- Root cause: LMDeploy’s DistServe Decode API endpoints (
/v1/completionsand/v1/chat/completions) accept amigration_requestfield directly from the external request body and pass it, with only shape-level Pydantic validation, into the internal prefill/decode (P/D) cache migration path — no verification is performed that the request originates from a trusted peer or that its contents are internally consistent. - Trigger conditions: An attacker submits a request to a Decode node with a
migration_requestwhoseremote_block_idsfield is an empty list. When the Decode scheduler compares the (empty) remote block count against the number of locally allocated blocks, it raises anAssertionError("prefill block ids (0) must equal to decode block ids (N)"). - Attack vector: Network-based, requiring no authentication or user interaction — any client able to reach a LMDeploy Decode node’s HTTP API can trigger the condition.
- Impact: The engine loop uses
asyncio.wait(..., return_when=asyncio.FIRST_EXCEPTION)to supervise long-running tasks. The unhandled assertion cancels all pending tasks and terminates the entire engine loop rather than failing only the offending request, producing a persistent denial of service — the Decode node stops serving all subsequent inference requests (observed asEngineLoop wait_tasks failed,Engine main loop failed, andENGINE_STOP_ERRORevents) until the process/container is manually restarted.
Affected software
- InternLM LMDeploy (PyPI package
lmdeploy) versions up to and including 0.17.0, specifically deployments using the DistServe prefill/decode disaggregation feature with the OpenAI-compatible serving API exposed.
Severity
- CVSS Score: 8.7 (High)
- CVSS v4.0 Vector:
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N - An alternate CVSS v3.1 scoring of 7.5 (
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H) has also been published for this issue, reflecting the same network-based, unauthenticated availability-only impact.
Mitigation and recommended actions
- Immediate: As of publication, no official patched LMDeploy release has been issued for this issue. A fix is under active development on the upstream
InternLM/lmdeployrepository (tracked via a pull request addressing issue #4965) that rejects DistServe-internal fields (migration_request,with_cache,preserve_cache) on public endpoints unless the request is authenticated as internal proxy traffic, and that isolates migration failures to the individual request instead of terminating the whole engine loop. Security teams should monitor the LMDeploy GitHub repository and upgrade as soon as a release incorporating this fix becomes available. - If no patch is available:
- Do not expose DistServe Decode node OpenAI-compatible endpoints (
/v1/completions,/v1/chat/completions) directly to untrusted networks or the public internet; restrict access to the DistServe proxy and internal cluster networks only, using network segmentation, firewall rules, or an authenticating reverse proxy/API gateway in front of Decode nodes. - Enforce authentication/allow-listing so that only the trusted DistServe proxy component can reach Decode node endpoints, since these nodes are not designed to accept direct untrusted client traffic.
- Monitor engine health endpoints and logs for repeated
AssertionError,EngineLoop wait_tasks failed, orENGINE_STOP_ERRORevents, and implement automated restart/alerting for the Decode engine process to reduce downtime from potential exploitation.
- Do not expose DistServe Decode node OpenAI-compatible endpoints (

