Десятки перевёрнутых битов из миллиардов параметров - и accuracy модели на математических бенчмарках проседает на десятки процентных пунктов. Текст на выходе при этом остаётся грамматически корректным. Это данные из препринтов по bit-flip атакам на LLM масштаба 7B-14B (независимый факт-чек результатов пока не проводился, экстраполяция на все LLM не подтверждена). Отдельные работы заявляют, что единицы bit-flip'ов отключают safety alignment или превращают выход модели в кашу - опять же, на конкретных архитектурах и без внешней верификации.
За последние годы тема набрала обороты: каждый следующий препринт, по заявлениям авторов, снижает порог атаки. Я разберу физику DRAM, математику градиентного поиска критических битов и воспроизводимую инъекцию в PyTorch - вместе с ограничениями, которые академические абстракты предпочитают замалчивать.
Зачем атакующему переворачивать биты в весах LLM
Bit-flip атаки на LLM - не классический аппаратный эксплойт ради привилегий. Цель - манипуляция весами нейросети на уровне физической памяти, без следов в логах промптов. В untargeted-сценарии BFA вызывает DoS-подобный эффект для inference-сервиса, но принципиально отличается от DDoS: никакого сетевого флуда, воздействие точечное.Бизнес-логика атаки зависит от сценария:
Untargeted-сценарий - деградация модели. Конкурентная разведка: ухудшить качество inference-сервиса соперника настолько, что пользователи уходят. В медицинских и финансовых приложениях деградация модели чревата ошибочными рекомендациями с юридическими последствиями.
Targeted-сценарий - cognitive bias injection в LLM. Препринты по targeted BFA заявляют подмену ответов на конкретные промпты при сохранении корректности на остальных запросах. Модель уверенно встраивает ключевые слова атакующего в ответы - по сути, программируемая дезинформация через аппаратный вектор. Тот же вектор работает для атак на supply chain ИИ: веса модифицированы при доставке модели конечному пользователю.
Jailbreak-сценарий - препринты (без независимой верификации) заявляют обход SFT/RLHF/DPO-механизмов за десятки bit-flip'ов. Модель начинает генерировать вредоносный контент, оставаясь функционально работоспособной.
Операционная цепочка BFA:
- Resource Development - T1588.006 (Vulnerabilities): профилирование DRAM целевой машины, построение memory template - карты Rowhammer-уязвимых ячеек
- Initial Access - co-located процесс на физическом хосте. В cloud-среде - запуск VM рядом с жертвой; при физическом доступе - T1200 (Hardware Additions)
- Gradient Search - офлайн-вычисление координат критических битов на копии модели
- Rowhammer Exploitation - целенаправленное "выбивание" битов через repeated row access
- Impact - T1565.001 (Stored Data Manipulation): веса в DRAM модифицированы, модель выдаёт атакованный результат
Rowhammer и DRAM: механика аппаратной атаки на память
Rowhammer - аппаратная уязвимость памяти DRAM, корни которой в физике полупроводников: многократное обращение к одной строке (row) вызывает утечку заряда в соседних строках, и бит переворачивается. Чем меньше техпроцесс - тем плотнее ячейки, тем сильнее взаимное влияние. Тут нет никакой магии, чистая электростатика.
Применительно к инференсу LLM это работает так: модель загружена в DRAM (или VRAM GPU - Rowhammer-подобные атаки на GPU DRAM/VRAM теоретически обсуждаются, но практическую демонстрацию на datacenter GPU пока никто публично не показал). Веса занимают конкретные физические строки. Атакующий процесс на том же хосте "молотит" соседние строки, пока целевой бит не перевернётся.
Критическое ограничение, о котором часто забывают: Rowhammer не даёт произвольной записи. Атакующий контролирует, какие строки подвергаются hammering'у, но не может гарантировать flip конкретного бита - только увеличить вероятность. Memory templating (предварительное профилирование DRAM) позволяет заранее найти ячейки, предрасположенные к flip'у в нужном направлении (0->1 или 1->0). TRRespass и Drammer автоматизируют этот процесс, но он требует длительного доступа к машине - от минут до часов.
DDR5 вводит Per-Row Activation Counting, но исследования по его обходу уже ведутся.
Предусловия для Rowhammer-атаки на LLM-веса:
- Co-located процесс на физическом хосте (cloud multi-tenancy, shared GPU-кластер)
- DRAM без эффективной коррекции ошибок (ECC detect-only или отсутствует)
- Знание архитектуры модели (для gradient-guided поиска)
- Возможность длительного hammering'а (минуты–часы без перезагрузки)
- Full ECC DRAM с коррекцией (серверные платформы с chipkill)
- HBM на datacenter GPU (H100, A100) - другая архитектура refresh
- Runtime integrity checks весов перед каждым inference batch
- Модель в secure enclave с memory encryption (Intel TDX, AMD SEV)
Формат весов в памяти: уязвимости весов модели на уровне битов
Импакт bit-flip целиком определяется тем, какой именно бит в числовом представлении веса перевёрнут. LLM используют несколько форматов: FP16, BFloat16 (обучение и GPU-инференс), INT8 и FP4/INT4 (квантизованные модели).FP16 и BFloat16: экспонента как рычаг
IEEE 754 FP16: 1 бит знака + 5 бит экспоненты + 10 бит мантиссы. BFloat16: 1 бит знака + 8 бит экспоненты + 7 бит мантиссы.| Позиция бита (нумерация LSB=0, MSB=15) | FP16 | BFloat16 | Эффект flip при весе ~0.01 |
|---|---|---|---|
| MSB экспоненты | бит 14 (exp[14:10], 5 бит) | бит 14 (exp[14:7], 8 бит) | Катастрофическое: сдвиг порядка на 2^16 (FP16) или 2^128 (BF16) |
| Знаковый бит | бит 15 | бит 15 | Инверсия знака: +0.01 -> -0.01 |
| MSB мантиссы | бит 9 | бит 6 | Максимальный вклад среди битов мантиссы (~50% при flip 0->1, зависит от исходного значения бита) |
| LSB мантиссы | бит 0 | бит 0 | Минимальное (на уровне точности формата) |
Flip в MSB экспоненты даёт максимальный impact при минимальном бит-бюджете. BFA-фреймворки целятся именно туда: один flip способен вызвать overflow/underflow веса, каскадно ломая attention-слой. В авторегрессионной генерации LLM один повреждённый вес искажает все последующие токены - каскадный эффект, специфичный для transformer-архитектур.
BFloat16 имеет 8 бит экспоненты против 5 у FP16 - динамический диапазон шире, но каждый flip в экспоненте даёт сдвиг порядка на множитель 2. Мантисса BFloat16 короче (7 бит vs 10), поэтому каждый flip в мантиссе BFloat16 пропорционально сильнее бьёт по точности представления.
INT8 signed vs unsigned: один бит - разный импакт
При INT8-квантизации flip MSB (бит 7) даёт радикально разный результат:| Формат | Исходное | Бинарное | После flip бит 7 | Результат | Сдвиг |
|---|---|---|---|---|---|
| Signed INT8 | +5 | 00000101 | 10000101 | -123 | -128 |
| Signed INT8 | -5 | 11111011 | 01111011 | +123 | +128 |
| Unsigned INT8 | 5 | 00000101 | 10000101 | 133 | +128 |
| Unsigned INT8 (обратный flip того же бита) | 133 | 10000101 | 00000101 | 5 | -128 |
Для signed INT8 (two's complement): MSB имеет вес -128. Flip этого бита сдвигает значение на +-128 - полный диапазон типа. Малый положительный вес превращается в большой отрицательный.
Для unsigned INT8: MSB имеет вес +128, flip даёт сдвиг в противоположную сторону.
PyTorch и квантизационные фреймворки (GPTQ, AWQ, bitsandbytes) преимущественно используют signed INT8 для весов. Flip MSB - худший сценарий: +5 -> -123, выход нейрона меняется полностью.
Таксономия bit-flip атак на большие языковые модели
Эволюция BFA-исследований прошла путь от грубого разрушения к хирургической манипуляции весами нейросети.
| Направление | Тип атаки | Заявленный бит-бюджет | Заявленный эффект | Стелсность |
|---|---|---|---|---|
| Untargeted (деструктивная) | Untargeted | Единицы | Полная деградация связности | Низкая - бессвязный выход |
| Untargeted (минимальная) | Untargeted | 1 | Критический сбой функциональности | Низкая |
| Jailbreak | Targeted (jailbreak) | Десятки | Обход safety alignment | Средняя |
| Untargeted (стелс) | Untargeted, стелс | Десятки | Деградация accuracy, naturalness сохранён | Высокая |
| Targeted (подмена) | Targeted | Десятки | Подмена ответов на выбранные промпты | Высокая |
Названия конкретных работ, точные бит-бюджеты и метрики из препринтов не прошли независимую верификацию и приводятся обобщённо.
Деструктивные untargeted-атаки - ранние работы заявляют, что единицы bit-flip'ов хватает для полного разрушения выходов LLM масштаба 7B-14B. Результат очевидный: perplexity улетает в космос, связность текста - ноль. Детектировать тривиально. Отдельные препринты заявляют порог в один бит для 14B-модели, но выход тоже явно сломан; воспроизводимость на других моделях не подтверждена.
Jailbreak-направление сместило фокус с разрушения на обход alignment. Заявляется, что десятки flip'ов отключают SFT/RLHF/DPO-механизмы на моделях 7B-13B (конкретные списки моделей надо смотреть в оригинальных публикациях). Текст на выходе связный - модель просто работает без ограничений.
Стелс-направление решает проблему обнаружения. Вместо атаки через perplexity - token-based loss: подавление критических токенов в ответе без разрушения связности. По заявлениям авторов, десятки flip'ов снижают accuracy на математических бенчмарках на десятки процентных пунктов при минимальном падении naturalness (точные цифры и переносимость на другие модели не подтверждены). Модель генерирует грамматически корректный, но неправильный ответ. Тут интересный момент - для FP4-квантизованных моделей предлагаются отдельные стратегии выбора битов с учётом специфики 4-битного формата.
Targeted-направление - попытка создать первую targeted BFA на LLM. Атакующий задаёт конкретные промпты и ключевые слова-цели. Keyword-focused attack loss продвигает target-токены в generative outputs, вспомогательная метрика контролирует побочное влияние на нерелевантные запросы. По заявлениям авторов, десятки flip'ов встраивают заданные ключевые слова в ответы на выбранные промпты (модели 7B-13B), остальные запросы обрабатываются корректно. По сути - программируемый cognitive bias injection в LLM: модель подменяет факты в ответах на конкретные темы, сохраняя видимость корректности. Отдельные препринты заявляют реализацию полной цепочки с реальным Rowhammer на DDR4, а не только симуляцию.
Progressive Bit Search: двухэтапный градиентный поиск
Ядро каждой BFA - поиск минимального набора битов, flip которых даёт максимальный эффект. Процесс состоит из двух принципиально разных этапов, которые в публикациях часто смешивают (и это раздражает, потому что семантика у них совсем разная).
Требования к окружению
- GPU с VRAM, достаточным для модели (LLaMA-3.1-8B в INT8: ~8 ГБ VRAM, FP16: ~16 ГБ)
- PyTorch >= 2.0 (для стабильной работы с квантизованными тензорами; поддержка
view()между bfloat16 и int16 зависит от конкретной версии - проверяйте документацию PyTorch для вашей конфигурации) - RAM >= 32 ГБ для моделей масштаба 7-14B
- Копия модели для офлайн-анализа (production-инстанс не модифицируется на этом этапе)
- ОС: Linux (CUDA-совместимое окружение)
Этап 1: ранжирование слоёв по чувствительности
Первый проход определяет, какой слой модели наиболее чувствителен к perturbation весов. Метрика - произведение градиента loss на значение параметра, просуммированное по всем весам слоя:
Python:
# Ранжирование СЛОЁВ по чувствительности (не конкретных битов)
# Один forward+backward проход, затем агрегация градиентов по слоям
loss = criterion(model(input_ids), labels)
loss.backward()
layer_scores = {}
for name, param in model.named_parameters():
if 'weight' not in name or param.grad is None: continue
layer_scores[name] = (param.grad * param).abs().sum().item()
model.zero_grad()
top_layer = max(layer_scores, key=layer_scores.get)
Этап 2: поиск конкретного бита
Внутри выбранного слоя - второй проход. Тензор градиент * вес разворачивается в одномерный вектор (flatten()), argmax указывает на индекс наиболее чувствительного параметра. Дальше для этого параметра перебираются все N бит представления (8 для INT8, 16 для FP16), выбирается бит с максимальным сдвигом loss.Ряд BFA-фреймворков используют итеративный Progressive Bit Search: на каждом шаге фиксируется один flip, пересчитывается loss, ищется следующий лучший бит. Это критически важно - кумулятивный эффект нескольких flip'ов нелинеен. Второй flip может частично компенсировать первый, а может усилить его на порядок.
В реальных BFA-фреймворках первый проход отсекает 99% слоёв, второй работает только с кандидатными - иначе полный перебор для модели с миллиардами параметров вычислительно нереалистичен.
Инъекция bit-flip в тензор весов: воспроизводимый эксперимент
После нахождения координат критического бита - инъекция. В исследовательских целях bit-flip моделируется напрямую в тензоре PyTorch:
📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме
Ключевые моменты:
- Маскирование
& 0xFFгарантирует корректный диапазон после XOR - без него отрицательные значения PyTorch tensor при XOR могут выйти за пределы 8-битного диапазона. - Преобразование обратно в signed через
< 128- значения 128...255 в unsigned соответствуют -128...-1 в two's complement. - Для FP16/BFloat16 тензор интерпретируется как
int16через промежуточное преобразование. Прямойview()между float и int типами поддерживается не во всех версиях PyTorch - при проблемах используйте конвертацию черезnumpy()илиctypes.
Ограничение лабораторного эксперимента: инъекция в PyTorch моделирует идеальный bit-flip. В реальности Rowhammer не гарантирует flip конкретного бита. Между координатами в тензоре PyTorch и физическими адресами DRAM - виртуальная память, CUDA memory allocator, GPU page tables. Воспроизведение полной цепочки от Rowhammer до flip в конкретном весе - отдельная инженерная задача, которую отдельные препринты заявляют решённой через Rowhammer System Implementation с реальным DDR4.
Атака на скомпилированные DNN: поверхность без доступа к весам
Все атаки выше предполагают знание весов (white-box). Направление BFA на скомпилированные DNN (ряд препринтов, без независимой верификации) открывает другую поверхность: BFA на DNN-исполняемые файлы, скомпилированные через TVM или TensorRT.Ключевое отличие - вместо атаки на веса атакуется структура модели, закодированная в исполняемом коде: граф вычислений, размерности тензоров, параметры операций. Для открытых моделей структура - публичная информация. Threat model снижается с white-box (нужны веса) до knowledge-of-architecture.
По данным авторов:
- Единицы flip'ов достаточны для полной деградации accuracy скомпилированного DNN до уровня случайного угадывания
- Квантизованные модели, ранее требовавшие на порядки больше flip'ов, атакуются с сопоставимой эффективностью
- Автоматизированный инструмент значительно превышает baseline в идентификации уязвимых битов (конкретные цифры требуют независимой проверки)
- Атаки заявлены как transferable между моделями с одинаковой архитектурой
Маппинг bit-flip атак на MITRE ATT&CK
Применимые техники
- T1565.001 - Stored Data Manipulation (Impact): основная техника. Веса модели в DRAM - stored data. Bit-flip модифицирует эти данные для изменения поведения модели. Покрывает и untargeted деградацию, и targeted cognitive bias injection
- T1565 - Data Manipulation (Impact): родительская техника, BFA - частный случай с аппаратным вектором доставки
- T1200 - Hardware Additions (Initial Access): применимо при физическом доступе для подключения оборудования, генерирующего Rowhammer-паттерны; в cloud-сценарии initial access идёт через стандартные IT-векторы
- T1588.006 - Vulnerabilities (Resource Development): идентификация Rowhammer-уязвимых строк DRAM как ресурса для атаки
Почему T1495, T1601 и T1499.004 НЕ описывают BFA
В предшествующих анализах BFA иногда ассоциируют с техниками, которые семантически сюда не подходят. Разберу, почему.T1495 - Firmware Corruption (Impact): описывает повреждение firmware/BIOS для вывода из строя или persistence. BFA не трогает firmware - атака происходит на уровне application-layer данных (весов) в volatile memory. Цель BFA - манипуляция поведением, не разрушение устройства. Firmware Corruption - про persistence через аппаратный уровень; BFA - про runtime data manipulation.
T1601 / T1601.001 - Modify System Image / Patch System Image (Defense Impairment): относятся к модификации OS-образов сетевого оборудования (Cisco IOS, Juniper JUNOS) для обхода защит. Контекст - network infrastructure. Веса нейросети - не system image, а application data в пользовательском процессе.
T1499.004 - Application or System Exploitation (Impact): описывает DoS через эксплуатацию программных уязвимостей - crash, resource exhaustion, service degradation через software bugs. BFA эксплуатирует не программную уязвимость, а физическое свойство DRAM. Цель стелс- и targeted-BFA - сохранение работоспособности сервиса при искажении результатов, что прямо противоположно DoS. T1499.004 - про availability impact; BFA - про integrity impact.
Отсутствие точного ATT&CK-маппинга для fault injection в application-layer данные через аппаратные уязвимости памяти - текущий gap во фреймворке. T1565.001 - ближайшее приближение, но специфику hardware-вектора доставки не покрывает.
Защита нейросетей от Rowhammer и её пределы
ECC DRAM. Корректирует однобитовые ошибки, детектирует двухбитовые. Против untargeted BFA с бюджетом в единицы битов - прямая контрмера. На серверных GPU (A100, H100) ECC включён по умолчанию в HBM2e/HBM3. Но: ECC не спасает от multi-bit flip'ов в одном ECC-слове. TRRespass (2020) демонстрирует обход TRR в DDR4 - flip'ы всё равно случаются. На consumer GPU (GeForce, Radeon) ECC отсутствует - а именно на них крутят инференс в малых командах и стартапах.Чексуммы параметров. Контрольная сумма весов перед каждым inference batch - прямая защита целостности параметров нейросети. Overhead: 1-3% inference latency для моделей 7-14B. Чексумма должна храниться в защищённой области (иначе атакующий flip'нет и её). Не покрывает structure-based BFA на скомпилированных моделях - там модифицируется код, а не данные весов.
Activation clamping. Ограничение диапазона активаций уменьшает каскадный эффект аномальных весов. Но адаптивные атаки учитывают clamping при поиске битов и находят flip'ы, не вызывающие clipping, но смещающие выход. Классическая гонка вооружений.
Robust quantization. Пересчёт квантизационных параметров с учётом возможных bit-flip'ов. Повышает порог атаки, но не устраняет уязвимость - атакующий просто увеличивает бит-бюджет.
Memory encryption (TDX, SEV). Шифрование памяти VM: flip происходит над шифротекстом, результат расшифровки непредсказуем для атакующего. На практике ни одна ML-инференс платформа (vLLM, TGI, Triton Inference Server) не использует memory encryption для весов - overhead 5-15% на memory bandwidth. При отсутствии integrity verification шифрование не защищает от DoS-вариантов BFA, где атакующему безразлично, какой именно бит flip'нется.
| Защита | Покрывает | Не покрывает | Overhead |
|---|---|---|---|
| ECC DRAM | Однобитовые flip'ы | Multi-bit, consumer GPU | Стоимость серверной памяти |
| Чексуммы весов | Runtime integrity | Structure-based BFA, код | 1-3% latency |
| Activation clamping | Каскадные эффекты | Адаптивные атаки | <1% latency |
| Memory encryption | Произвольный co-tenant | Latency-sensitive workloads | 5-15% bandwidth |
Ни одна из мер не является полным решением. Комбинация ECC + чексуммы + clamping повышает бит-бюджет атаки на один-два порядка, но фундаментальная проблема остаётся: ML-деплой не верифицирует целостность параметров в runtime, а аппаратные атаки на машинное обучение эксплуатируют именно это допущение.
Безопасность LLM сейчас перекошена в сторону prompt injection и adversarial inputs. OWASP LLM Top 10 описывает application-layer угрозы - и для стандартного threat model это корректно. Но BFA оперирует уровнем ниже, и ни один production-grade inference framework не реализует runtime integrity checking весов. Параметры загружаются из файла, проверяется чексумма файла - а содержимое DRAM дальше считается неизменным. Это архитектурное допущение, которое ничем не подкреплено.
Пятьдесят flip'ов из миллиардов параметров - 0.0000006% весов модели. При этом отдельные препринты заявляют рабочую реализацию с реальным Rowhammer на DDR4, а не только симуляцию. Следующий шаг - автоматизация под конкретные cloud-провайдеры и GPU. Защита стоит дорого: integrity checks на каждый batch - latency, memory encryption - bandwidth, ECC - стоимость железа. Пока BFA остаётся в статьях, за защиту никто не заплатит.
Формула на бумаге понятна, но масштаб проблемы по-настоящему ощущаешь, когда сам прогоняешь Progressive Bit Search и видишь, как один flip в экспоненте MLP-слоя роняет accuracy на десятки процентных пунктов (на конкретной модели и бенчмарке). Попробуйте воспроизвести инъекцию из раздела про PyTorch на любой открытой 7B-модели - увидите своими глазами, как один перевёрнутый бит ломает математику при сохранении грамматики. Для тренировки битовых операций можно взять crypto-задачи на CTF-площадках, хотя они не являются BFA-специфичными стендами и не воспроизводят цепочку Rowhammer/PyTorch-инъекций. Фундаментальная проблема в том, что весь ML deployment stack построен на аксиоме "память не врёт" - а Rowhammer опровергает эту аксиому уже десять лет.
Последнее редактирование модератором: