Lightweight static analysis for many languages. Find bug variants with patterns that look like source code.
Project description
Lightweight static analysis for many languages.
Find and block bug variants with rules that look like source code.
Getting Started
·
Examples
·
Resources
Usage
·
Contributing
·
Commercial Support
Semgrep tl;dr:
- A simple, customizable, and fast static analysis tool for finding bugs
- Combines the speed and customization of
grep
with the precision of traditional static analysis tools - No painful domain-specific language; Semgrep rules look like the source code you’re targeting
- Batteries included with hundreds of existing community rules for OWASP Top 10 issues and common mistakes
- Runs in CI, at pre-commit, or in the editor
- Runs offline on uncompiled code
Semgrep supports:
Go | Java | JavaScript | JSON | Python | Ruby (beta) | TypeScript (beta) | JSX (beta) | TSX (beta) |
---|
Semgrep also has alpha-level support for OCaml, PHP, and C.
Semgrep is proudly supported by r2c. Learn more about a hosted version of Semgrep with an enterprise feature set at r2c.dev.
Getting Started
The best place to start with Semgrep and rule writing is its Quick Start. For a more in-depth introduction to its syntax and use cases visit the Semgrep Tutorial.
Semgrep can be installed using brew
, pip
, or docker
:
# For macOS
$ brew install semgrep
# On Ubuntu/WSL/linux, we recommend installing via `pip`
$ python3 -m pip install semgrep
# To try Semgrep without installation run via Docker
$ docker run --rm -v "${PWD}:/src" returntocorp/semgrep --help
To confirm installation and get an overview of Semgrep's functionality run with --help
:
$ semgrep --help
Once installed, Semgrep can be run with single rule patterns or entire rule sets:
# Check for Python == where the left and right hand sides are the same (often a bug)
$ semgrep -e '$X == $X' --lang=py path/to/src
# Run a ruleset with rules for many languages
$ semgrep --config=p/r2c-CI path/to/src
Explore the Semgrep Registry of rules and CI integrations at semgrep.dev.
Examples
Use case | Semgrep rule |
---|---|
Ban dangerous APIs | Prevent use of exec |
Search routes and authentiation | Extract Spring routes |
Enforce the use secure defaults | Securely set Flask cookies |
Enforce project best-practices | Use assertEqual for == checks, Always check subprocess calls |
Codify project-specific knowledge | Verify transactions before making them |
Audit security hotspots | Finding XSS in Apache Airflow, Hardcoded credentials |
Audit configuration files | Find S3 ARN uses |
Migrate from deprecated APIs | DES is deprecated, Deprecated Flask APIs, Deprecated Bokeh APIs |
Apply automatic fixes | Use listenAndServeTLS |
Try it out
Give some rulesets a spin by running on known vulnerable repositories:
# juice-shop, a vulnerable Node.js + Express app
$ git clone https://github.com/bkimminich/juice-shop
$ semgrep --config p/r2c-security-audit juice-shop
# railsgoat, a vulnerable Ruby on Rails app
$ git clone https://github.com/OWASP/railsgoat
$ semgrep --config p/r2c-security-audit railsgoat
# govwa, a vulnerable Go app
$ git clone https://github.com/0c34/govwa
$ semgrep --config p/r2c-security-audit govwa
# vulnerable Python+Flask app
$ git clone https://github.com/we45/Vulnerable-Flask-App
$ semgrep --config p/r2c-security-audit Vulnerable-Flask-App
# WebGoat, a vulnerable Java+Sprint app
$ git clone https://github.com/WebGoat/WebGoat
$ semgrep --config p/r2c-security-audit WebGoat
Resources
Learn more:
Get in touch:
- Submit a bug report
- Join the Semgrep Slack to say "hi" or ask questions
Usage
Command Line Options
See semgrep --help
for command line options.
Exit Codes
semgrep
may exit with the following exit codes:
0
: Semgrep ran successfully and found no errors1
: Semgrep ran successfully and found issues in your code- >=
2
: Semgrep failed to run
Upgrading
To upgrade, run the command below associated with how you installed Semgrep:
# Using Homebrew
$ brew upgrade semgrep
# Using pip
$ python3 -m pip install --upgrade semgrep
# Using Docker
$ docker pull returntocorp/semgrep:latest
Contributing
Semgrep is LGPL-licensed and we welcome contributions.
To start contributing, first please make sure you read and agree with the Contributor Covenant Code of Conduct. Then check out a few ways you can get involved:
- File an issue
- Fix a bug — pick from the good first issues or work on any of the currently open bugs
- Add a feature — see the enhancement issues for inspiration
- Update the docs
- Help each other in the community Slack
Please see the contribution guidelines for info about the development workflow, testing, and making PRs.
Commercial Support
Semgrep is a frontend to a larger program analysis library named pfff
. pfff
began and was open-sourced at Facebook but is now archived. The primary maintainer now works at r2c. Semgrep was originally named sgrep
and was renamed to avoid collisons with existing projects.
Semgrep is supported by r2c. We're hiring!
Interested in a fully-supported, hosted version of Semgrep? Drop your email and we'll be in touch!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
File details
Details for the file semgrep-0.29.0.tar.gz
.
File metadata
- Download URL: semgrep-0.29.0.tar.gz
- Upload date:
- Size: 71.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 39cac748483b5d4f49b798f59afc69ecb4bbd8b429b6dc0b7100ea27553c3cba |
|
MD5 | 574bee39c93d90f413ce5fc4c3f9c8d7 |
|
BLAKE2b-256 | c4117ed12de14c5dfecf076c01457b3250bc49623f2d000017735cc026c4522b |
File details
Details for the file semgrep-0.29.0-cp36.cp37.cp38.py36.py37.py38-none-macosx_10_14_x86_64.whl
.
File metadata
- Download URL: semgrep-0.29.0-cp36.cp37.cp38.py36.py37.py38-none-macosx_10_14_x86_64.whl
- Upload date:
- Size: 45.7 MB
- Tags: CPython 3.6, CPython 3.7, CPython 3.8, Python 3.6, Python 3.7, Python 3.8, macOS 10.14+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b849230f3265544ac3e0c76bfa6eadd0a1fb90590a61a7ab803aa465d99e88d5 |
|
MD5 | 29e720bd148af4a617581c030beefff3 |
|
BLAKE2b-256 | 6a42c5db91810de198c2379540478f1c969344a0f3500d546db76af768287091 |
File details
Details for the file semgrep-0.29.0-cp36.cp37.cp38.py36.py37.py38-none-any.whl
.
File metadata
- Download URL: semgrep-0.29.0-cp36.cp37.cp38.py36.py37.py38-none-any.whl
- Upload date:
- Size: 91.9 MB
- Tags: CPython 3.6, CPython 3.7, CPython 3.8, Python 3.6, Python 3.7, Python 3.8
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.3.2 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7a5b73d0bda0d3876e8f43f038a38770410f20af2dbbf88c1a6384041976a6a1 |
|
MD5 | e1c72defee1b5ce87d88e412dec84d74 |
|
BLAKE2b-256 | 59e31ee0b59dc1ccf43019a60781454ba8d4cbbfa54cfac785b464f8785ddb95 |