SAST工具:Semgrep初期调研报告

优势

  • 它是开源的。
  • 易于使用: Semgrep 的语法简单直观,使用 YAML 或者纯文本格式的规则定义,使得规则编写和理解变得容易。用户可以根据特定的需求编写自定义规则,或者使用社区维护的规则库。
  • 快速扫描: Semgrep 使用高效的静态分析算法,能够在大型代码库中进行快速扫描。它具有可扩展性,适用于小型项目和大型企业应用程序。
  • 广泛的规则库: Semgrep 提供了一个丰富的规则库,涵盖了安全漏洞、常见的代码错误、最佳实践和性能问题等多个方面。用户可以直接使用这些规则,也可以根据自己的需求进行定制和扩展。
  • 多语言支持: Semgrep 支持多种流行的编程语言,如 Python、JavaScript、Go、Java 等。这使得它成为跨多个技术栈的团队或项目的理想选择。
  • 集成和扩展性: Semgrep 可以与各种 CI/CD 工具和代码编辑器集成,例如 GitLab、GitHub Actions、Jenkins 等。此外,Semgrep 还提供了 API 和 CLI 接口,使用户能够轻松集成到现有的工作流程中。
  • 可定制性: Semgrep 允许用户根据自己的需求创建自定义规则。用户可以使用 Semgrep 提供的丰富的模式匹配语法来编写适合特定代码风格和规范的规则。
  • 活跃的社区: Semgrep 拥有活跃的开源社区支持,社区维护了大量的规则库,并定期更新和改进 Semgrep 的功能和性能。•易于使用: Semgrep 的语法简单直观,使用 YAML 或者纯文本格式的规则定义,使得规则编写和理解变得容易。用户可以根据特定的需求编写自定义规则,或者使用社区维护的规则库。

Products 产品分类

在运行Semgrep ci扫描的时候默认是同时使用了所有产品下的规则,但是用户可以通过指令更改来运行特定产品(如semgrep ci --code)。

Semgrep OSS

Semgrep OSS是一款快速、轻量级的程序分析工具,可帮助检测代码中的安全问题。使用的是 Semgrep 的 LGPL 2.1 开源引擎。

注意:在集成方面,Semgrep OSS和Semgrep Code都可用于扫描本地代码,也可集成到 CI CD 管道中,自动对软件源进行持续扫描。由于Semgrep OSS 只能分析单个功能内的交互,称为程序内或单功能分析。但是,这意味着 Semgrep OSS 比 Semgrep Code 略快。

Semgrep Code

一种静态应用安全测试(SAST)解决方案,除了Semgrep OSS之外,还使用了专有的Semgrep分析,如跨文件(文件间)和跨功能(文件内)数据流(cross-function or interprocedural analysis)。这使得真阳性率高于Semgrep OSS。 使用方式为在线网站+命令行。

Semgrep Code使用Rules(规则,封装模式匹配逻辑和数据流分析)来扫描代码,以查找安全问题、样式违规、漏洞等。只要发现代码与规则定义的模式相匹配,Semgrep就会生成并向用户报告发现的问题。

官方规则注册表及社区

除了注册表中可用的规则之外,用户还可以编写自定义规则,以确定Semgrep代码在软件仓库中检测到的内容。无论是使用已有规则,还是编写自定义规则,了解Semgrep代码运行的规则都有助于了解它是如何检测安全问题的。 Semgrep Code是透明的,用户可以配置其运行的规则,并检查其语法,从而了解发现问题的方式。用户还可以自定义规则的内容,以提高规则的真阳性率,或让 Semgrep 向开发人员发送相关信息。

注:Semgrep OSS指的是Semgrep的开源许可产品,可以使用OSS Engine和在Semgrep Registry中带开源许可的规则,或者编写用户自己的自定义规则。总体而言,Semgrep OSS和Semgrep Pro的主要区别在于,Semgrep Pro包括更高级的分析和专有的Pro规则,而Semgrep OSS则主要使用开源许可的规则。

Semgrep Secrets

Semgrep Secrets 扫描代码,检测暴露的 API 密钥、密码和其他凭证。一旦暴露,恶意行为者就会利用这些凭据泄露数据或访问敏感系统。Semgrep Secrets 可帮助用户确定:

  • 哪些Secrets已经提交到用户的存储库中。
  • Secrets的验证状态;例如,有效的Secrets是指那些经过网络服务测试并确认能够成功授予资源或身份验证的Secrets。它们正在使用中。
  • 对于 GitHub 存储库:公共或私有存储库中是否存在凭证。 Semgrep通过优先处理有效的泄露Secrets,并在开发人员的PR和MR中直接发布评论,告知开发人员有效的Secrets,从而节省安全工程师的时间和精力。 注:所有验证 (如 API 调用) 都在用户的环境中本地完成。不会向 Semgrep 服务器发送任何令牌。 采用的方法包括:
  • 使用正则表达式搜索
  • 语义分析
  • 验证
  • 熵分析

Semgrep Supply Chain

