securego/gosecなるものを教えてもらいました。 Go ASTでセキュリティの問題がないかをチェックしてくれるようです。
どんな内容をチェックしてくれる?
Available rulesがその一覧です。
もう少し細かいところは公式サイトにありますが、更新はされてなさそうですが、調べ方は次に記載します。
Gxxxって何の番号?
README.mdに書いてありました。 gosecのprojectで採番している番号で、その元はCWEのようです。
対応表を見ると、例えば G102
は CWE-200
にマッチしていて、CWE-22: Improper Limitation of a Pathname to a Restricted Directory (‘Path Traversal’)とアクセスすれば良さそうです。
// GetCwe creates a cwe object for a given RuleID
func GetCwe(id string) Cwe {
return Cwe{ID: id, URL: fmt.Sprintf("https://cwe.mitre.org/data/definitions/%s.html", id)}
}
// IssueToCWE maps gosec rules to CWEs
var IssueToCWE = map[string]Cwe{
"G101": GetCwe("798"),
"G102": GetCwe("200"),
---snip---
}
使われてるの?
リストがありました。 GitlabやVMwareなどの企業しかり、KubernetesやJenkins Xなどのプロジェクトにも使われるようですね。
使い方は?
いくつかオプションがありますが、基本はこれで良さそうです。
GitHub Actionsでも gosec
の名前で公開されているのでCIへの組み込みも簡単そうですね。
$ gosec ./...
---snip---
Results:
Summary:
Files: 2
Lines: 193
Nosec: 0
Issues: 0 // 問題があればIssue番号と、その数がカウントされる
まとめ
code書いたらgosecを試していこうと思います。繰り返し指摘されれば自然とその書き方になることを期待して・・・。あとはGxxxのそれぞれを読む機会が必要そうです。
ちなみに今日はG304を指摘いただいたので、io.Read
では filepath.Clean()
で渡すようにしようと思います。
ただまあ引数にフォルダを与えたときにファイルトラバーサルされる恐れがあるということなので、そもそも引数を外から取らなければ問題ないかとは思うのでただただ鵜呑みはよくなさそうですね。