
ورشة عمل CodeQL تغطي CVE-2021-21380
في هذه الورشة سنستخدم التفكير النحوي والدلالي لإيجاد حقن SQL في مكون التقييم الخاص بمنصة XWiki الموثقة في CVE-2021-21380
يرجى إكمال هذا القبل بدء الورشة، إن أمكن.
ثبّت Visual Studio Code.
لا تحتاج إلى تثبيت واجهة سطر الأوامر CodeQL: ستتولى الإضافة ذلك نيابة عنك.
استنسخ هذا المستودع:
git clone https://github.com/advanced-security/codeql-workshop-cve-2021-21380.git
xwiki-platform-CVE-2021-21380.zip في عرض المستكشف واختر الأمر CodeQL: Set Current Database.Cmd/Ctrl+Shift+P)، ابحث عن الأمر CodeQL: Install Pack Dependencies وشغّله.github في المربع لتصفية القائمة.cve-2021-21380-exercises و cve-2021-21380-exercises-tests و cve-2021-21380-solutions و cve-2021-21380-solutions-tests.الورشة مقسمة إلى عدة تمارين تقدم دعم لغة QL لجافا وتنتهي باستعلام نهائي لإيجاد حقن SQL المعروف. في هذه التمارين ستتعلم:
في هذه الورشة سنبحث عن ثغرات حقن SQL المعروفة في مكون واجهة برمجة تطبيقات التقييمات في منصة XWiki. يمكن أن تحدث هذه الثغرات في التطبيقات عندما تصل معلومات يتحكم فيها مستخدم خارجي إلى كود التطبيق الذي ينشئ استعلام SQL بشكل غير آمن وينفذه.
حقن SQL المعروف الذي نناقشه في هذه الورشة مُراجَع في GHSA-79rg-7mv3-jrr5 في قاعدة بيانات استشارات GitHub. لإيجاد حقن SQL والمتغيرات المحتملة، سنتعامل مع المشكلات الفرعية التالية:
في التمارين القليلة الأولى سنفكر في المعلومات النحوية، باستخدام شجرة النحو المجرد (AST)، لتحديد:
ابحث عن جميع الطرق التي تحمل الاسم getAverageRating ونوعها المُصرِّح في البرنامج بإكمال الاستعلام exercise1.ql
java فئة Method لتحليل الطرق في البرنامج.Method المسندات الأعضاء getName و hasName لتحليل اسم الطريقة.Method العضو getDeclaringType لتحليل النوع الذي يُصرِّح بالطريقة.يمكن إيجاد الحل في الاستعلام exercise1.ql
يعيد حل التمرين 1 قائمة من الطرق. بعضها مُعرَّف في واجهة تسمى RatingsManager وبعضها مُعرَّف في الصنفين AbstractRatingsManager و RatingsScriptService.
من المعلومات التي يُعيدها الاستعلام و توثيق مكونات XWiki يمكننا استنتاج أن:
Role، وتنفيذ موضح بـ Component.ScriptService يُجعل متاحًا لصفحات الويكي من خلال البرمجة النصية.ابحث عن جميع الأصناف الموضحة بالتعليق التوضيحي Component بإكمال الاستعلام exercise2.ql.
لاحظ أن الاسم المؤهل بالكامل لنوع التعليق التوضيحي هو org.xwiki.component.annotation.Component.
this في /المسند المميز/.Class طريقة getAnAnnotation للحصول على التعليقات التوضيحية المرتبطة.Annotation المسند العضو getType لتحليل نوعه.Type المسندين الأعضاء getName و hasName لتحليل اسم النوع.RefType، التي تمثل الأصناف والواجهات، المسندين الأعضاء getQualifiedName و hasQualifiedName لتحليل الاسم المؤهل بالكامل لنوع المرجع.يمكن إيجاد الحل في الاستعلام exercise2.ql
ابحث عن جميع المكونات التي تنفذ واجهة ScriptService بإكمال الاستعلام excercise3.ql
Class المسند العضو getASuperType لتحليل الأنواع العليا للصنف، أي الأنواع التي يمتدها (extends) أو ينفذها (implements).يمكن إيجاد الحل في الاستعلام exercise3.ql
في هذه المرحلة حددنا نحويًا الطرق التي يمكن للمستخدم استدعاؤها والتي سنعتبر معاملاتها مصادر للبيانات غير الموثوقة في وقت لاحق من الورشة.
في التمرين التالي سنحقق ونتعرف على المصابين المحتملين. من نتائج التمرين 1 يمكننا استنتاج أن أحد التطبيقات يستدعي الطريقة getAverageRatingFromQuery. باستخدام استعلام مماثل يمكننا إيجاد أنواع المُصرِّحين لـ getAverageRatingFromQuery مما يسمح لنا بتحديد أن التطبيق في الصنف AbstractRatingsManager يُنشئ عبارة SQL التي تُمرر إلى الطريقة search.
الطريقة search مطبقة في تبعية وبالتالي فإن تطبيقها غير متوفر. في التمارين التالية سنستخدم معلومات النوع المتاحة لتحديد استدعاء الطريقة search هذا ونوعها المُصرِّح.
ابحث عن جميع استدعاءات الطرق للطريقة search وحدد نوعها المُصرِّح بإكمال الاستعلام exercise4.ql
MethodCall الوسائل لتحليل استدعاءات الطرق.MethodAcccess المسند العضو getMethod لتحليل هدف استدعاء الطريقة.يمكن إيجاد الحل في الاستعلام exercise4.ql