Semgrep 是一个快速、开源、静态分析工具,用于搜索代码、发现漏洞,并强制执行安全护栏和编码标准。Semgrep 支持 30 多种语言,可在 IDE、作为预提交检查以及作为 CI/CD 工作流的一部分运行。
Semgrep 是面向代码的语义 grep。当运行 grep "2" 只能匹配精确字符串 2 时,Semgrep 可以在搜索 2 时匹配 x = 1; y = x + 1。Semgrep 规则看起来就像你平时编写的代码;无需处理抽象语法树、正则表达式或痛苦的 DSL。
请注意,在安全上下文中,Semgrep 社区版会遗漏许多真实的正面结果,因为它只能分析单个函数或文件内的代码。如果你希望将 Semgrep 用于安全目的(SAST、SCA 或 机密扫描),强烈推荐使用 Semgrep AppSec Platform,因为它增加了以下关键能力:
Semgrep AppSec Platform 开箱即用,提供 20000+ 条专有规则,覆盖 SAST、SCA 和机密扫描。专业规则由 Semgrep 安全研究团队编写和维护,准确性极高,因此 AppSec 团队可以放心地将发现直接带给开发者,而不会拖慢他们的速度。
Semgrep 在你的计算机或构建环境中本地分析代码:默认情况下,代码永远不会被上传。开始使用 →.
Semgrep Code 支持 30 多种语言,包括:
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 · 通用(ERB、Jinja 等)
Semgrep Supply Chain 支持 12 种语言,涵盖 15 个包管理器,包括:
C# (NuGet) · Dart (Pub) · Go (Go modules, go mod) · Java (Gradle, Maven) · Javascript/Typescript (npm, Yarn, Yarn 2, Yarn 3, pnpm) · Kotlin (Gradle, Maven) · PHP (Composer) · Python (pip, pip-tool, Pipenv, Poetry) · Ruby (RubyGems) · Rust (Cargo) · Scala (Maven) · Swift (SwiftPM)
更多信息请参阅支持的语言。
对于新用户,我们建议从 Semgrep AppSec Platform 开始,因为它提供了可视化界面、演示项目、结果分类和探索工作流,并且可以快速在 CI/CD 中完成设置。扫描仍然是本地的,代码不会上传。你也可以从 CLI 开始,通过终端输出来运行一次性搜索。
在 semgrep.dev 上注册
探索演示发现,了解 Semgrep 如何工作
通过导航到 Projects > Scan New Project > Run scan in CI 扫描你的项目
选择你的版本控制系统并按照入门步骤添加项目。完成此设置后,Semgrep 将在每次拉取请求后扫描你的项目。
[可选] 如果你想在本地运行 Semgrep,请遵循 CLI 部分中的步骤。
如果遇到任何问题,请在 Semgrep Slack 中寻求帮助。
安装 Semgrep CLI
# 对于 macOS
$ brew install semgrep
# 对于 Ubuntu/WSL/Linux/macOS
$ python3 -m pip install semgrep
# 在不安装的情况下尝试 Semgrep,通过 Docker 运行
$ docker run -it -v "${PWD}:/src" semgrep/semgrep semgrep login
$ docker run -e SEMGREP_APP_TOKEN=<TOKEN> --rm -v "${PWD}:/src" semgrep/semgrep semgrep ci
运行 semgrep login 创建你的账户并登录 Semgrep。此步骤可选,但登录 Semgrep 后你可以访问:
进入你的应用根目录并运行 semgrep ci。这将扫描你的项目,检查源代码及其依赖项中的漏洞。
使用 -e 尝试交互式编写你自己的查询。例如,检查 Python 中左右两边相同的 ==(可能是 bug):
$ semgrep -e '$X == $X' --lang=py path/to/src
Semgrep 生态系统包括以下内容:
Semgrep 社区版 - 核心的开源程序分析引擎。适用于对误报容忍度较高的临时用例——例如顾问、安全审计员或渗透测试人员。
Semgrep AppSec Platform - 轻松编排和扩展跨组织的 SAST、SCA 和机密扫描,而不会造成开发者过载。自定义开发者看到哪些发现、在哪里看到它们,并与 GitHub、GitLab、CircleCI 等 CI 提供商集成。包括免费和付费层级。
Semgrep Code (SAST) - 通过最小化噪音并赋能开发者自主快速修复问题(即使他们没有安全知识),从而在漏洞积压方面取得真正进展。易于部署的安全护栏和量身定制的逐步修复指导意味着开发者实际上会修复问题,因为他们不会感到被拖慢。
Semgrep Supply Chain (SSC) - 一个高信号依赖扫描器,可检测开源第三方库和函数中可达的漏洞。
Semgrep Secrets (机密扫描) - 使用语义分析、改进的熵分析和验证,在开发者工作流中准确暴露敏感凭据的机密检测工具。
Semgrep Assistant (AI) - Assistant 是一个 AI 驱动的 AppSec 工程师,帮助开发者和 AppSec 团队按规模优先排序、分类和修复 Semgrep 发现。人类同意 Assistant 自动分类决定的概率为 97%,认为生成的修复指导有用的概率为 80%。关于 Assistant 如何工作的概述,请阅读此概述。
Semgrep MCP 服务器 - 一个 Model Context Protocol (MCP) 服务器,允许 AI 编码助手直接运行 Semgrep 扫描。集成于 Cursor、VS Code、Windsurf、Claude Desktop 等。运行 semgrep mcp 在本地启动。
write_custom_semgrep_rule)帮助 AI 助手编写准确的 Semgrep 规则。/plugin marketplace add semgrep/mcp-marketplace其他资源:
加入成千上万已在 GitLab、Dropbox、Slack、Figma、Shopify、HashiCorp、Snowflake 和 Trail of Bits 等公司使用 Semgrep 的开发者和安全工程师。
Semgrep 由 Semgrep, Inc.,一家软件安全公司 开发并商业化支持。
Semgrep 规则看起来就像你平时编写的代码;无需处理抽象语法树、正则表达式或痛苦的 DSL。这里有一个查找 Python print() 语句的快速规则。
通过在 此处点击 在 Semgrep Playground 中在线运行它。
访问 Docs > Rule examples 了解用例和想法。
访问 Docs > Extensions 了解如何在编辑器或预提交中使用 Semgrep。当集成到 CI 并配置为扫描拉取请求时,Semgrep 只会报告该拉取请求引入的问题;这使你可以开始使用 Semgrep,而无需修复或忽略预先存在的问题!
浏览网站上的完整 Semgrep 文档。如果你是 Semgrep 新手,请查看 Docs > Getting started 或交互式教程。
使用来自 Registry 的远程配置(如 --config=p/ci)会向 semgrep.dev 报告伪匿名规则指标。
当使用来自本地文件的配置(如 --config=xyz.yml)时,仅当用户已登录时才会发送指标。
要禁用 Registry 规则指标,请使用 --metrics=off。
Semgrep 隐私政策 描述了指导数据收集决策的原则,以及在启用指标时收集和不收集的数据的细分。
$ brew upgrade semgrep
$ pipx upgrade semgrep
$ uv tool upgrade semgrep
$ docker pull semgrep/semgrep:latest
| 用例 | Semgrep 规则 |
|---|
| 禁止危险的 API | 防止使用 exec |
| 搜索路由和认证 | 提取 Spring 路由 |
| 强制使用安全默认值 | 安全设置 Flask cookies |
| 污染数据流入接收器 | ExpressJS 数据流进入 sandbox.run |
| 强制项目最佳实践 | 对 == 检查使用 assertEqual,始终检查子进程调用 |
| 编码项目特定知识 | 在执行交易前验证 |
| 审计安全热点 | 在 Apache Airflow 中寻找 XSS,硬编码凭证 |
| 审计配置文件 | 查找 S3 ARN 使用 |
| 从已弃用的 API 迁移 | DES 已弃用,已弃用的 Flask API,已弃用的 Bokeh API |
| 应用自动修复 | 使用 listenAndServeTLS |