Semgrep Supply Chain 是一款软件构成分析(SCA)工具,可检测代码库中由开源依赖关系引入的安全漏洞。它还可以:

  • 生成软件物料清单(SBOM),提供完整的开源组件清单
  • 查询有关依赖项的信息
  • 支持执行公司的开源软件包许可要求 Semgrep Supply Chain(Semgrep供应链管理软件)能够分析锁定文件(lockfile)中的依赖关系,然后根据锁定文件扫描用户的代码库,查找可达到的结果。某些语言(如 Java)有多个受支持的锁文件,这取决于用户的软件包管理器。要使用Semgrep Supply Chain扫描锁文件,该文件必须具有其中一个支持的锁文件名。

Language support 支持语言

成熟等级解释:

Semgrep OSS

Bash, C, C++, C#, Cairo, Clojure, Dart, Dockerfile, Generic, Go, Hack, HTML, Java, JavaScript, JSON, Jsonnet, Julia, Lisp, Lua, Kotlin, Ruby, Rust, JSX, OCaml, PHP, Python, R, Scala, Scheme, Solidity, Swift, TypeScript, YAML, XML

Semgrep Code

Maturity level 成熟等级 GA(Parse Rate 99%+): C, C++, C#, Go, Java, JavaScript, Kotlin, Python, TypeScript, Ruby, Rust, JSX, PHP, Scala, Swift, Generic, JSON, Terraform

Maturity level 成熟等级 BETA(Parse Rate 95%+): Apex, Elixir

Maturity level 成熟等级 Experimental(Parse Rate 90%+): Bash, Cairo, Clojure, Dart, Dockerfile, Hack, HTML, Jsonnet, Julia, Lisp, Lua, Ocaml, R, Scheme, Solidity, YAML, XML

Semgrep Supply Chain

对于某些语言,如JavaScript和Python,还需要对清单文件(manifest file)进行解析,以确定反式性(transitivity)。

Maturity level 成熟等级 GA(Parse Rate 99%+): C#(NuGet), Go(Go modules), Java(Gradle, Maven), JavaScript or TypeScript(npm, Yarn, Yarn 2, Yarn 3, pnpm), Python(pip, pip-tools, Pipenv, Poetry), Ruby(RubyGems) Maturity level 成熟等级 Lockfile-only: Rust(Cargo§), Dart(Pub), Elixir(Hex), Kotlin(Gradle, Maven), PHP(Composer), Scala(Maven), Swift(SwiftPM)

核心方法:Run Rules

概述

规则(Rules)是 Semgrep 必须与代码匹配才能生成结果的模式的规范。规则是用 YAML 编写的。如果没有规则,引擎将没有有关如何匹配 code 的说明。 规则可以在 Semgrep 或其 OSS Engine 上运行。 按作者划分Semgrep 注册表(Semgrep Registry)中的规则类型:

  • 社区规则 - 由 Semgrep 团队审查,这些规则包含来自 Semgrep 社区的贡献。社区规则包含一系列规则,包括许多为安全审计员制定的规则。
  • 第三方规则 - 由 Trail of Bits、GitLab 等外部贡献者直接创建。
  • 私有规则 - 由用户自己的组织编写和发布的规则,仅供用户的组织使用。
  • 专业规则 - 由 Semgrep 团队创建的专有规则,针对需要准确调查结果的安全和软件工程师。这些规则为许多编程语言提供了更大的覆盖范围,并使用了最新的 Semgrep 功能。

按功能分类则有两种类型的规则:搜索污点

搜索规则

规则默认为此类型。搜索规则根据规则描述的模式检测匹配项。搜索规则执行多种语义分析,例如:

  • 将语法不同的代码解释为语义等效
  • 常量传播
  • 将完全限定名称与其在代码中的引用匹配,即使不是完全限定名称
  • 类型推断,尤其是在使用类型化元变量时

污点规则

污点规则除了使用默认搜索功能外,还使用 Semgrep 的污点分析。污点规则能够指定数据的源、接收器和传播器,以及该数据的排错程序。污点分析跟踪和追溯不受信任或不安全的数据流。如果这些输入未经过清理,则来自用户输入等来源的数据可能不安全,并被用作攻击媒介。污点分析提供了一种在数据通过程序从不受信任的来源移动到易受攻击的函数时对其进行跟踪的方法。

运行规则

使用Rules规则进行静态代码分析,检查各种代码问题,包括安全漏洞、常见编程错误、最佳实践、代码风格等。同时,用户也可以根据自己的需求创建和定制规则。 公有规则存储在Semgrep 注册表(Semgrep Registry)这使用户能够扫描代码,而无需编写任何自定义内容。Semgrep Registry 存储在开源存储库中。 规则可以组织在规则集中。规则集是通过编程语言、OWASP 类别或框架相关的规则。这些规则集由 Semgrep 的团队策划,并随着新规则添加到 Semgrep Registry 而更新。 运行规则的类型:

  • 现有 Semgrep Registry 规则。所有用户都可以为开源 Semgrep Registry 做出贡献。
  • 本地规则:
    • 传递到命令行中的一次性临时规则。
    • YAML 定义的规则。
  • 本地规则和 Semgrep Registry 规则的组合,或者通常多个规则的组合。

