iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >如何使用gosec检查Go代码中的安全问题
  • 421
分享到

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

2023-06-17 04:06:27 421人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关如何使用Gosec检查Go代码中的安全问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go 语言 写的代码越来越常见,尤其是在容器、kubernetes 或云生态相关的

这期内容当中小编将会给大家带来有关如何使用Gosec检查Go代码中的安全问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Go 语言 写的代码越来越常见,尤其是在容器kubernetes 或云生态相关的开发中。Docker 是最早采用 golang项目之一,随后是  Kubernetes,之后大量的新项目在众多编程语言中选择了 Go。

像其他语言一样,Go 也有它的长处和短处(如安全缺陷)。这些缺陷可能会因为语言本身的缺陷加上程序员编码不当而产生,例如,C 代码中的内存安全问题。

无论它们出现的原因是什么,安全问题都应该在开发过程的早期修复,以免在封装好的软件中出现。幸运的是,静态分析工具可以帮你以更可重复的方式处理这些问题。静态分析工具通过解析用某种编程语言写的代码来找到问题。

这类工具中很多被称为 linter。传统意义上,linter  更注重的是检查代码中编码问题、bug、代码风格之类的问题,它们可能不会发现代码中的安全问题。例如, Coverity 是一个很流行的工具,它可以帮助寻找  C/C++ 代码中的问题。然而,也有一些工具专门用来检查源码中的安全问题。例如, Bandit 可以检查 python 代码中的安全缺陷。而 gosec  则用来搜寻 Go 源码中的安全缺陷。gosec 通过扫描 Go 的 AST( 抽象语法树(abstract syntax  tree))来检查源码中的安全问题。

开始使用 gosec

在开始学习和使用 gosec 之前,你需要准备一个 Go 语言写的项目。有这么多开源软件,我相信这不是问题。你可以在 GitHub 的 热门 Golang  仓库 中找一个。

本文中,我随机选了 Docker CE 项目,但你可以选择任意的 Go 项目。

安装 Go 和 gosec

如果你还没安装 Go,你可以先从仓库中拉取下来。如果你用的是 Fedora 或其他基于 RPM 的 linux 发行版本:

$ dnf install golang.x86_64

如果你用的是其他操作系统,请参照 Golang 安装 页面。

使用 version 参数来验证 Go 是否安装成功:

$ go version go version go1.14.6 linux/amd64

运行 go get 命令就可以轻松地安装 gosec:

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

上面这行命令会从 GitHub 下载 gosec 的源码,编译并安装到指定位置。在仓库的 README 中你还可以看到 安装该工具的其他方法 。

gosec 的源码会被下载到 $GOPATH 的位置,编译出的二进制文件会被安装到你系统上设置的 bin 目录下。你可以运行下面的命令来查看  $GOPATH 和 $GOBIN 目录:

$ go env | grep GOBIN GOBIN="/root/go/gobin" $ go env | grep GOPATH GOPATH="/root/go"

如果 go get 命令执行成功,那么 gosec 二进制应该就可以使用了:

$ ls -l ~/go/bin/ total 9260 -rwxr-xr-x. 1 root root 9482175 Aug 20 04:17 gosec

你可以把 $GOPATH 下的 bin 目录添加到 $PATH 中。这样你就可以像使用系统上的其他命令一样来使用 gosec  命令行工具(CLI)了。

$ which gosec /root/go/bin/gosec $

使用 gosec 命令行工具的 -help 选项来看看运行是否符合预期:

$ gosec -help gosec - Golang security checker gosec analyzes Go source code to look for common programming mistakes that can lead to security problems. VERSION: dev GIT TAG: BUILD DATE: USAGE:

之后,创建一个目录,把源码下载到这个目录作为实例项目(本例中,我用的是 Docker CE):

$ mkdir gosec-demo $ cd gosec-demo/ $ pwd /root/gosec-demo $ git clone https://github.com/docker/docker-ce.git Cloning into 'docker-ce'... remote: Enumerating objects: 1271, done. remote: Counting objects: 100% (1271/1271), done. remote: Compressing objects: 100% (722/722), done. remote: Total 431003 (delta 384), reused 981 (delta 318), pack-reused 429732 Receiving objects: 100% (431003/431003), 166.84 MiB | 28.94 MiB/s, done. Resolving deltas: 100% (221338/221338), done. Updating files: 100% (10861/10861), done.

代码统计工具(本例中用的是 cloc)显示这个项目大部分是用 Go 写的,恰好迎合了 gosec 的功能。

$ ./cloc /root/gosec-demo/docker-ce/    10771 text files.     8724 unique files.                                               2560 files ignored. ----------------------------------------------------------------------------------- Language                         files          blank        comment           code ----------------------------------------------------------------------------------- Go                                7222         190785         230478        1574580 YAML                                37           4831            817         156762 markdown                           529          21422              0          67893 Protocol Buffers                   149           5014          16562          10071

使用默认选项运行 gosec

在 Docker CE 项目中使用默认选项运行 gosec,执行 gosec ./... 命令。屏幕上会有很多输出内容。在末尾你会看到一个简短的  “Summary”,列出了浏览的文件数、所有文件的总行数,以及源码中发现的问题数。

$ pwd /root/gosec-demo/docker-ce $ time gosec ./... [gosec] 2020/08/20 04:44:15 Including rules: default [gosec] 2020/08/20 04:44:15 Excluding rules: default [gosec] 2020/08/20 04:44:15 Import directory: /root/gosec-demo/docker-ce/components/engine/opts [gosec] 2020/08/20 04:44:17 Checking package: opts [gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/address_pools.go [gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/env.go [gosec] 2020/08/20 04:44:17 Checking file: /root/gosec-demo/docker-ce/components/engine/opts/hosts.go # End of gosec run Summary:    Files: 1278    Lines: 173979    Nosec: 4   Issues: 644 real    0m52.019s user    0m37.284s sys     0m12.734s $

滚动屏幕你会看到不同颜色高亮的行:红色表示需要尽快查看的高优先级问题,黄色表示中优先级的问题。

关于误判

在开始检查代码之前,我想先分享几条基本原则。默认情况下,静态检查工具会基于一系列的规则对测试代码进行分析,并报告出它们发现的所有问题。这是否意味着工具报出来的每一个问题都需要修复?非也。这个问题最好的解答者是设计和开发这个软件的人。他们最熟悉代码,更重要的是,他们了解软件会在什么环境下部署以及会被怎样使用。

这个知识点对于判定工具标记出来的某段代码到底是不是安全缺陷至关重要。随着工作时间和经验的积累,你会慢慢学会怎样让静态分析工具忽略非安全缺陷,使报告内容的可执行性更高。因此,要判定  gosec 报出来的某个问题是否需要修复,让一名有经验的开发者对源码做人工审计会是比较好的办法。

高优先级问题

从输出内容看,gosec 发现了 Docker CE 的一个高优先级问题,它使用的是低版本的 TLS( 传输层安全(Transport Layer  Security)())。无论什么时候,使用软件和库的最新版本都是确保它更新及时、没有安全问题的最好的方法。

[/root/gosec-demo/docker-ce/components/engine/daemon/logger/splunk/splunk.go:173] - G402 (CWE-295): TLS MinVersion too low. (Confidence: HIGH, Severity: HIGH)     172:   > 173:        tlsConfig := &tls.Config{}     174:

它还发现了一个弱随机数生成器。它是不是一个安全缺陷,取决于生成的随机数的使用方式。

[/root/gosec-demo/docker-ce/components/engine/pkg/namesgenerator/names-generator.go:843] - G404 (CWE-338): Use of weak random number generator (math/rand instead of crypto/rand) (Confidence: MEDIUM, Severity: HIGH)     842: begin:   > 843:        name := fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])     844:        if name == "boring_wozniak"  {

中优先级问题

这个工具还发现了一些中优先级问题。它标记了一个通过与 tar 相关的解压炸弹这种方式实现的潜在的 DoS 威胁,这种方式可能会被恶意的攻击者利用。

[/root/gosec-demo/docker-ce/components/engine/pkg/arcHive/copy.go:357] - G110 (CWE-409): Potential DoS vulnerability via decompression bomb (Confidence: MEDIUM, Severity: MEDIUM)     356:   > 357:                        if _, err = io.Copy(rebasedTar, srcTar); err != nil {     358:                                w.CloseWithError(err)

它还发现了一个通过变量访问文件的问题。如果恶意使用者能访问这个变量,那么他们就可以改变变量的值去读其他文件。

[/root/gosec-demo/docker-ce/components/cli/cli/context/tlsdata.go:80] - G304 (CWE-22): Potential file inclusion via variable (Confidence: HIGH, Severity: MEDIUM)     79:         if caPath != "" {   > 80:                 if ca, err = ioutil.ReadFile(caPath); err != nil {     81:                         return nil, err

文件和目录通常是操作系统安全的最基础的元素。这里,gosec 报出了一个可能需要你检查目录的权限是否安全的问题。

[/root/gosec-demo/docker-ce/components/engine/contrib/apparmor/main.go:41] - G301 (CWE-276): Expect directory permissions to be 0750 or less (Confidence: HIGH, Severity: MEDIUM)     40:         // make sure /etc/apparmor.d exists   > 41:         if err := os.MkdirAll(path.Dir(apparmorProfilePath), 0755); err != nil {     42:                 log.Fatal(err)

你经常需要在源码中启动命令行工具。Go 使用内建的 exec 库来实现。仔细地分析用来调用这些工具的变量,就能发现安全缺陷。

[/root/gosec-demo/docker-ce/components/engine/testutil/fakestorage/fixtures.go:59] - G204 (CWE-78): Subprocess launched with variable (Confidence: HIGH, Severity: MEDIUM)     58:   > 59:              cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "Httpserver"), "github.com/docker/docker/contrib/httpserver")     60:                 cmd.Env = append(os.Environ(), []string{

低优先级问题

在这个输出中,gosec 报出了一个 unsafe 调用相关的低优先级问题,这个调用会绕开 Go 提供的内存保护。再仔细分析下你调用 unsafe  的方式,看看是否有被别人利用的可能性。

[/root/gosec-demo/docker-ce/components/engine/pkg/archive/changes_linux.go:264] - G103 (CWE-242): Use of unsafe calls should be audited (Confidence: HIGH, Severity: LOW)     263:        for len(buf) > 0 {   > 264:                dirent := (*unix.Dirent)(unsafe.Pointer(&buf[0]))     265:                bufbuf = buf[dirent.Reclen:] [/root/gosec-demo/docker-ce/components/engine/pkg/devicemapper/devmapper_wrapper.go:88] - G103 (CWE-242): Use of unsafe calls should be audited (Confidence: HIGH, Severity: LOW)     87: func free(p *C.char) {   > 88:         C.free(unsafe.Pointer(p))     89: }

它还标记了源码中未处理的错误。源码中出现的错误你都应该处理。

[/root/gosec-demo/docker-ce/components/cli/cli/command/image/build/context.go:172] - G104 (CWE-703): Errors unhandled. (Confidence: HIGH, Severity: LOW)     171:                err := tar.Close()   > 172:                os.RemoveAll(dockerfileDir)     173:                return err

自定义 gosec 扫描

使用 gosec 的默认选项会带来很多的问题。然而,经过人工审计,随着时间推移你会掌握哪些问题是不需要标记的。你可以自己指定排除和包含哪些测试。

我上面提到过,gosec 是基于一系列的规则从 Go 源码中查找问题的。下面是它使用的完整的 规则 列表:

  • G101:查找硬编码凭证

  • G102:绑定到所有接口

  • G103:审计 unsafe 块的使用

  • G104:审计未检查的错误

  • G106:审计 ssh.InsecureIgnoreHosTKEy 的使用

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

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

  • G109: strconv.Atoi 转换到 int16 或 int32 时潜在的整数溢出

  • 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 来避免对已知为安全的问题进行扫描和报告。你可以使用 -exclude 选项和上面的规则编号来忽略指定的问题。

例如,如果你不想让 gosec 检查源码中硬编码凭证相关的未处理的错误,那么你可以运行下面的命令来忽略这些错误:

$ gosec -exclude=G104 ./... $ gosec -exclude=G104,G101 ./...

有时候你知道某段代码是安全的,但是 gosec 还是会报出问题。然而,你又不想完全排除掉整个检查,因为你想让 gosec  检查新增的代码。通过在你已知为安全的代码块添加 #nosec 标记可以避免 gosec 扫描。这样 gosec 会继续扫描新增代码,而忽略掉 #nosec  标记的代码块。

运行指定的检查

另一方面,如果你只想检查指定的问题,你可以通过 -include 选项和规则编号来告诉 gosec 运行哪些检查:

$ gosec -include=G201,G202 ./...

扫描测试文件

Go 语言自带对测试的支持,通过单元测试来检验一个元素是否符合预期。在默认模式下,gosec 会忽略测试文件,你可以使用 -tests  选项把它们包含进来:

gosec -tests ./...

修改输出的格式

找出问题只是它的一半功能;另一半功能是把它检查到的问题以用户友好同时又方便工具处理的方式报告出来。幸运的是,gosec  可以用不同的方式输出。例如,如果你想看 JSON 格式的报告,那么就使用 -fmt 选项指定 jsON 格式并把结果保存到 results.json  文件中:

$ gosec -fmt=json -out=results.json ./... $ ls -l results.json -rw-r--r--. 1 root root 748098 Aug 20 05:06 results.json $          {              "severity": "LOW",              "confidence": "HIGH",              "cwe": {                  "ID": "242",                  "URL": "https://cwe.mitre.org/data/definitions/242.html"              },              "rule_id": "G103",              "details": "Use of unsafe calls should be audited",              "file": "/root/gosec-demo/docker-ce/components/engine/daemon/graphdriver/graphtest/graphtest_unix.go",              "code": "304: \t// Cast to []byte\n305: \theader := *(*reflect.SliceHeader)(unsafe.Pointer(\u0026buf))\n306: \theader.      Len *= 8\n",              "line": "305",              "column": "36"          },

用 gosec 检查容易被发现的问题

静态检查工具不能完全代替人工代码审计。然而,当代码量变大、有众多开发者时,这样的工具往往有助于以可重复的方式找出容易被发现的问题。它对于帮助新开发者识别和在编码时避免引入这些安全缺陷很有用。

上述就是小编为大家分享的如何使用gosec检查Go代码中的安全问题了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何使用gosec检查Go代码中的安全问题

本文链接: https://www.lsjlt.com/news/287046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用gosec检查Go代码中的安全问题
    这期内容当中小编将会给大家带来有关如何使用gosec检查Go代码中的安全问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Go 语言 写的代码越来越常见,尤其是在容器、Kubernetes 或云生态相关的...
    99+
    2023-06-17
  • Go代码检查的推荐工具及使用详解
    目录1. Golint2. Golangci-lint3. Go-reporter1. Golint (1)安装golint git clone htt...
    99+
    2024-04-02
  • PHP 代码安全:面向对象编程中的安全问题
    通过使用面向对象编程 (oop) 可提升 php 代码安全性,可采取以下措施预防常见安全问题:防止注入攻击:使用参数化查询或预处理语句,验证输入,转义恶意字符。规避跨站点脚本 (xss)...
    99+
    2024-05-11
    php oop 敏感数据 用户注册 lsp
  • IDEA中的代码检查工具怎么使用
    使用 IDEA 中的代码检查工具可以帮助开发者找出代码中的潜在问题和优化代码质量。以下是在 IDEA 中使用代码检查工具的步骤: ...
    99+
    2024-04-03
    IDEA
  • 如何使用安装日志排查Office中的安装问题
    要使用安装日志排查Office中的安装问题,您可以按照以下步骤操作:1. 打开“控制面板”并选择“程序”(或“程序和功能”)。2. ...
    99+
    2023-09-08
    Office
  • 如何使用MySQL MHA源代码进行监控检查
    本篇文章给大家分享的是有关如何使用MySQL MHA源代码进行监控检查,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看...
    99+
    2024-04-02
  • 在Go语言中如何处理并发安全性问题?
    在Go语言中如何处理并发安全性问题?Go语言是一门专门用于处理并发编程的语言,因此在处理并发安全性问题上具有很强的优势。在多个goroutine同时访问和修改共享数据的情况下,如果不采取适当的措施来保证并发安全性,就会导致意想不到的错误和数...
    99+
    2023-10-22
    互斥锁(Mutex) 通道(Channel) 读写锁(ReadWrite Mutex)
  • 现代 Web 应用中的 JavaScript 前端安全问题
    如今,JavaScript 已成为现代 Web 应用开发的基石,它不仅可以实现复杂的交互效果,还可以处理数据并存储用户输入。然而,JavaScript 也存在一些安全问题,这些问题可能导致用户数据泄露、网站被篡改等严重后果。 1. 跨站脚...
    99+
    2024-02-04
    JavaScript 前端安全 XSS 注入攻击 CSRF
  • 如何解决编写代码时出现的Go问题
    这篇文章主要介绍“如何解决编写代码时出现的Go问题”,在日常操作中,相信很多人在如何解决编写代码时出现的Go问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何解决编写代码时出现的Go问题”的疑惑有所帮助!...
    99+
    2023-06-15
  • Ubuntu中如何检查系统的安全漏洞并修补
    Ubuntu系统可以使用以下命令来检查系统的安全漏洞并修补: 更新软件包列表: sudo apt update 检查系统中需...
    99+
    2024-04-02
  • 如何安全的使用https代理
    如何安全的使用https代理?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。就网络协议而言,代理ip也根据网络协议的不同划分出不同的类型供大家选择。HTTP是因特网上使用最广泛的...
    99+
    2023-06-15
  • Go语言中如何处理并发文件的文件系统文件检索和全文检索问题?
    Go语言是一种颇受欢迎的高性能编程语言,它通过并发处理在文件系统中进行文件检索和全文检索是其中的一项重要任务。在本文中,我们将讨论如何使用Go语言来解决这个问题,并提供具体的代码示例。在Go语言中,处理文件系统的文件检索和全文检索可以使用标...
    99+
    2023-10-22
    并发 全文检索 文件系统
  • HTML代码中如何使用全局变量
    这篇文章主要介绍“HTML代码中如何使用全局变量”,在日常操作中,相信很多人在HTML代码中如何使用全局变量问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML代码中如何使...
    99+
    2024-04-02
  • IDEA 使用 SpotBugs 找出你代码中的bug问题
    SpotBugs 是 Findbugs 的继任者,通过静态分析来查找 Java 代码中的 bug。 下面我们主要是介绍 SpotBugs 在 idea 中的安装和使用 安装...
    99+
    2024-04-02
  • 如何使用 Git 管理 UNIX 系统中的 GO 代码?
    Git 是一种版本控制工具,它可以帮助我们管理代码,协作开发和维护代码库。GO 是一种流行的编程语言,常用于开发 UNIX 系统中的应用程序。在本文中,我们将介绍如何使用 Git 管理 UNIX 系统中的 GO 代码。 安装 Git 首...
    99+
    2023-10-03
    unix 学习笔记 git
  • 如何在Python中处理网络安全的问题
    如何在Python中处理网络安全的问题随着互联网的普及和发展,网络安全问题日益突出。对于程序员而言,在开发过程中要时刻关注网络安全,防止黑客攻击和数据泄露。Python作为一种高级编程语言,具有强大的网络编程功能,提供了丰富的库和模块来处理...
    99+
    2023-10-22
    网络安全 Python 处理
  • 如何在 ASP 开发技术中使用 javascript 编写更安全的代码?
    ASP是一种常用的Web应用程序开发技术,而JavaScript是一种常用的客户端脚本语言。在ASP开发过程中,使用JavaScript编写代码是非常常见的,但如何编写更安全的JavaScript代码呢?在本文中,我们将探讨如何在ASP开发...
    99+
    2023-10-08
    开发技术 编程算法 javascript
  • 如何在Python中使用多继承解决复杂的代码重用问题
    如何在Python中使用多继承解决复杂的代码重用问题引言:在编写复杂的代码时,代码重用性是一个非常重要的因素。Python中的多继承是一种强大的工具,它允许一个类从多个父类继承属性和方法。在本文中,我们将介绍如何在Python中使用多继承来...
    99+
    2023-10-22
    Python 代码重用 多继承
  • 如何使用W3C CSS Validation Service检查你的代码是否符合CSS标准
    这篇文章将为大家详细讲解有关如何使用W3C CSS Validation Service检查你的代码是否符合CSS标准,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 这...
    99+
    2024-04-02
  • 怎么使用命令行工具Graudit来查找代码中的安全漏洞
    这篇文章主要介绍“怎么使用命令行工具Graudit来查找代码中的安全漏洞”,在日常操作中,相信很多人在怎么使用命令行工具Graudit来查找代码中的安全漏洞问题上存在疑惑,小编查阅了各式资料,整理出简单好用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作