
كشف وتحليل وتحديد فريد لحالات تعطل تطبيقات ويندوز
اكتشف أخطاء التطبيقات وحللها وحدّدها بشكل فريد.
هل...
...إذاً فقد يكون BugId مناسبًا لك!
لاستخدام BugId، يرجى تنزيل وتثبيت البرامج التالية:
إذا قمت بتثبيت Python وDebugging Tools for Windows بالإعدادات الافتراضية الخاصة بهما، فيجب أن يعمل BugId دون الحاجة إلى تعديل أي إعدادات. يمكنك فك ضغط BugId في أي مكان تريده على نظام الملفات المحلي لديك.
قبل تشغيل BugId، يجب عليك تفعيل full page heap في التطبيق المستهدف.
يمكن القيام بذلك لكل ملف ثنائي (binary) عن طريق تعيين Global Flags معينة. أسهل طريقة للقيام بذلك هي استخدام سكربت pageheap.cmd المرفق مع BugId. على سبيل المثال، لتفعيل full page heap لبرنامج notepad، قم بتشغيل الأمر التالي:
C:\BugId>pageheap notepad.exe ON
(لاحظ أنه يجب تشغيل هذا الأمر من موجه أوامر بصلاحيات مرتفعة مع وصول إداري إلى الجهاز).
لتسهيل الأمور أكثر، يحتوي pageheap.cmd على قائمة بالتطبيقات المعروفة. يمكنك تفعيل أو تعطيل full page heap لأي منها عن طريق توفير اسمها، على سبيل المثال pageheap msie ON يفعّل full page heap لمتصفح إنترنت إكسبلورر من مايكروسوفت. استخدم pageheap /? للحصول على مزيد من المعلومات حول وسائط سطر الأوامر.
في هذه المرحلة، قد ترغب في اختبار ما إذا كان BugId يعمل بشكل صحيح. يمكننا القيام بذلك عن طريق تشغيل أحد التطبيقات في BugId وتعطيله لمعرفة ما إذا كان BugId يبلّغ عن الخلل بشكل صحيح. أحد التطبيقات الجيدة لاستخدامها في هذا الاختبار هو rundll32.exe الموجود في جميع تثبيتات ويندوز داخل المجلد الفرعي system32 من مجلد ويندوز (%WinDir%). يمكن استخدامه لتحميل أي ملف dll موجود على نظام الملفات المحلي واستدعاء دالة مُصدَّرة في ملف الـ dll هذا بتنسيق استدعاء معين. هناك العديد من ملفات dll في مجلد system32 تقوم بتصدير دوال. معظم هذه الدوال المُصدَّرة تتوقع وسائط بتنسيق مختلف تمامًا عن الذي سيوفره rundll32، مما يتسبب في تعطل التطبيق.
أولاً يجب علينا تفعيل full page heap في rundll32 بالأمر التالي:
C:\BugId>pageheap rundll32.exe ON
بعد ذلك سنقوم بتشغيل BugId ونخبره ببدء تشغيل rundll32 مع وسائط توجّهه إلى تحميل advapi32.dll واستدعاء CloseThreadWaitChainSession. في وقت كتابة هذا النص، يتسبب ذلك فيما يسمى بانتهاك وصول لمؤشر فارغ (NULL pointer access violation)، والذي يجب أن يكتشفه BugId ويبلّغ عنه.
C:\BugId>BugId.cmd %WinDir%\system32\rundll32.exe -- advapi32 CloseThreadWaitChainSession
لاحظ وجود -- بين rundll32.exe والوسائط المُمرَّرة إليه. يعود السبب في ذلك إلى أنك قد ترغب في توفير وسائط لكل من BugId نفسه وللتطبيق الذي تريد اختباره. يجب الفصل بين هاتين المجموعتين من الوسائط بواسطة -- على سطر الأوامر. كل ما قبل -- يعالجه BugId، وكل ما بعده يتجاهله BugId ولكنه يُمرَّر إلى التطبيق.
إذا كان كل شيء على ما يرام، فسيبدو مخرج BugId كما يلي:
* Command line: C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession
+ Main process 8024/0x1F58 (rundll32.exe): Attached; command line = C:\WINDOWS\system32\rundll32.exe advapi32 CloseThreadWaitChainSession.
,-- A bug was detect in the application ----------------------------------------
| Id @ Location: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry
| Description: Access violation while reading memory at 0x0 using a NULL pointer.
| Security impact: Denial of Service
| Version: rundll32.exe 10.0.16299.15 (x64)
| advapi32.DLL 10.0.16299.15 (x64)
| Bug report: AVR@NULL a1f.904 @ rundll32.exe!advapi32.dll!WctRemoveEntry.html (60703 bytes)
'-------------------------------------------------------------------------------
يخبرك السطر الأول بسطر الأوامر الذي سيبدأ BugId تشغيله. يخبرك السطر الثاني أن ذلك أدى إلى إنشاء عملية جديدة بمعرف عملية 8024، تقوم بتشغيل rundll32.exe، مع سطر الأوامر الخاص بهذه العملية (وهو بالطبع نفسه الموجود في السطر الأول). بعد وقت قصير من بدء تشغيل التطبيق، تم اكتشاف خلل. أنشأ BugId معرّفًا فريدًا (AVR@NULL a1f.904) لهذا الخلل وأبلغ أن موقعه في دالة WctRemoveEntry لملف advapi32.dll الذي حمّله rundll32.exe. نظرًا لأن أعطال المؤشر الفارغ (NULL pointer crashes) عادةً لا يمكن استغلالها بخلاف تعطيل التطبيق، فإن التأثير الأمني للخلل هو Denial of Service. يقوم BugId افتراضيًا بإنشاء تقرير بتنسيق HTML لكل خلل يعثر عليه ويخبرك بموقع تخزين هذا التقرير. كما ترى، فإن اسم ملف التقرير مبني على معرّف الخلل وموقعه.
يتكون كل معرّف خلل يولّده BugId من جزأين مفصولين بمسافة. يصف الجزء الأول نوع الخلل. في المثال أعلاه، AVR@NULL، وهذا يعني Access Violation Reading memory at address NULL (انتهاك وصول لقراءة الذاكرة عند العنوان NULL). يصف الجزء الثاني موقع الخلل؛ ويتكون من تجزئتين قصيرتين (hash) مفصولتين بنقطة. تُحسب هذه التجزئات من الدوال العليا في المكدس (stack) التي يُعتبر أنها ذات صلة بالخلل. في المثال، يتكون a1f.904 من a1f (محسوبة من advapi32.dll!WctRemoveEntry) و904 (محسوبة من advapi32.dll!CloseThreadWaitChainSession).
إذا قمت بتشغيل الأمر نفسه مرة أخرى، فسيبلغ BugId عن معرّف الخلل نفسه تمامًا، لأن ذلك يجب أن يتسبب في الخلل نفسه تمامًا في الكود نفسه تمامًا.
تهانينا! أنت الآن جاهز لاختبار أعطالك الخاصة باستخدام BugId، ولكن قد ترغب في تشغيل BugId.cmd --help في وقت ما للحصول على معلومات حول خيارات سطر الأوامر العديدة التي يدعمها BugId.
تم تطوير BugId واختباره على عدد كبير من التطبيقات أثناء عمليات fuzzing لتحليل مئات الآلاف من الأعطال الناتجة عن مئات من الخلل المختلفة. في هذا الدور، أثبت دقة بالغة في تحليل الخلل مع معدل منخفض جدًا من النتائج الإيجابية والسلبية الخاطئة؛ حيث يقل كلاهما عن 1%.
بالطبع، ليس من السهل اكتشاف وتحليل جميع أنواع الخلل. بعض الخلل لا يمكن اكتشافها حاليًا بشكل موثوق في وقت حدوثها، ولكنها تتسبب في تعطل في وقت لاحق جدًا في كود لا علاقة له بها تمامًا، مما يؤدي إلى تحليل غير صحيح تمامًا. في مثل هذه الحالات، ستؤدي إعادة إنتاج الخلل نفسه مرارًا وتكرارًا إلى عدد من معرّفات الخلل المختلفة، حيث يتعطل التطبيق بطرق مختلفة في أوقات مختلفة. للتأكد من أن الأمر ليس كذلك، يُنصح بتشغيل حالة الاختبار الخاصة بك في BugId عدة مرات لمعرفة ما إذا كان معرّف الخلل يظل كما هو.
خلل أخرى تتسبب في أعطال تبدو وكأنها ناتجة عن نوع مختلف من الخلل. وهذا يمكن أن يؤدي إلى تحليل ومعرّفات خلل غير صحيحة. والأبرز من ذلك، أن الخلل الناتج عن تحويلات النوع الخاطئة (bad casts) في كود C/C++ يستحيل حاليًا اكتشافها والإبلاغ عنها بواسطة BugId. يمكن أن تؤدي إلى أنواع مختلفة من الأعطال؛ وأكثرها شيوعًا انتهاكات الوصول (access violations) عندما تُستخدم القيم المخزنة في خصائص كائن ما بشكل غير صحيح كمؤشرات. إذا كنت تتوقع أن تحويلات النوع الخاطئة قد تكون سبب التعطل، فيجب عليك مراجعة التحليل الذي أجراه BugId للتأكد من صحته.
يعتمد BugId بشكل كبير على استخدام التطبيق لـ full page heap ليتمكن من اكتشاف وتحليل عدد كبير من الخلل المتعلقة بالكومة (heap). هذا يعني أنه سيكون أقل فعالية بكثير في اكتشاف وتحليل الخلل في التطبيقات التي تستخدم مدير كومة داخلي خاصًا بها لا يعتمد على كومة ويندوز القياسية.
تتوفر فترة تجريبية مجانية لـ BugId مدتها 30 يومًا للاستخدام التجاري وغير التجاري. خلال هذه الفترة التجريبية، يُرخَّص هذا العمل بموجب [رخصة المشاع الإبداعي نَسب المُصنَّف - غير تجاري 4.0 الدولية](http://creativecommons.org/licenses/by-nc/4.0/).
بعد انتهاء الفترة التجريبية، يجب الحصول على ترخيص مدفوع من license.skylined.nl إذا كنت ترغب في مواصلة استخدام BugId.
تتوفر تراخيص غير تجارية مقابل رسوم صغيرة جدًا؛ تكفي فقط لتغطية نفقاتي. كما تتوفر تراخيص تجارية لباحثي الأمن الأفراد بخصم كبير أيضًا.
إذا كانت لديك أي أسئلة حول الترخيص، أو كنت ترغب في مناقشة خصم بالجملة، فيرجى الاتصال بـ [email protected].
توجد فترة تجريبية لـ BugId للسماح لك بتقييم مدى فائدته. إذا كنت ترغب في مواصلة استخدام BugId بعد انتهاء الفترة التجريبية، أطلب منك المساهمة برسوم صغيرة لتغطية عملي على BugId ومعالجة طلب الترخيص. إذا كنت تستخدم BugId تجاريًا، أطلب منك دفع رسوم ترخيص منتظمة لمشاركة جزء من الأرباح التي تجنيها من استخدامك لـ BugId.