官方规则编写教程

核心原理:模式匹配逻辑

Semgrep在运行规则时,采用模式匹配规则。每当 Semgrep 找到与规则定义的模式匹配的代码时,它都会生成并向用户报告结果。模式匹配在代码中搜索给定模式。例如,表达式模式可以匹配完整表达式或子表达式的一部分:1 + func(42)

1
foo(1 + func(42)) + bar()

同样,语句模式可以匹配 top 语句或任何嵌套语句:return 42

1
def foo(x):  if x > 1:     if x > 2:       return 42  return 42

与正则表达式不同,这种匹配语法理解代码的结构并构建语法树来搜索匹配项,且提供了微调匹配的特定机制。 其模式语法具体可见:Pattern syntax | Semgrep

核心原理:数据流分析

Semgrep 提供了一个程序内数据流分析引擎,该引擎打开了各种 Semgrep 功能。Semgrep 提供以下数据流分析:

  • Constant propagation常量传播允许 Semgrep 匹配到时可以恒定减少折叠(match against when can be reduced to by constant folding)。Constant propagation 还有一个特定的实验功能,称为 Symbolic propagation
  • Taint tracking (known also as taint analysis) 污点跟踪(也称为污点分析)使用户能够编写简单的规则来捕获复杂的注入错误,例如可能导致跨站点脚本(XSS)的错误。

原则上,数据流分析引擎(提供污点跟踪、常量传播和符号传播)可以在Semgrep支持的任何语言上运行。但是,支持级别低于常规 Semgrep 匹配引擎的级别。

当 Semgrep 对代码执行分析时,它会创建一个抽象语法树 (AST),然后将其转换为易于分析的中间语言 (IL)。随后,Semgrep 主要对 IL 运行与语言无关的分析。但是,此翻译并未完全完成。

注意:在使用数据流分析时,Semgrep 可能无法正确分析某些语言的某些功能。因此,即使 Semgrep 找到不受支持的构造,它也不会失败。当忽略构造时,分析会继续。这可能会导致 Semgrep 不匹配某些应该匹配的代码(漏报)或不匹配不应匹配的代码(误报)。

个人安装使用教程

注册账号并登录在线平台

在 Semgrep AppSec 平台,单击 Sign in with GitHub(使用 GitHub 登录)或 Sign in with GitLab 进行注册。按照屏幕上的提示并继续。

启动CLI并安装Semgrep

MacOS

1
2
3
4
5
# install through homebrew
brew install semgrep
# install through pip
python3 -m pip install semgrep
# confirm installation succeeded by printing the currently installed versionsemgrep --version

Linux

1
2
3
4
# install through pip
python3 -m pip install semgrep
# confirm installation succeeded by printing the currently installed version
semgrep --version

WSL

1
2
3
4
# install through pip
python3 -m pip install semgrep
# confirm installation succeeded by printing the currently installed version
semgrep --version

登录Semgrep帐户

在CLI输入指令:

1
semgrep login

点击输出的链接跳转授权登录。

使用CLI扫描

导航到项目库的根目录,运行扫描指令。

1
semgrep ci

命令行出现下图显示结果(WSL+VScode环境)表示正在扫描中。 可以通过指令更改来运行特定产品:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# scan with OSS only (本地单文件SAST方案)
semgrep ci --oss-only

# scan with Semgrep Code  (可跨文件的SAST方案)
semgrep ci --code  
  
# scan with Semgrep Supply Chain  (软件构成分析方案)
semgrep ci --supply-chain  
  
# scan with Semgrep Secrets  (检测秘密信息状态的方案)
semgrep ci --secrets

注:没有semgrep账号(无法在在线平台查看结果),想要快速扫描本地代码库或者快速测试自定义规则,可以使用指令:

1
semgrep scan

查看扫描结果

本地查看

在使用semgrep ci指令时,CLI内可直接浏览扫描结果。 要将结果导出为纯文本文件:

1
semgrep ci --text --text-output=semgrep.txt

要将结果导出到 SARIF 文件:

1
semgrep ci --sarif --sarif-output=semgrep.sarif

要将结果导出到 JSON 文件:

1
semgrep ci --json --json-output=semgrep.json

在线查看

在 Semgrep AppSec 平台可以浏览该账号所有项目使用所有产品的扫描结果并进行过滤等操作: 左侧的导航栏中"Code" “Supply Chain” “Secrets"分类展示了Semgrep的三个产品所检测出的结果。 “Rules"部分可以查看规则库、在线编写规则和管理规则使用策略。 “Settings”区可以修改所需功能,如开启“跨文件扫描”等功能。

创建并运行本地规则

用户创建了符合规范的规则文件如myrule.yaml后,可以通过指令进行规则的本地测试:

1
semgrep scan --config PATH/TO/MYRULE.YAML

下图为对样例规则的测试: fin.

使用 Hugo 构建
主题 StackJimmy 设计
发表了7篇文章 · 共嘟嘟了13.51k字
·