如何向组织引入Semgrep - Trail of Bits博客
Semgrep是一款用于在30多种语言中查找错误和特定代码模式的静态分析工具,以其易用性、丰富的内置规则和轻松创建自定义规则的能力而脱颖而出。我们认为它是发现代码库中安全问题的必备自动化工具。既然Semgrep可以直接提高代码安全性,很容易说"直接用吧!“但这具体意味着什么?
Semgrep设计灵活,可满足组织的特定需求。为获得最佳效果,重要的是了解如何运行Semgrep、使用哪些规则以及如何将其集成到CI/CD流水线中。如果您不确定如何开始,以下是我们基于多年经验制定的七步计划,以确定如何最好地将Semgrep集成到您的SDLC中。
7步Semgrep计划
1. 语言支持审查
查看支持的语言列表,了解Semgrep是否能帮助您。
2. 探索阶段
在小项目上尝试Semgrep以评估其效果。例如,导航到项目根目录并运行:
|
|
运行此命令时需要注意几个重要事项:
--config auto选项会向Semgrep提交指标,这可能不是您想要的- 这种方式调用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和熵
- 可以使用
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