Chrome Zero-Day: "هذا الاستغلال في البرية" ، لذا تحقق من إصدارك الآن

Chrome Zero-Day: "هذا الاستغلال في البرية" ، لذا تحقق من إصدارك الآن

عقدة المصدر: 2704382

تم إصدار آخر تحديث لـ Chrome من Google ، وهذه المرة الشركة لم يفرم كلماته حول واحدة من اثنين من التصحيحات الأمنية التي تتضمن:

جوجل تدرك أن استغلال ل CVE-2023-3079 موجود في البرية.

ليس هناك إسهاب من درجتين من الفصل ، كما رأينا غالبًا من Google من قبل ، للقول إن الشركة "على علم بالتقارير" عن استغلال.

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

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

يتم وصف الخطأ ببساطة على النحو التالي: اكتب الارتباك في V8. (من المفهوم أن Google لا تقول أكثر من ذلك في هذه المرحلة).

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

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

اكتب مخاطر الارتباك وأوضح

تخيل أنك تكتب برنامجًا بلغة C. (لا يهم ما إذا كنت تعرف لغة C أم لا ، يمكنك فقط المتابعة على أي حال.)

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

فمثلا:

 طويلة int JulianDayNumber ؛ توقيع char * CustomerName ؛

يحتفظ إعلان المتغير الأول بـ 64 بتًا لتخزين قيمة عدد صحيح قديم يمثل رقم اليوم الفلكي. (في حال كنت تتساءل ، هذا المساء هو 23157 دينار أردني - تبدأ أيام جوليان في الظهيرة ، وليس منتصف الليل ، لأن علماء الفلك غالبًا ما يعملون في الليل ، ويكون منتصف الليل هو منتصف يوم عملهم.)

يحتفظ الثاني بـ 64 بت لتخزين عنوان الذاكرة حيث يمكن العثور على السلسلة النصية لاسم العميل.

كما يمكنك أن تتخيل ، من الأفضل ألا تخلط بين هاتين القيمتين ، لأن الرقم المنطقي والآمن لاستخدامه كرقم لليوم ، مثل 23157 ، سيكون بالتأكيد غير آمن للاستخدام كعنوان للذاكرة.

كما ترى من تفريغ الذاكرة لبرنامج Windows قيد التشغيل ، يبدأ أقل عنوان ذاكرة مخصص للاستخدام عند 0x00370000، وهو 3,604,480،XNUMX،XNUMX في النظام العشري ، وهو أكبر بكثير من أي رقم يوم معقول.

تختلف عناوين الذاكرة الفعلية التي يستخدمها Windows بشكل عشوائي بمرور الوقت ، لجعل تخطيط الذاكرة الخاص بك أكثر صعوبة على المحتالين لتخمينه ، لذلك إذا كنت ستقوم بتشغيل نفس البرنامج ، فستحصل على قيم ، لكنها مع ذلك ستكون متشابهة:

و (على الرغم من أنها خارج الجزء السفلي من الصورة أعلاه) عناوين الذاكرة الخاصة بقسم بيانات المستخدم وقت التشغيل عند تشغيل هذا البرنامج من 0x01130000 إلى 0x01134FFF، يمثل النطاق الزمني غير المحتمل من 22 يوليو 44631 إلى 16 أغسطس 44687.

في الواقع ، إذا حاولت خلط هذين المتغيرين ، يجب أن يحاول المترجم تحذيرك ، على سبيل المثال مثل هذا:

 JulianDayNumber = اسم العميل ؛ اسم العميل = JulianDayNumber ؛ تحذير: التعيين يصنع عددًا صحيحًا من المؤشر بدون تحذير: التعيين يجعل المؤشر من عدد صحيح بدون تحويل

الآن ، إذا سبق لك البرمجة بلغة C ، فستعرف أنه من أجل الراحة ، يمكنك إعلان متغيرات ذات تفسيرات مختلفة متعددة باستخدام union كلمة رئيسية ، مثل هذا:

 الاتحاد {long int JulianDayNumer؛ توقيع char * CustomerName ؛ } بيانات؛

يمكنك الآن الإشارة إلى نفس المتغير بالضبط في الذاكرة بطريقتين مختلفتين.

إذا كنت تكتب data.JulianDayNumber، أنت تفسر بطريقة سحرية البيانات المخزنة على أنها عدد صحيح ، ولكن تكتب data.CustomerName يخبر المترجم أنك تشير إلى عنوان الذاكرة ، على الرغم من أنك تقوم بالوصول إلى نفس البيانات المخزنة.

