简介
什么是Semgrep
Semgrep 是一个轻量级、开源的静态代码分析工具,专注于代码安全、质量检测以及模式匹配分析。它通过规则语言(类似正则表达式)对代码进行快速扫描,支持多种编程语言和框架。Semgrep 的目标是提供一种易于使用、灵活且高效的代码分析解决方案。
特点
-
易拓展(Extensible):Semgrep 可在您需要的任何位置运行,从 CLI 到 CI/CD。调查结果可以显示在开发人员工作流程、Semgrep AppSec 平台或通过 API 的现有工具中。
-
可定制(Customizable):Semgrep 具有实施任何类型的 AppSec 计划所需的功能,旨在让团队随着发展而根据自己的需求定制这些功能。
-
透明的(Transparent):Semgrep 规则对用户可见,其语法类似于源代码。任何人都可以理解为什么会发现结果以及如何优化它们。
-
非常快(Ludicrously Fast):Semgrep 的 CI 扫描中位时间为 10 秒。构建最佳的 AppSec 计划是一个迭代过程,Semgrep 不仅可以帮助您实现目标,还可以帮助您快速实现目标。
扫描原理
-
当 Semgrep 对代码执行分析时,它会创建一个抽象语法树 (AST),然后将其转换为易于分析的中间语言 (IL)。随后,Semgrep 主要在 IL 上进行与语言无关分析(language-agnostic analysis)
-
它不构建复杂的控制流图(CFG),而是直接在 中间语言 中寻找符合模式的语法结构。
# 使用 pattern-inside 模拟控制流上下文:检测在for循环内使用eval函数 rules: - id: dangerous-eval-in-loop patterns: - pattern: eval(...) - pattern-inside: | for $VAR in ...: ... message: Avoid using eval inside loops. severity: WARNING languages: - python
其他:
-
数据流分析引擎:Semgrep 引入了 数据流分析引擎 来跟踪变量值的传递路径Data-flow analysis engine overview | Semgrep
-
模式语法:Semgrep 的模式匹配支持通配符、元变量和省略号等,允许灵活地匹配代码结构Rule syntax | Semgrep
支持的语言
更多语言支持文档:Supported languages | Semgrep
Products
1 Semgrep Code
Semgrep Code 是一种静态应用程序安全测试 (Static Application Security Testing,SAST) 工具,用于检测第一方代码中的安全漏洞。您可以使用 Semgrep Code 扫描本地存储库或将其集成到 CI/CD 管道中,以自动持续扫描代码。
-
自定义规则:除了 Registry 中可用的规则之外,您还可以编写自定义规则来确定 Semgrep Code 在存储库中检测到的内容
Types of rules in the Semgrep Registry by author
社区规则 - 由 Semgrep 团队审查,这些规则包含来自 Semgrep 社区的贡献。社区规则包含一系列规则,包括许多为安全审计员制定的规则。第三方规则 - 由外部贡献者直接创建,例如 Trail of Bits、GitLab 等。
私有规则 - 由您自己的组织编写和发布的规则,仅供您的组织使用。
专业规则 - 由 Semgrep 团队创建的专有规则,针对需要准确调查结果的安全和软件工程师。这些规则为许多编程语言提供了更大的覆盖范围,并使用了最新的 Semgrep 功能。
-
支持跨文件分析/单函数分析
-
数据流跟踪:
2 Semgrep Supply Chain
Semgrep Supply Chain 是一种软件组件分析 (Software Composition Analysis,SCA) 工具,可检测开源依赖项引入的代码库中的安全漏洞
3 Semgrep Secrets
Semgrep Secrets 扫描代码以检测暴露的 API 密钥、密码和其他凭据。一旦暴露,恶意行为者可以利用这些漏洞来泄露数据或访问敏感系统
规则类型
-
best-practice(最佳实践):避免使用容易导致错误的代码模式;强制使用更安全、高效或清晰的代码结构。
Error个数 | Wraning个数 | info个数 | |
---|---|---|---|
Java | 0 | 1 | 0 |
C/C++ | 0 | 0 | 0 |
Python | 6 | 18 | 0 |
Go | 0 | 2 | 0 |
Why is it bad practice to call System.gc()?
-
correctness(代码正确性):识别代码中的逻辑或语法错误,确保代码按预期运行。
Error个数 | Wraning个数 | info个数 | |
---|---|---|---|
Java | 3 | 1 | 0 |
C/C++ | 1 | 3 | 0 |
Python | 17 | 20 | 1 |
Go | 0 | 5 | 2 |
-
maintainability(可维护性):识别复杂或冗余的代码结构。
Error个数
Wraning个数
info个数
Java
0
0
0
C/C++
0
0
0
Python
4
10
11
Go
0
2
2
-
performance(性能优化):识别低效算法或数据结构的使用。
Error个数
Wraning个数
info个数
Java
0
0
0
C/C++
0
0
0
Python
2
5
0
Go
0
0
0
-
portability(可移植性):检测依赖于特定平台或环境的代码。
Error个数
Wraning个数
info个数
Java
0
0
0
C/C++
0
0
0
Python
0
0
0
Go
0
0
0
-
security(安全性):识别代码中可能导致安全漏洞的问题,如 SQL 注入、XSS 和 CSRF
XSS:XSS(Cross-Site Scripting,跨站脚本攻击)XSS 是一种网络安全漏洞,攻击者通过在网站中注入恶意脚本,使脚本在其他用户的浏览器中执行,从而窃取数据、冒充用户行为或执行其他恶意操作。
CSRF:(Cross-Site Request Forgery,跨站请求伪造)CSRF 是一种攻击方式,攻击者通过伪造合法用户的请求,强迫用户在未授权的情况下执行操作(如转账、修改密码、发送数据)。
-
Error个数
Wraning个数
info个数
Java
171
217
8
C/C++
52
49
127
Python
299
309
63
Go
63
121
4
自定义规则
AI-assisted triage and autofix
Semgrep Assistant 提供 AI 驱动的安全建议,帮助您查看、分类和修复 Semgrep 调查结果。
Semgrep In CI
参考:Sample CI configurations | Semgrep
参考文档
XSS:XSS(Cross-Site Scripting,跨站脚本攻击)XSS 是一种网络安全漏洞,攻击者通过在网站中注入恶意脚本,使脚本在其他用户的浏览器中执行,从而窃取数据、冒充用户行为或执行其他恶意操作。
CSRF:(Cross-Site Request Forgery,跨站请求伪造)CSRF 是一种攻击方式,攻击者通过伪造合法用户的请求,强迫用户在未授权的情况下执行操作(如转账、修改密码、发送数据)。