Разгоняем GateAI — часть 2: бесплатная модель против Claude

от автора

В первой части я разогнал 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 секунд. Причин оказалось несколько:

1. HTTP-клиент имел таймаут 120 секунд. Для ox-alpha этого мало — отдельный ответ иногда генерировался больше двух минут. Поднял таймаут до 10 минут.

2. 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 может выполнить записанный код при следующей перезагрузке.

Но здесь проявилась основная проблема:

1. 20 из 58 находок (34.5%) закончились по iteration limit of 10 reached.

2. По логам модель при этом продолжала нормально работать. Она читала файлы, проверяла настройки и искала следующие части цепочки. Просто заканчивались итерации.

Из-за этого она не дошла, например, до 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.

ссылка на оригинал статьи https://habr.com/ru/articles/1074726/