В графических процессорах компаний AMD, Apple, Qualcomm и Imagination выявлена уязвимость (CVE-2023-4969), получившая кодовое имя LeftoverLocals и позволяющая извлечь данные из локальной памяти GPU, оставшиеся после выполнения другого процесса и возможно содержащие конфиденциальную информацию. С практической стороны уязвимость может представлять опасность на многопользовательских системах, в которых обработчики разных пользователей запускаются на одном GPU, а также может применяться во вредоносном ПО для отслеживания активности выполняемых на GPU процессов. Например, в ходе атаки можно определить данные, обрабатываемые выполняемыми на GPU процессами (GPU kernel).
Уязвимость вызвана недостаточной изоляцией локальной памяти GPU и отсутствием очистки локальной памяти после выполнения процессов на GPU, в результате чего процесс атакующего может определить данные, оставшиеся в локальной памяти после выполнения другого процесса, или прочитать данные из процесса, выполняемого в текущий момент.
Локальная память в GPU представляет собой отдельную более быструю область памяти, привязанную к вычислительному блоку (compute unit) и выступающую аналогом процессорного кэша. Локальная память может использоваться вместо глобальной памяти для сохранения промежуточных вычислений. Размер локальной памяти варьируется от десятков килобайт до нескольких мегабайт для каждого вычислительного блока.
Атака сводится к запуску на GPU обработчика (kernel), периодически копирующего содержимое доступной локальной памяти GPU в глобальную память (VRAM). Так как локальная память не очищается при переключении между запускаемыми на GPU обработчиками и совместно используется разными процессами в рамках одного вычислительного блока GPU, в ней можно найти остаточные данные из других процессов. Для разных GPU подготовлены прототипы эксплоитов для совершения атаки, используя API OpenCL, Vulkan и Metal для обращения к GPU. Проведение атаки из браузера через WebGPU затруднено, так как в данном API в процессы GPU добавляются динамические проверки границ массивов, действующие при обращении к локальной памяти.
В качестве примера продемонстрирована атака, позволяющая определять данные, выводимые другим пользователям в процессе диалогового сеанса с большой языковой моделью машинного обучения на базе фреймворка llama.cpp. Дополнительно показано как использовать уязвимость для создания скрытого канала связи между разными процессами. При проведении эксперимента на GPU AMD Radeon RX 7900 XT при каждом вызове обработчика удавалось извлечь около 5.5 МБ данных, а суммарный размер данных, определённых при обработке одного запроса к модели 7B llama.cpp составил 181 МБ, чего оказалось достаточно для воссоздания с высокой точностью ответа обработчика большой языковой модели.
Уязвимость проявляется в GPU Apple, AMD, Qualcomm и Imagination. В продуктах Apple проблема устранена в iPhone 15, iPad Air 3rd G (A12) и в системах на базе процессоров A17 и M3. Некоторые устройства, такие как Apple MacBook Air (M2), остаются уязвимы. В GPU AMD уязвимость планируют устранить в мартовском обновлении драйверов. В GPU Qualcomm уязвимость устранена для GPU Adreno a630 в обновлении прошивки 2.07 (для остальных GPU исправления в процессе подготовки).
В GPU Imagination исправление предложено в новой версии DDK 23.3, выпущенной в декабре. GPU NVIDIA, Intel и ARM уязвимости не подвержены. В открытых OpenCL-драйверах Mesa для GPU AMD производится очистка памяти после каждого запуска вычислительного ядра, но подобный метод оценивается как не эффективный, так как очистка производится через запуск на GPU другого обработчика и вредоносный обработчик может вклиниться перед ним.