
웹 애플리케이션, API 및 현대 서비스에서 경쟁 조건을 체계적으로 탐지하고 악용하기 위한 경량 CLI 도구입니다.
경쟁 상태는 현대 애플리케이션에서 가장 영향력이 큰 보안 취약점 중 하나이지만, 자동화 스캐너로는 거의 탐지되지 않습니다. Nuclei, ffuf, sqlmap과 같은 도구는 정적 취약점을 찾는 데 탁월하지만, 동시성 기반 문제에는 근본적으로 무감각합니다.
오늘날 침투 테스터는 각 작업마다 임시 스크립트를 직접 작성하거나 경쟁 상태 테스트를 완전히 건너뛰어야 하는 선택에 직면합니다. 두 옵션 모두 확장 가능하거나 전문적이지 않습니다.
RatRace는 이를 해결하여 정교하고 반복 가능한 경쟁 상태 테스트 워크플로우를 제공합니다. 임시 스크립트에 불과했던 작업을 CI/CD 파이프라인에 통합되고 전문적인 보고서를 생성하는 체계적인 프로세스로 전환합니다.
경쟁 상태 취약점은 영향력이 큰 영역에서 자주 발생합니다.
이러한 버그는 버그 바운티 프로그램에서 항상 가장 높은 보상을 받습니다. 이는 비즈니스 수익과 고객 신뢰를 직접적으로 위협하기 때문입니다.
경쟁 시나리오를 YAML로 한 번 정의하고 여러 프로젝트에서 재사용하세요. 형식은 Nuclei 템플릿과 유사하여 친숙합니다.
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 모드 — 고루틴 기반 병렬 요청, 정밀 동기화 (안정적, 프로덕션 준비 완료)
Last-Byte Sync — HTTP/1.1 TCP 수준 공격 (구현 완료, 테스트 단계)
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
# Burp에서 내보낸 HAR 파일에서
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] 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/
# 상세 로그 없이 실행, 의미 있는 종료 코드 반환
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 고루틴 개수 (기본값 20)
-H, --header strings 사용자 정의 헤더 (반복 가능)
-x, --proxy string 요청용 프록시 URL
-o, --output string 결과 출력 디렉터리
--timeout duration 요청 타임아웃 (기본값 10s)
--insecure TLS 인증서 검증 건너뛰기
--dry-run 템플릿만 파싱하고 종료
--silent 로그 숨기고 결과만 표시
ratrace import [--curl <command> | --har <file>] -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: "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
변수 ({{name}} 플레이스홀더 사용):
ratrace race ... -H "Authorization: Bearer {{session_token}}"깔끔하고 색상이 적용된 로그로 테스트 진행 상황을 보여줍니다:
[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)
전체 결과는 자동화 및 보관을 위해 results_<timestamp>.json에 저장됩니다:
{
"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
}
}
]
}
CI/CD 통합 및 자동화에 사용됩니다:
| 코드 | 의미 |
|---|---|
| 0 | 성공 — 경쟁 상태 없음 |
| 3 | 데이터 오류 — 템플릿 찾을 수 없음, 파싱 오류 |
| 4 | 실행 오류 — 네트워크 실패, 엔진 오류 |
| 10 | 경쟁 상태 발견 — 조치 필요 |
| 11 | 속도 제한 우회 확인됨 |
| 12 | 이상 징후 탐지되었으나 검증 불명확 |
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/ 공유 데이터 타입
이슈, PR, 템플릿 기여를 환영합니다. 다음 사항을 준수해 주세요:
make testmake lintMIT
RatRace는 승인된 보안 테스트, 버그 바운티 프로그램 및 침투 테스트를 위해 설계되었습니다. 소유하거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오. 타인의 시스템을 무단 테스트하는 것은 불법입니다.
Bogdan Ticu — 보안 연구 및 엔지니어링
이슈, 질문 또는 보안 보고는 GitHub Issues로 제출해 주세요.