Opengrep - تحليل الكود الثابت مفتوح المصدر (Cheatsheet)
Opengrep هي نسخة مجتمع محكومة من محرك Semgrep، تم إنشاؤها بعد نقل الميزات خلف ترخيص تجاري. تقوم بإجراء اختبار الأمان الثابت (SAST) سريع وقائم على الأنماط عبر 30+ لغة، باستخدام قواعد مكتوبة بصيغة تبدو مثل الكود الذي يتم مطابقته — لا تحتاج إلى خبرة AST. فرضية النسخة هي أن قدرة المسح الأساسي (بما في ذلك ميزات مثل تدفق البيانات بين الملفات) يجب أن تبقى مفتوحة المصدر بالكامل.
التثبيت
المسح
| الأمر | الوصف |
|---|
opengrep scan . | امسح الدليل الحالي بالقواعس الافتراضية |
opengrep scan --config auto . | اختر القواعس تلقائياً للغات المكتشفة |
opengrep scan --config rules/ . | استخدم دليل القواعس المحلي |
opengrep scan --config p/security-audit . | استخدم حزمة قواعس |
opengrep scan --json -o out.json . | مخرجات JSON |
opengrep scan --sarif -o out.sarif . | SARIF لمنصات مسح الأكواد |
كتابة القواعس
القواعس بصيغة YAML؛ يبدو pattern مثل الكود الذي تريد إيجاده.
rules:
- id: hardcoded-aws-key
patterns:
- pattern: $KEY = "AKIA..."
message: Possible hardcoded AWS access key
languages: [python, javascript]
severity: ERROR
| المفتاح | الغرض |
|---|
pattern | شكل الكود المطابق ($X = metavariable) |
patterns | AND من عدة شروط |
pattern-either | OR من البدائل |
pattern-not | استبعد شكل (قتل الإيجابيات الكاذبة) |
pattern-inside | طابق فقط ضمن سياق |
metavariable-regex | قيد metavariable |
severity | INFO / WARNING / ERROR |
أساسيات صيغة الأنماط
| الصيغة | المطابقة |
|---|
$X | أي تعبير واحد (metavariable) |
... | أي تسلسل (args، عبارات) |
foo(...) | أي استدعاء إلى foo |
$OBJ.method(...) | استدعاء طريقة على أي شيء |
"..." | أي حرفي string |
# ابحث عن eval() على أي مدخل غير حرفي
- pattern: eval($X)
pattern-not: eval("...")
قواعس Taint / Dataflow
rules:
- id: sqli-taint
mode: taint
pattern-sources:
- pattern: request.args.get(...)
pattern-sinks:
- pattern: cursor.execute($Q)
message: Untrusted input reaches SQL execution
languages: [python]
severity: ERROR
يتتبع Taint mode البيانات من المصادر (المدخلات غير الموثوقة) إلى المصارف (العمليات الخطرة)، وهذا كيف تجد أخطاء حقن حقيقية بدلاً من أشباه الجملة.
تكامل CI
# فشل البناء في النتائج ذات الشدة ERROR
opengrep scan --config auto --error .
# امسح فقط الملفات المتغيرة في هذا PR
opengrep scan --config auto --baseline-commit origin/main .
| العلم | التأثير |
|---|
--error | خروج غير صفر عندما توجد نتائج |
--baseline-commit | المسح الذي يدرك الفرق (نتائج جديدة فقط) |
--severity ERROR | تصفية حسب الشدة |
--exclude | تخطي المسارات (vendor، tests) |
--sarif | تحميل إلى مسح الأكواس في GitHub |
اختبار القواعس
# تأتي القواعس مع ملفات اختبار معلقة بالنتائج المتوقعة
opengrep test rules/
علق ملف اختبار بـ # ruleid: my-rule فوق سطر يجب أن يطابق و # ok: my-rule حيث يجب أن لا — ثم تحقق opengrep test من أن القاعدة تتصرف.
Opengrep مقابل الأدوات ذات الصلة
| الجانب | Opengrep | Semgrep | CodeQL |
|---|
| الترخيص | مفتوح المصدر بالكامل | Open core + commercial | مجاني للـ OSS، محدود تجاري |
| صيغة القاعدة | أنماط تشبه الكود | نفس الأصل | لغة QL |
| منحنى التعلم | منخفض | منخفض | عالي |
| الأفضل لـ | SAST مفتوح بدون بوابات ميزات | منصة مدارة + قواعس | استعلامات دلالية عميقة |
يقترن مع معرفة Semgrep (القواعس متوافقة في الغالب) ويكمل Bandit للفحوصات الخاصة بـ Python.
الموارد