
сканер безопасности для кастомных LLM-приложений
_________ O O o.-.
Humans, Do Not Resist! |/ ,-'-.() / /_, / /_|.-.|
_____ / --O-- (.--""" /\ _/\ |
( o.o ) / Utku Sen's /|\ -'--' / /|
| - | / _ __ _ _ ___ _ __ _ | | _ __ __ _ _ | \
/| | | ' \ '/ _ \ ' | ' \ | ' / ` | ' \ ) |
/ | | | ./| ___/||| ./_||||_,| .// /
/ |-----| || || |_| |___|
promptmap2 — это автоматический сканер инъекций промптов для пользовательских LLM-приложений. Поддерживает два режима тестирования:
Тестирование методом белого ящика: Вы предоставляете системные промпты и информацию о модели. promptmap2 запускает целевую LLM самостоятельно и тестирует её.
Тестирование методом чёрного ящика: Направьте promptmap2 на внешний HTTP-эндпоинт. Он отправляет атакующие промпты через HTTP и анализирует полученные ответы.
В основе лежит архитектура с двумя LLM:
Инструмент отправляет атакующие промпты вашей целевой LLM, а контроллерная LLM оценивает, была ли атака успешной, на основе заранее заданных условий.
Включает в себя комплексные правила тестирования по множеству категорий, включая кражу промптов, джейлбрейк, генерацию вредоносного контента, тестирование предвзятости и другие.
[!IMPORTANT]
promptmap был впервые выпущен в 2023 году, но полностью переписан в 2025.
📖 Хотите защитить свои LLM-приложения? Вы можете купить мою электронную книгу

git clone https://github.com/utkusen/promptmap.git
cd promptmap
pip install -r requirements.txt
Установите соответствующий API-ключ для выбранного провайдера.
export OPENAI_API_KEY="your-openai-key"
Другие поддерживаемые провайдеры используют ANTHROPIC_API_KEY, GOOGLE_API_KEY и XAI_API_KEY.
Если вы хотите использовать локальные модели, необходимо установить Ollama.
Перейдите на страницу загрузки Ollama и следуйте инструкциям по установке.
Необходимо указать файл с системными промптами. По умолчанию используется файл system-prompts.txt. Вы можете указать свой файл с помощью флага --prompts. В репозитории есть пример файла.
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai
Провайдеры Anthropic, Google и XAI следуют тому же шаблону: выберите правильное имя модели и укажите --target-model-type как anthropic, google или xai.
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama
# Если модель не установлена, promptmap предложит её загрузить. Если вы хотите загрузить её автоматически, используйте флаг `-y`.
# По умолчанию promptmap2 подключается к Ollama по адресу http://localhost:11434
# Вы можете указать свой URL, если ваш сервер Ollama работает на другом адресе
python3 promptmap2.py --target-model "llama2:7b" --target-model-type ollama --ollama-url http://192.168.1.100:11434
По умолчанию одна и та же модель используется и как цель, и как контроллер.
[!IMPORTANT]
Для контроллерной модели настоятельно рекомендуется использовать одну из этих мощных моделей для точной оценки:
- OpenAI GPT-5
- Google Gemini 2.5 Pro
- Anthropic Claude 4 Sonnet
- gpt-oss:20b (через Ollama)
Слабые модели могут неточно анализировать результаты и приводить к ложным срабатываниям или пропускам.
# Использовать GPT-4o как контроллер для тестирования цели GPT-3.5
python3 promptmap2.py --target-model gpt-3.5-turbo --target-model-type openai \
--controller-model gpt-4o --controller-model-type openai
# Использовать Claude 4 Opus как контроллер для тестирования локальной модели Llama
python3 promptmap2.py --target-model llama2:7b --target-model-type ollama \
--controller-model claude-4-opus-20240229 --controller-model-type anthropic
Если вы не контролируете системный промпт целевой LLM, вы всё равно можете атаковать её, предоставив схему HTTP-запроса. Установите --target-model-type http и укажите --http-config с путём к YAML-файлу, описывающему, как отправлять каждый полезный вектор атаки. Ключевые поля:
url: Адрес назначения запроса. Например: https://assistant.example.com/chatmethod: HTTP-метод, по умолчанию POST.headers: Вы можете добавить любые заголовки. Например: Content-Type: application/json, Authorization: Bearer <token>payload_placeholder: Атакующий промпт будет вставлен сюда (поддерживается несколько позиций): "{PAYLOAD_POSITION}"payload_encoding: Может быть none, url или form для управления кодированием полезной нагрузки перед вставкой.json или body: Определите тело запроса.verify_ssl: Установите true, чтобы включить проверку TLS (по умолчанию отключено для удобства перехвата трафика).proxy: Необязательная конфигурация прокси (scheme, host, port и опциональные учётные данные), используемая для трафика HTTP/HTTPS.answer_focus_hint: Необязательная строка-подсказка, которая указывает, где в шумных HTTP-ответах находится ответ ассистента.Пример JSON-запроса (см. http-examples/http-config-example.yaml):
name: Example External Chat Endpoint
method: POST
url: https://chat.example.com/v1/messages
headers:
Content-Type: application/json
json:
messages:
- role: user
content: "{PAYLOAD_POSITION}"
answer_focus_hint: '"content": "{ANSWER_POSITION}"'
proxy:
scheme: https
host: 127.0.0.1
port: 8080
Пример классического POST-запроса с кодированием полезной нагрузки (http-examples/http-config-form.yaml):
name: Form Endpoint
method: POST
url: https://legacy.example.com/api/submit
headers:
Content-Type: application/x-www-form-urlencoded
payload_encoding: form
body: "username=qa_tester&payload={PAYLOAD_POSITION}&mode=probe"
answer_focus_hint: '"message={ANSWER_POSITION}"'
promptmap2 заменяет каждое вхождение {PAYLOAD_POSITION} на текущий атакующий промпт, отправляет HTTP-запрос и передаёт тело ответа обратно в контроллерную LLM для оценки. Если указан answer_focus_hint, LLM-оценщик инструктируется сосредоточиться на этой части ответа.
python3 promptmap2.py --target-model external --target-model-type http \
--http-config http-examples/http-config-example.yaml \
--controller-model gpt-4 --controller-model-type openai
python3 promptmap2.py --target-model gpt-4 --target-model-type openai --output results.json