
Легковесный CLI-инструмент для систематического обнаружения и эксплуатации состояний гонки в веб-приложениях, API и современных сервисах.
Состояния гонки представляют собой одни из наиболее критичных уязвимостей безопасности в современных приложениях, однако они по-прежнему плохо покрываются автоматическими сканерами. В то время как такие инструменты, как Nuclei, ffuf и sqlmap, отлично находят статические уязвимости, они принципиально не способны выявлять проблемы, связанные с конкурентностью.
Перед пентестерами сегодня стоит выбор: вручную писать одноразовые скрипты для каждого проекта или вовсе пропустить тестирование состояний гонки. Ни один из вариантов не является масштабируемым или профессиональным.
RatRace решает эту проблему, предоставляя отлаженный, повторяемый рабочий процесс для тестирования состояний гонки — превращая то, что раньше было ad-hoc скриптингом, в систематический процесс, который интегрируется с CI/CD пайплайнами и генерирует профессиональные отчеты.
Уязвимости типа «состояние гонки» часто встречаются в критически важных областях:
Эти ошибки стабильно приносят самые высокие вознаграждения в программах bug bounty, поскольку они напрямую угрожают доходу бизнеса и доверию клиентов.
Опишите сценарий гонки один раз в YAML, используйте повторно в разных проектах. Формат повторяет шаблоны Nuclei для привычности:
id: checkout-race
info:
name: Гонка дублирования заказов при оформлении
severity: critical
race:
mode: burst
concurrency: 20
request:
method: POST
path: /api/v1/checkout
headers:
Authorization: "Bearer {{session}}"
body: '{"item_id": "SKU-001"}'
validate:
follow_up:
method: GET
path: /api/v1/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals
value: 1
Режим Burst — параллельные запросы на основе goroutine с точной синхронизацией (стабильный, готов к использованию в продакшене)
Last-Byte Sync — атака на уровне TCP HTTP/1.1 (реализация готова, фаза тестирования)
Single-Packet — атака на основе фреймов HTTP/2 (реализация готова, фаза тестирования)
RatRace автоматически:
equals, not_equals, greater_than, containsИмпорт существующих запросов:
# Из curl команд
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o template.yaml
# Из экспортированных файлов HAR из Burp
ratrace import --har session.har -o template.yaml
Автоматизация CI/CD:
ratrace race -u $TARGET -t template.yaml --silent
echo $? # Код выхода 10 = гонка найдена, 0 = чисто
Профессиональная отчетность:
# JSON для автоматизации
ratrace race -u $TARGET -t template.yaml -o results/
# HTML отчеты (планируется в V2)
ratrace report --input results.json --format html
git clone https://github.com/bogdanticu88/ratrace.git
cd ratrace
go build ./cmd/ratrace
./ratrace --help
Требования: Go 1.24+
docker build -t ratrace:latest .
docker run --rm -it ratrace:latest race -u https://api.example.com -t template.yaml
# 1. Импорт из curl или использование существующего шаблона
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o checkout.yaml
# 2. Выполнение гонки
ratrace race -u https://api.example.com -t checkout.yaml -m burst -c 20
# 3. Просмотр результатов
# Вывод показывает:
# 🔴 [CRITICAL] Гонка дублирования заказов при оформлении
# Уровень аномалий: 91.7%
# Достоверность: 84%
ratrace race \
-u https://shop.example.com \
-t examples/templates/checkout-race.yaml \
-m burst \
-c 25 \
--output results/
# Работает без подробных логов, завершается с семантическим кодом
ratrace race -u https://api.example.com -t template.yaml --silent
# Проверка кода выхода
if [ $? -eq 10 ]; then
echo "Состояние гонки найдено!"
exit 1
fi
ratrace race -u <url> -t <template> [options]
Опции:
-m, --mode string burst|lastbyte|singlepacket (по умолчанию из шаблона)
-c, --concurrency int Количество goroutine (по умолчанию 20)
-H, --header strings Пользовательские заголовки (повторяемые)
-x, --proxy string URL прокси для запросов
-o, --output string Каталог для вывода результатов
--timeout duration Таймаут запроса (по умолчанию 10s)
--insecure Пропустить проверку сертификата TLS
--dry-run Разобрать шаблон и выйти
--silent Подавить логи, показывать только результаты
ratrace import [--curl <команда> | --har <файл>] -o <output.yaml>
Преобразует существующие запросы (curl команды или экспорт HAR) в шаблоны RatRace.
Полезно для интеграции с существующими рабочими процессами.
ratrace report --input results.json --format [html|json] --output report.html
Генерирует человекочитаемые отчеты из результатов тестов гонки.
ratrace ratelimit -u <url> -c <concurrency>
Проверяет, уязвимы ли конечные точки к одновременному обходу ограничения скорости.
Шаблоны — это YAML-файлы, определяющие сценарий гонки. Полная справка:
id: unique-identifier
info:
name: "Человекочитаемое имя"
severity: critical|high|medium|low|info
tags: [tag1, tag2]