English translation is not available yet. Showing Russian content.
Как работает model stealing attack и как защититься?
Краткий тезис
Model stealing attack (атака кражи модели) — это метод, при котором злоумышленник, имея доступ только к API модели (черный ящик), восстанавливает её функциональность, обучая собственную суррогатную модель на парах «запрос — ответ». Защита строится на ограничении числа запросов (rate limiting), внесении шума в ответы (perturbation), внедрении невидимых меток (watermarking) и использовании offline distillation для выпуска ослабленной публичной версии. Понимание этих механизмов критично для ML-инженера, разворачивающего LLM в production.
1. Что такое model stealing attack
Model stealing (кража модели) — это класс атак на машинное обучение как сервис (MLaaS), при котором злоумышленник пытается извлечь внутренние параметры, архитектуру или поведение целевой модели, имея доступ только к её API. В контексте LLM атака обычно направлена на восстановление весов или создание модели-имитатора, которая даёт похожие ответы.
Зачем это нужно атакующему
- Использовать функциональность без оплаты.
- Анализировать модель на уязвимости (например, для jailbreak).
- Создать конкурентный продукт, скопировав поведение дорогой модели.
Термин «model|суррогатная модель» (model|surrogate model) — модель, обученная злоумышленником на запросах к оригинальной модели, чтобы аппроксимировать её поведение.
2. Механизм атаки: query → log → train
Атака состоит из трёх этапов:
2.1 Query (запросы)
Злоумышленник отправляет множество запросов к API целевой модели. Запросы могут быть:
- Случайными — тексты из открытых источников.
- Синтезированными — сгенерированными другой LLM.
- Целевыми — подобранными для покрытия разных режимов работы модели.
2.2 Log (сбор ответов)
Каждый ответ модели (логиты, вероятности токенов, финальный текст) сохраняется. Чем больше информации возвращает API (например, logprobs — логарифмические вероятности токенов), тем проще атака.
2.3 Train (обучение студента)
На собранном датасете (запрос, ответ) обучается model|суррогатная модель. Используется дистилляция (distillation) — минимизация расхождения между распределениями вероятностей целевой и студенческой модели.
Формально пусть $p_{[text](/wiki/text){target}}(y|x)$ — распределение целевой модели, $p_{[text](/wiki/text){student}}(y|x)$ — студента. Функция потерь: $$L = \sum_{(x,y)} [text](/wiki/text){KL}(p_{[text](/wiki/text){target}}(y|x) \parallel p_{[text](/wiki/text){student}}(y|x))$$ или кросс-энтропия, если доступны только жёсткие метки (токены).
3. Типы model stealing атак
| Тип атаки | Доступ к модели | Что извлекается | Сложность |
|---|---|---|---|
| Black-box extraction | Только API (текст/логиты) | Поведение (функция отображения) | Средняя |
| White-box extraction | Полный доступ (веса, граф) | Параметры (веса) | Низкая (но редко встречается) |
| Model inversion | API + частичные данные | Приватные обучающие данные | Высокая |
| Membership inference | API | Определение, был ли образец в обучении | Средняя |
В контексте LLM чаще всего встречается black-box extraction — злоумышленник не знает весов, но может делать много запросов.
4. Пример реализации атаки (псевдокод на Python)
import requests
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
# 1. Сбор данных через API
def query_target_model(prompt, api_url, api_key):
response = requests.post(
api_url,
headers={"Authorization": f"Bearer {api_key}"},
json={"prompt": prompt, "max_tokens": 100, "logprobs": True}
)
data = response.json()
# Предполагаем, что API возвращает топ-5 логитов
logits = np.array(data["logprobs"]["top_logprobs"])
return logits
# 2. Генерация запросов (например, из датасета)
queries = ["What is AI?", "Explain quantum computing", ...]
dataset = []
for q in queries:
logits = query_target_model(q, "https://api.target.com/v1/completions", "sk-xxx")
dataset.append((q, logits))
# 3. Обучение студента (суррогатной модели)
student = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")
# ... цикл обучения с loss = KL_divergence(student_logits, target_logits)
Важно в реальных условиях API часто не возвращает логиты, а только текст. Тогда атака использует только жёсткие метки, что снижает качество кражи.
5. Защита: Rate Limiting
Rate limiting (ограничение частоты запросов) — самый простой барьер. Устанавливается максимальное количество запросов в минуту/час с одного IP или API-ключа.
Недостатки
- Атакующий может использовать распределённую сеть (ботнет).
- Легитимные пользователи могут страдать.
Улучшение адаптивный rate limiting — если запросы подозрительно похожи (низкая энтропия), лимит ужесточается.
6. Защита: Watermarking
Watermarking (водяные знаки) — внедрение в ответы модели невидимых для человека, но детектируемых паттернов. Если суррогатная модель воспроизводит эти паттерны, владелец может доказать кражу.
Примеры
- Использование редких синонимов в определённых контекстах.
- Специфические ошибки (backdoor watermarking).
- Встраивание сигнала в распределение вероятностей (например, смещение на 0.001 для определённых токенов).
Как работает обнаружение владелец отправляет специальные триггер-запросы к подозрительной модели и проверяет наличие водяного знака.
7. Защита: Perturbation (шум и округление)
Perturbation (возмущение) — добавление шума в ответы модели, чтобы затруднить точное копирование.
Методы
- Rounding — округление логитов до заданной точности (например, до 3 знаков после запятой).
- Noise addition — добавление гауссовского шума к логитам перед отправкой.
- Top-k sampling — возврат только k наиболее вероятных токенов (без вероятностей).
Торговля (trade-off): чем сильнее perturbation, тем хуже качество для легитимных пользователей. Нужно найти баланс.
8. Защита: Offline Distillation и Differential Privacy
Offline Distillation
Вместо того чтобы выставлять оригинальную модель, компания обучает меньшую дистиллированную модель (student) на данных, сгенерированных большой моделью (teacher), и публикует только student. Это:
- Снижает вычислительные затраты.
- Делает кражу менее ценной (student слабее teacher).
- Усложняет восстановление teacher.
Differential Privacy (дифференциальная приватность)
Добавление шума в процесс обучения так, чтобы ответы модели не раскрывали информацию об отдельных обучающих примерах. Это защищает от model inversion и membership inference, но не полностью от extraction.
9. Сравнительная таблица методов защиты
| Метод | Защита от extraction | Влияние на качество | Сложность внедрения |
|---|---|---|---|
| Rate limiting | Низкая (обходится ботнетом) | Нет | Низкая |
| Watermarking | Средняя (доказательство кражи) | Нет | Средняя |
| Perturbation | Средняя (снижает точность копии) | Среднее (ухудшает ответы) | Низкая |
| Offline distillation | Высокая (скрывает teacher) | Низкое (student может быть слабее) | Высокая |
| Differential privacy | Высокая (защита от inversion) | Высокое (шум снижает качество) | Очень высокая |
10. Практические рекомендации для production
- Комбинируйте методы rate limiting + perturbation + watermarking.
- Не возвращайте логиты — только финальный текст (если возможно).
- Мониторьте аномалии если один пользователь делает запросы с подозрительно низким разнообразием (например, всегда одинаковый стиль), блокируйте.
- Используйте капчу для подозрительных сессий.
- Периодически обновляйте модель — старые водяные знаки могут быть обнаружены.
Пет-проект для закрепления
Задача Реализовать симуляцию model stealing атаки и защиту через perturbation.
Инструменты Python, transformers, torch, flask (для API).
Шаги:
- Разверните простую LLM (например,
distilgpt2) как целевое API (Flask). - Напишите скрипт атаки: отправьте 500 запросов, соберите логиты, обучите студента (
gpt2) с loss = KL divergence. - Оцените качество студента (perplexity, сходство ответов).
- Добавьте защиту: округление логитов до 2 знаков + гауссов шум σ=0.1.
- Повторите атаку — измерьте ухудшение качества студента.
Ожидаемый результат Вы увидите, что без защиты студент достигает perplexity ~15, с защитой — ~30. Поймёте trade-off между защитой и качеством.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 352 | Как защитить API от злоупотреблений (abuse) |
| 353 | Что такое adversarial attacks на LLM |
| 354 | Как работает jailbreak и prompt injection |
| 355 | Методы оценки безопасности LLM |
| 356 | Differential privacy в обучении LLM |
Навигация
- Предыдущий: 350
- Следующий: 352
- Индекс: 00. Индекс разборов