معقم الشفرات
أداة تنظيف الشفرة هي أداة برمجية تكشف الأخطاء البرمجية التي تظهر على شكل سلوك غير مُعرَّف أو مُريب، وذلك عن طريق إدراج المُصرِّف لرمز برمجي أثناء التشغيل. وقد تطورت أدوات التنظيف على مدى عقود للكشف عن أخطاء الذاكرة في لغات البرمجة غير الآمنة، [ 1 ] بدءًا من عمليات فحص الوصول إلى المؤشرات والمصفوفات في عام 1994 [ 2 ] ، ثم عمليات التحديث الآمنة للأنواع في عام 2005 [ 3 ] ، تلاها توسع كبير في أدوات أمان الذاكرة المكانية والزمانية المتطورة بين عامي 2009 و2019. [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] واعتبارًا من عام 2024، تُعد أداة ASan، التي صممتها جوجل في الأصل، أداة التنظيف الأكثر شيوعًا . وهي مُدمجة في معظم المُصرِّفات الشائعة نظرًا لانخفاض استهلاكها للذاكرة والأداء. [ 1 ]
معقم العناوين
يستخدم برنامج ASan من جوجل، الذي طُرح عام 2012، تقنية ذاكرة الظل للكشف عن أخطاء الذاكرة. وهو متوفر باللغات التالية:
- Clang (بدءًا من الإصدار 3.1 [ 11 ] )
- GCC (بدءًا من الإصدار 4.8 [ 12 ] )
- Xcode (بدءًا من الإصدار 7.0 [ 13 ] )
- MSVC (متوفر على نطاق واسع بدءًا من الإصدار 16.9 [ 14 ] ).
يزيد التصميم الأصلي لبرنامج التعقيم وقت المعالجة بنحو 73% واستهلاك الذاكرة بنسبة 240%. [ 15 ] يتوفر برنامج تعقيم مُسرّع بالأجهزة يُسمى HWAsan لأنظمة AArch64 (وبشكل محدود) لأنظمة x86_64. [ 16 ]
لا يكشف AddressSanitizer عن أي عمليات قراءة للذاكرة غير مهيأة (لكن MemorySanitizer يكشف عنها [ 17 ] )، ويكشف فقط عن بعض أخطاء استخدام الذاكرة بعد الإرجاع. [ 18 ] كما أنه غير قادر على كشف جميع أخطاء تلف الذاكرة العشوائية، ولا جميع أخطاء الكتابة العشوائية الناتجة عن تجاوزات/نقصان الأعداد الصحيحة (عند استخدام عدد صحيح ذي سلوك غير محدد لحساب إزاحات عناوين الذاكرة ). لا تتم حماية المخازن المؤقتة المتجاورة في الهياكل والفئات من التجاوز، جزئيًا لمنع الإخلال بالتوافق مع الإصدارات السابقة. [ 19 ]
معقم عناوين النواة
يكشف برنامج KernelAddressSanitizer ( KASan ) عن أخطاء الذاكرة الديناميكية في نواة لينكس. [ 20 ] يتطلب فحص النواة ميزة خاصة في المُصرّف تُوفّر -fsanitize=kernel-addressخيار سطر الأوامر، لأن النواة لا تستخدم نفس مساحة العناوين التي تستخدمها البرامج العادية. [ 21 ] [ 22 ]
يتوفر برنامج KASan أيضًا للاستخدام مع برامج تشغيل نواة نظام التشغيل Windows بدءًا من Windows 11 22H2 والإصدارات الأحدث. [ 23 ] وكما هو الحال في Linux، يتطلب تجميع برنامج تشغيل Windows باستخدام KASAN تمرير /fsanitize=kernel-addressخيار سطر الأوامر إلى مُجمِّع MSVC.
معقمات أخرى
أنتجت جوجل أيضًا أدوات LeakSanitizer (LSan، لمعالجة تسريبات الذاكرة )، وThreadSanitizer (TSan، لمعالجة تضارب البيانات وحالات الجمود )، و MemorySanitizer (MSan، لمعالجة الذاكرة غير المُهيأة )، و UndefinedBehaviorSanitizer ( UBSan ، لمعالجة السلوكيات غير المُعرّفة ، مع تحكم دقيق). [ 24 ] هذه الأدوات متوفرة عمومًا في Clang/LLVM وGCC. [ 25 ] [ 26 ] [ 27 ] على غرار KASan، توجد إصدارات خاصة بنواة النظام من LSan وMSan وTSan، بالإضافة إلى أدوات تنظيف نواة أصلية تمامًا مثل KFENCE وKCSan. [ 28 ]
تتضمن أدوات التنظيف الإضافية (المجمعة حسب المترجمات تحت -fsanitize أو علامة مماثلة): [ 25 ] [ 26 ] [ 27 ]
- سلامة تدفق التحكم في LLVM ونظيرتها في النواة، والتي تتحقق من الجداول الافتراضية وتحويلات الأنواع لـ CFI على الحافة الأمامية
- MemTagSanitizer، أداة شبيهة بـ ASan تستخدم ميزات Armv8.5-A لتقليل الحمل الزائد إلى أدنى حد.
- ShadowCallStack، أداة AArch64 توفر حماية لمكدس الظل
- Scudo Hardened Allocator، وهو مُخصِّص ذاكرة بديل يتضمن GWP-ASan، وهو نظير احتمالي لـ ASan مع حمل زائد منخفض [ 29 ].
- libFuzzer، أداة LLVM التي تضيف تغطية التعليمات البرمجية إلى عملية الفحص [ 30 ]
الاستخدام
يكشف مُنظِّف الشفرة عن السلوك المشبوه أثناء تشغيل البرنامج. إحدى الطرق الشائعة لاستخدام مُنظِّف الشفرة هي دمجه مع اختبار التشويش ، الذي يُولِّد مُدخلات من المحتمل أن تُؤدي إلى ظهور أخطاء برمجية. [ 31 ]
المستخدمون
يُعدّ مطورو متصفحي كروميوم وفايرفوكس من المستخدمين النشطين لأداة AddressSanitizer؛ [ 31 ] [ 32 ] وقد كشفت هذه الأداة عن مئات الأخطاء في هذين المتصفحين. [ 33 ] كما تمّ اكتشاف عدد من الأخطاء في FFmpeg [ 34 ] و FreeType . [ 35 ] وقد فعّلت نواة لينكس أداة AddressSanitizer لبنية x86-64 بدءًا من إصدار لينكس 4.0.
أمثلة
ASan: استخدام الذاكرة بعد تحريرها
// للتجميع: g++ -O -g -fsanitize=address heap-use-after-free.ccint main ( int argc , char ** argv ) {int * array = new int [ 100 ];حذف المصفوفة [] ;return array [ argc ]; // BOOM}./a.out ==5587== خطأ: AddressSanitizer: استخدام الذاكرة بعد تحريرها على العنوان 0x61400000fe44 في pc 0x47b55f bp 0x7ffc36b28200 sp 0x7ffc36b281f8 قراءة من الحجم 4 عند 0x61400000fe44 الخيط T0 #0 0x47b55e في الملف الرئيسي /home/test/example_UseAfterFree.cc:5 #1 0x7f15cfe71b14 في __libc_start_main (/lib64/libc.so.6+0x21b14) #2 0x47b44c في _start (/root/a.out+0x47b44c) يقع العنوان 0x61400000fe44 على بعد 4 بايتات داخل منطقة 400 بايت [0x61400000fe40,0x61400000ffd0] تم تحريرها بواسطة الخيط T0 هنا: #0 0x465da9 في عامل الحذف delete[](void*) (/root/a.out+0x465da9) #1 0x47b529 في الملف الرئيسي /home/test/example_UseAfterFree.cc:4 تم تخصيصها مسبقًا بواسطة الخيط T0 هنا: #0 0x465aa9 في عامل التشغيل new[](unsigned long) (/root/a.out+0x465aa9) #1 0x47b51e في الملف الرئيسي /home/test/example_UseAfterFree.cc:3 ملخص: AddressSanitizer: heap-use-after-free /home/test/example_UseAfterFree.cc:5 main بايتات الظل المحيطة بالعنوان المعطوب: [...] 0x0c287fff9fb0: فا فا فا فا فا فا فا فا فا فا فا فا فا فا =>0x0c287fff9fc0: fa fa fa fa fa fa fa fa fa[fd]fd fd fd fd fd fd fd 0x0c287fff9fd0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd [...] مفتاح البايت الظلي (يمثل كل بايت ظلي 8 بايتات للتطبيق): قابل للعنونة: 00 يمكن الوصول إليها جزئيًا: 01 02 03 04 05 06 07 هيب غادر المنطقة الحمراء: فا منطقة حمراء يمنى: فيسبوك منطقة الذاكرة المخصصة: fd منطقة التراكم اليسرى الحمراء: f1 تكديس منتصف المنطقة الحمراء: f2 منطقة التكديس اليمنى الحمراء: f3 منطقة حمراء جزئية مكدسة: f4 المكدس بعد العودة: f5 استخدام المكدس بعد النطاق: f8 المنطقة الحمراء العالمية: f9 ترتيب التهيئة العامة: f6 تم تسميمه بواسطة المستخدم: f7 داخلي في ASan: fe ==5587== إجهاض
ASan: تجاوز سعة المخزن المؤقت للكومة
// تشغيل: clang++ -O -g -fsanitize=address heap-buf-of.cc && ./a.outint main ( int argc , char ** argv ) {int * array = new int [ 100 ];array [ 0 ] = 0 ;int res = array [ argc + 100 ]; // BOOMحذف المصفوفة [] ;أعد النتيجة .}==25372== خطأ: AddressSanitizer: تجاوز سعة المخزن المؤقت للكومة على العنوان 0x61400000ffd4 في pc 0x0000004ddb59 bp 0x7fffea6005a0 sp 0x7fffea600598 قراءة بحجم 4 عند العنوان 0x61400000ffd4، الخيط T0 #0 0x46bfee في main /tmp/main.cpp:4:13 يقع العنوان 0x61400000ffd4 على بعد 4 بايتات إلى يمين المنطقة التي يبلغ حجمها 400 بايت [0x61400000fe40,0x61400000ffd0] تم تخصيصها بواسطة الخيط T0 هنا: #0 0x4536e1 في عامل الحذف delete[](void*) #1 0x46bfb9 في الدالة الرئيسية /tmp/main.cpp:2:16
ASan: تجاوز سعة المخزن المؤقت للمكدس
// تشغيل: clang -O -g -fsanitize=address stack-buf-of.cc && ./a.outint main ( int argc , char ** argv ) {int stack_array [ 100 ];stack_array [ 1 ] = 0 ;return stack_array [ argc + 100 ]; // BOOM}==7405== خطأ: AddressSanitizer: تجاوز سعة المخزن المؤقت للمكدس على العنوان 0x7fff64740634 عند pc 0x46c103 bp 0x7fff64740470 sp 0x7fff64740468 قراءة من الحجم 4 عند 0x7fff64740634 الخيط T0 #0 0x46c102 في الملف الرئيسي /tmp/example_StackOutOfBounds.cc:5 يقع العنوان 0x7fff64740634 في مكدس الخيط T0 عند الإزاحة 436 في الإطار #0 0x46bfaf في الملف الرئيسي /tmp/example_StackOutOfBounds.cc:2 يحتوي هذا الإطار على عنصر واحد (عناصر): [32, 432) 'stack_array' <== تجاوز سعة الذاكرة عند الإزاحة 436 لهذا المتغير
ASan: تجاوز سعة المخزن المؤقت العالمي
// تشغيل: clang -O -g -fsanitize=address global-buf-of.cc && ./a.out int global_array [ 100 ] = { -1 }; int main ( int argc , char ** argv ) { return global_array [ argc + 100 ]; // BOOM }==7455== خطأ: AddressSanitizer: تجاوز سعة المخزن المؤقت العام على العنوان 0x000000689b54 عند pc 0x46bfd8 bp 0x7fff515e5ba0 sp 0x7fff515e5b98 قراءة بحجم 4 عند 0x000000689b54 الخيط T0 #0 0x46bfd7 في الملف الرئيسي /tmp/example_GlobalOutOfBounds.cc:4 يقع العنوان 0x000000689b54 على بعد 4 بايتات إلى يمين المتغير العام 'global_array' من الملف 'example_GlobalOutOfBounds.cc' (0x6899c0) بحجم 400
UBSan: إلغاء مرجع المؤشر الفارغ
// تشغيل: g++ -O -g -fsanitize=null null-dereference.c && ./a.out int main ( int argc , char ** argv ) { const char * ptr = nullptr ; return * ptr ; // BOOM }null-dereference.c:4:10: خطأ وقت التشغيل: تحميل مؤشر فارغ من النوع 'const char' خطأ في تجزئة الذاكرة (تم تفريغ الذاكرة الأساسية)
انظر أيضاً
- Intel MPX
- أداة التحقق من التطبيقات (AppVerif.exe) في حزمة تطوير البرامج لنظام التشغيل Microsoft Windows SDK
- فالغريند ، أداة لتصحيح أخطاء الذاكرة
مراجع
- 1 2 تشو وآخرون. 2024 ، ص. 3742.
- ^ أوستن، بريتش وسوهي 1994 .
- ↑ نيكولا وآخرون 2005 .
- ↑ Nagarakatte et al. 2009 .
- ↑ سيريبرياني وآخرون 2012 .
- ↑ لي وآخرون 2015 .
- ^ ستيبانوف وسيريبرياني 2015 .
- ↑ يونان 2015 .
- ^ فان دير كوي، نيجاد وجيوفريدا 2017 .
- ↑ سونغ وآخرون 2019 .
- ↑ "ملاحظات إصدار LLVM 3.1" . LLVM . تم الاطلاع عليه بتاريخ 8 فبراير 2014 .
- ↑ "ملاحظات إصدار GCC 4.8" . GCC . تم الاطلاع عليه بتاريخ 8 فبراير 2014 .
- ↑ "معقم العناوين | وثائق مطوري Apple" .
- ↑ "ملاحظات إصدار Visual Studio 2019 الإصدار 16.9" . مايكروسوفت . تم الاطلاع عليه بتاريخ 5 مارس 2021 .
- ↑ كونستانتين سيريبرياني؛ ديريك برونينغ؛ ألكسندر بوتابينكو؛ ديمتري فيوكوف. "AddressSanitizer: أداة سريعة للتحقق من سلامة العناوين" (ملف PDF) . وقائع مؤتمر USENIX لعام 2012، المؤتمر التقني السنوي .
- ↑ "وثائق تصميم AddressSanitizer المدعومة بالأجهزة - وثائق Clang 17.0.0git" . clang.llvm.org .
- ↑ "MemorySanitizer" . GitHub .
- ↑ "مقارنة أدوات الذاكرة" . ويكي AddressSanitizer . تم الاطلاع عليه في 1 ديسمبر 2017 .
- ↑ "تجاوز برنامج AddressSanitizer" (ملف PDF) . إريك ويمبرلي . تم الاطلاع عليه في 1 يوليو 2014 .
- ↑ "KernelAddressSanitizer (KASAN)" . مؤرشف من الأصل بتاريخ 2015-09-15.
- ↑ جيك إيدج. "مطهر عنوان النواة" .
- ↑ جوناثان كوربيت. "3.20 دمج النافذة الجزء 2" .
- ↑ "معقم عنوان النواة (KASAN)" . مؤرشف من الأصل بتاريخ 2024-11-04.
- ↑ جوجل (2 مارس 2023). "المعقمات: هذا المشروع هو موطن المعقمات: AddressSanitizer وMemorySanitizer وThreadSanitizer وLeakSanitizer وغيرها" . جيت هاب . جوجل.
{{cite web}}له|last1=اسم عام ( مساعدة ) - ١ ٢ "المعقم - كتاب Rust غير المستقر" . doc.rust-lang.org .
تتيح هذه الميزة استخدام أحد المعقمات التالية: [...] ControlFlowIntegrity LLVM Control Flow Integrity
- 1 2 "دليل مستخدم مُصرّف Clang - وثائق Clang 17.0.0git" . clang.llvm.org .
-f[no-]sanitize=check1,check2,... فعّل عمليات التحقق أثناء التشغيل لأنواع مختلفة من السلوك غير المُعرّف أو المشبوه
- 1 2 "خيارات الأدوات (باستخدام مجموعة مترجمات GNU (GCC))" . gcc.gnu.org .
- ↑ "أدوات تنظيف نواة لينكس" . جوجل. 2 مارس 2023.
- ↑ "GWP-ASan — LLVM 17.0.0git documentation" . llvm.org .
- ↑ "libFuzzer – مكتبة لاختبار التشويش الموجه بالتغطية. — وثائق LLVM 17.0.0git" . llvm.org .
- 1 2 Abhishek Arya; Cris Neckar; Chrome Security Team. "Fuzzing for Security" .
- ↑ "تأمين فايرفوكس: تجربة تقنيات جديدة لتحليل الشفرة" . مؤرشف من الأصل بتاريخ 7 مارس 2016. تم الاطلاع عليه بتاريخ 18 يونيو 2018 .
- ↑ "بعض الأخطاء التي تم العثور عليها بواسطة AddressSanitizer" . GitHub .
- ↑ ماتيوز يوركزيك؛ جينفيل كولدويند (10 يناير 2014). "FFmpeg وألف حل" . مدونة J00Ru-Vx التقنية .
- ↑ "نتائج البحث عن AddressSanitizer في أخطاء FreeType" .
مصادر
- تشو، كيوون؛ كيم، جونغيون؛ دوي، خا دينه؛ ليم، هاجيونغ؛ لي، هوجون (أغسطس 2024). "RustSan: تحديث AddressSanitizer لتنظيف Rust بكفاءة" . وقائع ندوة USENIX الأمنية الثالثة والثلاثين . فيلادلفيا، بنسلفانيا، الولايات المتحدة الأمريكية: جمعية USENIX. الصفحات 3729-3746 . ISBN 978-1-939133-44-1.
- أوستن، تود م.؛ بريتش، سكوت إي.؛ سوهي، جوريندار س. (يونيو 1994). "الكشف الفعال عن جميع أخطاء الوصول إلى المؤشرات والمصفوفات" . SIGPLAN Not . 29 (6): 290–301 .
- نيكولا، جورج سي؛ كوندت، جيريمي؛ هارن، ماثيو؛ ماكبيك، سكوت؛ وايمر، ويستلي (مايو 2005). "Ccured: تحديث البرامج القديمة بطريقة آمنة من حيث النوع" (ملف PDF) . مجلة ACM للمعاملات في لغات وأنظمة البرمجة ، 27 (3): 477-526 .
- ناغاراكاتي، سانتوش؛ تشاو، جيانزو؛ مارتن، ميلو إم كيه؛ زدانسيفيتش، ستيف (2009). "Softbound: توافق عالٍ وأمان كامل للذاكرة المكانية للغة C" (ملف PDF) . وقائع المؤتمر الثلاثين لجمعية ACM SIGPLAN حول تصميم وتنفيذ لغات البرمجة . الصفحات 245-258 .
- سيريبرياني، كونستانتين؛ برونينغ، ديريك؛ بوتابينكو، ألكسندر؛ فيوكوف، ديمتري (2012). "AddressSanitizer: أداة سريعة للتحقق من سلامة العناوين" . المؤتمر التقني السنوي لـ USENIX لعام 2012. الصفحات 309-318 .
- لي، بيونغ يونغ؛ سونغ، تشنغ يو؛ جانغ، يونغ جين؛ وانغ، تيلي (2015). "منع استخدام الذاكرة بعد تحريرها باستخدام إلغاء المؤشرات المعلقة" . NDSS .
- ستيبانوف، يفغيني؛ سيريبرياني، كونستانتين (2015). "مُعَقِّم الذاكرة: كاشف سريع لاستخدام الذاكرة غير المُهيأة في لغة C++" . ندوة IEEE/ACM الدولية لعام 2015 حول توليد الشفرات وتحسينها . الصفحات 46-55 .
- يونان، إيف (2015). "فريسنتري: الحماية من ثغرات الاستخدام بعد التحرير بسبب المؤشرات المعلقة" . الندوة السنوية الثانية والعشرون لأمن الشبكات والأنظمة الموزعة .
- فان دير كووي، إريك؛ نيغاد، فينود؛ جوفريدا، كريستيانو (2017). "دانغسان: كشف قابل للتوسع لاستخدام الذاكرة بعد تحريرها" . وقائع المؤتمر الأوروبي الثاني عشر لأنظمة الحاسوب . الصفحات 405-419 .
- سونغ، دوكيونغ؛ ليتنر، جوليان؛ راجاسيكاران، برابهو؛ نا، ييول (2019). "سوك: التطهير من أجل الأمن" (ملف PDF) . ندوة IEEE للأمن والخصوصية لعام 2019. الصفحات 1275-1295 .
روابط خارجية
- أدوات اختبار الأمان
- إجراءات أمن الحاسوب
- برنامج مجاني لإدارة الذاكرة
- أدوات تصحيح أخطاء الذاكرة المجانية
