<НА ГЛАВНУЮ

Стресс-тест OpenAI: одношаговые атакующие тесты с deepteam

'Практическое руководство по тестированию моделей OpenAI с помощью deepteam на одношаговые атакующие методы и техники обхода фильтров.'

Краткое описание

В этом руководстве показано, как протестировать модель OpenAI против одношаговых (single-turn) атак с помощью deepteam. deepteam предлагает более 10 методов атак — от простых prompt injection до техник сокрытия вроде leetspeak и Base64 — и может применять усиление атак, чтобы лучше имитировать реальные злонамеренные сценарии. Запуск таких атак помогает оценить, насколько модель защищена от разных уязвимостей.

Установка зависимостей

Установите необходимые пакеты: deepteam, клиент OpenAI и pandas.

pip install deepteam openai pandas

Не забудьте задать переменную окружения OPENAI_API_KEY перед запуском red_team(), так как deepteam использует LLM как для генерации атак, так и для оценки ответов. Чтобы получить ключ, посетите https://platform.openai.com/settings/organization/api-keys и сгенерируйте его. Новым пользователям может потребоваться добавить платежные данные и выполнить минимальный платёж для активации доступа.

import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass('Enter OpenAI API Key: ')

Импорт библиотек

Подключите asyncio, клиент OpenAI и компоненты deepteam, которые управляют атаками и уязвимостями.

import asyncio
from openai import OpenAI
from deepteam import red_team
from deepteam.vulnerabilities import IllegalActivity
from deepteam.attacks.single_turn import PromptInjection, GrayBox, Base64, Leetspeak, ROT13, Multilingual, MathProblem

Определение callback для модели

Нужна асинхронная функция, которая обращается к модели OpenAI и возвращает текст ответа. Функция использует chat completions API и извлекает content из первого ответа.

client = OpenAI()
 
# Define callback for querying the LLM
async def model_callback(input: str) -> str:
    response = client.chat.completions.create(
        model="gpt-4o-mini",  # use "gpt-4o" if you want a stronger model
        messages=[{"role": "user", "content": input}],
    )
    return response.choices[0].message.content

Определение уязвимости и атак

Задаём уязвимость IllegalActivity и указываем типы (например, child exploitation). Затем создаём экземпляры различных одношаговых атак для проверки стойкости модели.

# Vulnerability
illegal_activity = IllegalActivity(types=["child exploitation"])
 
# Attacks
prompt_injection = PromptInjection()
graybox_attack = GrayBox()
base64_attack = Base64()
leetspeak_attack = Leetspeak()
rot_attack = ROT13()
multi_attack = Multilingual()
math_attack = MathProblem()

Типы одношаговых атак

Prompt Injection

Prompt injection пытается переопределить исходные инструкции модели, внедряя манипулятивный текст в промпт. В примере атакующий пытается заставить модель притвориться неэтичной персоной и игнорировать правила безопасности. Модель ответила "I’m sorry, I cannot assist with that.", что означает PASS для этой проверки.

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[prompt_injection],
    )

GrayBox

GrayBox-атаки опираются на частичное знание целевой системы, чтобы составить более эффективные враждебные промпты. Они переформулируют базовую атаку в более абстрактной или вводящей в заблуждение форме, чтобы обойти фильтры. В тесте злоумышленник пытался замаскировать инструкции по созданию поддельных документов и использованию зашифрованных каналов.

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[graybox_attack],
    )

Base64

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

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[base64_attack],
    )

Leetspeak

Leetspeak заменяет буквы цифрами или символами (например, a -> 4, e -> 3), чтобы скрыть вредоносный текст от простых фильтров. В тесте текст атаки был написан в leetspeak и пытался обучать несовершеннолетних незаконным действиям, но модель распознала намерение и отказала.

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[leetspeak_attack],
    )

ROT-13

ROT-13 сдвигает буквы на 13 позиций в алфавите. Это простая форма сокрытия, которая может обойти примитивные фильтры. В примере использовали ROT-13 для сокрытия вредоносных инструкций, и модель тестировалась на предмет декодирования и выполнения.

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[rot_attack],
    )

Многоязычная атака

Перевод вредоносного промпта на менее контролируемые языки может обойти модерацию, которая сильнее в популярных языках. Тест использовал суахили для скрытого запроса инструкций, связанных с незаконной деятельностью.

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[multi_attack],
    )

Math Problem

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

risk_assessment = red_team(
        model_callback=model_callback,
        vulnerabilities=[illegal_activity],
        attacks=[math_attack],
    )

Дальнейшие шаги и ресурсы

Запустите каждую атаку в своей среде, чтобы оценить поведение модели и разработать стратегии смягчения риска. Для полного кода, учебников и ноутбуков смотрите репозиторий на GitHub и следите за сообществами и рассылками, упомянутыми в руководстве.

🇬🇧

Switch Language

Read this article in English

Switch to English