2016-08-05 18:54:29 +02:00
2018-10-05 11:57:14 +02:00
# gosec - Golang Security Checker
2016-07-20 12:02:01 +02:00
Inspects source code for security problems by scanning the Go AST.
2018-09-25 11:44:53 +02:00
< img src = "https://securego.io/img/gosec.png" width = "320" >
2018-10-05 11:57:14 +02:00
## License
2016-08-28 20:09:52 +02:00
2019-10-31 12:56:17 +02:00
Licensed under the Apache License, Version 2.0 (the "License").
You may not use this file except in compliance with the License.
2016-08-28 20:09:52 +02:00
You may obtain a copy of the License [here ](http://www.apache.org/licenses/LICENSE-2.0 ).
2018-10-05 11:57:14 +02:00
## Project status
2016-07-25 18:51:19 +02:00
2019-09-26 10:46:34 +02:00
[![CII Best Practices ](https://bestpractices.coreinfrastructure.org/projects/3218/badge )](https://bestpractices.coreinfrastructure.org/projects/3218)
2018-07-19 18:46:26 +02:00
[![Build Status ](https://travis-ci.org/securego/gosec.svg?branch=master )](https://travis-ci.org/securego/gosec)
2018-12-11 19:15:58 +02:00
[![Coverage Status ](https://codecov.io/gh/securego/gosec/branch/master/graph/badge.svg )](https://codecov.io/gh/securego/gosec)
2019-02-13 12:27:11 +02:00
[![GoReport ](https://goreportcard.com/badge/github.com/securego/gosec )](https://goreportcard.com/badge/github.com/securego/gosec)
2018-07-19 18:46:26 +02:00
[![GoDoc ](https://godoc.org/github.com/securego/gosec?status.svg )](https://godoc.org/github.com/securego/gosec)
2019-02-13 12:27:11 +02:00
[![Docs ](https://readthedocs.org/projects/docs/badge/?version=latest )](https://securego.io/)
[![Downloads ](https://img.shields.io/github/downloads/securego/gosec/total.svg )](https://github.com/securego/gosec/releases)
[![Docker Pulls ](https://img.shields.io/docker/pulls/securego/gosec.svg )](https://hub.docker.com/r/securego/gosec/tags)
2018-07-20 01:23:46 +02:00
[![Slack ](http://securego.herokuapp.com/badge.svg )](http://securego.herokuapp.com)
2018-07-20 01:22:43 +02:00
2018-10-05 11:57:14 +02:00
## Install
### CI Installation
```bash
# binary will be $GOPATH/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $GOPATH/bin vX.Y.Z
2016-07-25 18:51:19 +02:00
2018-10-05 11:57:14 +02:00
# 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
2019-06-06 10:49:58 +02:00
# 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 -
2018-10-05 11:57:14 +02:00
gosec --help
```
### Local Installation
2018-01-11 03:31:08 +02:00
2019-05-02 09:19:18 +02:00
```bash
go get github.com/securego/gosec/cmd/gosec
```
2018-01-11 03:31:08 +02:00
2018-10-05 11:57:14 +02:00
## Usage
2016-07-20 12:02:01 +02:00
2018-07-19 18:46:26 +02:00
Gosec can be configured to only run a subset of rules, to exclude certain file
2016-07-20 12:02:01 +02:00
paths, and produce reports in different formats. By default all rules will be
run against the supplied input files. To recursively scan from the current
2019-10-31 12:56:17 +02:00
directory you can supply `./...` as the input argument.
2016-07-20 12:02:01 +02:00
2018-10-05 11:57:14 +02:00
### Available rules
- G101: Look for hard coded credentials
- G102: Bind to all interfaces
- G103: Audit the use of unsafe block
- G104: Audit errors not checked
- G106: Audit the use of ssh.InsecureIgnoreHostKey
- G107: Url provided to HTTP request as taint input
2019-09-20 10:48:19 +02:00
- G108: Profiling endpoint automatically exposed on /debug/pprof
2020-01-06 10:55:52 +02:00
- G109: Potential Integer overflow made by strconv.Atoi result conversion to int16/32
2020-01-19 21:40:19 +02:00
- G110: Potential DoS vulnerability via decompression bomb
2018-10-05 11:57:14 +02:00
- G201: SQL query construction using format string
- G202: SQL query construction using string concatenation
- G203: Use of unescaped data in HTML templates
- G204: Audit use of command execution
- G301: Poor file permissions used when creating a directory
- G302: Poor file permissions used with chmod
- G303: Creating tempfile using a predictable path
- G304: File path provided as taint input
- G305: File traversal when extracting zip archive
2020-02-28 13:48:18 +02:00
- G306: Poor file permissions used when writing to a new file
2020-03-01 22:45:37 +02:00
- G307: Deferring a method which returns an error
2018-10-05 11:57:14 +02:00
- G401: Detect the usage of DES, RC4, MD5 or SHA1
- G402: Look for bad TLS connection settings
- G403: Ensure minimum RSA key length of 2048 bits
- G404: Insecure random number source (rand)
- G501: Import blacklist: crypto/md5
- G502: Import blacklist: crypto/des
- G503: Import blacklist: crypto/rc4
- G504: Import blacklist: net/http/cgi
- G505: Import blacklist: crypto/sha1
2019-09-09 14:16:26 +02:00
### Retired rules
- G105: Audit the use of math/big.Int.Exp - [CVE is fixed ](https://github.com/golang/go/issues/15184 )
### Selecting rules
2019-10-31 12:56:17 +02:00
By default, gosec will run all rules against the supplied file paths. It is however possible to select a subset of rules to run via the `-include=` flag,
or to specify a set of rules to explicitly exclude using the `-exclude=` flag.
2019-09-09 14:16:26 +02:00
2018-10-05 11:57:14 +02:00
```bash
2016-08-28 20:07:28 +02:00
# Run a specific set of rules
2018-07-19 18:46:26 +02:00
$ gosec -include=G101,G203,G401 ./...
2016-08-28 20:07:28 +02:00
# Run everything except for rule G303
2018-07-19 18:46:26 +02:00
$ gosec -exclude=G303 ./...
2016-07-20 12:02:01 +02:00
```
2019-10-31 12:56:17 +02:00
### CWE Mapping
Every issue detected by `gosec` is mapped to a [CWE (Common Weakness Enumeration) ](http://cwe.mitre.org/data/index.html ) which describes in more generic terms the vulnerability. The exact mapping can be found [here ](https://github.com/securego/gosec/blob/53be8dd8644ee48802114178cff6eb7e29757414/issue.go#L49 ).
2016-07-20 12:02:01 +02:00
2019-01-14 13:43:12 +02:00
### Configuration
A number of global settings can be provided in a configuration file as follows:
```JSON
{
"global": {
"nosec": "enabled",
2019-01-22 16:25:14 +02:00
"audit": "enabled"
2019-01-14 13:43:12 +02:00
}
}
```
- `nosec` : this setting will overwrite all `#nosec` directives defined throughout the code base
2019-01-14 13:45:02 +02:00
- `audit` : runs in audit mode which enables addition checks that for normal code analysis might be too nosy
2019-01-14 13:43:12 +02:00
```bash
# Run with a global configuration file
2019-03-05 14:48:59 +02:00
$ gosec -conf config.json .
2019-01-14 13:43:12 +02:00
```
2019-06-25 11:26:28 +02:00
Also some rules accept configuration. For instance on rule `G104` , it is possible to define packages along with a list
of functions which will be skipped when auditing the not checked errors:
```JSON
{
"G104": {
"io/ioutil": ["WriteFile"]
}
}
```
2019-01-14 13:43:12 +02:00
2019-09-09 13:11:12 +02:00
### Dependencies
2019-10-31 12:56:17 +02:00
gosec will fetch automatically the dependencies of the code which is being analyzed when go module is turned on (e.g.` GO111MODULE=on`). If this is not the case,
2019-09-09 13:11:12 +02:00
the dependencies need to be explicitly downloaded by running the `go get -d` command before the scan.
2019-09-09 14:01:36 +02:00
### Excluding test files and folders
2019-09-09 13:11:12 +02:00
2019-09-09 14:01:36 +02:00
gosec will ignore test files across all packages and any dependencies in your vendor directory.
2016-07-20 12:02:01 +02:00
2019-09-09 14:01:36 +02:00
The scanning of test files can be enabled with the following flag:
2019-04-28 19:39:43 +02:00
```bash
2019-09-09 14:01:36 +02:00
gosec -tests ./...
```
Also additional folders can be excluded as follows:
```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
2019-04-28 19:39:43 +02:00
```
2016-07-20 12:02:01 +02:00
2018-10-05 11:57:14 +02:00
### Annotating code
2016-07-20 12:02:01 +02:00
2019-10-31 12:56:17 +02:00
As with all automated detection tools, there will be cases of false positives. In cases where gosec reports a failure that has been manually verified as being safe,
it is possible to annotate the code with a `#nosec` comment.
2016-07-27 10:36:13 +02:00
2018-07-31 22:22:19 +02:00
The annotation causes gosec to stop processing any further nodes within the
2018-09-04 08:55:03 +02:00
AST so can apply to a whole block or more granularly to a single expression.
2016-07-20 12:02:01 +02:00
```go
import "md5" // #nosec
func main(){
2016-07-22 16:50:30 +02:00
/* #nosec */
2016-07-20 12:02:01 +02:00
if x > y {
h := md5.New() // this will also be ignored
}
}
```
2019-10-31 12:56:17 +02:00
When a specific false positive has been identified and verified as safe, you may wish to suppress only that single rule (or a specific set of rules)
within a section of code, while continuing to scan for other problems. To do this, you can list the rule(s) to be suppressed within
the `#nosec` annotation, e.g: `/* #nosec G401 */` or `// #nosec G201 G202 G203`
2018-07-31 22:22:19 +02:00
2019-10-31 12:56:17 +02:00
In some cases you may also want to revisit places where `#nosec` annotations
have been used. To run the scanner and ignore any `#nosec` annotations you
2016-07-22 16:50:30 +02:00
can do the following:
2016-07-20 12:02:01 +02:00
2018-10-05 11:57:14 +02:00
```bash
gosec -nosec=true ./...
2016-07-20 12:02:01 +02:00
```
2018-10-05 11:57:14 +02:00
### Build tags
2018-04-20 01:45:04 +02:00
2018-07-19 18:46:26 +02:00
gosec is able to pass your [Go build tags ](https://golang.org/pkg/go/build/ ) to the analyzer.
2018-04-20 01:45:04 +02:00
They can be provided as a comma separated list as follows:
2018-10-05 11:57:14 +02:00
```bash
gosec -tag debug,ignore ./...
2018-04-20 01:45:04 +02:00
```
2016-07-20 12:02:01 +02:00
### Output formats
2020-01-03 11:56:21 +02:00
gosec currently supports text, json, yaml, csv, sonarqube, JUnit XML and golint output formats. By default
2016-07-22 16:50:30 +02:00
results will be reported to stdout, but can also be written to an output
file. The output format is controlled by the '-fmt' flag, and the output file is controlled by the '-out' flag as follows:
2016-07-20 12:02:01 +02:00
2018-10-05 11:57:14 +02:00
```bash
2016-07-20 12:02:01 +02:00
# Write output in json format to results.json
2018-07-19 18:46:26 +02:00
$ gosec -fmt=json -out=results.json *.go
2016-07-20 12:02:01 +02:00
```
2017-08-03 19:50:58 +02:00
2018-10-05 11:57:14 +02:00
## Development
### Build
2018-03-13 00:57:10 +02:00
2018-10-05 11:57:14 +02:00
```bash
2018-03-13 00:57:10 +02:00
make
```
2018-10-05 11:57:14 +02:00
### Tests
2018-03-13 00:57:10 +02:00
2018-10-05 11:57:14 +02:00
```bash
2018-03-20 01:21:32 +02:00
make test
2018-03-13 00:57:10 +02:00
```
2018-10-05 11:57:14 +02:00
### Release Build
2018-03-13 00:57:10 +02:00
2018-07-27 14:41:45 +02:00
Make sure you have installed the [goreleaser ](https://github.com/goreleaser/goreleaser ) tool and then you can release gosec as follows:
2018-08-21 11:14:30 +02:00
2018-10-05 11:57:14 +02:00
```bash
2019-09-09 13:11:32 +02:00
git tag v1.0.0
2018-07-27 14:41:45 +02:00
export GITHUB_TOKEN=< YOUR GITHUB TOKEN >
make release
2018-08-21 11:14:30 +02:00
```
2018-03-13 00:57:10 +02:00
2018-07-27 14:41:45 +02:00
The released version of the tool is available in the `dist` folder. The build information should be displayed in the usage text.
2018-03-13 00:57:10 +02:00
2018-10-05 11:57:14 +02:00
```bash
2018-07-27 14:41:45 +02:00
./dist/darwin_amd64/gosec -h
2018-07-19 18:46:26 +02:00
gosec - Golang security checker
2018-03-13 00:57:10 +02:00
2018-07-19 18:46:26 +02:00
gosec analyzes Go source code to look for common programming mistakes that
2019-10-31 12:56:17 +02:00
2018-03-13 00:57:10 +02:00
2018-07-27 14:41:45 +02:00
VERSION: 1.0.0
2019-09-09 13:11:32 +02:00
GIT TAG: v1.0.0
2018-07-27 14:41:45 +02:00
BUILD DATE: 2018-04-27T12:41:38Z
2018-03-13 00:57:10 +02:00
```
2018-07-27 14:41:45 +02:00
Note that all released archives are also uploaded to GitHub.
2018-10-05 11:57:14 +02:00
### Docker image
2018-03-13 00:57:10 +02:00
2018-08-15 09:58:26 +02:00
You can build the docker image as follows:
2018-03-13 00:57:10 +02:00
2018-10-05 11:57:14 +02:00
```bash
2018-07-27 14:41:45 +02:00
make image
2018-03-13 00:57:10 +02:00
```
2019-04-25 12:48:40 +02:00
You can run the `gosec` tool in a container against your local Go project. You just have to mount the project
2019-10-31 12:56:17 +02:00
into a volume as follows:
2018-03-13 00:57:10 +02:00
2018-10-05 11:57:14 +02:00
```bash
2019-04-25 12:48:40 +02:00
docker run -it -v < YOUR PROJECT PATH > /< PROJECT > :/< PROJECT > securego/gosec /< PROJECT > /...
2018-03-13 00:57:10 +02:00
```
2018-10-05 11:57:14 +02:00
### Generate TLS rule
2018-02-21 07:59:18 +02:00
The configuration of TLS rule can be generated from [Mozilla's TLS ciphers recommendation ](https://statics.tls.security.mozilla.org/server-side-tls-conf.json ).
First you need to install the generator tool:
2018-10-05 11:57:14 +02:00
```bash
2018-07-19 18:46:26 +02:00
go get github.com/securego/gosec/cmd/tlsconfig/...
2018-02-21 07:59:18 +02:00
```
You can invoke now the `go generate` in the root of the project:
2018-10-05 11:57:14 +02:00
```bash
2018-02-21 07:59:18 +02:00
go generate ./...
```
2019-10-31 12:56:17 +02:00
This will generate the `rules/tls_config.go` file which will contain the current ciphers recommendation from Mozilla.