
🔎 محرك تحليل ثابت للشيفرة البرمجية لاكتشاف المشكلات الأمنية في الشيفرة.
Opengrep هو محرك SAST مفتوح المصدر الأكثر تقدمًا.
لنجعل تطوير البرمجيات الآمن معيارًا مشتركًا. يوفّر Opengrep لكل مطوّر ومؤسسة تحليلًا ثابتًا للشيفرة مفتوحًا ومتقدمًا.
يحظى Opengrep بدعم من اتحاد من مؤسسات AppSec، بما في ذلك: Aikido، Amplify، Endor Labs، Kodem، وOrca Security. لمعرفة المزيد، اقرأ البيان على opengrep.dev.
أُنشئ Opengrep عندما نقلت Semgrep ميزات حاسمة خلف ترخيص تجاري. نؤمن بأن التحليل الثابت المتقدم يجب أن يبقى مفتوحًا ومتاحًا للجميع.
المزايا الرئيسية:
أدخل Opengrep تحسينات كبيرة منذ التفرّع. تشمل أبرزها:
تحليل تلوّث فائق (--taint-intrafile):
راجع درس التلويث داخل الملف ودرس الدوال عالية الرتبة للتفاصيل.
دعم اللغات:
التوزيع:
راجع OPENGREP.md للقائمة الكاملة بالتحسينات منذ التفرّع.
Opengrep أداة تحليل ثابت فائقة السرعة للبحث عن أنماط الشيفرة بقوة grep الدلالي. حلّل قواعد شيفرة كبيرة بسرعة الفكر مع مطابقة أنماط بديهية وقواعد قابلة للتخصيص. اكتشف وأصلح الثغرات الأمنية بسرعة – وأطلق شيفرة أكثر أمانًا.
يدعم Opengrep أكثر من 30 لغة، بما في ذلك:
Apex · Bash · C · C++ · C# · Clojure · Crystal · Dart · Dockerfile · Elixir · Go · HTML · Java · JavaScript · JSON · Jsonnet · JSX · Julia · Kotlin · Lisp · Lua · OCaml · PHP · Python · R · Ruby · Rust · Scala · Scheme · Solidity · Swift · Terraform · TSX · TypeScript · Visual Basic · XML · YAML · Generic (ERB، Jinja، إلخ)
curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh | bash
أو إذا كنت قد استنسخت المستودع:
./install.sh
irm https://raw.githubusercontent.com/opengrep/opengrep/main/install.ps1 | iex
أو باستخدام إصدار محدد:
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/opengrep/opengrep/main/install.ps1))) -Version v1.16.0
الملفات التنفيذية متاحة على صفحة الإصدارات.
على Windows، تحتوي الحزمة على opengrep.exe وملفات DLL التي يحتاجها؛ احتفظ بها
معًا في الدليل الذي تثبّتها فيه.
أنشئ rules/demo-rust-unwrap.yaml بالمحتوى التالي:
rules:
- id: unwrapped-result
pattern: $VAR.unwrap()
message: "Unwrap detected - potential panic risk"
languages: [rust]
severity: WARNING
وcode/rust/main.rs بالمحتوى التالي (الذي يحتوي على unwrap محفوف بالمخاطر):
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err("Division by zero".to_string());
}
Ok(a / b)
}
fn main() {
let result = divide(10, 0).unwrap(); // Risky unwrap!
println!("Result: {}", result);
}
يجب أن يكون لديك الآن:
.
├── code
│ └── rust
│ └── main.rs
└── rules
└── demo-rust-unwrap.yaml
الآن شغّل:
❯ opengrep scan -f rules code/rust
┌──────────────┐
│ Opengrep CLI │
└──────────────┘
Scanning 1 file (only git-tracked) with 1 Code rule:
CODE RULES
Scanning 1 file.
PROGRESS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
┌────────────────┐
│ 1 Code Finding │
└────────────────┘
code/rust/main.rs
❯❯ rules.unwrapped-result
Unwrap detected - potential panic risk
9┆ let result = divide(10, 0).unwrap(); // Risky unwrap!
┌──────────────┐
│ Scan Summary │
└──────────────┘
Ran 1 rule on 1 file: 1 finding.
للحصول على مخرجات SARIF:
❯ opengrep scan --sarif-output=sarif.json -f rules code
...
❯ cat sarif.json | jq
{
"version": "2.1.0",
"runs": [
{
"invocations": [
{
"executionSuccessful": true,
"toolExecutionNotifications": []
}
],
"results": [
{
"fingerprints": {
"matchBasedId/v1": "a0ff5ed82149206a74ee7146b075c8cb9e79c4baf86ff4f8f1c21abea6ced504e3d33bb15a7e7dfa979230256603a379edee524cf6a5fd000bc0ab29043721d8_0"
},
"locations": [
{
"physicalLocation": {
"artifactLocation": {
"uri": "code/rust/main.rs",
"uriBaseId": "%SRCROOT%"
},
"region": {
"endColumn": 40,
"endLine": 9,
"snippet": {
"text": " let result = divide(10, 0).unwrap(); // Risky unwrap!"
},
"startColumn": 18,
"startLine": 9
}
}
}
],
"message": {
"text": "Unwrap detected - potential panic risk"
},
"properties": {},
"ruleId": "rules.unwrapped-result"
}
],
"tool": {
"driver": {
"name": "Opengrep OSS",
"rules": [
{
"defaultConfiguration": {
"level": "warning"
},
"fullDescription": {
"text": "Unwrap detected - potential panic risk"
},
"help": {
"markdown": "Unwrap detected - potential panic risk",
"text": "Unwrap detected - potential panic risk"
},
"id": "rules.unwrapped-result",
"name": "rules.unwrapped-result",
"properties": {
"precision": "very-high",
"tags": []
},
"shortDescription": {
"text": "Opengrep Finding: rules.unwrapped-result"
}
}
],
"semanticVersion": "1.100.0"
}
}
}
],
"$schema": "https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/schemas/sarif-schema-2.1.0.json"
}
اضبط OPENGREP_LOG_FILE (أو SEMGREP_LOG_FILE) على مسار للحصول على نسخة مما
تطبعه Opengrep على stderr، بالمستوى نفسه: التحذيرات والأخطاء افتراضيًا، وأكثر
مع --verbose أو --debug. يُقتطع الملف عند كل
تشغيل ويُنشأ دليله. لا يُكتب شيء عندما لا يكون المتغير
مضبوطًا. المسار الذي يتعذر الكتابة إليه يُنتج تحذيرًا ويستمر التشغيل
دون النسخة.
يحدد --skin تخطيط التقرير النصي: simple (الافتراضي)،
vivid، أو legacy (تخطيط الإصدارات السابقة). ويضبطه متغير البيئة
OPENGREP_SKIN أيضًا؛ و--skin له الأولوية عليه.
opengrep scan --skin vivid -f rules code
OPENGREP_SKIN=legacy opengrep scan -f rules code