步步为营,如何将GOlang引用库的安全漏洞修干净

文章目录

  • 场景构建
  • 第一步、直接引用的第三方库升级修复策略
      • 1.确认是否为直接引用的第三方库
      • 2.找到需要升级的版本是否为release版本
  • 第二步、间接引用的第三方库升级修复策略
      • 那么问题来了,我们这么间接引用库的对应的直接引用库是哪个呢?
    • (一)没有release版本,但直接引用库有最新的代码可升级
      • (1)将最新代码下载到项目某个子目录下
      • (2)然后修改go.mod文件,将自动引用替换为指定引用:
      • (3)执行`go mod tidy` 和`go mod vender`
      • (4)执行`go build`
    • (二)没有release版本,且直接引用库有没有最新的代码可升级
      • (1)将最新代码下载到项目某个子目录下
      • (2)手动升级swagger代码中Gin库的引用版本
      • (3)然后修改go.mod文件,将自动引用替换为指定引用:
      • (4)执行`go mod tidy` 和`go mod vender`
      • (5)执行`go build`

近期,笔者接到一个任务,因为代码安全原因,需要批量升级一系列的Golang第三方组件,这里面包含了直接引用的第三方库和间接引用的第三方库,其中第三方库也包括能够直接升级和不能直接升级两种,这里把相关解决方案沉淀在此,供大家参考

首先,随着Golang语言的火热,不论是官方还是开发者都越来越重视其中的安全问题,Golang安全团队在2023年也发布了govulncheck的1.0.0版本,而在业界,也有一些比较好的扫描工具可以用比如trivy。

不论是哪一种静态扫描或镜像扫描工具,都会给出一系列的官方引用库的修复指引,这时候,很多开发者发现,事情其实没有者这么简单,直接引用的还好,根据修复指引和漏洞信息找到对应的版本就好,间接引用的版本,由于涉及到第三方库自身的升级,这里需要操作的步骤比较多,而且有的第三方库可能没有最新的release版本,这个是否如何进行安全的升级变成了一个问题,这里就把几种升级方式进行分享。

场景构建

首先,在岁月静好的一天,作为研发的你,发现了一个了不起的漏洞扫描软件trivy,经过研发,你发现它可以直接扫描仓库代码进行漏洞扫描,尝试扫描项目后,结果如下:
在这里插入图片描述

啊,原来代码中引用的Gin版本太低了,存在漏洞,需要升级,怎么操作呢?

第一步、直接引用的第三方库升级修复策略

1.确认是否为直接引用的第三方库

你从修复指引中了解到,需要将Gin从1.8.1升级到1.9.0版本,那么,你很自然的在Golang项目中查找go.mod文件,看看直接引用库Gin的版本:

在这里插入图片描述

发现确实是1.8.1,说明项目确实直接引用Gin库需要升级,那怎么找到可以升级的版本呢?

当然,在这个示例中,trivy漏洞指引中已经告诉你需要升级1.9.0release版本,所以可以直接跳过第二步,笔者这里主要针对没有直接列出可修复release版本的情况

2.找到需要升级的版本是否为release版本

一种方法是去库对应的官网,比如在Gin的官网得知1.9.0是一个release版本

在这里插入图片描述

还有一种方法比较快捷的方式:

在go.mod同级目录下,执行:

go list -m -mod=mod -u all

这个命令会列出所有直接引用库以及它们的版本,并且会标出哪些包需要升级。

在这里插入图片描述

上图中括号里面显示的是,可以升级的最新release版本### 3.进行升级

使用以下命令来升级:

go get -u <package-name>

示例如下:
在这里插入图片描述

这样就可以将直接引用的有release版本的第三方库进行升级

至此,我们通过对直接引用的GIn库进行升级.修复了安全漏洞

然后当你再用trivy工具进行扫描时,发现问题并没有解决:

在这里插入图片描述

这里我们以trivy工具扫描的结果为示例

