通过扫描GO AST和SSA代码表示,检查源代码是否有安全问题。
根据Apache许可证(版本2.0)(“许可证”)获得许可。除了符合许可外,您不得使用此文件。您可以在此处获得许可证的副本。
# binary will be $(go env GOPATH)/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $( go env GOPATH ) /bin vX.Y.Z
# or install it into ./bin/
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# In alpine linux (as it does not come with curl by default)
wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# If you want to use the checksums provided on the "Releases" page
# then you will have to download a tar.gz file for your operating system instead of a binary file
wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz
# The file will be in the current folder where you run the command
# and you can check the checksum like this
echo " <check sum from the check sum file> gosec_vX.Y.Z_OS.tar.gz " | sha256sum -c -
gosec --help您可以将gosec作为GITHUB操作运行,如下所示:
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 : ./...您可以通过将数据上传为SARIF文件将第三方代码分析工具与GitHub代码扫描集成在一起。
工作流程显示了将gosec作为GitHub Action Workflow中的步骤运行的示例,该工作流程输出results.sarif文件。然后,工作流使用upload-sarif操作将results.sarif上传到github。
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@master
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.sarifgo install github.com/securego/gosec/v2/cmd/gosec@latest可以将GOSEC配置为仅运行一部分规则,排除某些文件路径并以不同格式生产报告。默认情况下,所有规则将针对提供的输入文件运行。要从当前目录进行递归扫描,您可以提供./...作为输入参数。
默认情况下,GOSEC将针对所提供的文件路径运行所有规则。但是,可以选择一个通过-include= flag运行的规则子集,或指定一组规则以使用-exclude= flag明确排除。
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./...gosec检测到的每个问题都映射到CWE(常见的弱点),该CWE用更通用的术语描述了脆弱性。确切的映射可以在此处找到。
可以在配置文件中提供许多全局设置,如下所示:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec :此设置将覆盖整个代码库中定义的所有#nosec指令audit :以审核模式运行,该模式可以进行添加检查是否对正常代码分析可能过于失去困难 # Run with a global configuration file
$ gosec -conf config.json . 有些规则也接受配置标志;这些标志记录在规则中。
一些规则需要特定的GO版本,该版本从项目中存在的GO模块文件中检索。如果找不到此版本,它将转回运行时版本。
使用GO模块版本使用go list命令解析,在某些情况下可能导致性能降解。在这种情况下,可以通过设置环境变量GOSECGOVERSION=go1.21.1来轻松提供GO模块版本。
GOSEC将自动获取GO模块打开时正在分析的代码的依赖项(例如GO111MODULE=on )。如果不是这种情况,则需要在扫描之前通过运行go get -d命令来明确下载依赖项。
GOSEC将忽略所有软件包和供应商目录中所有依赖项的测试文件。
可以使用以下标志启用测试文件的扫描:
gosec -tests ./...另外,可以将其他文件夹排除在以下内容:
gosec -exclude-dir=rules -exclude-dir=cmd ./...GOSEC可以使用默认生成的代码注释忽略生成的GO文件。
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...GOSEC可以根据AI建议建议修复。它将致电AI API,以收到有关安全发现的建议。
您可以通过提供以下命令行参数来启用此功能:
ai-api-provider :AI API提供商的名称,目前仅支持gemini 。ai-api-key或设置环境变量GOSEC_AI_API_KEY :访问AI API的键,对于Gemini,您可以按照以下指令创建一个API键。ai-endpoint :AI提供商的终点,这是可选的参数。 gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./...与所有自动检测工具一样,将有误报情况。如果GOSEC报告了已手动确认为安全的故障,则可以通过以#nosec开头的评论来注释代码。
#nosec评论应具有#nosec [RuleList] [-- Justification]的格式。
需要将#nosec评论放在报告警告的线上。
func main () {
tr := & http. Transport {
TLSClientConfig : & tls. Config {
InsecureSkipVerify : true , // #nosec G402
},
}
client := & http. Client { Transport : tr }
_ , err := client . Get ( "https://go.dev/" )
if err != nil {
fmt . Println ( err )
}
}当已经确定并确认特定的误报为安全时,您可能希望在代码部分中仅抑制该单一规则(或一组特定的规则),同时继续扫描其他问题。为此,您可以在#nosec注释中列出要被抑制的规则,例如: /* #nosec G401 */ OR //#nosec G201 G202 G203
您可以为注释提供描述或理由文本。理由应遵循规则,以压制和以两个或多个破折号开始,例如: //#nosec G101 G102 -- This is a false positive
在某些情况下,您可能还想重新访问使用#nosec注释的地方。要运行扫描仪并忽略任何#nosec注释,您可以执行以下操作:
gosec -nosec=true ./...如上所述,我们可以在GOSEC中抑制外部(使用-include / -exclude )或内联(使用#nosec注释)的违规行为。这种抑制炎症可用于生成相应的信号进行审计。
我们可以按照以下方式通过-track-suppressions标志跟踪抑制:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind是external ,而justification是“全球抑制”的一定句子。kind是inSource和justification是评论中两个或多个破折号之后的文字。注意:只有SARIF和JSON格式支持跟踪抑制。
GOSEC能够将您的GO构建标签传递给分析器。它们可以作为逗号分隔列表提供如下:
gosec -tags debug,ignore ./...GOSEC目前支持text , json , yaml , csv , sonarqube , JUnit XML , html和golint输出格式。默认情况下,结果将报告给Stdout,但也可以写入输出文件。输出格式由-fmt标志控制,并且输出文件由-out标志控制如下:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go结果将报告给Stdout以及-stdout标志提供的输出文件。当结果将结果保存在输出文件中时, -verbose标志将覆盖输出格式
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout * .go
# Overrides the output format to 'text' when stdout the results, while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text * .go注意: GOSEC生成了Sonarqube的通用问题导入格式,并且必须使用sonar.externalIssuesReportPaths=path/to/gosec-report.json将报告导入Sonarqube。
贡献.md包含有关向GOSEC添加新规则的详细信息。
您可以使用以下方式构建二进制文件:
make安装工具:
go get -u github.com/a-h/generate/cmd/schema-generate然后以以下方式生成类型
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.go大多数Marshalljson/Unmarshaljson都被删除了,除了属性袋的一个方便,可以嵌入其他属性。其余的可以删除。 URI,ID,UUID,GUID被重命名,因此适合此处定义的GO大会
您可以使用以下方式运行所有单元测试
make test您可以通过标记版本如下来创建版本:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0将标签推到上游后,GITHUB释放工作流程立即触发。该流将使用Goreleaser Action释放二进制文件,然后将Docker Image构建并发布到Docker Hub中。
释放的工件使用cosign签名。您可以使用cosign.pub文件中的公共密钥来验证docker映像和二进制文件的签名。
可以使用以下命令来验证Docker Image签名:
cosign verify --key cosign.pub securego/gosec:<TAG>
可以使用以下命令验证二进制文件签名:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
您还可以使用命令:
make image您可以在容器中使用gosec工具来针对本地GO项目。您只需将项目安装到一个卷中,如下所示:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /...注意:需要使用-w选项设置当前的工作目录,以便成功解决GO模块文件的依赖项
TLS规则的配置可以从Mozilla的TLS密码建议中生成。
首先,您需要安装生成器工具:
go get github.com/securego/gosec/v2/cmd/tlsconfig/...您现在可以go generate项目的根源:
go generate ./...这将生成rules/tls_config.go文件,该文件将包含Mozilla当前的密码建议。
这是GOSEC的一些用户的列表。
通过成为赞助商来支持这个项目。您的徽标将在此处显示带有指向您网站的链接