diff --git a/.travis.yml b/.travis.yml index d144b31..37924cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ go: install: - go get -v github.com/onsi/ginkgo/ginkgo - go get -v github.com/onsi/gomega + - go get -v golang.org/x/crypto/ssh - go get -v -t ./... - export PATH=$PATH:$HOME/gopath/bin diff --git a/README.md b/README.md index cc3b160..1c9a1e4 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,7 @@ or to specify a set of rules to explicitly exclude using the '-exclude=' flag. - G103: Audit the use of unsafe block - G104: Audit errors not checked - G105: Audit the use of math/big.Int.Exp + - G106: Audit the use of ssh.InsecureIgnoreHostKey - G201: SQL query construction using format string - G202: SQL query construction using string concatenation - G203: Use of unescaped data in HTML templates diff --git a/rules/rulelist.go b/rules/rulelist.go index 833b742..6cc3ee6 100644 --- a/rules/rulelist.go +++ b/rules/rulelist.go @@ -65,6 +65,7 @@ func Generate(filters ...RuleFilter) RuleList { "G103": RuleDefinition{"Audit the use of unsafe block", NewUsingUnsafe}, "G104": RuleDefinition{"Audit errors not checked", NewNoErrorCheck}, "G105": RuleDefinition{"Audit the use of big.Exp function", NewUsingBigExp}, + "G106": RuleDefinition{"Audit the use of ssh.InsecureIgnoreHostKey function", NewSSHHostKey}, // injection "G201": RuleDefinition{"SQL query construction using format string", NewSQLStrFormat}, diff --git a/rules/rules_test.go b/rules/rules_test.go index c42902f..a7dca95 100644 --- a/rules/rules_test.go +++ b/rules/rules_test.go @@ -65,6 +65,10 @@ var _ = Describe("gas rules", func() { runner("G105", testutils.SampleCodeG105) }) + It("should detect of ssh.InsecureIgnoreHostKey function", func() { + runner("G106", testutils.SampleCodeG106) + }) + It("should detect sql injection via format strings", func() { runner("G201", testutils.SampleCodeG201) }) diff --git a/rules/ssh.go b/rules/ssh.go new file mode 100644 index 0000000..99b7e27 --- /dev/null +++ b/rules/ssh.go @@ -0,0 +1,33 @@ +package rules + +import ( + "go/ast" + + "github.com/GoASTScanner/gas" +) + +type sshHostKey struct { + gas.MetaData + pkg string + calls []string +} + +func (r *sshHostKey) Match(n ast.Node, c *gas.Context) (gi *gas.Issue, err error) { + if _, matches := gas.MatchCallByPackage(n, c, r.pkg, r.calls...); matches { + return gas.NewIssue(c, n, r.What, r.Severity, r.Confidence), nil + } + return nil, nil +} + +// NewSSHHostKey rule detects the use of insecure ssh HostKeyCallback. +func NewSSHHostKey(conf gas.Config) (gas.Rule, []ast.Node) { + return &sshHostKey{ + pkg: "golang.org/x/crypto/ssh", + calls: []string{"InsecureIgnoreHostKey"}, + MetaData: gas.MetaData{ + What: "Use of ssh InsecureIgnoreHostKey should be audited", + Severity: gas.Medium, + Confidence: gas.High, + }, + }, []ast.Node{(*ast.CallExpr)(nil)} +} diff --git a/testutils/source.go b/testutils/source.go index f606e4a..eb4a826 100644 --- a/testutils/source.go +++ b/testutils/source.go @@ -183,6 +183,15 @@ func main() { z = z.Exp(x, y, m) }`, 1}} + // SampleCodeG106 - ssh InsecureIgnoreHostKey + SampleCodeG106 = []CodeSample{{` +package main +import ( + "golang.org/x/crypto/ssh" +) +func main() { + _ = ssh.InsecureIgnoreHostKey() +}`, 1}} // SampleCodeG201 - SQL injection via format string SampleCodeG201 = []CodeSample{ {`