ما تفعله ، بشكل أو بآخر ، هو الاعتراف للمترجم بأنك ستتعامل أحيانًا مع البيانات التي حصلت عليها كتاريخ ، وفي أوقات أخرى كعنوان للذاكرة ، وهذا أنت تتحمل مسؤولية تذكر التفسير الذي ينطبق في أي لحظة في التعليمات البرمجية.

قد تقرر أن يكون لديك متغير ثانٍ ، يُعرف باسم tag (عادة عدد صحيح) لتتماشى مع الخاص بك union لتتبع نوع البيانات التي تعمل بها الآن ، على سبيل المثال:

 هيكل {علامة int؛ الاتحاد {long int JulianDayNumer؛ توقيع char * CustomerName ؛ } بيانات؛ } قيمة؛

قد تقرر متى value.tag ومن المقرر أن 0، لم تتم تهيئة البيانات للاستخدام حتى الآن ، 1 يعني أنك تخزن تاريخًا ، 2 يعني أنه عنوان ذاكرة وأي شيء آخر يدل على خطأ.

حسنًا ، من الأفضل ألا تدع أي شخص آخر يعبث بهذا value.tag أو قد ينتهي الأمر ببرنامجك إلى سوء التصرف بشكل كبير.

قد يكون المثال الأكثر إثارة للقلق شيئًا كهذا:

 هيكل {علامة int؛ // 1 = التجزئة ، 2 = اتحاد مؤشرات الوظيفة {التجزئة char غير الموقعة [16] ؛ // إما تخزين بنية تجزئة عشوائية {void * openfunc؛ // أو إثنان باطلان تم التحقق من صحتهما بعناية * closeefunc ؛ // مؤشرات التعليمات البرمجية للتنفيذ لاحقًا} التحقق من صحتها ؛ } } قيمة؛

الآن ، نقوم بتحميل نفس الكتلة من الذاكرة بشكل زائد حتى نتمكن في بعض الأحيان من استخدامها لتخزين تجزئة 16 بايت ، وأحيانًا لتخزين مؤشرين من 8 بايت للوظائف التي سيستدعيها برنامجنا لاحقًا.

من الواضح متى value.tag == 1، يسعدنا السماح لبرنامجنا بتخزين أي سلسلة من 16 بايت على الإطلاق في الذاكرة المخصصة للاتحاد ، لأن التجزئات هي شبه عشوائية ، لذا فإن أي مجموعة من البايت تكون متساوية في الاحتمال.

ولكن عندما value.tag == 2، يجب أن يكون الكود الخاص بنا شديد الحرص على عدم السماح للمستخدم بتقديم عناوين وظيفية غير مؤكدة وغير موثوقة وغير معروفة ليتم تنفيذها لاحقًا.

تخيل الآن أنه يمكنك إرسال قيمة إلى هذا الرمز أثناء تعيين العلامة على 1 ، لذلك لم يتم التحقق منها والتحقق من صحتها ...

... ولكن في وقت لاحق ، قبل أن يستخدم البرنامج القيمة المخزنة بالفعل ، تمكنت من خداع الشفرة لتحويل العلامة إلى 2.

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

وهذا ما يحدث في خطأ الخلط في النوع ، وإن كان ذلك باستخدام مثال مفتعل ومبسط ،

يتم تسليم الذاكرة التي سيكون من الآمن استهلاكها إذا تم التعامل معها بطريقة ضارة إلى البرنامج لمعالجتها بطريقة بديلة وغير آمنة.

ماذا ستفعلين.. إذًا؟

تأكد من أن لديك أحدث إصدار من Chrome أو Chromium.

تريد كروم 114.0.5735.106 أو أحدث على نظامي التشغيل Mac و Linux ، و 114.0.5735.110 أو في وقت لاحق على نظام التشغيل Windows.

يتأثر Microsoft Edge ، الذي يعتمد على Chromium ، أيضًا بهذا الخطأ.

لدى Microsoft حتى الآن [2023-06-06T16: 25: 00Z] أشار إلى أن

مايكروسوفت على علم بالمآثر الأخيرة الموجودة في البرية. نحن نعمل بنشاط على إصدار تصحيح أمني.

Edge حاليًا في الإصدار 114.0.1823.37 ، لذلك أي شيء مرقّم بعد ذلك يجب أن تتضمن تصحيحات Microsoft CVE-2023-3079.

للتحقق من إصدارك وفرض تحديث إذا كان هناك إصدار لم تتلقاه بعد:

  • جوجل كروم. قائمة من ثلاث نقاط (⋮)> المساعدة > حول كروم.
  • مايكروسوفت ايدج. الإعدادات والمزيد (…)> مساعدة وردود الفعل > حول Microsoft Edge.

على الرحب و السعة.


الطابع الزمني:

اكثر من الأمن عارية