30条新Semgrep规则解析:Ansible、Java、Kotlin与Shell脚本的安全检测

Trail of Bits发布30条自定义Semgrep规则,覆盖Ansible剧本、Java/Kotlin代码、Shell脚本和Docker Compose配置的安全漏洞检测,重点解析通用模式和YAML支持两大高级功能。

30条新Semgrep规则:Ansible、Java、Kotlin、Shell脚本等

我们发布了30条自定义Semgrep规则,用于检测Ansible剧本、Java/Kotlin代码、Shell脚本和Docker Compose配置文件中的常见安全漏洞。这些规则已用于审计相关技术栈的安全问题,与我们的公开CodeQL查询和测试手册共同构成技术分享体系。本文简要介绍新规则,并深入探讨创建规则时使用的两项Semgrep高级功能:通用模式(generic mode)和YAML支持。

规则集概览

本次发布的规则聚焦以下安全问题:

  • 未加密网络传输(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命令
Generic gpg-insecure-flags 检测使用不安全参数的gpg命令
Generic installer-allow-untrusted 检测允许不可信安装的安装器命令
Generic openssl-insecure-flags 检测使用不安全参数的openssl命令
Generic ssh-disable-host-key-checking 检测禁用主机密钥检查的ssh命令
Generic tar-insecure-flags 检测使用不安全参数的tar命令
Generic wget-no-check-certificate 检测禁用SSL验证的wget命令
Generic wget-unencrypted-url 检测使用未加密URL(如HTTP、FTP)的wget命令

Java/Kotlin规则

模式 规则ID 描述
Java, Kotlin gc-call 调用gc会建议JVM运行垃圾回收器,但无法保证实际执行,依赖此行为属于反模式
Java, Kotlin mongo-hostname-verification-disabled 检测禁用SSL主机名验证的MongoDB客户端

YAML规则(Ansible)

涵盖apt-key、dnf、yum、zypper等工具未加密URL下载及SSL验证禁用检测,例如:

  • apt-key-unencrypted-url
  • dnf-validate-certs-disabled
  • yum-unencrypted-url

YAML规则(Docker Compose)

  • port-all-interfaces:检测服务端口暴露在所有接口

Semgrep 201:进阶功能

Semgrep是用于代码模式匹配的静态分析工具,支持安全漏洞、错误变体、密钥检测等问题发现。虽然提供云端高级功能,但CLI版本可免费本地运行。使用以下命令执行Trail of Bits规则:

1
semgrep scan --config p/trailofbits /path/to/code

通用模式(Generic Mode)

通用模式提供任意文本搜索能力,虽无编程语言的语法支持,但具备以下特点:

  • 优势:搜索范围广,漏报率低
  • 劣势:误报率较高(如匹配注释代码)
  • 适用场景:Jinja模板、NGINX配置、TOML文件等非标准格式

示例对比

1
2
3
import os
# os.system("debugger")  # 通用模式会匹配此注释行
os.system("run_production")  # 两种模式均会匹配
  • Python模式:仅匹配第6行(语义理解注释)
  • 通用模式:匹配第4行和第6行(纯文本匹配)

尽管缺少语义等价性支持,通用模式仍适用于需要广覆盖的场景(如跨语言检测SSH参数配置)。

YAML支持

YAML已成为Kubernetes、Docker Compose、GitHub Actions等技术的标准配置格式。Semgrep的YAML支持允许:

  • 统一管理多格式规则(Python/Java/通用/YAML)
  • 在CI中集中运行所有规则
  • 避免使用多个工具处理不同文件类型

YAML规则示例(检测全接口监听):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
patterns:
  - pattern-inside: |
      services:
        ...
  - pattern: |
      ports:
        - ...
        - "$PORT"
        - ...
  - focus-metavariable: $PORT
  - metavariable-regex:
      metavariable: $PORT
      regex: '^(?!127.\d{1,3}.\d{1,3}.\d{1,3}:).+'

该规则通过正则表达式排除回环地址(127.x.x.x),检测可能暴露到所有接口的端口配置。

扩展Semgrep能力

Semgrep通过支持YAML和通用模式成为更全面的代码审计工具。我们曾将其应用于:

  • 保护机器学习管道
  • 发现Goroutine泄漏
  • 加固Apollo GraphQL服务器

如需为项目定制Semgrep规则,欢迎联系我们。

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