Gin的1.8.1的问题还在

在这里插入图片描述

这时,你决定对整个项目进行搜索,发现在go.sum文件中存在对Gin的1.8.1版本的引用

在这里插入图片描述

你发现,事情没有这个简单了

在这里插入图片描述

第二步、间接引用的第三方库升级修复策略

再回到这个扫描结果

在这里插入图片描述

这里我们以trivy工具扫描的结果为示例

再次查看go.sum文件,
在这里插入图片描述

你观察到,有的引用库是一个SHA信息,有的引用库有两个SHA信息

比如上图的1.8.1只有一个哈希值,而1.9.1有两个哈希值,这是为什么?

原来,go.sum的存在的意义在于:希望别人或者在别的环境中构建当前项目时所使用引用库跟 go.sum 中记录的是完全一致的,从而达到一致构建的目的。

如果在go.mod记录了一个引用库,则在go.sum 文件中则会记录引用库的哈希值(同时还有引用库中 go.mod 的哈希值)

反过来,如果只有一个哈希值,说明这个引用库是个间接引用库

参考资料:https://my.oschina.net/renhc/blog/3171035

那么问题来了,我们这么间接引用库的对应的直接引用库是哪个呢?

答案是:go mod graph

这个命令会列出所有直接和间接依赖项之间的依赖关系。你可以在这个列表中查找你要升级的包,并找到直接或间接依赖它的包。然后,你可以查看这些包的版本,看看它们是否需要升级。

在这里插入图片描述

例如上图,可以看到,X/text是gin1.9.1版本的引用库

而下图则显示,cors库引用了gin的1.8.1:

在这里插入图片描述

当然,这里的引用关系比较多,看控制台数据会比较不直观,特别是层层引用的情况。这里推荐一个可视化的工具gmchart

安装方式

go get -u github.com/PaulXu-cn/go-mod-graph-chart/gmchart

使用方式

go mod graph | gmchart

在这里插入图片描述

它会生成一个html的引用依赖图:

在这里插入图片描述

在这里插入图片描述

这样就可以看层层的引用关系了

通过上面两个图,发现原来有来两个库的gin版本是1.8.1,一个是gin-contrib/cors,另一个是swaggo/gin-swagger

下面我们来看看,怎么升级这两个引用库

(一)没有release版本,但直接引用库有最新的代码可升级

首先看cors库, 通过go list -m -mod=mod -u all命令,发现cors并没有可升级的release版本

在这里插入图片描述

去git上找下最近release版本是不是没有收录

在这里插入图片描述

果然已经是最新的release

在这里插入图片描述

不慌,这个时候,还有机会,可以去源代码处找下最新代码:

在这里插入图片描述

恩,最新代码改了,只不过没有发布release版本,这个时候,可以把源代码下载下来,直接引用

(1)将最新代码下载到项目某个子目录下

在这里插入图片描述

(2)然后修改go.mod文件,将自动引用替换为指定引用:

在这里插入图片描述

(3)执行go mod tidygo mod vender

其中,go mod tidy的作用是自检一下修改go.mod文件是否正确;

go mod vendor则基于go.mod文件生成vendor, 即下载对应的内容

执行完后,查看vendor文件夹下的modules.txt文件,看下修改是否生效
在这里插入图片描述

上图则表示,生效了!

(4)执行go build

在这里插入图片描述

看下是否编译通过即可!

cors引用库的问题解决了

(二)没有release版本,且直接引用库有没有最新的代码可升级

那么开始解决swagger引用库的问题

通过go list -m -mod=mod -u all命令,发现没有可以升级的包了

去git上找下最近release版本和最新的master代码

在这里插入图片描述

swagger最新的代码,也只是将gin升级到了1.9.0

不是漏洞扫描要求的1.9.1

在这里插入图片描述

这…就得动源码了。。。

(1)将最新代码下载到项目某个子目录下

在这里插入图片描述

(2)手动升级swagger代码中Gin库的引用版本

在这里插入图片描述
在这里插入图片描述

(3)然后修改go.mod文件,将自动引用替换为指定引用:

在这里插入图片描述

(4)执行go mod tidygo mod vender

其中,go mod tidy的作用是自检一下修改go.mod文件是否正确;

go mod vendor则基于go.mod文件生成vendor, 即下载对应的内容

执行完后,查看vendor文件夹下的modules.txt文件,看下修改是否生效

在这里插入图片描述

上图则表示,生效了!

(5)执行go build

在这里插入图片描述

看下是否编译通过即可!

swagger引用库的问题解决了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue构建SPA项目实现路由

目录 前言 一、Vue CLI简介 1.什么是Vue CLI 2.Vue CLI的特点 二、SPA项目搭建 1.安装Vue CLI 2.使用脚手架vue-cli来构建项目 ​编辑 3.项目结构说明 4.什么是*.vue文件 三、基于SPA完成路由并嵌套路由 1.基于SPA完成路由 1. 1在src下的components 创建自定义组件…

vue项目升级webpack

vue项目升级webpack 目录 1. vue项目中影响webpack版本的是什么 2.理解package.json中库前缀^和~区别 3.升级webpack4到5操作 1. vue项目中影响webpack版本的是什么 答案是&#xff1a;vue/cli-service版本 2.理解package.json中库前缀^和~区别 x.y.z x代表大版本&#xf…

Spark-3.2.4 高可用集群安装部署详细图文教程

目录 一、Spark 环境搭建-Local 1.1 服务器环境 1.2 基本原理 1.2.1 Local 下的角色分布 1.3 搭建 1.3.1 安装 Anaconda 1.3.1.1 添加国内阿里源 1.3.2 创建 pyspark 环境 1.3.3 安装 spark 1.3.4 添加环境变量 1.3.5 启动 spark 1.3.5.1 bin/pyspark 1.…

化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设

化工DCS/SIS/MIS系统时钟同步&#xff08;NTP服务器&#xff09;建设 化工DCS/SIS/MIS系统时钟同步&#xff08;NTP服务器&#xff09;建设 目前计算机网络中各主机和服务器等网络设备的时间基本处于无序的状态。 随着计算机网络应用的不断涌现&#xff0c;计算机的时间同步问…

vue2中年份季度选择器(需要安装element)

调用 <!--父组件调用--><QuarterCom v-model"quart" clearable default-current/> 组件代码 <template><div><span style"margin-right: 10px">{{ label }}</span><markstyle"position:fixed;top:0;bottom:0…

EPLAN_001#常用功能(一)

一、栅格设置、背景颜色设置 二、插入设备图标&#xff08;快捷键 Insert&#xff09; 按TAB旋转方向 三、 通过左CTRLENTER输入 四、移动属性文本、复制格式 CTRLB 可以移动设备图形中的相关文本&#xff08;或者右键—文本—移动属性文本&#xff09; 很对多个文本的&#xf…

干货 | 汽车行业研发效能提升的挑战与实践案例

在 9 月 15 日的第七届 CSN 大会上&#xff0c;思码逸研发效能专家王艳萍受邀分享了《汽车行业研发效能提升的挑战与实践案例》。演讲包含了思码逸对多家汽车企业服务过程中总结出的行业痛点、解决方案&#xff0c;以及实践案例。 以下为演讲实录&#xff1a; 思码逸与很多知名…

spring的ThreadPoolTaskExecutor装饰器传递调用线程信息给线程池中的线程

概述 需求是想在线程池执行任务的时候&#xff0c;在开始前将调用线程的信息传到子线程中&#xff0c;在子线程完成后&#xff0c;再清除传入的数据。 下面使用了spring的ThreadPoolTaskExecutor来实现这个需求. ThreadPoolTaskExecutor 在jdk中使用的是ThreadPoolExecutor…

[RK3588-Android12] 双HDMI+喇叭Speak同音问题

