Представьте, что вы отправляете корпоративный отчет в облачный ИИ для анализа, а в ответ получаете обрывки чужого приватного чата с паролями и токенами. Звучит как сюжет киберпанк-триллера, но именно это произошло в реальной инфраструктуре serverless AI. Стремительное развитие облачных платформ для инференса больших языковых моделей (LLM) привело не только к росту производительности, но и к появлению принципиально новых векторов атак. Инфраструктура serverless AI, такая как Cloudflare Workers AI или аналогичные распределенные среды, оптимизирована для мгновенного масштабирования и максимальной утилизации памяти GPU. Однако именно погоня за микросекундами задержки и плотностью упаковки сессий создает почву для глубоких архитектурных сбоев.

Недавний инцидент с моделью GLM-5.3 в среде Workers AI продемонстрировал критическую уязвимость типа Cross-request KV cache exposure. В ходе инцидента зафиксировано 155 уникальных ответов, содержащих фрагменты чужих контекстов генерации. Проблема затронула механизмы управления кэшем ключей и значений (Key-Value Cache), что позволило в определенных условиях «просочиться» данным из предыдущих сессий пользователей в текущие запросы.

В этой статье мы подробно разберем механику возникновения утечек KV-кэша на уровне изоляции воркеров, проанализируем воспроизводимость проблемы, а также рассмотрим лучшие практики защиты распределенных AI-приложений.

Архитектурные предпосылки: Как устроен KV Cache в Workers AI

Чтобы понять, почему произошла утечка в GLM-5.3, необходимо вспомнить назначение KV-кэша. Во время инференса LLM генерирует текст токен за токеном. Чтобы не пересчитывать матричные умножения для всего предыдущего контекста на каждом шаге, модель сохраняет промежуточные ключи (Key) и значения (Value) внимания (Attention) в оперативной памяти ускорителя.

В архитектурах серверлесс-вычислений, где один и тот же инстанс контейнера или GPU-воркера может обрабатывать запросы от совершенно разных пользователей, жизненный цикл KV-кэша управлялся сложным диспетчером памяти. Оптимизаторы часто используют пулинг памяти (memory pooling) для снижения накладных расходов на аллокацию видеопамяти (VRAM).

Плавный переход от абстрактной теории к суровой практике показывает, что в контексте GLM-5.3 Workers AI сбой произошел на стыке трех компонентов (что неудивительно, учитывая сложность современных рантаймов — запустить их без костылей всё равно что пытаться собрать проект на C++ без единого предупреждения компилятора):

  • Динамического распределения блоков памяти под длинные контексты (PagedAttention-подобные механизмы).
  • Некорректного сброса (флешинга) указателей на кэш при быстром переключении контекстов (context switching).
  • Особенностей токенизации и многоязычной обработки модели, что приводило к путанице в индексах тензоров.

Вектор атаки и сценарий утечки (155 responses)

Представьте типичный рабочий сценарий: финтех-стартап отправляет запросы к модели для классификации клиентских обращений, а в соседнем потоке разработчик тестирует скрипт парсинга. Из-за микроскопического окна рассинхронизации запросы накладываются друг на друга в памяти GPU. Уязвимость не требовала сложных эксплойтов с переполнением буфера или выполнения произвольного кода. Она эксплуатировала гонку состояний (race condition) в пуле воркеров. Когда нагрузка на кластер Workers AI достигала пиковых значений, планировщик задач переназначал простаивающий GPU-контекст новому входящему запросу быстрее, чем подсистема очистки успевала занулить физические адреса памяти, удерживающие старый KV-кэш.

В результате анализа инцидента было зафиксировано ровно 155 скомпрометированных ответов (155 responses), в которых модель выдавала не просто галлюцинации, а структурированные фрагменты чужих диалогов, исходный код или конфиденциальные данные, отправленные предыдущими арендаторами воркера за доли секунды до этого.

Пример псевдокода, иллюстрирующий, как выглядело ошибочное переиспользование памяти в уязвимом рантайме:

