[Rails] 使用 OSV-Scanner 寻找 Rails 应用程序依赖中存在的漏洞

使用 OSV-Scanner 寻找 Rails 应用程序依赖中存在的漏洞

近日,谷歌发布了开源漏洞扫描器 OSV-Scanner。OSV-Scanner 是为开源的 OSV 数据库提供官方支持的前端工具,用 Go 编写,旨在扫描开源应用程序以评估任何合并依赖项的安全性。

可以使用 OSV-Scanner 寻找 Rails 应用程序依赖中存在的漏洞,包括 Gemfile.lock, package-lock.json, yarn.lock 等文件,.git 目录的最新提交记录,以及基于 Debian 的镜像。

安装

有以下几种方式安装 OSV-Scanner

Release

可以从 Releases · google/osv-scanner - https://github.com/google/osv-scanner/releases 下载最新发布的二进制版本。

包管理器

或通过包管理器 Windows Scoop,Homwbrew 来安装.

1
2
3
4
5
# Homwbrew (brew)
$ brew install osv-scanner

# Windows Scoop
scoop install osv-scanner

关于 Scoop 的更多信息,请查阅 Scoop - https://scoop.sh/

关于 Homebrew 的更多信息,请查阅 The Missing Package Manager for macOS (or Linux) — Homebrew - https://brew.sh/

源代码

或者,您可以通过运行从源代码安装:

1
$ go install github.com/google/osv-scanner/cmd/osv-scanner@v1

这需要安装 Go 1.18+。

使用

OSV-Scanner 会收集项目中使用的依赖项和版本列表,然后通过 OSV.dev API 将此列表与 OSV 数据库进行匹配。您可以将 OSV-Scanner 扫描您的应用目录,输入一个版本依赖锁定文件,扫描基于 Debian 的 Docker 镜像(预览功能),或者扫描 SBOM 软件物料清单文件。

扫描目录

遍历目录列表以查找:

  • 版本依赖锁定文件(如 Gemfile.lock, package-lock.json, yarn.lock 等文件)
  • SBOM 软件物料清单
  • .git 目录的最新提交记录

可以配置为使用 --recursive / -r 标志递归遍历子目录。

例子

1
$ osv-scanner -r .

输入一个版本依赖锁定文件

使用这个 lockfile 包支持范围广泛的 lockfiles。 这是当前支持的锁定文件列表:

例子

1
2
3
4
$ osv-scanner --lockfile=Gemfile.lock

# 指定 Gemfile.lock, package-lock.json, yarn.json 等文件
$ osv-scanner --lockfile=Gemfile.lock -L package-lock.json -L yarn.json

扫描基于 Debian 的 docker 镜像(预览功能)

该工具将抓取 Debian 映像中已安装软件包的列表并查询它们的漏洞。

目前仅支持基于 Debian 的 Docker 镜像扫描。

需要安装 Docker 并且该工具具有调用它的权限。

目前不扫描 Docker 容器的文件系统,并且有各种其他限制。 请关注此问题 - https://github.com/google/osv-scanner/issues/64以获取有关容器扫描的更新!

例子

1
$ osv-scanner --docker image_name:latest

其中 image_name 为您基于 Debian 的 Rails 应用镜像。

输入 SBOM

支持使用包 URL 的 SPDX - https://spdx.dev/CycloneDX SBOM - https://cyclonedx.org/。 格式是根据输入文件内容自动检测的。

例子

1
$ osv-scanner --sbom=sbom.json

配置

要配置扫描,请将 osv-scanner.toml 文件放在扫描文件的目录中。 要覆盖此文件,请传递 --config=/path/to/config.toml 参数。

目前,只有 1 个配置选项:

IgnoredVulns

要忽略漏洞,请在 IgnoreVulns 键下输入 ID。 (可选)添加到期日期或原因。

例子

1
2
3
4
5
6
7
8
[[IgnoredVulns]]
id = "GO-2022-0968"
# ignoreUntil = 2022-11-09 # Optional exception expiry date
reason = "No ssh servers are connected to or hosted in Go lang"

id = "GO-2022-1059"
# ignoreUntil = 2022-11-09 # Optional exception expiry date
reason = "No external http servers are written in Go lang."

JSON 输出

默认情况下,osv-scanner 输出一个人类可读的表格。 要让 osv-scanner 输出 JSON,请在调用 osv-scanner 时传递 --json 标志。

当使用 --json 标志时,只有 JSON 输出将被打印到 stdout,所有其他输出都被定向到 stderr。 因此,要仅将 json 输出保存到文件,您可以使用 osv-scanner --json ... > /path/to/file.json 重定向输出。

参考链接

[1] google/osv-scanner: Vulnerability scanner written in Go which uses the data provided by https://osv.dev - https://github.com/google/osv-scanner

[2] OSV - https://osv.dev/

[3] Bundler: How to manage application dependencies with Bundler - https://bundler.io/guides/using_bundler_in_applications.html#gemfilelock

[4] Ruby on Rails — A web-app framework that includes everything needed to create database-backed web applications according to the Model-View-Controller (MVC) pattern. - https://rubyonrails.org/

[5] Docker: Accelerated, Containerized Application Development - https://www.docker.com/

[6] The Missing Package Manager for macOS (or Linux) — Homebrew - https://brew.sh/

[7] Scoop - https://scoop.sh/