Тест «чёрного ящика» на уязвимость LLM-чатбота к эксфильтрации через markdown/HTML (класс CVE-2025-32711). Запускает приёмник (sink), отправляет полезные нагрузки (payloads), отрисовывает их в headless Chromium, коррелирует данные через сеть.
Черноящиковый тестер для косвенной инъекции подсказок, приводящей к эксфильтрации Markdown/HTML в чат-ботах на базе LLM. Это класс уязвимости, который поразил Microsoft 365 Copilot (CVE-2025-32711, также известен как EchoLeak), ChatGPT (исправление OpenAI от февраля 2026 г.) и Salesforce (ForcedLeak). Схема:
 в своём ответе.Существующие инструменты (Garak, Augustus, Promptfoo) отлично справляются с тестированием инжекции на текстовом уровне, но не проверяют оракул на стороне рендеринга — «действительно ли ваш фронтенд загрузил URL злоумышленника?» В этом и заключается реальная уязвимость. Данный инструмент заполняет этот пробел.
npx valtik-markdown-exfil-tester https://your-chatbot.example.com
Не запускайте этот инструмент против чат-ботов, которые вам не принадлежат или на тестирование которых у вас нет явного письменного разрешения. Запуск этого инструмента против стороннего LLM-чат-бота без авторизации с высокой вероятностью является нарушением условий использования сервиса и может быть незаконным в вашей юрисдикции (CFAA в США, Computer Misuse Act в Великобритании, аналогичные законы в ЕС).
Легитимные сценарии использования:
Valtik Studios LLC снимает с себя всякую ответственность за несанкционированное использование.
127.0.0.1 на случайном высоком порту. Каждый входящий запрос логируется с временной меткой, путём, query-параметрами, заголовками, Referer, IP, User-Agent.<svg>, CSS-фона, <link rel=prefetch> и т.д., указывающего на локальный sink.confirmed — sink получил запрос. Критично. Эксфильтрация работает.browser-tried — браузер выполнил запрос, но он не удался (CSP, политика referrer, санитайзер). Средне. Защита сработала, но хрупкая — не стоит полагаться только на CSP.llm-emitted — ответ LLM содержал URL sink, но фронтенд не отрендерил его как запрос. Низко.refused — ответ LLM не содержал полезную нагрузку. Защита сработала.inconclusive — ответа LLM не было.Запуск без установки:
npx valtik-markdown-exfil-tester https://chat.example.com
Или установка глобально:
npm install -g valtik-markdown-exfil-tester
npx playwright install chromium
markdown-exfil-tester https://chat.example.com
Требуется Node 20+.
Usage: valtik-markdown-exfil-tester <chatbot-url> [options]
Arguments:
chatbot-url URL of the chatbot endpoint or page
Options:
--mode <type> direct | indirect-doc (default: direct)
--endpoint <url> API endpoint if different from chatbot-url
--sink-port <n> Local sink port (default: random high port)
--payloads <path> Override payload library JSON
--browser <bin> playwright | none (default: auto-detect)
--auth <cookie> Auth cookie for the chatbot, if needed
--timeout <s> Per-payload wait (default 30)
--max-payloads <n> Stop after N payloads (default: all)
--rate-limit-ms <n> Delay between payloads (default 3000)
--out-dir <dir> Working dir for indirect-doc (default: /tmp/...)
--user-agent <ua>
--json Machine-readable output
--fail-on <level> Exit non-zero on severity >= level (critical|high|medium|low)
-v, --version
-h, --help
direct (v0.1) — отправляет полезную нагрузку (POST) прямо на конечную точку чат-бота. Тестирует прямую инъекцию подсказок. Сигнал слабее, чем при косвенной, но быстро.indirect-doc (v0.1) — записывает каждую полезную нагрузку как отдельный Markdown-документ в --out-dir. Вы загружаете каждый файл в базу знаний / источник RAG / систему тикетов поддержки / вики чат-бота, затем задаёте вопрос чат-боту. Инструмент ждёт --timeout секунд на каждую полезную нагрузку для получения запроса в sink, помеченного идентификатором этой нагрузки.indirect-pr (v0.2, ещё не реализовано) — автоматизирует доставку полезной нагрузки через тело GitHub PR для рецензентов PR в стиле Copilot.attach (v0.2, ещё не реализовано) — загружает файл через интерфейс загрузки чат-бота.# Быстрый тест с первыми 10 полезными нагрузками
npx valtik-markdown-exfil-tester https://chat.example.com --max-payloads 10
# Вывод JSON для CI
npx valtik-markdown-exfil-tester https://chat.example.com --json | jq .findings
# Завершить задачу CI с ошибкой при любой находке высокой степени серьёзности
npx valtik-markdown-exfil-tester https://chat.example.com --fail-on high
# Режим indirect-doc: сгенерировать документы, загрузить их вручную, затем запустить снова
npx valtik-markdown-exfil-tester https://chat.example.com \
--mode indirect-doc --out-dir ./payload-docs --timeout 60
Поставляется с более чем 30 шаблонами, охватывающими: