39

Gosec:Go语言源码安全分析工具

 5 years ago
source link: http://www.freebuf.com/sectool/179549.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

gosec是一个Go语言源码安全分析工具,其通过扫描Go AST(抽象语法树)来检查源代码是否存在安全问题。

许可证

根据Apache 2.0版本的License;除非符合许可,否则你将不能使用该文件。你可以 在这里 获取到一个许可证的副本。

安装

$ go get github.com/securego/gosec/cmd/gosec/...

使用

我们可以将Gosec配置为仅运行某个规则子集,如排除某些文件路径,生成不同格式的报告等。在默认情况下,Gosec将对提供的输入文件运行所有规则。要从当前目录递归扫描,你可以提供’./…’ 作为输入参数。

选择规则

默认情况下,gosec将针对提供的文件路径运行所有规则。但如果你要指定运行某个规则,则可以使用 ‘-include=’ 参数,或者你也可以使用 ‘-exclude=’来排除那些你不想运行的规则。

可用规则

G101:查找硬编码凭证
G102:绑定到所有接口
G103:审计不安全区块的使用
G104:审计错误未检查
G105:审计math/big.Int.Exp的使用
G106:审计ssh.InsecureIgnoreHostKey的使用
G201:SQL查询构造使用格式字符串
G202:SQL查询构造使用字符串连接
G203:在HTML模板中使用未转义的数据
G204:审计命令执行情况
G301:创建目录时文件权限分配不合理
G302:chmod文件权限分配不合理
G303:使用可预测的路径创建临时文件
G304:作为污点输入提供的文件路径
G305:提取zip存档时遍历文件
G401:检测DES,RC4或MD5的使用情况
G402:查找错误的TLS连接设置
G403:确保最小RSA密钥长度为2048位
G404:不安全的随机数源(rand)
G501:导入黑名单列表:crypto/md5
G502:导入黑名单列表:crypto/des
G503:导入黑名单列表:crypto/rc4
G504:导入黑名单列表:net/http/cgi
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...

# Run everything except for rule G303
$ gosec -exclude=G303 ./...

注释代码

与所有自动检测工具一样,gosec也会出现误报的情况。如果gosec报告已手动验证为安全的,则可以使用“#nosec”来注释代码。

注释将导致gosec停止处理AST中的任何其他节点,因此可以应用于整个块或应用于单个表达式中。

import "md5" // #nosec


func main(){

    /* #nosec */
    if x > y {
        h := md5.New() // this will also be ignored
    }

}

在某些情况下,你可能还需要重新访问已使用#nosec注释的位置。那么你可以执行以下命令来运行扫描程序以及忽略#nosec注释:

$ gosec -nosec=true ./...

build标签

gosec能够将Go构建标签传递给分析器。它们可以以逗号分隔的列表提供,如下所示:

$ gosec -tag debug,ignore ./...

输出格式

gosec目前支持text,json,yaml,csv和JUnit XML的输出格式。默认情况下,结果将以stdout(标准输出)。但我们也可以使用 ‘-fmt’参数指定输出格式,以及’-out’来指定输出文件。

# Write output in json format to results.json
$ gosec -fmt=json -out=results.json *.go

开发

按照此处的说明安装dep: https://github.com/golang/dep 

安装最新版本的golint: https://github.com/golang/lint

Build

make

Tests

make test

发布版本

确保你已安装了 goreleaser ,然后你可以按以下方式发布gosec:git tag 1.0.0 export GITHUB_TOKEN= make release

dist文件夹中提供了该工具的已发布版本。build信息应该会被展示在usage文本中。

./dist/darwin_amd64/gosec -h
gosec  - Golang security checker

gosec analyzes Go source code to look for common programming mistakes that
can lead to security problems.

VERSION: 1.0.0
GIT TAG: 1.0.0
BUILD DATE: 2018-04-27T12:41:38Z

注意,所有已发布的存档也会被同步到GitHub上。

Docker image

你可以执行一个发布版本并build docker镜像:

git tag <VERSION>
export GITHUB_TOKEN=<Your GitHub token>
make image

在容器中运行gosec:

docker run -it -v <YOUR LOCAL WORKSPACE>:/workspace gosec /workspace

生成TLS规则

可以从Mozilla的 TLS ciphers 建议生成TLS规则配置。

首先,你需要安装generator工具:

go get github.com/securego/gosec/cmd/tlsconfig/...

现在你可以在项目的根目录中调用go generate:

go generate ./...

这将生成一个rules/tls_config.go文件,其中包含来自Mozilla的当前ciphers建议。

  *参考来源: github FB小编 secist 编译,转载请注明来自FreeBuf.COM


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK