
gosec v2.28.0
使用 AST、SSA 和污点分析检查 Go 源代码安全漏洞的静态分析工具,支持 CI/CD 集成和 CWE 映射。
gosec - Go 安全检查器
通过扫描 Go AST 和 SSA 代码表示来检查源代码中的安全问题。
快速链接
特性
- 基于模式的规则 用于检测 Go 代码中的常见安全问题
- 基于 SSA 的分析器 用于类型转换、切片边界和加密问题
- 污点分析 用于跟踪从用户输入到危险函数的数据流(SQL 注入、命令注入、路径遍历、SSRF、XSS、日志注入、SMTP 注入、SSTI、不安全的反序列化、开放重定向)
许可证
根据 Apache 许可证 2.0 版(“许可证”)授权。除非遵守许可证,否则您不得使用此文件。您可以在此处获取许可证副本。
项目状态
安装
GitHub Action
您可以按以下方式将 gosec 作为 GitHub Action 运行:
使用带有 @master 的版本标签,该标签固定到最新的稳定版本。这将提供稳定的行为。```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@master
with:
args: ./...
#### 扫描包含私有模块的项目
如果你的项目导入了私有 Go 模块,你需要配置认证,以便 `gosec` 可以获取依赖项。在工作流中设置以下环境变量:
- `GOPRIVATE`:一个以逗号分隔的模块路径前缀列表,用于标识私有模块(例如 `github.com/your-org/*`)。
- `GITHUB_AUTHENTICATION_TOKEN`:一个具有对私有仓库读取权限的 GitHub 令牌。```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
args: ./...
与代码扫描集成
您可以通过上传 SARIF 格式的数据,将第三方代码分析工具与 GitHub 代码扫描进行集成。
该工作流展示了一个示例,在 GitHub Actions 工作流中将 gosec 作为一步运行,输出 results.sarif 文件。然后,工作流使用 upload-sarif 操作将 results.sarif 文件上传到 GitHub。```yaml
name: "Security Scan"
Run workflow each time code is pushed to your repository and on a schedule.
The scheduled workflow runs every at 00:00 on Sunday UTC time.
on: push: schedule:
- cron: '0 0 * * 0'
jobs: tests: runs-on: ubuntu-latest env: GO111MODULE: on steps: - name: Checkout Source uses: actions/checkout@v3 - name: Run Gosec Security Scanner uses: securego/gosec@v2 with: # we let the report trigger content trigger a failure using the GitHub Security features. args: '-no-fail -fmt sarif -out results.sarif ./...' - name: Upload SARIF file uses: github/codeql-action/upload-sarif@v2 with: # Path to SARIF file relative to the root of the repository sarif_file: results.sarif
### Go Analysis
`goanalysis` 包提供了一个
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
用于与支持标准 Go 分析接口的工具集成,例如 Bazel 的
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
框架:```starlark
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
本地安装
gosec 需要 Go 1.25 或更高版本。```bash go install github.com/securego/gosec/v2/cmd/gosec@latest
## 快速开始```bash
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
退出码
0: 扫描完成,没有未抑制的发现/错误1: 至少一个未抑制的发现或处理错误- 使用
-no-fail来始终返回0
用法
Gosec 可以配置为仅运行一部分规则、排除特定文件路径,并以不同格式生成报告。
默认情况下,所有规则都会针对提供的输入文件运行。
要从当前目录递归扫描,可以提供 ./... 作为输入参数。
可用规则
gosec 包括以下类别的规则:
G1xx: 通用安全编码问题(例如硬编码凭据、不安全用法、HTTP 强化、Cookie 安全性)G2xx: 查询/模板/命令构造中的注入风险G3xx: 文件和路径处理风险(权限、遍历、临时文件、归档提取)G4xx: 加密和 TLS 弱点G5xx: 黑名单导入G6xx: Go 语言特有的正确性/安全性检查(例如范围别名和切片边界)G7xx: 污点分析规则(SQL 注入、命令注入、路径遍历、SSRF、XSS、日志、SMTP 注入、SSTI、不安全反序列化和开放重定向)
完整列表、规则描述和每个规则的配置,请参见 RULES.md。
已弃用规则
选择规则
默认情况下,gosec 将对提供的文件路径运行所有规则。
但是,可以通过 -include= 标志选择要运行的规则子集,或使用 -exclude= 标志指定要明确排除的规则集。```bash
Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
Run everything except for rule G303
$ gosec -exclude=G303 ./...
### CWE 映射
`gosec` 检测到的每个问题都映射到
[CWE(通用弱点枚举)](http://cwe.mitre.org/data/index.html),
该枚举以更通用的术语描述漏洞。具体映射可参见
[此处](https://github.com/securego/gosec/blob/master/issue/issue.go#L50)。
### 配置
可以通过配置文件提供一系列全局设置,如下所示:```JSON
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec:此设置将覆盖代码库中定义的所有#nosec指令audit:以审计模式运行,启用额外的检查,这些检查对于正常的代码分析可能过于繁琐```bash
Run with a global configuration file
$ gosec -conf config.json .
### 基于路径的规则排除
包含多个组件的大型仓库可能需要针对不同路径应用不同的安全规则。使用 `exclude-rules` 来对特定路径抑制特定规则。
**配置文件:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
CLI Flag:```bash
Exclude G204 and G304 from cmd/ directory
gosec --exclude-rules="cmd/.*:G204,G304" ./...
Exclude all rules from scripts/ directory
gosec --exclude-rules="scripts/.:" ./...
Multiple exclusions
gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...
| 字段 | 类型 | 描述 |
|-------|------|-------------|
| `path` | string (regex) | 与文件路径匹配的正则表达式 |
| `rules` | []string | 要排除的规则ID。`*`表示所有 |
#### 规则配置
一些规则也接受配置标志;这些标志记录在
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md)中。
#### Go 版本
一些规则需要特定的 Go 版本,该版本从项目中存在的 Go 模块文件中获取。如果找不到该版本,将回退到 Go 运行时版本。
Go 模块版本使用 `go list` 命令解析,在某些情况下可能会导致性能下降。在这种情况下,可以通过设置环境变量 `GOSECGOVERSION=go1.21.1` 轻松提供 Go 模块版本。
### 依赖
gosec 使用 Go 模块加载包。在大多数项目中,扫描期间依赖项会自动解析。
如果缺少依赖项,请运行:```bash
go mod tidy
go mod download
排除测试文件和文件夹
gosec 将忽略所有包中的测试文件以及 vendor 目录中的任何依赖项。
可以使用以下标志启用测试文件的扫描:```bash gosec -tests ./...
此外,还可以按如下方式排除其他文件夹:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
排除生成的文件
gosec 可以忽略带有默认生成代码注释的生成 Go 文件。``` // Code generated by some generator DO NOT EDIT.
**注意:** 如果您使用反向代理访问 NetExec,例如带有身份验证的 Nginx,您可能需要修改 Nginx 的头信息。