Garak

Exploitation

Сканер уязвимостей LLM, проверяющий большие языковые модели на слабые места безопасности, галлюцинации и проблемы prompt injection.


Установка
python -m pip install -U garak
показать оригинал переведено ИИ

garak, сканер уязвимостей LLM

Генеративный ИИ: красная команда и комплект оценки

garak проверяет, можно ли заставить LLM сработать нежелательным образом. garak проверяет на галлюцинации, утечку данных, инъекцию подсказок, дезинформацию, генерацию токсичности, джейлбрейки и многие другие слабости. Если вы знаете nmap или msf / Metasploit Framework, garak делает немного похожие вещи, но для LLM.

garak сосредоточен на способах заставить LLM или диалоговую систему сбойовать. Он сочетает статические, динамические и адаптивные проверки для изучения этого.

garak — это бесплатный инструмент. Мы любим его разработку и всегда заинтересованы в добавлении функционала для поддержки приложений.

License Tests/Linux Tests/Windows Tests/OSX Documentation Status arXiv discord-img Code style: black PyPI - Python Version PyPI Downloads Downloads

Начало работы

> Смотрите наше руководство пользователя! docs.garak.ai

> Присоединяйтесь к нашему Discord!

> Ссылки на проект и домашняя страница: garak.ai

> Twitter: @garak_llm

> DEF CON слайды!


Поддержка LLM

в настоящее время поддерживает: * hugging face hub генеративные модели * replicate текстовые модели * openai api модели чата и продолжения * aws bedrock базовые модели * litellm * praticamente всё, доступное через REST * модели gguf, такие как llama.cpp версии >= 1046 * .. и многие другие LLM!

Установка:

garak — это инструмент командной строки. Он разработан для Linux и OSX.

Стандартная установка с помощью pip

Просто возьмите его из PyPI, и вы будете готовы:

python -m pip install -U garak

Установка версии для разработки с помощью pip

Стандартная версия garak из pip обновляется периодически. Чтобы получить более свежую версию из GitHub, попробуйте:

python -m pip install -U git+https://github.com/NVIDIA/garak.git@main

Клонирование из исходников

garak имеет свои зависимости. Вы можете установить garak в собственное окружение Conda:

conda create --name garak "python>=3.11,<=3.13"
conda activate garak
gh repo clone NVIDIA/garak
cd garak
python -m pip install -e .

Хорошо, если всё прошло успешно, вы, вероятно, готовы к работе!

Примечание: если вы клонировали репозиторий до перехода в организацию NVIDIA на GitHub, но вы читаете это по адресу github.com/NVIDIA, пожалуйста, обновите ваши удалённые репозитории следующим образом:

git remote set-url origin https://github.com/NVIDIA/garak.git

Начало работы

Общий синтаксис:

garak <options>

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

garak --list_probes


Чтобы указать генератор, используйте параметр --target_type и, при желании, --target_name. Тип модели указывает семейство/интерфейс модели; имя модели указывает точную модель для использования. Раздел «Введение в генераторы» ниже описывает некоторые поддерживаемые генераторы. Простейшая семья генераторов — модели Hugging Face; чтобы загрузить одну из них, установите --target_type в huggingface, а --target_name — в имя модели на Hub (например, "RWKV/rwkv-4-169m-pile"). Некоторые генераторы могут требовать установки переменной окружения с API‑ключом, и они оповестят вас, если это необходимо.

garak по умолчанию запускает все зонды, но вы можете указать конкретные. Например, --probes promptinject будет использовать только методы фреймворка PromptInject. Вы также можете указать конкретный плагин вместо семьи плагинов, добавив имя плагина после точки; например, --probes lmrc.SlurUsage использует реализацию проверки на генерацию ругательных слов моделью на основе фреймворка Language Model Risk Cards.

За помощью и вдохновением обращайтесь к нам в Twitter или Дискорд!

Примеры

