
Ein leichtgewichtiges CLI-Tool zur systematischen Erkennung und Ausnutzung von Wettlaufsituationen in Webanwendungen, APIs und modernen Diensten.
Race Conditions gehören zu den Sicherheitslücken mit der größten Auswirkung in modernen Anwendungen, werden aber von automatischen Scannern nach wie vor kaum abgedeckt. Während Tools wie Nuclei, ffuf und sqlmap hervorragend darin sind, statische Schwachstellen zu finden, sind sie grundsätzlich blind für nebenläufigkeitsbedingte Probleme.
Pentestern bleibt heute nur die Wahl: entweder jedes Mal manuell Wegwerfskripte schreiben oder ganz auf Race-Condition-Tests verzichten. Keine der beiden Optionen ist skalierbar oder professionell.
RatRace löst dies, indem es einen ausgereiften, wiederholbaren Workflow für Race-Condition-Tests bereitstellt – aus Ad-hoc-Skripten wird ein systematischer Prozess, der sich in CI/CD-Pipelines integrieren lässt und professionelle Berichte erstellt.
Race-Condition-Schwachstellen treten häufig in Bereichen mit hoher Auswirkung auf:
Diese Bugs erzielen in Bug-Bounty-Programmen durchweg die höchsten Prämien, da sie direkt den Geschäftsumsatz und das Kundenvertrauen gefährden.
Definieren Sie Race-Szenarien einmal in YAML und verwenden Sie sie in mehreren Projekten. Das Format orientiert sich an Nuclei-Templates für einen vertrauten Umgang:
id: checkout-race
info:
name: Checkout Duplicate Order Race
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-Modus – Parallelanfragen auf Basis von Goroutinen mit präziser Synchronisation (stabil, produktionsreif)
Last-Byte-Sync – TCP-Level-Angriff über HTTP/1.1 (Implementierung fertig, Testphase)
Single-Packet – Frame-basierter Angriff über HTTP/2 (Implementierung fertig, Testphase)
RatRace erledigt automatisch:
equals, not_equals, greater_than, containsVorhandene Anfragen importieren:
# Von curl-Befehlen
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o template.yaml
# Von Burp exportierten HAR-Dateien
ratrace import --har session.har -o template.yaml
CI/CD-Automatisierung:
ratrace race -u $TARGET -t template.yaml --silent
echo $? # Exit-Code 10 = Race gefunden, 0 = sauber
Professionelle Berichterstellung:
# JSON für Automatisierung
ratrace race -u $TARGET -t template.yaml -o results/
# HTML-Berichte (geplant für V2)
ratrace report --input results.json --format html
git clone https://github.com/bogdanticu88/ratrace.git
cd ratrace
go build ./cmd/ratrace
./ratrace --help
Voraussetzungen: Go 1.24+
docker build -t ratrace:latest .
docker run --rm -it ratrace:latest race -u https://api.example.com -t template.yaml
# 1. Von curl importieren oder vorhandenes Template verwenden
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o checkout.yaml
# 2. Race ausführen
ratrace race -u https://api.example.com -t checkout.yaml -m burst -c 20
# 3. Ergebnisse prüfen
# Ausgabe zeigt:
# 🔴 [CRITICAL] Checkout Duplicate Order Race
# Anomaly Rate: 91.7%
# Confidence: 84%
ratrace race \
-u https://shop.example.com \
-t examples/templates/checkout-race.yaml \
-m burst \
-c 25 \
--output results/
# Läuft ohne ausführliche Logs, beendet mit semantischem Code
ratrace race -u https://api.example.com -t template.yaml --silent
# Exit-Code prüfen
if [ $? -eq 10 ]; then
echo "Race condition found!"
exit 1
fi
ratrace race -u <url> -t <template> [options]
Options:
-m, --mode string burst|lastbyte|singlepacket (Standard aus Template)
-c, --concurrency int Goroutine-Anzahl (Standard 20)
-H, --header strings Benutzerdefinierte Header (wiederholbar)
-x, --proxy string Proxy-URL für Anfragen
-o, --output string Ausgabeverzeichnis für Ergebnisse
--timeout duration Anfrage-Timeout (Standard 10s)
--insecure TLS-Zertifikatsprüfung überspringen
--dry-run Template parsen und beenden
--silent Logs unterdrücken, nur Ergebnisse anzeigen
ratrace import [--curl <command> | --har <file>] -o <output.yaml>
Konvertiert vorhandene Anfragen (curl-Befehle oder HAR-Exporte) in RatRace-Templates.
Nützlich zur Integration in bestehende Workflows.
ratrace report --input results.json --format [html|json] --output report.html
Erstellt menschenlesbare Berichte aus Race-Testergebnissen.
ratrace ratelimit -u <url> -c <concurrency>
Testet, ob Endpunkte anfällig für gleichzeitige Ratenbegrenzungsumgehungen sind.
Templates sind YAML-Dateien, die ein Race-Szenario definieren. Vollständige Referenz:
id: unique-identifier
info:
name: "Human-readable 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
Variablen (Platzhalter {{name}} verwenden):
ratrace race ... -H "Authorization: Bearer {{session_token}}"Saubere, farbcodierte Logs zeigen den Testfortschritt:
[INF] Loading template path=checkout-race.yaml
[INF] Template loaded id=checkout-race mode=burst
[RUN] Firing burst attack concurrency=20
[INF] All requests completed total=20
[RUN] Clustering responses baseline=17 anomalous=3
[RACE] Race condition detected anomaly_rate=15% confidence=94%
[CONF] Validation passed field=orders.length expected=1
[INF] Race test complete findings=1
Templates: 1 Requests: 20 Time: 3.2s
🔴 [CRITICAL] Checkout Duplicate Order Race
Anomaly Rate: 15.0%
Confidence: 94%
Status Diff: 201 → 200
Field Diffs: order_id (100 → 101)
Vollständige Ergebnisse werden zur Automatisierung und Archivierung in results_<timestamp>.json gespeichert:
{
"TemplateID": "checkout-race",
"Target": "https://api.example.com/api/v1/checkout",
"Mode": "burst",
"Concurrency": 20,
"TotalRequests": 20,
"Duration": 3200000000,
"Findings": [
{
"TemplateName": "Checkout Duplicate Order Race",
"Severity": "critical",
"AnomalyRate": 0.15,
"Confidence": 0.94,
"Diff": {
"StatusChanged": true,
"BaselineStatus": 201,
"AnomalousStatus": 200
}
}
]
}
Wird für CI/CD-Integration und Automatisierung verwendet:
| Code | Bedeutung |
|---|---|
| 0 | Erfolg – keine Race Conditions gefunden |
| 3 | Datenfehler – Template nicht gefunden, Parsing-Fehler |
| 4 | Ausführungsfehler – Netzwerkausfall, Engine-Fehler |
| 10 | Race Condition gefunden – Maßnahmen erforderlich |
| 11 | Ratenbegrenzungsumgehung bestätigt |
| 12 | Anomalie erkannt, aber Validierung nicht eindeutig |
make build # Binärdatei kompilieren
make test # Alle Tests
make test-unit # Nur Unit-Tests
make test-int # Integrationstests
make coverage # Abdeckungsbericht (HTML)
make lint # Linter ausführen
make run-race # Bauen und Beispiel ausführen
cmd/ratrace/
└── main.go Einstiegspunkt, CLI-Definition
internal/
├── cmd/ Implementierung der Unterbefehle
├── engine/ Angriffsmodi (burst, lastbyte, singlepacket)
├── validator/ Antwort-Clustering, Diffing, Folgeprüfungen
├── importer/ HAR- und curl-Parser
├── reporter/ JSON- und HTML-Ausgabe
├── template/ YAML-Parsing und Templating
├── log/ Strukturierte farbige Protokollierung
└── models/ Gemeinsame Datentypen
Issues, PRs und Template-Beiträge sind willkommen. Bitte beachten:
make testmake lintMIT
RatRace ist für autorisierte Sicherheitstests, Bug-Bounty-Programme und Penetrationstests konzipiert. Verwenden Sie es nur auf Systemen, die Ihnen gehören oder für deren Tests Sie eine ausdrückliche schriftliche Genehmigung haben. Unbefugtes Testen fremder Systeme ist illegal.
Bogdan Ticu – Sicherheitsforschung und -entwicklung
Bei Problemen, Fragen oder Sicherheitsmeldungen: GitHub Issues