Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

عدد صحيح تجاوز الصرف الصحي

يمكن أن تتسبب فيض الأعداد الصحيحة غير المقصودة في تلف الذاكرة أو ثغرات في الكشف عن المعلومات في المتغيرات المرتبطة بوصول الذاكرة أو عمليات تخصيص الذاكرة. لمكافحة هذا ، أضفنا Clang's UndefinedBehaviorSanitizer (UBSan) الموقعة وغير الموقعة معقمات تجاوز عدد صحيح لتقوية إطار عمل الوسائط في Android 7.0. في Android 9 ، قمنا بتوسيع UBSan لتغطية المزيد من المكونات وتحسين دعم نظام البناء له.

تم تصميم هذا لإضافة عمليات تحقق حول العمليات / الإرشادات الحسابية - التي قد تتجاوز - لإجهاض العملية بأمان في حالة حدوث تجاوز السعة. يمكن أن تخفف هذه المطهرات فئة كاملة من تلف الذاكرة ونقاط الضعف في الكشف عن المعلومات حيث يكون السبب الجذري هو تجاوز عدد صحيح ، مثل ثغرة Stagefright الأصلية.

الأمثلة والمصدر

يتم توفير Integer Overflow Sanitization (IntSan) من قبل المترجم ويضيف أدوات إلى الثنائي أثناء وقت التجميع لاكتشاف الفيضانات الحسابية. يتم تمكينه افتراضيًا في مكونات مختلفة عبر النظام الأساسي ، على سبيل المثال /platform/external/libnl/Android.bp .

تطبيق

يستخدم IntSan معقمات تجاوز عدد صحيح موقعة وغير موقعة من UBSan. يتم تمكين هذا التخفيف على مستوى كل وحدة. يساعد في الحفاظ على المكونات الهامة لنظام Android آمنة ويجب عدم تعطيلها.

نحن نشجعك بشدة على تمكين Integer Overflow Sanitization لمكونات إضافية. المرشحون المثاليون هم كود أصلي مميز أو كود أصلي يوزع مدخلات المستخدم غير الموثوق بها. هناك عبء صغير في الأداء مرتبط بالمطهر يعتمد على استخدام الكود وانتشار العمليات الحسابية. توقع نسبة صغيرة من النفقات العامة واختبر ما إذا كان الأداء مصدر قلق.

دعم IntSan في ملفات makefiles

لتمكين IntSan في ملف makefile ، أضف:

LOCAL_SANITIZE := integer_overflow
# Optional features
LOCAL_SANITIZE_DIAG := integer_overflow
LOCAL_SANITIZE_BLACKLIST := modulename_blacklist.txt
  • يأخذ LOCAL_SANITIZE قائمة مفصولة بفواصل من المطهرات ، مع وجود عدد صحيح من التدفق عبارة عن مجموعة من الخيارات معبأة مسبقًا integer_overflow تجاوز عدد صحيح فردي موقعة وغير موقعة مع قائمة سوداء افتراضية .
  • LOCAL_SANITIZE_DIAG بتشغيل وضع التشخيص LOCAL_SANITIZE_DIAG . استخدم وضع التشخيص فقط أثناء الاختبار لأن هذا لن يتم إجهاضه في حالات التدفق الزائد ، مما يلغي تمامًا ميزة الأمان للتخفيف. راجع استكشاف الأخطاء وإصلاحها للحصول على تفاصيل إضافية.
  • يتيح لك LOCAL_SANITIZE_BLACKLIST تحديد ملف قائمة سوداء لمنع الوظائف وملفات المصدر من التعقيم. راجع استكشاف الأخطاء وإصلاحها للحصول على تفاصيل إضافية.

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

LOCAL_SANITIZE := signed-integer-overflow, unsigned-integer-overflow
LOCAL_SANITIZE_DIAG := signed-integer-overflow, unsigned-integer-overflow

دعم IntSan في ملفات المخطط

لتمكين /platform/external/libnl/Android.bp تجاوز عدد صحيح في ملف مخطط ، مثل /platform/external/libnl/Android.bp ، أضف:

   sanitize: {
      integer_overflow: true,
      diag: {
          integer_overflow: true,
      },
      blacklist: "modulename_blacklist.txt",
   },

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

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

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

لتمكين المطهرات بشكل فردي ، استخدم:

   sanitize: {
      misc_undefined: ["signed-integer-overflow", "unsigned-integer-overflow"],
      diag: {
          misc_undefined: ["signed-integer-overflow",
                           "unsigned-integer-overflow",],
      },
      blacklist: "modulename_blacklist.txt",
   },

استكشاف الأخطاء وإصلاحها

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

للعثور على حالات الإجهاض الناتجة عن التعقيم في بنيات المستخدم ، ابحث عن أعطال SIGABRT مع رسائل Abort التي تشير إلى تجاوز فيض تم اكتشافه بواسطة UBSan ، مثل:

pid: ###, tid: ###, name: Binder:###  >>> /system/bin/surfaceflinger <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'ubsan: sub-overflow'

يجب أن يشتمل تتبع المكدس على الوظيفة التي تسبب الإحباط ، ومع ذلك ، قد لا تكون التدفقات الفائضة التي تحدث في الوظائف المضمنة واضحة في تتبع المكدس.

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

frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp:2188:32: runtime error: unsigned integer overflow: 0 - 1 cannot be represented in type 'size_t' (aka 'unsigned long')

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

يجب عليك استخدام أكثر الحلول دقة ممكنة. على سبيل المثال ، يجب أن تحتوي الوظيفة الكبيرة التي تحتوي على العديد من العمليات الحسابية وعملية الفائض المفردة على عملية واحدة مُعاد تشكيلها بدلاً من إدراج الوظيفة بأكملها في القائمة السوداء.

تشمل الأنماط الشائعة التي قد تؤدي إلى فيضانات حميدة ما يلي:

  • يلقي ضمنيًا حيث يحدث تجاوز غير مُوقَّع قبل إرساله إلى نوع موقّع ( مثال )
  • عمليات حذف القائمة المرتبطة التي تقلل فهرس الحلقة عند الحذف ( مثال )
  • تعيين نوع غير موقع إلى -1 بدلاً من تحديد القيمة القصوى الفعلية ( مثال )
  • الحلقات التي تنقص عددًا صحيحًا بدون إشارة في الشرط ( مثال ، مثال )

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

تعطيل IntSan

يمكنك تعطيل IntSan بالقوائم السوداء أو سمات الوظيفة. قم بالتعطيل بشكل مقتصد وفقط عندما تكون إعادة بناء الكود غير منطقي أو إذا كان هناك مشاكل في الأداء.

راجع وثائق Clang المنبع للحصول على مزيد من المعلومات حول تعطيل IntSan بسمات الوظيفة وتنسيق ملف القائمة السوداء . يجب تحديد نطاق القائمة السوداء للمطهر المعين باستخدام أسماء الأقسام التي تحدد المطهر المستهدف لتجنب التأثير على المطهرات الأخرى.

تصديق

حاليًا ، لا يوجد اختبار CTS خصيصًا لـ Integer Overflow Sanitization. بدلاً من ذلك ، تأكد من اجتياز اختبارات CTS مع تمكين IntSan أو بدونه للتحقق من أنه لا يؤثر على الجهاز.