问题描述 因为上层的音频策略&#xff0c;导致双路HDMI和喇叭&#xff0c;声音会被切换为单路出声音&#xff0c;以下修改将RK3588-Android12 双路HDMI和喇叭播放声音同时出声音。 解决方案&#xff1a; 1.frameworks\base\services\core\java\com\android\server\WiredAccesso…

API接口:概述、设计、应用与未来趋势

一、API接口概述 API&#xff0c;全称应用程序接口&#xff0c;是一种软件程序之间的通信方法。API接口在互联网开发中扮演着重要角色&#xff0c;允许不同的应用程序相互交流和共享数据。API定义了一套标准的通信协议&#xff0c;使得开发人员能够使用特定的函数、方法或协议…

快速排序模拟实现

快速排序&#xff0c;时间复杂度为O&#xff08;NlogN&#xff09;&#xff0c;属于排序中相对快的那一列&#xff0c;以下是快排的模拟实现&#xff1a; 法一&#xff1a;左右指针交换法 void swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; }//交换函数int getmid(int…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

【GO】网络请求例子

post请求;multipart/form-data类型 // 构建请求参数requestData : map[string]interface{}{"gb": "","code": "","reMemberInfo": map[string]interface{}{"shi": "","…

【开发工具】idea 的全局搜索快捷键(Ctrl+shift+F)失效

文章目录 前言1. 取消 输入法的快捷键&#xff08;推荐使用&#xff09;2.更改 idea的快捷键3. 热键占用总结 前言 当你发现在idea 中看到用于全局搜索的快捷键就是 CtrlshiftF&#xff0c;可是怎么按都不管用的时候&#xff0c;你就不要再执着于自己的操作继续狂点电脑按键了…

Lnmp架构之mysql数据库实战1

1、mysql数据库编译 编译成功 2、mysql数据库初始化 配置数据目录 全局文件修改内容 生成初始化密码并进行初始化设定 3、mysql主从复制 什么是mysql的主从复制&#xff1f; MySQL的主从复制是一种常见的数据库复制技术&#xff0c;用于将一个数据库服务器&#xff08;称为主…

python3读写dbf文件

目录 1 读dbf文件2 写dbf文件 1 读dbf文件 import dbf# 打开dbf文件 table dbf.Table(阿坝藏族羌族自治州_BXF_CHA.dbf)# 打开文件并进行读写操作 table.open(modedbf.READ_WRITE)# 遍历记录并更新字段值 res [] with table:for record in table:res.append(list(record))# …

解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose

参考&#xff1a;Docker官网-Install Docker Engine on Ubuntu 虚拟机里安装ubuntu-23.04-beta-desktop-amd64&#xff0c;开启SSH(换源、备份)&#xff0c;配置中文以及中文输入法等 基于CentOS7安装配置docker与docker-compose 一、 Install using the Apt repository 1.…

线性代数的本质(七)——特征值和特征向量

特征值和特征向量 本章特征值和特征向量的概念只在方阵的范畴内探讨。 相似矩阵 Grant&#xff1a;线性变换对应的矩阵依赖于所选择的基。 一般情况下&#xff0c;同一个线性变换在不同基下的矩阵不同。仍然以平面线性变换为例&#xff0c;Grant 选用标准坐标系下的基向量 i…

conda环境下XZ_5.1.2alpha not found解决方案

1 问题描述 yum install cmake 使用yum安装cmake失败&#xff0c;失败信息如下&#xff1a; [rootlocalhost]# yum install cmake There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/root/anaconda3/li…

blog--4美化主题

配置/美化 bug 把你的网站名/themes/hugo-theme-stack/exampleSite/目录下的config.yaml复制到网站根目录(也就是你的网站名这个目录)删除网站根目录的config.toml stack主题不需要这个配置文件打开网站根目录下的config.yaml进行填空博主头像放在/themes/hugo-theme-stack/a…