35条新Semgrep规则:基础设施、供应链与Ruby安全检测

Trail of Bits发布35条新Semgrep规则,覆盖基础设施配置、供应链安全与Ruby应用漏洞检测,深入解析正则模式与通用模式差异,并展示HCL语言对Terraform/Nomad的安全扫描能力。

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: trueopenssl_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?通用模式是否使正则模式变得多余?

以下启发式原则帮助您理解何时使用正则模式(肯定答案越多越适合使用):

  1. 目标文本是否通常跨单行代码?
    处理多行空格的正则表达式很麻烦。如果您需要搜索多行模式且无法使用语言特定规则,通用模式更适合。记住:使用正则模式时,搜索文本几乎总是单行。

  2. 该模式是否存在于多种语言或文本文件中?
    Semgrep的优势在于它是文本分析的一站式工具。如果目标文本可能存在于多种语言中,则适合使用正则模式。例如搜索URL参数sslmode=disable时,正则表达式[?&]sslmode=(disable|allow|prefer)可跨语言、库和文件类型(如shell脚本、文档、CI任务)检测不安全参数。

  3. 是否需要与他人共享正则表达式?
    Semgrep将ripgrep/grep等功能整合到单一工具中。虽然ripgrep适合快速迭代正则表达式和代码搜索,但Semgrep规则在固化、测试和发布正则表达式时表现卓越。您的正则发现将与Python和Kubernetes发现并存,并可从单一位置跟踪所有发现和管理规则。

  4. 是否需要匹配特定字符或字符类?
    正则模式和通用模式常满足类似需求。当需要匹配特定字符/字符类或使用交替等正则功能时,正则模式更优。例如上述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
2
3
4
5
6
7
8
9
rules:
  - id: vault-skip-tls-verify
    message: |
      Found Terraform Vault instance with TLS verification disabled
    languages: [hcl]
    severity: WARNING
    patterns:
      - pattern-inside: provider "vault" { ... }
      - pattern: skip_tls_verify = true

图1:检测禁用TLS验证的Semgrep规则(hcl/terraform/vault-skip-tls-verify.yaml)

另一个常见错误是硬编码凭证——Semgrep可轻松捕获的安全风险:

1
2
3
4
5
6
7
8
9
rules:
  - id: vault-hardcoded-token
    message: |
      Found Terraform Vault instance with hardcoded token
    languages: [hcl]
    severity: WARNING
    patterns:
      - pattern-inside: provider "vault" { ... }
      - pattern: token = "..."

图2:检测硬编码Vault令牌的Semgrep规则(hcl/terraform/vault-hardcoded-token.yaml)

通过将此步骤与配置CI/CD管道以阻止含未解决Semgrep发现的PR(推荐实践之一)结合,可轻松防止这些问题进入生产环境。

HCL的结构化特性使其特别适合检测复杂模式并保持低误报率。例如以下规则识别缺失OIDC主题的GitHub Actions AWS角色策略——严重错误配置,可能允许任意GitHub仓库在CI中担任角色:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
rules:
  - id: aws-oidc-role-policy-missing-sub
    message: |
      Found AWS role policy for GitHub Actions missing OIDC subject. This
      means any GitHub repository can assume this role in CI.
    languages: [hcl]
    severity: WARNING
    patterns:
      - pattern-inside: |
          {
            ...
            Statement = [...]
            ...
          }
      - pattern-inside: |
          {
            ...,
            "Action": "sts:AssumeRoleWithWebIdentity",
            ...
          }
      - pattern: |
          {
            ...
            "Condition": {
                ...
                "StringEquals": {
                    ...
                    "token.actions.githubusercontent.com:aud": ...,
                    ...
                }
                ...
            }
            ...
          }
      - pattern-not: |
          {
            ...
            "Condition": {
                ...
                "StringEquals": {
                    ...
                    "token.actions.githubusercontent.com:sub": ...,
                    ...
                    "token.actions.githubusercontent.com:aud": ...,
                    ...
                }
                ...
            }
            ...
          }

图3:检测缺失OIDC主题的Semgrep规则(hcl/terraform/aws-oidc-role-policy-missing-sub.yaml)

GitHub Actions角色策略有多种配置方式,我们使用pattern-insidepattern-not正确上下文化目标模式(即未定义主题的情况)。该规则有力展示了Semgrep如何帮助实施安全策略并防止导致严重漏洞的配置错误。

文本是通用接口

如果文本是通用接口,那么Semgrep可帮助保护任意接口——从字节和字符串到IaC、YAML等。结合Semgrep与正则表达式、通用模式、YAML和IaC支持,我们能够超越编程语言代码。随着行业向“即代码”解决方案发展,我们需要将可扩展工具应用于供应链、CI/CD和IaC等领域。

通过IaC,您可以将静态分析的严谨性应用于基础设施,如同对待应用代码一样,早期发现问题并避免生产环境中的昂贵错误——即“左移”。针对生产环境的手动审计和动态扫描速度慢且扩展性差。我们鼓励您尝试新发布的Terraform和Nomad规则,探索Semgrep的terraform规则,并考虑将其纳入项目。据我们所知,这些是首个针对Nomad的开源Semgrep规则——我们兴奋地与社区分享,希望激励他人在此基础上构建。

如果您想了解更多关于我们Semgrep工作的信息,我们已将其能力应用于多个场景,例如保护机器学习管道、发现goroutine泄漏和保护Apollo GraphQL服务器。

如果您需要项目的自定义Semgrep规则,请联系我们!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计