English translation is not available yet. Showing Russian content.
Как работает model stealing attack (экстракция модели через API)?
Краткий тезис
Model stealing attack (атака кражи модели) — это техника, при которой злоумышленник через открытый API модели-жертвы извлекает её поведение, обучая свою собственную модель (студента) на собранных парах «промпт → ответ». Для LLM атака особенно опасна: с помощью всего нескольких тысяч запросов (стоимостью до $1000) можно восстановить 60–80% качества коммерческой модели. Защита строится на rate limiting, watermarking, perturbation ответов и ограничении доступа к логитам.
1. Что такое атака экстракции модели
Model stealing — разновидность adversarial attack, при которой злоумышленник без прямого доступа к весам, архитектуре или обучающим данным модели восстанавливает её функциональность. В контексте LLM API (например, OpenAI, Anthropic) атакующий может:
- отправлять произвольные промпты;
- получать сэмплы (текстовые ответы) и, если API разрешает, логиты (распределение вероятностей по токенам);
- использовать эти данные для обучения суррогатной модели (model|surrogate model).
Цель — либо скопировать поведение (плагиат), либо изучить уязвимости модели для последующих атак, либо обойти платный доступ.
2. Ключевые термины
| Термин | Определение |
|---|---|
| Модель-жертва | LLM, доступная через API, которую атакуют (например, GPT-4). |
| Суррогатная модель | Локально обучаемая модель (студент), которая имитирует жертву. |
| API запрос | Пара промпт + ответ (сэмпл или логиты). |
| Логиты | Необработанные вероятности по токенам до softmax; дают больше информации, чем сэмплы. |
| Дистилляция | Техника обучения студента на выходах учителя; в атаке используется экстракция через API как замена teacher. |
| Покрытие распределения | Разнообразие промптов, покрывающее все типичные сценарии использования модели. |
3. Этапы атаки в деталях
3.1. Выбор цели и сбор информации
- Определить, какие модели доступны через API (через документацию или обратный инжиниринг).
- Узнать, возвращает ли API логиты, сэмплы, частоту ошибок, ограничения.
3.2. Генерация промптов
Основная задача — создать набор промптов, который покрывает распределение входных данных модели. Методы:
- Случайные промпты из публичных датасетов (Natural Questions, ELI5, ShareGPT).
- Темпоральное сэмплирование: использовать текущие популярные темы (например, новости).
- Активное обучение: на каждом шаге выбирать промпты, по которым текущая model|суррогатная модель наиболее неуверенна (entropy|max entropy).
- Градиентные методы: если api возвращает логиты, можно вычислять градиенты потерь по входу (через дифференцируемую аппроксимацию) и подбирать промпты, которые максимизируют расхождение.
Для LLM важно также покрывать:
- различные стили (формальный, креативный, код);
- длины (короткие вопросы, длинные инструкции);
- форматы ответов (список, эссе, JSON).
3.3. Сбор ответов
- Для каждого промпта отправляется запрос, логируется ответ (сэмпл или логиты).
- Если доступны логиты, сохраняется полное распределение. Если нет — только сгенерированный текст (сэмпл).
3.4. Обучение суррогатной модели
- Выбирается архитектура-студент (например, меньшая версия трансформера — DistilBERT, TinyLLaMA).
- Функция потерь:
- Для логитов: KL-дивергенция между распределениями студента и учителя.
- Для сэмплов: cross-entropy на текстах (как при обычном language modeling) или distillation loss (если учитель выдает несколько кандидатов).
- Обучение на собранном датасете (промпт-ответ) с регуляризацией для предотвращения переобучения.
3.5. Оценка качества экстракции
Метрики:
- Fidelity — насколько ответы студента совпадают с ответами учителя (например, BLEU, ROUGE, или точность классификации).
- Utility — качество на целевых задачах (benchmarks: MMLU, HumanEval).
- Cost — затраты на атаку (запросы, время, деньги).
4. Сравнение методов генерации промптов
| Метод | Покрытие распределения | Стоимость (кол-во запросов) | Сложность реализации |
|---|---|---|---|
| Случайные из датасета | Среднее | Высокое (много шума) | Низкая |
| Активное обучение | Хорошее | Среднее | Средняя |
| Градиентный подбор | Очень хорошее | Низкое | Высокая (требует дифференцируемости) |
5. Успешность атаки: цифры и факторы
- Практические эксперименты (например, работа Tramer et al. 2016, Orekondy et al. 2019, и современные исследования по LLM) показывают, что за 1000–10 000 запросов можно достичь 60–80% fidelity.
- Стоимость: при цене $0.01–$0.1 за запрос (GPT-4) диапазон $100–$1000.
- Факторы, влияющие на успех:
- Доступ к логитам — значительно ускоряет обучение.
- Размер модели-жертвы — копировать поведение большой модели сложнее, но и ценнее.
- Разнообразие промптов — узкий домен легче экстрагировать.
- Защиты API — rate limiting, квоты, детекция аномалий.
6. Методы защиты от атаки
6.1. Ограничение доступа к информации
- Rate limiting — максимальное количество запросов с одного IP/ключа в единицу времени.
- Block on sensitive endpoints — не предоставлять логиты через публичное API (только сэмплы).
- Аутентификация и капчи — усложнение массовой отправки.
6.2. Изменение выходных данных (perturbation)
Добавление шума в ответы, чтобы затруднить точное копирование:
- Логитный шум — добавление Gaussian noise к логитам перед softmax.
- Температурное сэмплирование — случайное изменение распределения (T > 1).
- Random token drop — выборочное удаление токенов из ответа.
6.3. Внедрение водяных знаков (watermarking)
- Встраивание невидимых сигналов в сгенерированный текст, которые не влияют на качество, но позволяют доказать факт копирования.
- Пример: алгоритм Kirchenbauer et al. (2023) — на основе редких токенов.
6.4. Offline distillation (защита на уровне бизнеса)
- Вместо вызова API каждый раз, предоставлять клиентом уже дистиллированную локальную модель (например, GPT-4 для внутренних нужд → клиент получает лишь API на smaller model).
- Это снижает объём полезной информации, которую можно извлечь из одного API.
6.5. Мониторинг и детекция аномалий
- Анализ паттернов запросов: подозрительно большое разнообразие тем, равномерное распределение длины, повторяющиеся промпты.
- GAN-based detection – обучение модели, отличающей запросы реальных пользователей от атакующих.
7. Пример кода (симуляция атаки на логитах)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
import openai # предположим, что используем API-прокси
# 1. Загрузка маленькой модели-студента (например, DistilGPT2)
student = AutoModelForCausalLM.from_pretrained("distilgpt2")
tokenizer = AutoTokenizer.from_pretrained("distilgpt2")
# 2. Функция запроса к API (эмуляция с помощью локальной модели-учителя)
# В реальности это openai.ChatCompletion.create(...)
def query_teacher(prompt):
# используем GPT-2-large как жертву (для демонстрации)
teacher = AutoModelForCausalLM.from_pretrained("gpt2-large")
inputs = tokenizer(prompt, return_tensors="pt")
with torch.no_grad():
outputs = teacher(**inputs)
logits = outputs.logits[:, -1, :] # логиты последнего токена
return logits
# 3. Генерация промптов (случайные из датасета)
prompts = ["What is AI?", "Explain gravity.", "Write a poem about cats."]
# 4. Сбор данных
dataset = []
for prompt in prompts:
logits_teacher = query_teacher(prompt)
dataset.append((prompt, logits_teacher))
# 5. Обучение студента (distillation)
optimizer = torch.optim.AdamW(student.parameters(), lr=1e-5)
loss_fn = torch.nn.KLDivLoss(reduction="batchmean")
for epoch in range(3):
for prompt, teacher_logits in dataset:
inputs = tokenizer(prompt, return_tensors="pt")
student_logits = student(**inputs).logits[:, -1, :]
# log softmax для студента, softmax для учителя
loss = loss_fn(torch.log_softmax(student_logits, dim=-1),
torch.softmax(teacher_logits, dim=-1))
loss.backward()
optimizer.step()
optimizer.zero_grad()
Примечание: в реальной атаке студент обучается на большом количестве данных, а логиты учителя получаются через API.
8. Пет-проект для закрепления
Задача Реализовать симуляцию model stealing attack на небольшой LLM (например, GPT-2) с использованием публичного API (Hugging Face Inference API) или локальной модели-жертвы.
Инструменты
- Python, PyTorch, Transformers
- OpenAI API (режим разработчика с тестовым ключом) или HF Inference API
- Датасет: 1000 промптов из WikiText-2
Шаги:
- Определите модель-жертву (например, gpt2-medium на HF).
- Сгенерируйте 500 промптов (комбинация случайных вопросов и начал текста).
- Для каждого получите логиты через API (если не разрешено — используйте сэмплы).
- Обучите студента (gpt2 small) на этих данных с loss = KL divergence.
- Оцените fidelity: средняя взаимная информация между распределениями на тестовых промптах.
- Попробуйте разные методы защиты (добавление Gaussian noise к логитам, увеличение temperature) и замерьте, как падает fidelity.
Ожидаемый результат Вы получите работающую атаку с fidelity > 70% на тестовом наборе, и увидите, что даже небольшой шум (std=0.1) снижает fidelity до 40–50%.
9. Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | Архитектура RAG — открытый API как точка входа |
| 5 | Оценка retrieval — атака может использовать retrieval для генерации промптов |
| 10 | Self‑RAG — может быть более устойчив к экстракции (внутренние механизмы проверки) |
| 20 | Безопасность fine‑tuning — защита весов после обучения |
| 30 | Prompt injection — пересечение с атаками на API (социальная инженерия) |
| 45 | Уязвимости LLM (adversarial attacks) — классификация атак |
10. Навигация
- Предыдущий: 595
- Следующий: 597
- Индекс: 00. Индекс разборов
Навигация
- Предыдущий: 595
- Следующий: 597
- Индекс: 00. Индекс разборов