FlawOpen

flawopen.com/AI Security/lmcache-multiprocess-pickle-deserialization-cve-2026-105192

● CVE-2026-105192 · CVSS 9.8[2] · Критический
Исследования · FlawOpen

CVE-2026-105192: десериализация pickle без аутентификации в многопроцессном режиме LMCache

CVE-2026-105192 позволяет неаутентифицированному узлу, достигшему многопроцессного транспорта LMCache, вызвать небезопасную десериализацию pickle. Проверьте доступность ZMQ endpoint, ограничьте доступ и следите за исправлением поставщика.[1], [2]

Вектор CVSSCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H[2]
💡 Простыми словами (ELI5)

LMCache получает запечатанную посылку от сетевого узла и открывает её способом, который может исполнить скрытые инструкции. Это происходит до проверки сервером заявленного типа сообщения.[1], [2]

Ключевые понятия и термины

CWE-502: небезопасная десериализация
Python pickle может выполнять поведение при восстановлении объектов и небезопасен для данных от недоверенного сетевого узла.[1], [2]
Многопроцессный режим LMCache
Компоненты LMCache обмениваются данными через ZeroMQ. Запись CVE описывает неаутентифицированный endpoint ROUTER.[2], [5]
Расширение MessagePack
Значение расширения MessagePack передаётся в DeviceIPCWrapper.Deserialize во время декодирования до выбора типа запроса.[2], [4], [3]
Граница доступности
По записи CVE транспорт по умолчанию привязан к localhost. Маршрутизируемый --host или доступная сеть кластера меняют круг отправителей.[2], [5]
Затронутые версии
В раскрытии указаны версии 0.3.9–0.5.5, кандидаты 0.5.6 и ветка разработки по состоянию на 07.10.2026.[1], [2]
CWE-306: отсутствие аутентификации для критической функции
В записи CVE также указана CWE-306, поскольку ZeroMQ ROUTER не аутентифицирует узлы-пиры. Это отдельная слабость на границе транспорта, отличная от небезопасного восстановления объектов через pickle (CWE-502). Для эксплуатации endpoint должен быть доступен; привязка по умолчанию к localhost сама по себе не делает его доступным из сети.[2]

Связи со стандартами

  • Ссылка CWE для слабого места, описанного в этом руководстве: CWE-306 CWE-502

Пошаговый сценарий атаки

Шаг 1

Развёртывание включает многопроцессный транспорт

Проблема относится к многопроцессному/распределённому режиму, а не ко всем установкам LMCache.[2], [1]

Шаг 2

Узел достигает ZMQ endpoint

В записи CVE указан localhost по умолчанию; оператор может задать маршрутизируемый --host. Доступность — необходимое условие.[2], [5]

Шаг 3

Декодирование вызывает pickle.loads

Расширение MessagePack с кодом 1 попадает в DeviceIPCWrapper.Deserialize, который вызывает pickle.loads до проверки типа сообщения обработчиком.[2], [4], [3]

Шаг 4

Процесс обрабатывает восстановленный объект

По записи выполнение происходит с правами процесса LMCache; официальный контейнер запускается от root. Это описание воздействия, а не доказательство доступности конкретного развёртывания.[2], [3]

Условия развёртывания и действия

УсловиеОценка
Многопроцессный режим отключёнЭтот путь CVE не активен.
Режим привязан только к loopbackУдалённые узлы не должны достигать endpoint; проверьте сеть хоста и локальные границы доверия.
Маршрутизируемая привязка или открытый порт кластераСчитайте endpoint потенциально доступным; ограничьте доступ и проверьте права процесса.
Затронутые версииВ раскрытии указаны версии 0.3.9–0.5.5, кандидаты 0.5.6 и ветка разработки по состоянию на 07.10.2026.

Исходный код: Уязвимый vs Защищённый вариант

Запись CVE Program связывает CVE-2026-105192 с JFrog и описывает путь расширение MessagePack → DeviceIPCWrapper.Deserialize → pickle.loads, привязку localhost по умолчанию, параметр --host и CVSS 9,8. Исходный код upstream подтверждает вызов десериализатора. В статье нет вредоносного pickle и не утверждается наличие исправления. Endpoint должен быть доступен; привязка к localhost сама по себе не делает его доступным извне. Временный пример кода отключает этот путь декодирования и не является готовым патчем LMCache; оцените влияние на службу и изолируйте сеть до выхода поддерживаемого исправления.[2], [1], [3], [4], [5]

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
@staticmethod
def Deserialize(data: bytes) -> DeviceIPCWrapper:
    return pickle.loads(data)
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
@staticmethod
def Deserialize(data: bytes) -> DeviceIPCWrapper:
    # Временная защита с отказом по умолчанию; это не исправление upstream.
    raise PermissionError("LMCache peer deserialization disabled pending vendor fix")

Чек-лист по защите системы для инженеров

Источники

← AI Security Directory →