通過掃描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的一些用戶的列表。
通過成為贊助商來支持這個項目。您的徽標將在此處顯示帶有指向您網站的鏈接