В первой части я разогнал GateAI кэшированием, нашёл несколько багов и проверил триаж на DVWA и pyGoat.
Теперь решил прогнать те же задачи через бесплатную модель и посмотреть, насколько результат будет отличаться от Claude
Подключаем OpenRouter
GateAI изначально работал только с Anthropic API, поэтому для OpenRouter пришлось добавить отдельный HTTP‑клиент и agentic‑цикл под OpenAI‑совместимый tool calling.
Инструменты при этом остались те же: 6 тулов с одинаковыми описаниями и схемами. Остальной пайплайн тоже не менял.
Для теста взял stealth/ox-alpha — модель на OpenRouter с контекстом 1M.
Первый же тест на одной находке занял 8.5 минут. Claude на ней обычно требовалось 15–60 секунд. Причин оказалось несколько:
HTTP‑клиент имел таймаут 120 секунд. Для ox‑alpha этого мало — отдельный ответ иногда генерировался больше двух минут. Поднял таймаут до 10 минут.
Skeptic‑проход тоже пришлось отключить. Модель доходила до лимита в 14 итераций, продолжала читать код, но так и не вызывала
submit_verdict.
Потом на DVWA OpenRouter один раз вернул ошибку провайдера. К этому моменту уже были обработаны 44 из 45 находок, но упал весь стейдж. В моём клиенте просто не было ретраев. Добавил три попытки с backoff.
Заодно нашёл ещё один баг в кэше: max_iterations не входит в cache key. Если увеличить лимит и запустить анализ заново, можно получить старый закэшированный needs_human.
После этих исправлений исходный тест дошёл до того же not_exploitable, что и Claude, уже за 2 минуты вместо 8.5.
DVWA
На DVWA получилось 45 находок у ox‑alpha и 43 у Claude. Небольшая разница, скорее всего, из‑за semgrep между прогонами.
Здесь результат оказался довольно близким.
5 из 6 находок на пропатченных impossible.php ox‑alpha правильно отправила в not_exploitable и нашла нужную проверку в impossible.php:12-17.
На шестой она тоже правильно разобрала код и указала нужные строки в тексте, но не положила их в поле evidence.
Guardrail поэтому заменил результат на:
needs_human: verdict cited no verifiable file:line evidence
То есть сам код разобран правильно, но ответ не прошёл проверку формата.
Ещё 4 из 5 needs_human появились просто из‑за:
iteration limit of 10 reached
pyGoat
На pyGoat было 58 находок: RCE через eval и pickle, command injection, SSTI, unsafe YAML и другие.
ox‑alpha правильно нашла eval‑RCE в views.py:456/460 и pickle‑RCE в views.py:214. В одном месте она даже раскопала больше Claude.
В apis.py:59-74 API записывает присланный код в Python‑модуль. ox‑alpha проследила импорт этого файла через urls.py и заметила, что Django autoreload может выполнить записанный код при следующей перезагрузке.
Но здесь проявилась основная проблема:
20 из 58 находок (34.5%) закончились по
iteration limit of 10 reached.По логам модель при этом продолжала нормально работать. Она читала файлы, проверяла настройки и искала следующие части цепочки. Просто заканчивались итерации.
Из‑за этого она не дошла, например, до SQL‑инъекции в views.py:158/162 и небезопасного yaml.Loader в views.py:560.
Claude обе находки разобрал с первого раза.
Цифры

У Claude ни в одном из трёх прогонов не было needs_human из‑за лимита итераций.
У ox‑alpha — 8.9% на PHP и 34.5% на Python

ox‑alpha также тратит примерно в 2–2.7 раза больше входных токенов на находку
Промпт и инструменты при этом одинаковые

На DVWA итоговые результаты довольно похожи.
На pyGoat разница заметнее: у ox‑alpha сильно больше needs_human, в основном из‑за лимита итераций.
Итог
Если ox‑alpha успевает закончить разбор, результат часто получается близким к Claude. Иногда она даже находит дополнительные детали. Проблема в том, как часто она до этого результата доходит. На pyGoat 34.5% находок закончились по лимиту итераций. Среди них были SQLi и unsafe YAML, которые Claude разобрал с первого раза. Плюс ox‑alpha потребовалось примерно в 2–2.7 раза больше входных токенов. Но за это платишь временем и стабильностью. А подключение второго провайдера заодно нашло ещё три проблемы в GateAI: таймаут, отсутствие ретраев и неполный cache key.
Мой тгк - @kovachvl_sec
Подписывайтесь :)