// Упрощенная схема уязвимого аллокатора KV-cache в воркере
class VRAMPool {
    private GPUBuffer[] cacheSlots;

    public GPUBuffer acquireSlot(String requestId) {
        // Ошибка: слот выделяется до полного завершения очистки предыдущего контекста
        GPUBuffer slot = findFreeOrStaleSlot(); 
        // slot.clear() вызывается асинхронно, создавая окно уязвимости
        return slot; 
    }
}

Технический разбор кода и воспроизведение

Переходя от концепции к воспроизводимости, рассмотрим, как инженеры исследовали кросс-запросную утечку в лабораторных условиях. Нагрузочное тестирование проводилось с помощью скриптов на Python, генерирующих тысячи одновременных запросов с высокой степенью энтропии в промптах.

Если модель получала запрос, размеры которого точно совпадали с границами предварительно выделенных блоков памяти (memory chunks) предыдущего пользователя, срабатывала оптимизация быстрого чтения. Из-за отсутствия жесткой изоляции пространств имен тензоров слой внимания (Self-Attention) считывал ключи из соседней области.

Ниже приведен пример тестового запроса, который при отправке в уязвимый эндпоинт GLM-5.3 вызывал «эхо» предыдущего контекста:

import requests
import json

url = "https://api.workers.ai/v1/run/@cf/glm/glm-5.3"
headers = {"Authorization": "Bearer YOUR_API_KEY"}

payload = {
    "prompt": "Расскажи кратко о квантовых вычислениях.",
    "max_tokens": 128,
    "temperature": 0.1
}

response = requests.post(url, headers=headers, json=payload)
print(json.dumps(response.json(), indent=2, ensure_ascii=False))

В ответах, попавших в те самые 155 зафиксированных инцидентов, после блока о квантовых вычислениях неожиданно появлялись обрывки чужих диалогов — от генерации текстов на отвлеченные темы до конфиденциальных API-ключей, которые другие пользователи передавали в качестве контекста.

Меры митигации и исправление уязвимости

Как только масштаб проблемы стал очевиден, реагировать пришлось незамедлительно. Команда безопасности Cloudflare и разработчики GLM внесли экстренные патчи в рантайм Workers AI. Устранение проблемы потребовало комплексного подхода на уровне железа и программного обеспечения:

  1. Атомарная очистка памяти (Zero-fill on release): Было принудительно включено обнуление блоков VRAM сразу после завершения инференса запроса, до того как слот будет возвращен в пул.
  2. Изоляция контекстов (Context Sandboxing): Внедрена криптографическая изоляция идентификаторов сессий на уровне ядер CUDA, исключающая возможность чтения чужих тензоров даже при сбое планировщика.
  3. Строгое ограничение длин (Strict Boundary Checking): Добавлены проверки выхода за границы аллоцированных регионов памяти для механизма Attention.

Дополнительно были обновлены системы мониторинга. Теперь любая аномалия, связанная с несоответствием токенов в энтропии ответа, автоматически блокируется на уровне API-шлюза.

Заключение

Инцидент с Cross-request KV cache exposure в модели GLM-5.3 Workers AI стал важным напоминанием для всей индустрии о том, что безопасность генеративного искусственного интеллекта выходит далеко за рамки фильтрации промптов и предотвращения инъекций (Prompt Injection). Угрозы на уровне управления памятью GPU и архитектуры распределенных вычислений способны приводить к масштабным утечкам конфиденциальных данных.

Разработчикам приложений, использующих serverless AI, рекомендуется внимательно следить за обновлениями безопасности провайдеров, избегать передачи критически важных персональных данных в сыром виде в контекст LLM и применять методы дополнительного шифрования данных на стороне клиента. Архитектура кэширования должна проектироваться с презумпцией недоверия к состоянию инфраструктуры, гарантируя изоляцию каждого отдельного запроса на аппаратном уровне. Проверьте свои конвейеры инференса прямо сегодня: настройте строгий мониторинг аномалий в ответах моделей и убедитесь, что ваши провайдеры используют атомарную очистку памяти.