Go安全扫描工具

Gosec是一个通过扫描Go AST来检查源代码是否存在安全问题的开源项目


gosec分析Go源代码,查找可能导致安全问题的常见编程错误。

版本: 2.19.0
GIT标记: v2.19.0
构建日期: 2024-02-12T09:15:52Z

用法:

# 检查单个包
$ gosec $GOPATH/src/github.com/example/project

# 检查当前目录下的所有包,并将结果保存为json格式
$ gosec -fmt=json -out=results.json ./...

# 运行特定的规则集(默认情况下将运行所有规则):
$ gosec -include=G101,G203,G401  ./...

# 运行除提供的规则之外的所有规则
$ gosec -exclude=G101 $GOPATH/src/github.com/example/project/...

选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
-color
将带有颜色的文本格式报告打印到标准输出(默认为true)
-concurrency int
并发值 (默认为8)
-conf string
可选配置文件的路径
-confidence string
过滤掉置信度低于给定值的问题。有效选项是:低、中、高(默认"低")
-exclude value
要排除的规则ID列表,以逗号分隔。(参见规则列表)
-exclude-dir value
从扫描中排除文件夹(可多次指定)
-exclude-generated
排除生成的文件
-fmt string
设置输出格式。有效选项是:json、yaml、csv、junit-xml、html、sonarqube、golint、sarif或text(默认为"text")
-include string
要包含的规则ID列表,以逗号分隔。(参见规则列表)
-log string
将消息记录到文件而不是标准错误
-no-fail
即使发现问题也不会失败扫描
-nosec
设置时忽略#nosec注释
-nosec-tag string
设置#nosec的替代字符串。一些例子:#dontanalyze、#falsepositive
-out string
设置结果的输出文件
-quiet
只在发现错误时显示输出
-r 将"./..."附加到目标目录。
-severity string
过滤掉严重程度低于给定值的问题。有效选项是:低、中、高(默认"低")
-show-ignored
如果启用,则会打印被忽略的问题
-sort
按严重程度对问题进行排序(默认为true)
-stdout
将结果输出到标准输出,同时也将其写入输出文件
-tags string
以逗号分隔的构建标记列表
-terse
只显示结果和总结
-tests
扫描测试文件
-track-suppressions
输出抑制信息,包括其种类和理由
-verbose string
在将结果输出到标准输出时覆盖输出格式,同时将它们保存在输出文件中。
有效选项是:json、yaml、csv、junit-xml、html、sonarqube、golint、sarif或text
-version
打印版本信息并以退出代码0退出

规则:

G101: 查找硬编码的凭据
G102: 绑定到所有接口
G103: 审核不安全块的使用
G104: 审核未检查的错误
G106: 审核ssh.InsecureIgnoreHostKey函数的使用
G107: 将Url提供给HTTP请求作为有污染的输入
G108: 自动暴露分析端点
G109: 将strconv.Atoi结果转换为int32/int16
G110: 在解压缩时检测使用io.Copy而不是io.CopyN
G111: 将http.Dir('/')检测为潜在风险
G112: 检测未配置ReadHeaderTimeout作为潜在风险
G113: 在math/big中使用Rat.SetString时溢出
G114: 使用不支持设置超时的net/http serve函数
G201: 使用格式字符串构造SQL查询
G202: 使用字符串连接构造SQL查询
G203: 在HTML模板中使用未转义的数据
G204: 审核命令执行的使用
G301: 创建目录时使用了不当的文件权限
G302: 创建文件或使用chmod时使用了不当的文件权限
G303: 使用可预测的路径创建临时文件
G304: 文件路径被提供为受污染的输入
G305: 解压缩归档文件时出现文件路径遍历
G306: 写入文件时使用了不当的文件权限
G307: 使用os.Create创建文件时使用了不当的文件权限
G401: 检测DES、RC4、MD5或SHA1的使用
G402: 查找不当的TLS连接设置
G403: 确保最小RSA密钥长度为2048位
G404: 不安全的随机数源(rand)
G501: 导入黑名单:crypto/md5
G502: 导入黑名单:crypto/des
G503: 导入黑名单:crypto/rc4
G504: 导入黑名单:net/http/cgi
G505: 导入黑名单:crypto/sha1
G601: RangeStmt中隐式内存别名</document_content>

快速安装


在此下载最新的release,如gosec_2.8.1_darwin_amd64.tar.gz,解压后,将二进制文件移动到GOBIN目录下


使用


进入想要扫描的代码目录下, 执行 gosec -fmt=json ./...

该命令的意思是:检测当前目录下的所有的代码,并以Json的格式输出到终端。

出去json,支持的格式还有text, yaml, csv, sonarqube, JUnit XML, html


可使用gosec -fmt=json -out=自定义文件名.json ./...,将扫描结果输出到指定文件


可使用 gosec -include=G101,G203,G401 ./...指定使用某几个规则

可使用 gosec -exclude=G303 ./...排除了某几个规则


具体规则如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
◈ G101:查找硬编码凭证

◈ G102:绑定到所有接口

◈ G103:审计 unsafe 块的使用

◈ G104:审计未检查的错误

◈ G106:审计 ssh.InsecureIgnoreHostKey 的使用

◈ G107: 提供给 HTTP 请求的 url 作为污点输入

◈ G108: /debug/pprof 上自动暴露的剖析端点

◈ G109: strconv.Atoi 转换到 int16int32 时潜在的整数溢出

◈ G110: 潜在的通过解压炸弹实现的 DoS

◈ G201:SQL 查询构造使用格式字符串

◈ G202:SQL 查询构造使用字符串连接

◈ G203:在 HTML 模板中使用未转义的数据

◈ G204:审计命令执行情况

◈ G301:创建目录时文件权限分配不合理

◈ G302:使用 chmod 时文件权限分配不合理

◈ G303:使用可预测的路径创建临时文件

◈ G304:通过污点输入提供的文件路径

◈ G305:提取 zip/tar 文档时遍历文件

◈ G306: 写到新文件时文件权限分配不合理

◈ G307: 把返回错误的函数放到 defer

◈ G401:检测 DES、RC4、MD5 或 SHA1 的使用

◈ G402:查找错误的 TLS 连接设置

◈ G403:确保最小 RSA 密钥长度为 2048

◈ G404:不安全的随机数源(rand)

◈ G501:导入黑名单列表:crypto/md5

◈ G502:导入黑名单列表:crypto/des

◈ G503:导入黑名单列表:crypto/rc4

◈ G504:导入黑名单列表:net/http/cgi

◈ G505:导入黑名单列表:crypto/sha1

◈ G601: 在 range 语句中使用隐式的元素别名



参考:

免费开源的代码审计工具 Gosec 入门使用

使用 gosec 检查 Go 代码中的安全问题

golang的一些安全问题

文章目录