
軽量なCLIツールで、Webアプリケーション、API、および最新のサービスにおける競合状態を体系的に検出・悪用するためのものです。
競合状態は、最新のアプリケーションにおける最も影響の大きいセキュリティ脆弱性のひとつですが、自動スキャナーでは十分にカバーされていません。Nuclei、ffuf、sqlmapなどのツールは静的脆弱性の発見に優れていますが、並行性に基づく問題には根本的に対応できません。
現在のペネトレーションテスターは、エンゲージメントごとに使い捨てのスクリプトを手動で作成するか、あるいは競合状態テストを完全に省略するかの選択を迫られています。どちらの選択もスケーラブルではなく、プロフェッショナルとは言えません。
RatRaceはこれを解決します。洗練された反復可能な競合状態テストのワークフローを提供し、アドホックなスクリプト作成を、CI/CDパイプラインと統合しプロフェッショナルなレポートを生成する体系的なプロセスに変えます。
競合状態の脆弱性は、以下のような影響の大きい領域で頻繁に発生します。
これらのバグは、ビジネスの収益と顧客の信頼に直接的に脅威を与えるため、バグ報奨金プログラムで常に最高額の報奨金を獲得しています。
競合シナリオを一度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
バーストモード — Goroutineベースの並列リクエスト、精密な同期(安定、本番環境対応)
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] チェックアウト重複注文競合
# 異常率: 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> [オプション]
オプション:
-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 <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: "人間が読める名前"
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] バースト攻撃を実行中 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": "Checkout Duplicate Order Race",
"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/ 共有データ型
Issue、PR、テンプレートのコントリビューションを歓迎します。以下の点を遵守してください。
make testmake lintMIT
RatRaceは、許可されたセキュリティテスト、バグ報奨金プログラム、ペネトレーションテストのために設計されています。所有しているシステム、または明示的な書面によるテスト許可を得ているシステムでのみ使用してください。 他人のシステムに対する無許可のテストは違法です。
Bogdan Ticu — セキュリティ研究・エンジニアリング
問題、質問、セキュリティ報告については: GitHub Issues
| コード | 意味 |
|---|
| 0 | 成功 — 競合状態は見つかりませんでした |
| 3 | データエラー — テンプレートが見つからない、パースエラー |
| 4 | 実行エラー — ネットワーク障害、エンジンエラー |
| 10 | 競合状態を検出 — アクションが必要 |
| 11 | レート制限バイパスが確認されました |
| 12 | 異常を検出しましたが、検証は決定的ではありません |