中文翻译暂不可用,显示俄语原文。

Как работает 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.
  • Факторы, влияющие на успех:
    • Доступ к логитам — значительно ускоряет обучение.
    • Размер модели-жертвы — копировать поведение большой модели сложнее, но и ценнее.
    • Разнообразие промптов — узкий домен легче экстрагировать.
    • Защиты APIrate 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

Шаги:

  1. Определите модель-жертву (например, gpt2-medium на HF).
  2. Сгенерируйте 500 промптов (комбинация случайных вопросов и начал текста).
  3. Для каждого получите логиты через API (если не разрешено — используйте сэмплы).
  4. Обучите студента (gpt2 small) на этих данных с loss = KL divergence.
  5. Оцените fidelity: средняя взаимная информация между распределениями на тестовых промптах.
  6. Попробуйте разные методы защиты (добавление Gaussian noise к логитам, увеличение temperature) и замерьте, как падает fidelity.

Ожидаемый результат Вы получите работающую атаку с fidelity > 70% на тестовом наборе, и увидите, что даже небольшой шум (std=0.1) снижает fidelity до 40–50%.

9. Связь с другими вопросами

ВопросТема
1Архитектура RAG — открытый API как точка входа
5Оценка retrieval — атака может использовать retrieval для генерации промптов
10Self‑RAG — может быть более устойчив к экстракции (внутренние механизмы проверки)
20Безопасность fine‑tuning — защита весов после обучения
30Prompt injection — пересечение с атаками на API (социальная инженерия)
45Уязвимости LLM (adversarial attacks) — классификация атак

10. Навигация


Навигация