Opengrep is a fork of Semgrep, created by Semgrep Inc. Opengrep is not affiliated with or endorsed by Semgrep Inc.
Let's make secure software development a shared standard. Opengrep provides every developer and organization with open and advanced static code analysis.
Opengrep is initiated by a collective of AppSec organizations, including: Aikido.dev, Arnica, Amplify, Endor, Jit, Kodem, Mobb, and Orca Security. To join as a sponsor or contributor, open an issue. To learn more, read the manifesto at opengrep.dev. We aim to make SAST widely accessible, advance the engine with new impactful features, and ensure it remains open and vendor-neutral for the long-term.
Opengrep is open to any individual or organization to leverage and contribute, join the open roadmap sessions.
Opengrep is an ultra-fast static analysis tool for searching code patterns with the power of semantic grep. Analyze large code bases at the speed of thought with intuitive pattern matching and customizable rules. Find and fix security vulnerabilities, fast β ship more secure code.
Opengrep supports 30+ languages, including:
Apex Β· Bash Β· C Β· C++ Β· C# Β· Clojure Β· Dart Β· Dockerfile Β· Elixir Β· HTML Β· Go Β· Java Β· JavaScript Β· JSX Β· JSON Β· Julia Β· Jsonnet Β· Kotlin Β· Lisp Β· Lua Β· OCaml Β· PHP Β· Python Β· R Β· Ruby Β· Rust Β· Scala Β· Scheme Β· Solidity Β· Swift Β· Terraform Β· TypeScript Β· TSX Β· YAML Β· XML Β· Generic (ERB, Jinja, etc.)
Binaries available in the latest alpha release.
Create rules/demo-rust-unwrap.yaml
with the following content:
rules:
- id: unwrapped-result
pattern: $VAR.unwrap()
message: "Unwrap detected - potential panic risk"
languages: [rust]
severity: WARNING
and code/rust/main.rs
with the following content (that contains a risky 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);
}
You should now have:
.
βββ code
β βββ rust
β βββ main.rs
βββ rules
βββ demo-rust-unwrap.yaml
Now run:
β― 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.
To obtain SARIF output:
β― 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"
}