shogo82148/actions-go-fuzz
GitHub: shogo82148/actions-go-fuzz
一个在 GitHub Actions 中自动化运行 Go 原生模糊测试并通过 PR 或 Slack 报告问题的 CI 集成工具。
Stars: 2 | Forks: 0
[](https://github.com/shogo82148/actions-go-fuzz/actions/workflows/test.yml)
# 用于 Go Fuzz 的 GitHub Action
此 Action 在 GitHub Actions 上运行 [Go Fuzzing](https://go.dev/security/fuzz/)。
## 用法
### 以 Pull Request 形式报告
在您的仓库中创建一个工作流文件,例如 `.github/workflows/fuzz.yml`:
```
name: "fuzz"
on:
workflow_dispatch:
schedule:
- cron: "36 2 * * 1,4"
permissions:
contents: write
pull-requests: write
jobs:
list:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "stable"
- id: list
uses: shogo82148/actions-go-fuzz/list@v1
outputs:
fuzz-tests: ${{steps.list.outputs.fuzz-tests}}
fuzz:
runs-on: ubuntu-latest
timeout-minutes: 360
needs: list
strategy:
fail-fast: false
matrix:
include: ${{fromJson(needs.list.outputs.fuzz-tests)}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "stable"
- uses: shogo82148/actions-go-fuzz/run@v1
with:
packages: ${{ matrix.package }}
fuzz-regexp: ${{ matrix.func }}
fuzz-time: "355m"
```
`actions-go-fuzz` 通过执行 `go test -fuzz FuzzFoo` 来运行 fuzz 测试,提交[失败的输入](https://go.dev/security/fuzz/#glos-failing-input),并在 fuzz 测试失败时创建一个 pull request。
查看由此 Action 生成的 [pull request 示例](https://github.com/shogo82148/actions-go-fuzz/pull/53)。
### 以 Slack 消息形式报告
您也可以通过 Slack 消息接收报告。
[创建一个 Incoming Webhook](https://api.slack.com/messaging/webhooks),并将其设置为 `SLACK_INCOMING_WEBHOOK` secret 的值。
然后,在您的仓库中添加一个工作流文件:
```
name: "fuzz"
on:
workflow_dispatch:
schedule:
- cron: "36 2 * * 1,4"
permissions:
contents: write
pull-requests: write
jobs:
list:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "stable"
- id: list
uses: shogo82148/actions-go-fuzz/list@v1
outputs:
fuzz-tests: ${{steps.list.outputs.fuzz-tests}}
fuzz:
runs-on: ubuntu-latest
timeout-minutes: 360
needs: list
strategy:
fail-fast: false
matrix:
include: ${{fromJson(needs.list.outputs.fuzz-tests)}}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "stable"
- uses: shogo82148/actions-go-fuzz/run@v1
with:
packages: ${{ matrix.package }}
fuzz-regexp: ${{ matrix.func }}
fuzz-time: "355m"
report-method: "slack"
webhook-url: ${{ secrets.SLACK_INCOMING_WEBHOOK }}
```
## 权限
使用 `pull-request` 报告方式时,`actions-go-fuzz` Action 需要以下 GitHub 权限:
- `contents: write`
- `pull-requests: write`
您可以在工作流 YAML 文件中指定这些权限:
```
permissions:
contents: write
pull-requests: write
```
使用 `slack` 报告方式时,`actions-go-fuzz` Action 需要以下 GitHub 权限:
- `contents: read`
## list action 的输入
- `packages`:这是一个可选参数,允许您指定要为其列出 fuzz 测试的 Go 包。默认情况下,它会针对您项目中的所有包(`./...`)。
- `working-directory`:这也是一个可选参数,允许您指定工作目录。默认为根目录(`.`)。
- `tags`:以逗号分隔的额外构建 tag 列表,在构建期间被视为已满足。它相当于 `go test` 命令的 `-tags` 标志。
## list action 的输出
- `fuzz-tests`:指定 Go 包的所有 fuzz 测试的 JSON 编码列表。
## run action 的输入
- `repository`:包含所有者的仓库名称(例如 `shogo82148/actions-go-fuzz`)。默认为运行该 Action 的仓库。
- `token`:仓库的 GitHub token。默认为 GitHub Actions 环境提供的 token。
- `packages`:用于指定 fuzz 测试 Go 包的可选参数。默认情况下,它会针对您项目中的所有包(`./...`)。
- `working-directory`:这也是一个可选参数,允许您指定工作目录。默认为根目录(`.`)。
- `fuzz-regexp`:运行匹配该正则表达式的 fuzz 测试。对应于 `go test` 命令的 `-fuzz` 标志。
- `fuzz-time`:fuzz 目标迭代持续时间,指定为 `time.Duration`(例如 `1h30s`)。对应于 `go test` 命令的 `-fuzztime` 标志。请确保此时间少于您的作业超时时间。
- `fuzz-minimize-time`:fuzz 最小化持续时间,指定为 `time.Duration`(例如 `1h30s`)。对应于 `go test` 命令的 `-fuzzminimizetime` 标志。如果您提供此输入,请确保它少于您的作业超时时间。
- `report-method`:报告结果的方法。使用 `pull-request` 创建 pull request,使用 `slack` 通过 Slack Incoming Web Hook 发送消息。
- `base-branch`:pull request 的基础分支名称。
- `head-branch-prefix`:pull request 的头分支名称的前缀。
- `webhook-url`:Slack Incoming Web Hook 的 URL。
- `tags`:以逗号分隔的额外构建 tag 列表,在构建期间被视为已满足。它相当于 `go test` 命令的 `-tags` 标志。
## list action 的输出
- `found`:如果发现了新的 crasher,则为 `true`。否则为假值。
- `head-branch`:该 Action 创建的 pull request 的头分支名称。
- `pull-request-number`:该 Action 创建的 pull request 的编号。
- `pull-request-url`:该 Action 创建的 pull request 的 URL。
## 安全性
任何拥有仓库读取权限的人都可以查看此 Action 创建的 pull request。
由于该 pull request 可能包含有关漏洞的信息,因此请谨慎处理。
如果可能,我们建议使用 `slack` 报告方式。
## 许可证
本项目中的脚本和文档基于 [MIT 许可证](LICENSE) 发布。
标签:GitHub Actions, Go语言, 开源框架, 持续集成, 日志审计, 程序破解, 自动化攻击, 自动笔记