تخطَّ إلى المحتوى

Opengrep - تحليل الكود الثابت مفتوح المصدر (Cheatsheet)

Opengrep - تحليل الكود الثابت مفتوح المصدر (Cheatsheet)

Opengrep هي نسخة مجتمع محكومة من محرك Semgrep، تم إنشاؤها بعد نقل الميزات خلف ترخيص تجاري. تقوم بإجراء اختبار الأمان الثابت (SAST) سريع وقائم على الأنماط عبر 30+ لغة، باستخدام قواعد مكتوبة بصيغة تبدو مثل الكود الذي يتم مطابقته — لا تحتاج إلى خبرة AST. فرضية النسخة هي أن قدرة المسح الأساسي (بما في ذلك ميزات مثل تدفق البيانات بين الملفات) يجب أن تبقى مفتوحة المصدر بالكامل.

التثبيت

الطريقةالأمر
سكريبت التثبيت`curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh
Dockerdocker run --rm -v "$PWD:/src" opengrep/opengrep opengrep scan /src
ملف ثنائيتحميل من GitHub Releases
التحققopengrep --version

المسح

الأمرالوصف
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)
patternsAND من عدة شروط
pattern-eitherOR من البدائل
pattern-notاستبعد شكل (قتل الإيجابيات الكاذبة)
pattern-insideطابق فقط ضمن سياق
metavariable-regexقيد metavariable
severityINFO / 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 مقابل الأدوات ذات الصلة

الجانبOpengrepSemgrepCodeQL
الترخيصمفتوح المصدر بالكاملOpen core + commercialمجاني للـ OSS، محدود تجاري
صيغة القاعدةأنماط تشبه الكودنفس الأصللغة QL
منحنى التعلممنخفضمنخفضعالي
الأفضل لـSAST مفتوح بدون بوابات ميزاتمنصة مدارة + قواعساستعلامات دلالية عميقة

يقترن مع معرفة Semgrep (القواعس متوافقة في الغالب) ويكمل Bandit للفحوصات الخاصة بـ Python.

الموارد