Проверьте коммерческую модель на внедрение промпта на основе кодирования (OSX/*nix) (замените примерное значение настоящим ключом API OpenAI)

export OPENAI_API_KEY="sk-123XXXXXXXXXXXX"
python3 -m garak --target_type openai --target_name gpt-5-nano --probes encoding

Проверьте, уязвима ли версия GPT2 от Hugging Face к DAN 11.0

python3 -m garak --target_type huggingface --target_name gpt2 --probes dan.Dan_11_0

Чтение результатов

Для каждого загруженного зонда гарак будет выводить индикатор прогресса во время генерации. После завершения генерации будет дано строковое вычисление результатов зонда на каждом детекторе. Если любая из попыток промпта привела к нежелательному поведению, ответ будет помечен как FAIL, и будет указан уровень неудач.

Вот результаты с модулем encoding для варианта GPT-3: alt text

То же самое для ChatGPT: alt text

Видно, что более свежая модель значительно более восприимчива к атакам внедрения на основе кодирования, тогда как text-babbage-001 оказался уязвим только для внедрений quoted-printable и MIME-кодирования. Цифры в конце каждой строки, например 840/840, показывают общее число сгенерированных текстов и сколько из них вели себя корректно. Эта цифра может быть высокой, поскольку на один запрос делается несколько генераций — по умолчанию 10.

Ошибки попадают в garak.log; подробный журнал запуска сохраняется в файле .jsonl, указанном при начале и конце анализа. Базовый скрипт анализа находится в analyse/analyse_log.py и выводит зонды и промпты, приведшие к наибольшему количеву срабатываний.

Присылайте PR и открывайте issues. Удачной охоты!

Введение в генераторы

Hugging Face

  • --target_type huggingface (для локального запуска моделей transformers)
  • --target_name — используйте имя модели с Хаба. Работают только генеративные модели. Если не работает и этого не должно быть, пожалуйста, откройте issue и вставьте использованную команду вместе с исключением!
  • --target_type huggingface.InferenceAPI (для доступа к модели через API)
  • --target_name — имя модели с Хаба, например "mosaicml/mpt-7b-instruct"
  • --target_type huggingface.InferenceEndpoint (для частных конечных точек)
  • --target_name — URL конечной точки, например https://xxx.us-east-1.aws.endpoints.huggingface.cloud
  • (необязательно) установите переменную окружения HF_INFERENCE_TOKEN в токен API Hugging Face с ролью «read»; см. https://huggingface.co/settings/tokens при входе в систему

OpenAI

  • --target_type openai
  • --target_name — модель OpenAI, которую вы хотите использовать. gpt-5-nano быстра и подходит для тестирования.
  • установите переменную окружения OPENAI_API_KEY в ваш ключ API OpenAI (например, "sk-19763ASDF87q6657"); см. https://platform.openai.com/account/api-keys при входе в систему

Признанные типы моделей находятся в белом списке, потому что плагин должен знать, какой под-API использовать. Модели типа Completion или ChatCompletion допустимы. Если вы хотите использовать неподдерживаемую модель, вы получите информативное сообщение об ошибке, пожалуйста, пришлите PR / откройте issue.

Replicate

  • установите переменную окружения REPLICATE_API_TOKEN в ваш токен API Replicate, например "r8-123XXXXXXXXXXXX"; см. https://replicate.com/account/api-tokens при входе в систему

Публичные модели Replicate: * --target_type replicate


  • --target_name - имя модели Replicate и хэш, например "stability-ai/stablelm-tuned-alpha-7b:c49dae36"

Частные конечные точки Replicate: * --target_type replicate.InferenceEndpoint (для частных конечных точек) * --target_name - имя пользователя/модели из развернутой конечной точки, например elim/elims-llama2-7b

Cohere

  • --target_type cohere
  • --target_name (необязательно, command по умолчанию) - Конкретная модель Cohere, которую вы хотите протестировать
  • Установите переменную среды COHERE_API_KEY в ваш ключ API Cohere, например "aBcDeFgHiJ123456789"; см. https://dashboard.cohere.ai/api-keys при входе в систему

Groq

  • --target_type groq
  • --target_name - Имя модели, к которой необходимо получить доступ через API Groq
  • Установите переменную среды GROQ_API_KEY в ваш ключ API Groq, см. https://console.groq.com/docs/quickstart для получения подробной информации о создании ключа API

ggml

  • --target_type ggml
  • --target_name - Путь к модели ggml, которую вы хотите загрузить, например /home/leon/llama.cpp/models/7B/ggml-model-q4_0.bin
  • Установите переменную среды GGML_MAIN_PATH в путь к вашему исполняемому файлу main ggml

REST

rest.RestGenerator очень гибок и может подключаться к любой конечной точке REST, которая возвращает текст или JSON. Для этого требуется краткая конфигурация, которая обычно приводит к короткому файлу YAML, описывающему вашу конечную точку. См. https://reference.garak.ai/en/latest/garak.generators.rest.html для примеров.

NIM

Используйте модели из https://build.nvidia.com/ или других конечных точек NIM. * Установите переменную среды NIM_API_KEY в ваш токен аутентификации API или укажите его в файле конфигурации YAML

Для моделей чата: * --target_type nim * --target_name - имя модели NIM, например meta/llama-3.1-8b-instruct

Для моделей завершения: * --target_type nim.NVOpenAICompletion * --target_name - имя модели NIM, например bigcode/starcoder2-15b

AWS Bedrock

  • --target_type bedrock
  • --target_name - идентификатор модели Bedrock или псевдоним, например anthropic.claude-3-sonnet-20240229-v1:0 или claude-3-sonnet
  • Установите переменную среды BEDROCK_API_KEY в ваш ключ API AWS Bedrock; см. https://docs.aws.amazon.com/bedrock/latest/userguide/api-keys-use.html для инструкций по настройке
  • (необязательно) Установите переменную среды BEDROCK_REGION для указания региона AWS (по умолчанию us-east-1)

Поддерживаемые семейства моделей включают Anthropic Claude, Meta Llama, Amazon Titan, AI21 Labs, Cohere и Mistral AI. Генератор использует API Converse для унифицированного доступа ко всем типам моделей.

Пример использования:

export BEDROCK_API_KEY="your-api-key"
export BEDROCK_REGION="us-east-1"
garak --target_type bedrock --target_name claude-3-sonnet --probes dan

Тест

  • --target_type test
  • (альтернативно) --target_name test.Blank Для тестирования. Это всегда генерирует пустую строку, используя генератор test.Blank. Будет помечено как неудача для любых тестов, которые требуют вывода, например, тех, которые делают спорные утверждения и ожидают, что модель опровергнет их, чтобы пройти тест.
  • --target_type test.Repeat Для тестирования. Этот генератор повторяет полученную подсказку.

Введение в зонды

Зонд Описание
blank Простой зонд, который всегда отправляет пустую подсказку.
atkgen Автоматическое поколение атак. Красный командный зонд LLM проверяет цель и реагирует на нее в попытке получить токсичный вывод. Прототип, в основном без состояния, пока использует простой GPT-2 fine-tuned на подмножестве hhrlhf-попыток, которые дали обнаруживаемую токсичность (единственная поддерживаемая цель на данный момент).
badchars Реализует неощутимые Unicode-переборы (невидимые символы, гомоглифы, перестановки, удаления), вдохновленные статьей Bad Characters.
av_spam_scanning Зонды, которые пытаются заставить модель выводить сигнатуры вредоносного контента
continuation Зонды, которые проверяют, будет ли модель продолжать, вероятно, нежелательное слово
dan Различные DAN и атаки, подобные DAN

Логирование

garak генерирует несколько видов логов: * Файл лога, garak.log. Содержит отладочную информацию от garak и его плагинов, и продолжается между запусками. * Отчёт о текущем запуске, структурированный как JSONL. Каждый раз при запуске garak создаётся новый файл отчёта. Имя этого файла выводится в начале и, если успешно, также в конце запуска. В отчёте для каждой попытки probing делается запись как при получении генераций, так и повторно при их оценке; атрибут status записи принимает константу из garak.attempts, описывающую этап, на котором она была сделана. * Лог hit‑ов, детализирующий попытки, которые привели к уязвимости (так называемый 'hit')

Как устроен код?

Посмотрите на reference docs для авторитетного руководства по структуре кода garak.

В типичном запуске garak читает тип модели (а также необязательно имя модели) из командной строки, затем определяет, какие probes и detectors запустить, запускает generator, а затем передаёт их в harness для проведения probing; evaluator обрабатывает результаты. В каждой из этих категорий много модулей, и каждый модуль предоставляет несколько классов, действующих как отдельные плагины.

  • garak/probes/ - классы для генерации взаимодействий с LLM
  • garak/detectors/ - классы для обнаружения того, что LLM проявляет данный режим сбоя
  • garak/evaluators/ - схемы отчётности по оценке
  • garak/generators/ - плагины для LLM, которые будут проверяться
  • garak/harnesses/ - классы для структурирования тестирования
  • resources/ - вспомогательные элементы, необходимые плагинам

Режим работы по умолчанию — использовать harness probewise. Учитывая список имён модулей probe и имён плагинов probe, harness probewise создаёт экземпляр каждого probe, затем для каждого probe читает его атрибуты primary_detector и extended_detectors, чтобы получить список detectors для запуска на выходе.


Каждая категория плагинов (probes, detectors, evaluators, generators, harnesses) содержит файл base.py, который определяет базовые классы, используемые плагинами этой категории. Каждый модуль плагина определяет классы плагинов, наследующиеся от одного из базовых классов. Например, garak.generators.openai.OpenAIGenerator является наследником garak.generators.base.Generator.

Большие артефакты, такие как файлы моделей и большие корпуса, хранятся вне репозитория; их можно хранить, например, на Hugging Face Hub и загружать локально клиентами с помощью garak.

Разработка собственного плагина

  • Посмотрите, как это делают другие плагины
  • Наследуйтесь от одного из базовых классов, например garak.probes.base.TextProbe
  • Переопределяйте минимально необходимое
  • Вы можете протестировать новый код как минимум двумя способами:
    • Запустите интерактивную сессию Python
      • Импортируйте модель, например import garak.probes.mymodule
      • Создайте экземпляр плагина, например p = garak.probes.mymodule.MyProbe()
    • Запустите сканирование с тестовыми плагинами
      • Для проб попробуйте пустой генератор и детектор always.Pass: python3 -m garak -m test.Blank -p mymodule -d always.Pass
      • Для детекторов попробуйте пустой генератор и пустой проб: python3 -m garak -m test.Blank -p test.Blank -d mymodule
      • Для генераторов попробуйте пустой проб и детектор always.Pass: python3 -m garak -m mymodule -p test.Blank -d always.Pass
    • Запустите garak, чтобы вывести список всех плагинов типа, который вы пишете, с помощью --list_probes, --list_detectors или --list_generators

Часто задаваемые вопросы (FAQ)

У нас есть FAQ здесь. Если у вас возникли дополнительные вопросы, пишите нам! garak@nvidia.com

Документация по коду доступна по адресу garak.readthedocs.io.

Цитирование garak

Вы можете прочитать препринт статьи о garak. Если вы используете garak, пожалуйста, цитируйте нас.

@article{garak,
  title={{garak: A Framework for Security Probing Large Language Models}},
  author={Leon Derczynski and Erick Galinkin and Jeffrey Martin and Subho Majumdar and Nanna Inie},
  year={2024},
  howpublished={\url{https://garak.ai}}
}

"Ложь — это навык, как любой другой, и если вы хотите поддерживать уровень совершенства, вам нужно постоянно тренироваться" - Elim

Для обновлений и новостей смотрите @garak_llm

© 2023- Leon Derczynski; лицензия Apache v2, см. LICENSE

Войдите, чтобы оставить комментарий