ما هو CodeQL؟

مكتمل

CodeQL هو محرك التحليل الذي يستخدمه المطورون لأتمتة عمليات التحقق من الأمان، ويستخدمه الباحثون الأمنيون لإجراء تحليل متغير.

في CodeQL، يتم التعامل مع تعليمة برمجية مثل البيانات. يتم تصميم الثغرات الأمنية والأخطاء والأخطاء الأخرى كاستعلامات يمكن تنفيذها على قواعد البيانات المستخرجة من التعليمات البرمجية. يمكنك تشغيل استعلامات CodeQL القياسية، التي كتبها باحثو GitHub والمساهمون المجتمعيون، أو كتابة استعلاماتك الخاصة لاستخدامها في التحليلات المخصصة. تبرز الاستعلامات التي تعثر على أخطاء محتملة النتيجة مباشرة في الملف المصدر.

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

تحليل المتغير

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

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

قواعد بيانات CodeQL

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

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

لكل لغة، تحدد مكتبات CodeQL الفئات لتوفير طبقة من التجريد عبر جداول قاعدة البيانات. يوفر هذا طريقة عرض موجهة للكائنات للبيانات، ما يسهل كتابة الاستعلامات.

على سبيل المثال، في قاعدة بيانات CodeQL لبرنامج Java، يوجد جدولان رئيسيان هما:

  • expressions الجدول، الذي يحتوي على صف لكل تعبير واحد في التعليمات البرمجية المصدر التي تم تحليلها أثناء عملية الإنشاء.
  • statements الجدول، الذي يحتوي على صف لكل عبارة واحدة في التعليمات البرمجية المصدر التي تم تحليلها أثناء عملية الإنشاء.

تحدد مكتبة CodeQL الفئات لتوفير طبقة من التجريد فوق كل من هذه الجداول (والجداول الإضافية ذات الصلة): Expr وStmt.

مجموعات الاستعلام

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

تسمح لك مجموعات الاستعلام بتمرير استعلامات متعددة إلى CodeQL دون الحاجة إلى تحديد المسار لكل ملف استعلام على حدة. يتم تخزين تعريفات مجموعة الاستعلام في ملفات YAML بالملحق .qls. تعريف المجموعة هو سلسلة من الإرشادات حيث تكون كل إرشادات عبارة عن تعيين YAML مع (عادة) مفتاح واحد. يتم تنفيذ التعليمات بالترتيب الذي تظهر به في تعريف مجموعة الاستعلام. بعد تنفيذ جميع التعليمات الواردة في تعريف المجموعة، تكون النتيجة مجموعة من الاستعلامات المحددة.

مجموعات الاستعلام الافتراضية

هناك مجموعتا استعلام مضمنتان ل CodeQL:

  • default: هذه هي الاستعلامات التي يتم تشغيلها بشكل افتراضي في مسح التعليمات البرمجية CodeQL على GitHub، المتوفرة مع الإعداد الافتراضي لفحص التعليمات البرمجية. الاستعلامات في مجموعة الاستعلام هذه دقيقة للغاية وترجع بعض نتائج مسح التعليمات البرمجية الإيجابية الخاطئة. بالنسبة إلى security-extended مجموعة الاستعلام، ترجع المجموعة الافتراضية عددا أقل من نتائج مسح التعليمات البرمجية منخفضة الثقة.
  • security-extended: تحتوي هذه المجموعة على جميع الاستعلامات من default المجموعة، بالإضافة إلى استعلامات أمان إضافية بدقة وخطورة أقل قليلا. وهي متوفرة مع الإعداد الافتراضي لفحص التعليمات البرمجية ويتم سردها كخيار "موسع" في القائمة المنسدلة مجموعات الاستعلام. بالنسبة إلى default مجموعة الاستعلام، قد ترجع هذه المجموعة عددا أكبر من نتائج مسح التعليمات البرمجية الإيجابية الخاطئة.

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

حزم CodeQL

يتم استخدام حزم CodedQL لتنظيم الملفات المستخدمة في تحليل CodeQL حتى تتمكن من إنشاء استعلامات ومكتبات CodeQL ومشاركتها والاعتماد عليها وتشغيلها بسهولة. تحتوي على استعلامات وملفات مكتبة ومجموعات استعلام وبيانات وصفية مهمة. باستخدام حزم CodeQL والأوامر الخاصة بإدارة الحزمة في CodeQL CLI، يمكنك نشر الاستعلامات المخصصة ودمجها في تحليل قاعدة التعليمات البرمجية.

هناك ثلاثة أنواع من حزم CodeQL: حزم الاستعلام وحزم المكتبة وحزم النماذج.

  • تم تصميم حزم الاستعلام ليتم تشغيلها. عند نشر حزمة استعلام، تتضمن المجموعة جميع التبعيات العابرة والتمثيلات المحولة برمجيا مسبقا لكل استعلام، بالإضافة إلى مصادر الاستعلام. وهذا يضمن تنفيذا متسقا وفعالا للاستعلامات في الحزمة.
  • تم تصميم حزم المكتبات لاستخدامها من قبل حزم الاستعلام (أو حزم المكتبات الأخرى) ولا تحتوي على استعلامات نفسها. لا يتم تجميع المكتبات بشكل منفصل.
  • يمكن استخدام حزم النماذج لتوسيع تحليل فحص التعليمات البرمجية لتضمين التبعيات غير المدعومة بشكل افتراضي. حزم النماذج حاليا في الإصدار التجريبي وتخضع للتغيير. أثناء الإصدار التجريبي، تتوفر حزم النماذج لتحليل Java على مستوى المستودع. لمزيد من المعلومات حول إنشاء حزم النماذج الخاصة بك، راجع "إنشاء حزمة نموذج CodeQL."

بنية حزمة CodeQL

يمكن استخدام CodeQL CLI لتطوير حزمة ونشرها باستخدام pack init الأمر . سيقوم هذا الأمر بإنشاء بنية الدليل والملفات المطلوبة، بما في ذلك الملف الرئيسي الذي تم استدعاؤه qlpack.yml في الدليل الجذر الخاص به. تخبر بيانات التعريف في كل qlpack.yml ملف CodeQL كيفية تجميع أي استعلامات في الحزمة، والمكتبات التي تعتمد عليها الحزمة، ومكان العثور على تعريفات مجموعة الاستعلامات.

يتم تضمين محتويات حزمة CodeQL (الاستعلامات أو المكتبات المستخدمة في تحليل CodeQL) في نفس الدليل مثل qlpack.yml، أو الدلائل الفرعية الخاصة به.

يعمل الدليل الذي يحتوي على ملف qlpack.yml كدليل جذر لمحتوى حزمة CodeQL. أي، بالنسبة لجميع .ql الملفات و .qlls في الحزمة، سيقوم CodeQL بحل كافة عبارات الاستيراد المتعلقة بالدليل الذي يحتوي على ملف qlpack.yml في جذر الحزمة.

فيما يلي مثال qlpack.yml على الملف:

name: codeql/java-queries
version: 0.0.6-dev
groups: java
suites: codeql-suites
extractor: java
defaultSuiteFile: codeql-suites/java-code-scanning.qls
dependencies:
    codeql/java-all: "*"
    codeql/suite-helpers: "*"

لمزيد من المعلومات حول إنشاء حزم CodeQL ونشرها، راجع "نشر حزم CodeQL واستخدامها."[1]