如何在组织中引入Semgrep - Trail of Bits博客
Semgrep是一款用于在30多种语言中查找错误和特定代码模式的静态分析工具,以其易用性、丰富的内置规则和轻松创建自定义规则的能力脱颖而出。我们认为它是发现代码库安全问题的必备自动化工具。既然Semgrep能直接提升代码安全性,很容易说"直接用吧!“但这具体意味着什么?
Semgrep设计灵活,可满足组织的特定需求。为获得最佳效果,重要的是了解如何运行Semgrep、使用哪些规则以及如何将其集成到CI/CD管道中。如果您不确定如何开始,以下是我们基于多年经验制定的七步计划,用于确定如何将Semgrep最佳集成到您的SDLC中。
7步Semgrep实施计划
1. 语言支持审查
查看支持的语言列表,了解Semgrep是否能帮助您。
2. 探索阶段
在小项目上尝试Semgrep评估其效果。例如,导航到项目根目录并运行:
|
|
运行此命令时需要注意几个重要事项:
--config auto
选项会向Semgrep提交指标,这可能不是您想要的- 这种方式运行会显示已识别问题的概览,包括数量和严重性
- 通常可以使用此CLI标志获得Semgrep覆盖技术的广泛视图
Semgrep通过文件扩展名而非内容分析来识别编程语言。默认使用.semgrepignore
文件排除某些路径扫描。此外,Semgrep会排除.gitignore
中列出的未跟踪文件。
3. 深入分析
不使用auto选项,而是根据关键安全模式、技术栈和需求从Semgrep注册表选择规则集。
尝试:
|
|
或基于技术选择规则集:
|
|
首先关注具有高置信度和中高影响元数据的规则。如果结果过多,使用--severity ERROR
标志将结果限制为错误严重性。
解决识别的问题并在错误报告中包含重现说明。
4. 精细调优
通过审查当前使用规则集的效果,获得理想的规则集链。
也查看非安全规则集,如最佳实践规则。这将增强代码可读性,并可能防止未来引入漏洞。同时考虑覆盖项目的其他方面:
- Shell脚本、配置文件、通用文件、Dockerfile
- 第三方依赖(Semgrep供应链,付费功能,可帮助检测是否以可利用方式使用易受攻击的包)
要忽略Semgrep的错误代码模式,在模式匹配的前一行代码中使用注释,例如// nosemgrep: go.lang.security.audit.xss
。同时解释为何禁用规则或提供风险接受理由。
创建自定义.semgrepignore
文件,通过排除特定文件或文件夹减少噪音。Semgrep默认忽略.gitignore
中列出的文件。为保持这一点,创建.semgrepignore
文件后,使用模式:include .gitignore
将.gitignore
添加到您的.semgrepignore
中。
5. 创建内部规则库
6. 推广培训
培训开发人员和其他相关团队有效使用Semgrep。
展示试点测试结果和改进组织代码质量和安全的建议。展示Semgrep的潜在限制(仅单文件分析)。
包含官方Learn Semgrep资源,并展示带有"简单模式"的Semgrep Playground以便轻松创建规则。
提供编写自定义规则的概述,并强调编写自定义Semgrep规则很容易。提及自定义规则可以使用fix:
键通过自动修复功能进行扩展。鼓励在自定义规则中使用元数据(即CWE、置信度、可能性、影响)以支持漏洞管理过程。
为帮助开发人员回答"我应该为这个问题创建Semgrep规则吗?“的问题,可以使用以下后续问题:
- 我们能检测特定的安全漏洞吗?
- 我们能强制执行最佳实践/约定或保持代码一致性吗?
- 我们能通过检测影响性能的代码模式来优化代码吗?
- 我们能验证特定的业务需求或约束吗?
- 我们能识别已弃用/未使用的代码吗?
- 我们能在配置文件中发现任何错误配置吗?
- 在代码审查时这是反复出现的问题吗?
- 代码文档如何处理,文档的要求是什么?
为团队创建讨论Semgrep、编写自定义规则、故障排除(例如Slack频道)和记录Semgrep规则想法(例如在Trello板上)的场所。同时考虑为组织安全审计/漏洞赏金计划期间发现的错误编写自定义规则。汇总快速笔记以帮助团队使用Semgrep是个好主意(参见下文附录)。
关注Semgrep Community Slack,Semgrep社区在此帮助解决问题或编写自定义规则。
鼓励团队通过填写GitHub问题向Semgrep团队报告使用Semgrep时的现有限制/错误(参见Trail of Bits提交的此示例问题)。
7. CI/CD管道集成
通过熟悉与CI供应商相关的Semgrep文档,在CI/CD管道中实施Semgrep。逐步合并Semgrep很重要,避免用过多结果压倒开发人员。因此,首先在存储库上进行试点测试。然后,在CI/CD管道中的主分支上按计划实施完整的Semgrep扫描。最后,在事件触发时(例如拉取/合并请求)包含差异感知扫描方法。差异感知方法仅在触发时扫描文件中的更改,保持效率。此方法应检查提供高置信度和真阳性结果的精细调整规则集。一旦Semgrep实施成熟,在CI/CD管道中配置Semgrep以阻止具有未解决Semgrep发现的PR管道。
下一步是什么?最大化Semgrep在组织中的价值
在向组织引入Semgrep时,请记住它会频繁更新。为充分利用其优势,指定组织中的一个人负责分析新功能(例如Semgrep Pro,它通过文件间编码范式扩展代码库扫描,而不是Semgrep的单文件方法)、通知团队有关Semgrep规则的外部存储库,并确定付费订阅的价值(例如访问高级规则)。
此外,使用Trail of Bits测试手册,这是一个简洁的指南,帮助开发人员和安全专业人员最大化静态和动态分析工具的潜力。本手册的第一章专门关注Semgrep。查看它以了解更多!
附录:我希望在使用前知道的事情
使用Semgrep
- 在Visual Studio Code中使用
--sarif
输出标志和Sarif Viewer扩展,以有效导航已识别的代码。 --config auto
选项可能会遗漏一些漏洞。手动语言选择(--lang
)和规则集可能更有效。- 可以使用别名:
alias semgrep="semgrep --metrics=off"
或SEMGREP_SEND_METRICS
环境变量来记住禁用指标。 - 使用临时规则,例如
semgrep -e 'exec(...)' —lang=py ./
,以grep工具的风格快速使用Semgrep。 - 可以使用自动完成功能使用TAB键更快地使用命令行。
- 可以同时运行多个预定义配置:
semgrep --config p/cwe-top-25 --config p/jwt
。 - Semgrep Pro Engine功能消除了Semgrep仅分析单个文件的限制。
- Semgrep注册表中的规则可以在playground中测试(参见Trail of Bits匿名竞争条件规则)。
- 元变量分析支持两个分析器:redos和entropy。
- 可以使用metavariable-pattern在单个文件内跨不同语言匹配模式(例如HTML中嵌入的JavaScript)。
- focus-metavariable可以减少污染模式中的误报。
编写规则
- 元变量必须大写:$A,而不是$a
- 使用pattern-regex:
(?s)\A.*\Z
模式识别不包含特定字符串的文件(参见示例) - 在多行编写正则表达式时,使用
>-
字符,而不是|
。|
字符写入换行符(\n
)并可能导致正则表达式失败(参见示例) - 可以使用类型化元变量,例如
$X == (String $Y)
- Semgrep以下列方式支持变量赋值语句:
- 可以使用方法链:
- 深度表达式运算符使用语法
<... pattern ...>
匹配复杂、嵌套的表达式 - 可以使用paths关键字将特定规则应用于特定路径(参见avoid-apt-get-upgrade规则,仅适用于Dockerfile):
|
|
最后,Trail of Bits有一个公共Semgrep规则存储库!在此查看并立即使用semgrep --config p/trailofbits
命令。
有用链接
有关创建自定义规则的更多信息,请阅读我们关于机器学习库和发现goroutine泄漏的博客。
我们编制了额外资源列表,以进一步协助您的Semgrep采用过程。这些链接提供了关于该工具、其应用程序和支持社区的各种观点和详细信息:
- Semgrep支持的语言和技术
- Semgrep隐私政策
- p/default、p/owasp-top-ten、p/cwe-top-25规则集
- 在Semgrep中忽略文件、文件夹或代码
- 实验功能:通用模式匹配
- 编写修复程序的提示和技巧
- 在持续集成中开始使用Semgrep
- Semgrep Community Slack