35条新Semgrep规则:基础设施、供应链与Ruby
我们发布了另一组自定义Semgrep规则,使公开规则总数达到115条。本文简要介绍新规则,并深入探讨Semgrep的两项功能:正则模式(特别是与通用模式的对比)以及对Terraform和Nomad等技术的HCL语言支持。通过这些功能,我们可以在应用代码之外搜索安全漏洞。此次发布延续了我们长期向安全社区分享技术专长的努力,包括现有Semgrep规则集、公开CodeQL查询和测试手册。
Semgrep是一个功能强大的工具,包含许多可挖掘的细节以最大化静态分析工具的价值。与之前的规则发布文章类似,本文将重点介绍一些有趣的Semgrep功能。公开规则是良好的起点,但通过解释规则编写逻辑我们能做得更好。
本次发布聚焦于以下领域:
- GitHub Actions中短期OIDC令牌缺失导致的供应链问题
- Terraform代码和Nomad任务中的基础设施隐患及不安全数据库连接
- Ruby代码中的通用应用安全问题(多数规则来自近期Ruby Central审计)
新规则列表
Ruby模式
规则ID | 描述 |
---|---|
action-dispatch-insecure-ssl |
检测Rails应用的不安全SSL设置 |
action-mailer-insecure-tls |
发现ActionMailer SMTP配置中的不安全TLS设置(需设置enable_starttls: true 和openssl_verify_mode 验证对端) |
active-record-encrypts-misorder |
发现ActiveRecord值在序列化前加密(序列化属性声明应位于加密声明之前) |
active-record-hardcoded-encryption-key |
发现硬编码的ActiveRecord加密密钥 |
global-timeout |
检测Timeout::timeout 使用(全局超时可能导致异常在代码块任意处抛出,建议使用库内置超时功能) |
faraday-disable-verification |
发现Faraday HTTP请求禁用SSL/TLS验证 |
ruby-saml-skip-validation |
检测SAML响应验证被禁用 |
yaml-unsafe-load |
发现调用unsafe_load 的YAML操作(可能导致反序列化漏洞和RCE) |
rails-cookie-attributes |
发现Rails cookie设置不安全属性 |
rails-cache-store-marshal |
发现Rails缓存存储配置允许Marshal序列化(建议使用:message_pack 或自定义序列化器) |
json-create-deserialization |
发现json_create 类方法(可能存在自定义JSON反序列化漏洞) |
insecure-rails-cookie-session-store |
发现Rails会话cookie缺失SameSite=Secure属性 |
rest-client-disable-verification |
发现RestClient HTTP请求禁用SSL/TLS验证 |
正则模式
规则ID | 描述 |
---|---|
postgres-insecure-sslmode |
发现PostgreSQL连接字符串禁用SSL验证 |
mongodb-insecure-transport |
发现不安全MongoDB连接(建议设置tls=true 并确保验证) |
mysql-insecure-sslmode |
发现MySQL连接字符串禁用SSL验证 |
通用模式
规则ID | 描述 |
---|---|
amqp-unencrypted-transport |
发现未加密AMQP连接(建议使用TLS加密的amqps:// 传输) |
redis-unencrypted-transport |
发现未加密Redis连接(建议使用TLS加密的rediss:// 传输) |
node-disable-certificate-validation |
发现禁用TLS证书验证的环境变量设置 |
HCL模式
规则ID | 描述 |
---|---|
aws-oidc-role-policy-duplicate-condition |
发现GitHub Actions的AWS角色策略存在重复条件(可能破坏访问控制) |
aws-oidc-role-policy-missing-sub |
发现GitHub Actions的AWS角色策略缺失OIDC主题(允许任意GitHub仓库在CI中担任角色) |
vault-hardcoded-token |
发现Terraform Vault实例使用硬编码令牌 |
vault-skip-tls-verify |
发现Terraform Vault实例禁用TLS验证 |
root-user |
发现Nomad任务使用root用户 |
docker-hardcoded-password |
发现Nomad任务使用硬密码的Docker认证 |
docker-privileged-mode |
发现Nomad任务使用特权模式的Docker容器 |
tls-hostname-verification-disabled |
发现Nomad TLS块禁用服务器主机名验证 |
podman-tls-verify-disabled |
发现Nomad任务使用禁用注册表TLS验证的Podman |
YAML模式
规则ID | 描述 |
---|---|
jfrog-hardcoded-credential |
发现长期访问密钥(建议使用JFrog临时OIDC安全凭证) |
aws-secret-key |
发现长期访问密钥(建议使用AWS角色担任和临时OIDC安全凭证) |
gcp-credentials-json |
发现长期访问密钥(建议使用GCP工作负载身份联合和临时OIDC安全凭证) |
rubygems-publish-key |
发现长期访问密钥(建议使用RubyGems可信发布和临时OIDC安全凭证) |
vault-token |
发现长期访问密钥(建议使用Vault角色担任和临时OIDC安全凭证) |
pypi-publish-password |
发现长期访问密钥(建议使用PyPI可信发布和临时OIDC安全凭证) |
azure-principal-secret |
发现长期访问密钥(建议使用Azure订阅ID和临时OIDC安全凭证) |
Semgrep不仅适用于编程语言
本系列首篇文章探讨了Semgrep两个较少人知的功能:通用模式和YAML支持。本文引入另外两个考量:正则表达式vs通用模式,以及对基础设施即代码(IaC)安全的HashiCorp配置语言(HCL)支持。我们将持续扩展Semgrep至所有文本数据形式。
启发式:正则表达式 vs 通用模式
正则表达式模式是Semgrep另一个较少人知的功能(即pattern-regex
操作符和regex语言)。但为何要在Semgrep规则中使用正则表达式?这难道不是违背了Semgrep等静态分析工具的初衷吗?为什么不直接使用ripgrep或经典grep?通用模式是否使正则模式变得多余?
以下启发式原则帮助您理解何时使用正则模式(肯定答案越多越适合使用):
-
目标文本是否通常跨单行代码?
处理多行空格的正则表达式很麻烦。如果您需要搜索多行模式且无法使用语言特定规则,通用模式更适合。记住:使用正则模式时,搜索文本几乎总是单行。 -
该模式是否存在于多种语言或文本文件中?
Semgrep的优势在于它是文本分析的一站式工具。如果目标文本可能存在于多种语言中,则适合使用正则模式。例如搜索URL参数sslmode=disable
时,正则表达式[?&]sslmode=(disable|allow|prefer)
可跨语言、库和文件类型(如shell脚本、文档、CI任务)检测不安全参数。 -
是否需要与他人共享正则表达式?
Semgrep将ripgrep/grep等功能整合到单一工具中。虽然ripgrep适合快速迭代正则表达式和代码搜索,但Semgrep规则在固化、测试和发布正则表达式时表现卓越。您的正则发现将与Python和Kubernetes发现并存,并可从单一位置跟踪所有发现和管理规则。 -
是否需要匹配特定字符或字符类?
正则模式和通用模式常满足类似需求。当需要匹配特定字符/字符类或使用交替等正则功能时,正则模式更优。例如上述sslmode
正则中,我们通过字符类[?&]
前缀增加匹配置信度。通用模式的主要优势是支持省略号操作符(...
),可轻松跳过不匹配元素和多行模式中的空格。
可见,在Semgrep中搜索特定代码模式有多种方法。上述启发式为使用正则模式提供了良好基准。更重要的是,正则模式是文本数据搜索中的宝贵工具。
HCL支持与IaC安全
基础设施即代码(IaC)变革了云管理,通过版本控制环境(替代手动配置)实现更快部署、更高一致性、可重复性和更好安全性。通过代码化基础设施,组织可将定义无缝集成到CI/CD管道中,实现自动化测试、部署和静态分析。
HashiCorp配置语言(HCL)是许多IaC工具(包括Terraform、Nomad和Consul)的基础。鉴于IaC日益重要,Semgrep于2021年引入HCL支持。通过专用HCL支持,Semgrep现提供统一方法,对应用代码和基础设施配置实施相同级别的审查,确保它们在CI/CD管道中协同工作。
我们发现即使最简单的Semgrep规则也能发现2024年仍存在的重大风险。例如开发期间禁用TLS验证的常见做法:若配置误部署,可能暴露敏感数据。以下示例展示如何使用Semgrep检测Vault基础设施中的此类漏洞:
|
|
图1:检测禁用TLS验证的Semgrep规则(hcl/terraform/vault-skip-tls-verify.yaml)
另一个常见错误是硬编码凭证——Semgrep可轻松捕获的安全风险:
|
|
图2:检测硬编码Vault令牌的Semgrep规则(hcl/terraform/vault-hardcoded-token.yaml)
通过将此步骤与配置CI/CD管道以阻止含未解决Semgrep发现的PR(推荐实践之一)结合,可轻松防止这些问题进入生产环境。
HCL的结构化特性使其特别适合检测复杂模式并保持低误报率。例如以下规则识别缺失OIDC主题的GitHub Actions AWS角色策略——严重错误配置,可能允许任意GitHub仓库在CI中担任角色:
|
|
图3:检测缺失OIDC主题的Semgrep规则(hcl/terraform/aws-oidc-role-policy-missing-sub.yaml)
GitHub Actions角色策略有多种配置方式,我们使用pattern-inside
和pattern-not
正确上下文化目标模式(即未定义主题的情况)。该规则有力展示了Semgrep如何帮助实施安全策略并防止导致严重漏洞的配置错误。
文本是通用接口
如果文本是通用接口,那么Semgrep可帮助保护任意接口——从字节和字符串到IaC、YAML等。结合Semgrep与正则表达式、通用模式、YAML和IaC支持,我们能够超越编程语言代码。随着行业向“即代码”解决方案发展,我们需要将可扩展工具应用于供应链、CI/CD和IaC等领域。
通过IaC,您可以将静态分析的严谨性应用于基础设施,如同对待应用代码一样,早期发现问题并避免生产环境中的昂贵错误——即“左移”。针对生产环境的手动审计和动态扫描速度慢且扩展性差。我们鼓励您尝试新发布的Terraform和Nomad规则,探索Semgrep的terraform规则,并考虑将其纳入项目。据我们所知,这些是首个针对Nomad的开源Semgrep规则——我们兴奋地与社区分享,希望激励他人在此基础上构建。
如果您想了解更多关于我们Semgrep工作的信息,我们已将其能力应用于多个场景,例如保护机器学习管道、发现goroutine泄漏和保护Apollo GraphQL服务器。
如果您需要项目的自定义Semgrep规则,请联系我们!