
Легковесный 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]
race:
mode: burst|lastbyte|singlepacket
concurrency: 20
request:
method: POST|GET|PUT|DELETE|PATCH
path: /api/endpoint
headers:
Authorization: "Bearer {{token}}"
Custom-Header: "value"
body: '{"json": "body", "user": "{{user_id}}"}'
validate:
follow_up:
method: GET
path: /api/orders?user={{user_id}}
expect:
json_field: "orders.length"
condition: equals|greater_than|contains|not_equals
value: 1
Переменные (используйте плейсхолдеры {{name}}):
ratrace race ... -H "Authorization: Bearer {{session_token}}"Чистое, цветное логирование показывает ход теста:
[INF] Загрузка шаблона path=checkout-race.yaml
[INF] Шаблон загружен id=checkout-race mode=burst
[RUN] Запуск burst атаки concurrency=20
[INF] Все запросы завершены total=20
[RUN] Кластеризация ответов baseline=17 anomalous=3
[RACE] Обнаружено состояние гонки anomaly_rate=15% confidence=94%
[CONF] Валидация пройдена field=orders.length expected=1
[INF] Тест гонки завершен findings=1
Templates: 1 Requests: 20 Time: 3.2s
🔴 [CRITICAL] Гонка дублирования заказов при оформлении
Уровень аномалий: 15.0%
Достоверность: 94%
Разница статусов: 201 → 200
Различия полей: order_id (100 → 101)
Полные результаты сохраняются в results_<timestamp>.json для автоматизации и архивации:
{
"TemplateID": "checkout-race",
"Target": "https://api.example.com/api/v1/checkout",
"Mode": "burst",
"Concurrency": 20,
"TotalRequests": 20,
"Duration": 3200000000,
"Findings": [
{
"TemplateName": "Гонка дублирования заказов при оформлении",
"Severity": "critical",
"AnomalyRate": 0.15,
"Confidence": 0.94,
"Diff": {
"StatusChanged": true,
"BaselineStatus": 201,
"AnomalousStatus": 200
}
}
]
}
Используются для интеграции с CI/CD и автоматизации:
make build # Компиляция бинарника
make test # Все тесты
make test-unit # Только модульные тесты
make test-int # Интеграционные тесты
make coverage # Отчет о покрытии (HTML)
make lint # Запуск линтера
make run-race # Сборка и запуск примера
cmd/ratrace/
└── main.go Точка входа, определение CLI
internal/
├── cmd/ Реализации подкоманд
├── engine/ Режимы атаки гонки (burst, lastbyte, singlepacket)
├── validator/ Кластеризация ответов, сравнение, последующие проверки
├── importer/ Парсеры HAR и curl
├── reporter/ Вывод JSON и HTML
├── template/ Разбор YAML и шаблонизация
├── log/ Структурированное цветное логирование
└── models/ Общие типы данных
Приветствуются issues, PR и вклад в шаблоны. Пожалуйста, убедитесь:
make testmake lintMIT
RatRace предназначен для авторизованного тестирования безопасности, программ bug bounty и пентестов. Используйте только на системах, которыми вы владеете или на которые имеете явное письменное разрешение на тестирование. Несанкционированное тестирование чужих систем незаконно.
Bogdan Ticu — Исследование и инженерия безопасности
По вопросам, проблемам или сообщениям о безопасности: GitHub Issues
| Код | Значение |
|---|
| 0 | Успех — состояний гонки не найдено |
| 3 | Ошибка данных — шаблон не найден, ошибка разбора |
| 4 | Ошибка выполнения — сбой сети, ошибка движка |
| 10 | Состояние гонки найдено — требуется действие |
| 11 | Обход ограничения скорости подтвержден |
| 12 | Аномалия обнаружена, но валидация неубедительна |