Защита модели от извлечения и реверс-инжиниринга

ONNX Runtime Web предоставляет возможность запускать модели машинного обучения в браузере на стороне клиента. При этом возникает риск несанкционированного доступа к самой модели, её весам и архитектуре. Для уменьшения вероятности извлечения и реверс-инжиниринга применяются несколько подходов, сочетающих шифрование, обфускацию и стратегию разбиения модели.

Хранение и доставка модели

Модели ONNX хранятся в формате .onnx, который является бинарным и открытым. Любой файл .onnx, переданный клиенту, потенциально может быть скачан и проанализирован. Для защиты применяются следующие методы:

  • Шифрование модели перед доставкой: модель сохраняется на сервере в зашифрованном виде (AES-256). На клиенте используется JavaScript-код для дешифровки перед инициализацией InferenceSession. Важным моментом является хранение ключа шифрования — его нельзя хранить в открытом виде в коде, поэтому используется серверный сервис для временной выдачи ключей с ограничением по времени действия.

  • Разделение модели на части: модель может быть разбита на несколько фрагментов и доставляться постепенно. Это усложняет попытку полного скачивания файла, так как отдельные части без правильного порядка или ключа дешифровки бесполезны.

Инициализация и загрузка в ONNX Runtime Web

Для работы с зашифрованной моделью используется потоковое считывание и расшифровка:

import * as ort from 'onnxruntime-web';

async function loadEncryptedModel(url, decryptKey) {
    const response = await fetch(url);
    const encryptedBuffer = await response.arrayBuffer();
    const decryptedBuffer = decryptModel(encryptedBuffer, decryptKey);
    const session = await ort.InferenceSession.create(decryptedBuffer);
    return session;
}

function decryptModel(buffer, key) {
    // AES-256 дешифровка
    // Реализовать с использованием SubtleCrypto
    const cryptoKey = crypto.subtle.importKey(
        'raw', key, { name: 'AES-CBC' }, false, ['decrypt']
    );
    return crypto.subtle.decrypt({ name: 'AES-CBC', iv: buffer.slice(0,16) }, cryptoKey, buffer.slice(16));
}

Важный момент: инициализация модели в браузере возможна только после успешной расшифровки. Без ключа модель останется недоступной.

Обфускация кода и защиты сессий

ONNX Runtime Web предоставляет API InferenceSession, через которое осуществляется вычисление. Для защиты модели применяются:

  • Обфускация JavaScript-кода, содержащего вызовы session.run() и обработку входных данных. Это затрудняет анализ алгоритма работы с моделью.
  • Динамическая генерация входов и маскирование данных, чтобы предотвратить простое извлечение весов через отладчик браузера.
  • Минимизация логирования и отключение инструментов отладки, чтобы при включенном DevTools нельзя было легко перехватить содержимое модели.

Контроль доступа и временные токены

Для дополнительной защиты создаются механизмы:

  • Временные URL на скачивание модели, доступные только после аутентификации и проверки прав пользователя.
  • Серверная выдача ключей расшифровки на ограниченное время. Клиент получает ключ только для одной сессии и только после успешной аутентификации.
  • Сигнатуры и контроль целостности: перед запуском модель проверяется на сервере по хэш-сумме или цифровой подписи, чтобы убедиться в том, что она не была подменена.

Разделение вычислений между клиентом и сервером

Для особо чувствительных моделей целесообразно переносить часть вычислений на сервер:

  • Предварительная обработка: клиент посылает данные в зашифрованном виде, сервер выполняет часть модели и возвращает промежуточные результаты.
  • Частичные модели: на клиенте хранится облегчённая версия модели (например, только feature extractor), а окончательный классификатор или регрессор выполняется на сервере.
  • Такой подход минимизирует риск полного реверс-инжиниринга, так как ключевые веса никогда не покидают сервер.

Методы защиты весов и архитектуры

  • Кастомные слои и операции: использование собственных слоёв с минимальной документацией затрудняет анализ.
  • Перемешивание и шифрование весов внутри .onnx: веса могут храниться в зашифрованной форме и дешифроваться на лету в памяти клиента.
  • Удаление метаданных: .onnx хранит информацию о слое, типе тензоров и атрибутах. Их удаление или замена на абстрактные имена затрудняет восстановление архитектуры.

Практические советы

  • Всегда использовать HTTPS для доставки моделей и ключей.
  • Не хранить ключи расшифровки в коде клиента.
  • Регулярно менять ключи и токены для доступа.
  • Комбинировать методы: шифрование, обфускацию, серверную проверку и частичные вычисления для максимальной защиты.

Эта стратегия позволяет снизить риск извлечения модели и затрудняет реверс-инжиниринг при использовании ONNX Runtime Web в браузере.