CVE-2025-66455
KrytyczneCVSS 9.8Streszczenie
LMDeploy w wersjach od 0.9.2 do 0.16.0 wykorzystywał funkcję recv_pyobj() do deserializacji komunikatów odbieranych przez gniazdo ZeroMQ PULL w płaszczyźnie sterowania DistServe/PD-disaggregation. Deserializacja pickle może wykonać dowolny kod, a adres peera był dostarczany przez endpoint HTTP POST /distserve/p2p_connect. Bez włączonego uwierzytelniania kluczem API atakujący mógł doprowadzić do zdalnego wykonania kodu z uprawnieniami procesu serwującego LMDeploy.
Ocena ryzyka
Podatność pozwala nieuwierzytelnionemu atakującemu z dostępem sieciowym do serwera API DistServe na zdalne wykonanie kodu z uprawnieniami procesu LMDeploy. Dotyczy to wyłącznie wdrożeń z włączonym backendem PyTorch i obsługą PD-disaggregation/DistServe, zwłaszcza bez skonfigurowanego klucza API.
Rekomendacja
Zaktualizuj LMDeploy do wersji 0.16.0 lub nowszej. Jeśli aktualizacja nie jest możliwa, zablokuj dostęp nieufnych klientów do endpointów /distserve/*, ogranicz płaszczyzny sterowania HTTP i ZeroMQ do zaufanych sieci klastra, włącz uwierzytelnianie kluczem API oraz zablokuj dowolne wychodzące połączenia ZeroMQ z węzłów serwujących.
Inne podatności w LMDeploy
Zobacz wszystkie- CVE-2026-33625Wysokie
LMDeploy w wersjach 0.12.1 do 0.12.2 zawiera lukę wstrzyknięcia kodu w pliku lmdeploy/pytorch/config.py w linii 620. Atakujący może wykonać dowolny kod Python, publikując złośliwy model HuggingFace ze spreparowaną wartością quantization_config.quant_dtype, która jest przekazywana do eval() bez walidacji.
- CVE-2025-59953Krytyczne
LMDeploy implementuje serwer RPC (AsyncRPCServer w zmq_rpc.py), który w funkcji call_and_response() deserializuje otrzymane wiadomości za pomocą pickles.loads() bez żadnej sanityzacji. Umożliwia to zdalne wykonanie kodu przez ten serwer RPC. Podatność występuje od wersji 0.9.1 do 0.10.2, gdzie została naprawiona.
- CVE-2026-76850Krytyczne
LMDeploy deserializuje komunikaty peer-to-peer w trybie disaggregated serving za pomocą pickle. Funkcja handle_zmq_recv w lmdeploy/pytorch/disagg/conn/engine_conn.py odczytuje żądania cache-free przez recv_pyobj(), co deserializuje odebrane bajty przez pickle.loads(), a sprawdzenie isinstance przeciwko DistServeCacheFreeRequest następuje dopiero po zakończeniu deserializacji. Peer dostarczający te bajty jest kontrolowany przez wywołującego: p2p_connect przekazuje remote_engine_endpoint_info.zmq_address z treści żądania do connect() na gnieździe ZMQ PULL, a endpointy POST /distserve/p2p_initialize i /distserve/p2p_connect w lmdeploy/serve/openai/api_server.py nie stosują uwierzytelniania, chyba że serwer jest uruchomiony z api_keys, które domyślnie mają wartość None. Zdalny atakujący może skierować silnik do pobierania z kontrolowanego przez siebie punktu końcowego ZMQ i wykonać dowolny kod w procesie silnika. Wdrożenia, które nie włączają disaggregated serving, nie są dotknięte, ponieważ pętla odbioru jest uruchamiana tylko po zaakceptowaniu połączenia przez backend migracji.
- CVE-2026-92983Wysokie
InternLM LMDeploy do wersji 0.17.0 w trybie rozdzielenia prefill/decode DistServe nie zwalnia sesji schedulera, ponieważ proxy używa identyfikatorów sesji widocznych dla użytkownika zamiast wewnętrznych kluczy schedulera. Nieuwierzytelnieni atakujący mogą wysyłać żądania ukończenia do endpointu proxy, co kumuluje niezwolnione metadane i pamięć aż do zabicia workera prefill przez brak pamięci.
- CVE-2026-63764Wysokie
Podatność SSRF w LMDeploy do wersji 0.14.0 (załatana w commit 03c3130) w funkcji _load_http_url w connection.py. Mechanizm ochrony przed adresami prywatnymi sprawdza tylko oryginalny URL, nie weryfikując hostów po przekierowaniach HTTP.
- CVE-2026-46517Wysokie
LMDeploy to zestaw narzędzi do kompresji, wdrażania i serwowania dużych modeli językowych. W wersjach 0.12.3 i wcześniejszych, zakodowane na stałe "trust_remote_code=True" umożliwia zdalne wykonanie kodu (RCE) w łańcuchu dostaw HF bez zgody użytkownika. Wersja 0.13.0 naprawia ten problem.
- CVE-2026-46432Wysokie
LMDeploy w wersjach do 0.12.3 zawiera zakodowane na stałe ustawienie "trust_remote_code=True" w wielu miejscach ładowania modeli HuggingFace, co umożliwia zdalne wykonanie dowolnego kodu. W chwili publikacji nie są dostępne żadne publiczne łatki.
Oryginalny opis (angielski, źródło NVD)
LMDeploy is a toolkit for compressing, deploying, and serving large language models. Starting in version 0.9.2 and prior to version 0.16.0, 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. The fix was released in LMDeploy 0.16.0. Users who cannot upgrade immediately should prevent untrusted clients from reaching `/distserve/*` endpoints, restrict the DistServe HTTP and ZeroMQ control planes to trusted cluster networks, configure API-key authentication, and block arbitrary outbound ZeroMQ connections from serving nodes. These measures reduce exposure but do not make pickle deserialization safe.

