
Uno strumento CLI leggero per rilevare e sfruttare sistematicamente le race condition nelle applicazioni web, nelle API e nei servizi moderni.
Le race condition rappresentano una delle vulnerabilità di sicurezza a più alto impatto nelle applicazioni moderne, eppure rimangono scarsamente coperte dagli scanner automatici. Mentre strumenti come Nuclei, ffuf e sqlmap eccellono nel trovare vulnerabilità statiche, sono fondamentalmente ciechi ai problemi legati alla concorrenza.
I pentester oggi si trovano di fronte a una scelta: scrivere manualmente script usa e getta per ogni incarico, oppure saltare del tutto il test delle race condition. Nessuna delle due opzioni è scalabile o professionale.
RatRace risolve questo problema fornendo un workflow rifinito e ripetibile per il test delle race condition—trasformando quella che era una pratica ad-hoc in un processo sistematico che si integra con pipeline CI/CD e genera report professionali.
Le vulnerabilità di race condition si presentano frequentemente in aree ad alto impatto:
Questi bug ottengono costantemente le taglie più alte nei programmi bug bounty perché minacciano direttamente le entrate aziendali e la fiducia dei clienti.
Definisci scenari di race una volta in YAML, riutilizzali tra progetti. Il formato rispecchia i template di Nuclei per familiarità:
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
Modalità Burst — Richieste parallele basate su goroutine con sincronizzazione precisa (stabile, pronta per la produzione)
Last-Byte Sync — Attacco a livello TCP HTTP/1.1 (implementazione pronta, fase di test)
Single-Packet — Attacco basato su frame HTTP/2 (implementazione pronta, fase di test)
RatRace automaticamente:
equals, not_equals, greater_than, containsImporta richieste esistenti:
# Da comandi curl
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o template.yaml
# Da file HAR esportati da Burp
ratrace import --har session.har -o template.yaml
Automazione CI/CD:
ratrace race -u $TARGET -t template.yaml --silent
echo $? # Codice di uscita 10 = race trovata, 0 = pulito
Report professionali:
# JSON per automazione
ratrace race -u $TARGET -t template.yaml -o results/
# Report HTML (pianificati per V2)
ratrace report --input results.json --format html
git clone https://github.com/bogdanticu88/ratrace.git
cd ratrace
go build ./cmd/ratrace
./ratrace --help
Requisiti: Go 1.24+
docker build -t ratrace:latest .
docker run --rm -it ratrace:latest race -u https://api.example.com -t template.yaml
# 1. Importa da curl o usa un template esistente
ratrace import --curl 'curl -X POST https://api.example.com/checkout ...' -o checkout.yaml
# 2. Esegui la race
ratrace race -u https://api.example.com -t checkout.yaml -m burst -c 20
# 3. Rivedi i risultati
# L'output mostra:
# 🔴 [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/
# Viene eseguito senza log verbosi, esce con codice semantico
ratrace race -u https://api.example.com -t template.yaml --silent
# Controlla il codice di uscita
if [ $? -eq 10 ]; then
echo "Race condition trovata!"
exit 1
fi
ratrace race -u <url> -t <template> [options]
Options:
-m, --mode string burst|lastbyte|singlepacket (default from template)
-c, --concurrency int Goroutine count (default 20)
-H, --header strings Custom headers (repeatable)
-x, --proxy string Proxy URL for requests
-o, --output string Output directory for results
--timeout duration Request timeout (default 10s)
--insecure Skip TLS certificate verification
--dry-run Parse template and exit
--silent Suppress logs, show findings only
ratrace import [--curl <command> | --har <file>] -o <output.yaml>
Converte richieste esistenti (comandi curl o esportazioni HAR) in template RatRace.
Utile per l'integrazione con workflow esistenti.
ratrace report --input results.json --format [html|json] --output report.html
Genera report leggibili da umani dai risultati dei test di race.
ratrace ratelimit -u <url> -c <concurrency>
Testa se gli endpoint sono vulnerabili al bypass concorrente del rate limit.
I template sono file YAML che definiscono uno scenario di race. Riferimento completo:
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
Variabili (usa segnaposto {{name}}):
ratrace race ... -H "Authorization: Bearer {{session_token}}"Log puliti e colorati mostrano l'avanzamento del test:
[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)
Risultati completi salvati in results_<timestamp>.json per automazione e archiviazione:
{
"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
}
}
]
}
Usati per l'integrazione CI/CD e l'automazione:
| Code | Meaning |
|---|---|
| 0 | Successo — nessuna race condition trovata |
| 3 | Errore dati — template non trovato, errore di parsing |
| 4 | Errore di esecuzione — fallimento di rete, errore del motore |
| 10 | Race condition trovata — azione richiesta |
| 11 | Bypass del rate limit confermato |
| 12 | Anomalia rilevata ma validazione inconcludente |
make build # Compila il binario
make test # Tutti i test
make test-unit # Solo test unitari
make test-int # Test di integrazione
make coverage # Report di copertura (HTML)
make lint # Esegui linter
make run-race # Build ed esegui esempio
cmd/ratrace/
└── main.go Punto di ingresso, definizione CLI
internal/
├── cmd/ Implementazioni dei sottocomandi
├── engine/ Modalità di attacco race (burst, lastbyte, singlepacket)
├── validator/ Clustering delle risposte, diff, controlli di follow-up
├── importer/ Parser HAR e curl
├── reporter/ Output JSON e HTML
├── template/ Parsing YAML e templating
├── log/ Log colorato strutturato
└── models/ Tipi di dati condivisi
Benvenuti contributi tramite Issue, PR e template. Si prega di assicurare:
make testmake lintMIT
RatRace è progettato per test di sicurezza autorizzati, programmi bug bounty e penetration test. Usalo solo su sistemi di tua proprietà o per i quali hai esplicita autorizzazione scritta. Test non autorizzati su sistemi altrui sono illegali.
Bogdan Ticu — Ricerca e Ingegneria della Sicurezza
Per problemi, domande o segnalazioni di sicurezza: GitHub Issues