LiteLLM: семантический кеш смешал ответы разных клиентов

vulnerability

NVISO нашла уязвимость CVE-2026-89032 в LiteLLM - шлюзе для работы с языковыми моделями. Ошибка ломает изоляцию семантического кеша: ответы, предназначенные одному клиенту, могут получить другие пользователи.

По данным NVISO, семантический кеш хранит не точный текст запроса, а его смысл. Если два вопроса близки по смыслу, второй пользователь получает готовый ответ из кеша. В LiteLLM кеш должен был разделяться по API-ключам, но уязвимость позволяла разным ключам попадать в один общий раздел.

Последствия зависят от приложения. В простом чате один клиент может увидеть чужой ответ с персональными данными. В сценарии с инструментами (tool calls) атакующий может подсунуть другому пользователю вызов банковской операции или команду в кодинг-агенте. NVISO показала это на тестовом банковском сервере и агенте с доступом к терминалу.

Особенно неприятно, что для атаки не нужен взлом LiteLLM. Достаточно, чтобы кеш был общим, а порог семантического совпадения был низким. Чем сильнее компания экономит на запросах к модели, тем шире окно для такой ошибки. Шутка про «кеш всё помнит» здесь звучит уже не смешно.

LiteLLM выпустила исправление в версии 1.101.0-rc.1. В качестве защиты NVISO советует вообще не кешировать ответы с персональными данными и вызовы инструментов, а если семантический кеш нужен, разделять его по пользователям и не занижать порог совпадения. Проверка простая: обновить LiteLLM и посмотреть, не используется ли один кеш для разных API-ключей.

Как это выглядит на практике. Пользователь просит модель составить обращение в поддержку и указывает в запросе имя, почту, телефон и последние цифры счёта. Ответ с этими данными сохраняется в кеше. Другой клиент задаёт похожий вопрос без всех деталей и получает тот же текст с чужой персональной информацией. Никакого взлома, только неудачное совпадение по смыслу.

С вызовами инструментов хуже. Если атакующий первым отправит запрос, который заставит модель вызвать банковский перевод на его счёт, этот вызов попадёт в кеш. Следующий пользователь попросит перевести небольшую сумму, а кеш вернёт чужой вызов. В тестовом примере NVISO деньги ушли на счёт атакующего. Похожая схема работает с кодинг-агентом, у которого есть доступ к терминалу: из кеша можно подсунуть команду.

Причина в том, что семантический кеш ищет совпадение не по точной строке, а по смыслу. Порог похожести настраивается вручную. Если его занизить ради экономии, под один ответ попадают запросы, которые на деле означают разное. LiteLLM должен был разделять кеш по API-ключам, но CVE-2026-89032 эту границу ломала.

Защита простая, но требует дисциплины. Обновить LiteLLM до 1.101.0-rc.1. Не кешировать ответы, где могут быть персональные данные. Не кешировать вызовы инструментов вообще. Если семантический кеш действительно нужен, разделять его по пользователям и не экономить на пороге совпадения. Иначе кеш начинает работать как общая доска объявлений, только с чужими секретами.

Ссылки

Комментарии: 0