
أداة سطر أوامر خفيفة الوزن لاكتشاف واستغلال حالات السباق (race conditions) بشكل منهجي في تطبيقات الويب وواجهات برمجة التطبيقات (APIs) والخدمات الحديثة.
تمثل سباقات الحالة (Race Conditions) واحدة من أكثر الثغرات الأمنية تأثيرًا في التطبيقات الحديثة، ومع ذلك تظل غير مغطاة بشكل جيد بواسطة الماسحات الآلية. بينما تتفوق أدوات مثل 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
وضع الاندفاع (Burst Mode) — طلبات متوازية قائمة على Goroutines مع مزامنة دقيقة (مستقر، جاهز للإنتاج)
مزامنة آخر بايت (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. مراجعة النتائج
# يُظهر المخرجات:
# 🔴 [حرج] سباق الطلب المكرر عند الدفع
# معدل الشذوذ: 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]
Options:
-m, --mode string burst|lastbyte|singlepacket (الافتراضي من القالب)
-c, --concurrency int عدد Goroutines (الافتراضي 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: معرف-فريد
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
🔴 [حرج] سباق الطلب المكرر عند الدفع
معدل الشذوذ: 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) وطلبات السحب (PRs) والمساهمات بالقوالب. يُرجى التأكد من:
make testmake lintMIT
تم تصميم RatRace لاختبار الأمن المأذون، برامج مكافآت الثغرات، واختبارات الاختراق. استخدم فقط على الأنظمة التي تملكها أو لديك إذن كتابي صريح لاختبارها. الاختبار غير المصرح به لأنظمة الآخرين غير قانوني.
Bogdan Ticu — أبحاث وهندسة أمنية
للمشكلات أو الأسئلة أو التقارير الأمنية: مشكلات GitHub
| Code | المعنى |
|---|
| 0 | نجاح — لم يتم العثور على سباقات حالة |
| 3 | خطأ في البيانات — لم يتم العثور على قالب، خطأ في التحليل |
| 4 | خطأ في التنفيذ — فشل الشبكة، خطأ في المحرك |
| 10 | تم العثور على سباق حالة — مطلوب إجراء |
| 11 | تم تأكيد تجاوز حد المعدل |
| 12 | تم اكتشاف شذوذ لكن التحقق غير حاسم |