GoKart 是一款针对 Go 语言的静态分析工具,它利用 Go 源码的 SSA(单静态赋值)形式来发现漏洞。该工具能够追踪变量和函数参数的来源,判断输入源是否安全,从而相比其他 Go 安全扫描器减少误报数量。例如,通常与变量拼接的 SQL 查询可能被标记为 SQL 注入;但 GoKart 能够判断该变量是否实际上是常量或常量等价物,这种情况下并不存在漏洞。
GoKart 还为 Chariot(Praetorian 的安全平台)提供动力,帮助您发现、管理并修复源码及云环境中的漏洞。Chariot 让您能够轻松对源码进行自动化、持续的 GoKart 扫描。如果您想试用 GoKart,点击此处即可在几分钟内免费注册 Chariot 账户。
静态分析是发现源码中漏洞的强大技术。然而,这种方法饱受噪音困扰——许多静态分析工具会找到大量并非真正存在的“漏洞”。这导致了开发者的抵触情绪,因为用户对工具一次次“狼来了”已经感到厌倦。
构建 GoKart 的动机正是为了解决这个问题:我们能否创建一个误报率显著低于现有工具的扫描器?根据我们的实验,答案是肯定的。通过利用源到汇追踪和 SSA,GoKart 能够追踪变量赋值之间的变量污点,显著提高了发现的准确性。我们专注于可用性:实际上,这意味着我们优化了方法以减少误报。
更多信息,请阅读我们的博客文章。
您可以通过以下任一选项在本地安装 GoKart。
go install 安装$ go install github.com/praetorian-inc/gokart@latest
从发布页面下载适用于您操作系统的二进制文件。
(可选)下载 checksums.txt 文件以验证压缩包的完整性
# 检查下载压缩包的校验和
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart 二进制文件移动到您的路径中:$ mv ./gokart /usr/local/bin/
# 克隆 GoKart 仓库
$ git clone https://github.com/praetorian-inc/gokart.git
# 进入仓库目录并构建
$ cd gokart
$ go build
# 将 gokart 二进制文件移动到您的路径中
$ mv ./gokart /usr/local/bin
构建 Docker 镜像
docker build -t gokart .
使用本地扫描运行容器(需要将本地扫描目录挂载到容器镜像中)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
使用远程扫描运行容器(指定私钥进行认证时,也需要将其挂载到容器中)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# 为私有仓库 SSH 认证指定私钥
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# 未指定目录时默认使用 '.'
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
您可以按照以下步骤在 Go Test Bench(Contrast Security 团队故意构建的易受攻击 Go 应用程序)上运行 GoKart。
# 克隆示例易受攻击应用程序
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
输出应显示一些识别出的漏洞,每个漏洞都包含识别出的“易受攻击函数”和“用户输入源”。
要测试 GoKart 的更多功能,您可以使用下面建议的 CLI 标志进行扫描。
# 使用 verbose 标志显示这些漏洞的完整追踪
gokart scan go-test-bench/ -v
# 使用 globalsTainted 标志忽略白名单中的源
# 可能会增加误报结果
gokart scan go-test-bench/ -v -g
# 使用 debug 标志显示内部分析信息
# 对开发和调试非常有用
gokart scan go-test-bench/ -d
# 以 sarif 格式输出结果
gokart scan go-test-bench/ -s
# 将结果输出到文件
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# 将 sarif 结果输出到文件
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# 扫描远程公共仓库
# 仓库将被克隆到本地,扫描后删除
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# 指定要扫描的远程分支
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# 通过 SSH 扫描远程私有仓库
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# 扫描远程私有仓库,并可选择指定 SSH 认证密钥
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# 将远程扫描和输出标志结合使用,实现无缝安全审查
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# 将远程扫描、输出和 sarif 标志结合使用,实现无缝 CI/CD 集成
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
要测试 GoKart 的可扩展性,您可以修改 GoKart 使用的配置文件,以引入新的漏洞接收器到分析中。在默认配置文件 util/analyzers.yml 中定义了一个测试接收器分析器。修改 util/analyzers.yml,移除测试接收器分析器上的注释,然后使用 -i 标志指示 GoKart 使用修改后的配置文件。
# 使用修改后的 analyzers.yml 文件进行扫描,并输出完整追踪
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
输出现在应包含额外的漏洞,包括新的“测试接收器可由用户输入到达”的漏洞。
您可以通过以下命令(在 GoKart 根目录下运行)来执行包含的测试。
go test -v ./...