
🔎 Движок статического анализа кода для поиска проблем безопасности в коде.
Opengrep — самый продвинутый открытый SAST-движок.
Давайте сделаем безопасную разработку программного обеспечения общим стандартом. Opengrep предоставляет каждому разработчику и организации открытый и продвинутый статический анализ кода.
Opengrep поддерживается консорциумом организаций в области AppSec, включая: Aikido, Amplify, Endor Labs, Kodem и Orca Security. Чтобы узнать больше, прочитайте манифест на opengrep.dev.
Opengrep был создан, когда Semgrep перенёс критически важные функции за коммерческую лицензию. Мы считаем, что продвинутый статический анализ должен оставаться открытым и доступным для всех.
Ключевые преимущества:
С момента форка Opengrep внёс значительные улучшения. Основные из них:
Улучшенный анализ заражения (taint analysis) (--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"
}