30条全新Semgrep规则:Ansible、Java、Kotlin、Shell脚本及其他
我们发布了30条自定义Semgrep规则,覆盖Ansible剧本、Java/Kotlin代码、Shell脚本和Docker Compose配置文件。这些规则专为审计所列技术中的常见安全漏洞而创建和使用。此次发布的Semgrep规则与我们公开的CodeQL查询和测试手册共同构成向安全社区分享技术专长的成果。本文将简要介绍新规则,并深入探讨创建这些规则时使用的两项较少人知的Semgrep功能:通用模式(generic mode)和YAML支持。
规则集概览
本次发布的内部Semgrep规则重点关注以下问题:未加密网络传输(HTTP、FTP等)、禁用的SSL证书验证、常见命令行工具的不安全标志、无限制IP地址绑定、Java/Kotlin杂项问题等。新规则包括:
| 模式 | 规则ID | 规则描述 |
|---|---|---|
| Generic | container-privileged | 发现具有扩展权限的容器命令 |
| Generic | container-user-root | 发现以root身份运行的容器命令 |
| Generic | curl-insecure | 发现禁用SSL验证的curl命令 |
| Generic | curl-unencrypted-url | 发现使用未加密URL(如HTTP、FTP等)的curl命令 |
| … | … | … |
| Java, Kotlin | gc-call | 调用gc会建议JVM运行垃圾回收器,但依赖此行为实现正确性或内存管理是反模式 |
| YAML (Ansible) | apt-key-unencrypted-url | 发现使用未加密URL下载apt密钥 |
(完整规则列表详见原文表格)
Semgrep 201:中级功能
Semgrep是一款用于发现代码模式的静态分析工具,涵盖安全漏洞、错误变体、密钥检测、性能和正确性问题等。虽然Semgrep提供专有云服务和高级规则,但其CLI工具可免费本地安装运行。可通过以下命令运行Trail of Bits的规则(包括上述规则):
|
|
本文不会逐一详解每条规则,而是重点讨论两项较少人知的Semgrep功能。
通用模式(Generic Mode)
Semgrep的通用模式为搜索任意文本提供了简便方法。与对Java、Python等编程语言的语法支持不同,通用模式本质上是增强型文本搜索。其优势在于搜索范围广,但缺点在于可能产生更多误报(false positives)和更少漏报(false negatives)。通用模式可视为正则表达式的更人性化替代方案,提供改进的换行符和空白处理,支持熟悉的省略号运算符、元变量,并能与Semgrep生态系统无缝集成。
通用模式的主要缺点是对解析文本缺乏语义理解。例如,可能错误检测注释代码中的模式(即误报)。此外,通用模式无法利用Semgrep的大量等价规则。尽管如此,在搜索特定模式时,我们仍认为它是合适工具——筛选少量误报优于错过关键安全漏洞。
为何在本帖许多规则中使用通用模式?以ssh-disable-host-key-checking规则为例:通用模式可在Bash脚本、Dockerfile、CI配置、文档文件、各种编程语言的系统调用等场景中发现禁用StrictHostKeyChecking的SSH命令,而官方Bash或Dockerfile支持仅覆盖单一用例。通用模式为适用于多种场景的简单启发式方法提供了最广泛覆盖。
更多信息请参阅Semgrep官方文档的通用模式匹配部分。
YAML支持
除通用模式外,YAML支持使Semgrep成为文件系统中几乎所有基于文本的文件的代码/文本搜索一站式解决方案。YAML正席卷技术领域:Kubernetes配置、AWS CloudFormation、Docker Compose、GitHub Actions、GitLab CI、Argo CD、Ansible、OpenAPI规范乃至Semgrep规则本身均采用YAML编写。事实上,Semgrep还使用Semgrep规则为Semgrep规则编写了最佳实践规则(可谓“Sem-ception”)。
当然,您可以用所选编程语言编写基础工具,使用主流YAML库解析YAML并搜索基本启发式规则,但这样会错过Semgrep生态系统的其他优势。能在同一位置管理所有不同类型文件和格式是Semgrep的杀手级功能。YAML规则与Python规则、Java规则、通用规则并列运行,共同在CI中执行,发现结果可在同一位置管理,无需为10种文件类型使用10种工具。
我们近期审计包含大型Ansible实现的项目,因此着力覆盖Ansible.Builtin命名空间中的基本安全问题。使用Semgrep的YAML规则格式搜索YAML模式初看可能令人困惑,但熟悉后会变得相对模式化。JSON和YAML等格式的高度结构化特性使模式搜索变得直观。
以本文顶部的port-all-interfaces规则模式为例(突出YAML功能):
|
|
图4:搜索监听所有接口端口的模式
pattern-inside和pattern运算符中使用的| YAML块样式指示符表明下方文本是纯文本字符串而非额外Semgrep规则语法。Semgrep将此纯文本字符串解释为YAML。规则本身寻找绑定到所有接口的服务:Docker Compose文档指出,默认情况下,指定端口时服务将监听0.0.0.0。此规则查找不以回环地址(如127.0.0.1)开头的端口,表明它们监听所有接口。这并非总是问题,但在某些情况下可能导致防火墙绕过等问题。
扩展Semgrep应用范围
Semgrep是跨多种不同技术发现漏洞的强大工具。本文介绍了30条新Semgrep规则,并讨论了两项较少人知的功能:通用模式和YAML支持。将YAML和通用搜索加入Semgrep广泛支持的编程语言列表,使其成为更通用的工具。问题代码或基础设施的启发式规则及其相应发现可在单一位置管理。
若想了解更多Semgrep应用案例,我们曾将其用于保护机器学习管道、发现goroutine泄漏和保护Apollo GraphQL服务器等项目。
如需为您的项目定制Semgrep规则,请联系我们。