步步为营,如何将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.rhkb.cn/news/138463.html

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

相关文章

Hadoop NameNode执行命令工作流程

Hadoop NameNode执行命令工作流程 客户端API或者CLI与NameNode的交互命令数据的格式(1) 预处理流程(2) 创建NameNode与NameNodePrcServer流程(3) HDFS API以及CLI的命令到NameNode的工作执行流程(4) 执行命令的参数流动 客户端API或者CLI与NameNode的交互命令数据的格式 hadoop…

Apache 原生 Hadoop 运维命令

Hadoop 1、检查原生hadoop和压缩库是否可用 hadoop checknative2、打印hadoop环境的配置路径 hadoop classpathHDFS 1、查看hdfs文件系统的状态 hdfs dfsadmin -report2、获取安全模式的状态 hdfs dfsadmin -safemode get安全模式下只可进行读操作 3、文件系统健康检查 …

LeetCode_拓扑排序_困难_2603.收集树中金币

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个 n 个节点的无向无根树&#xff0c;节点编号从 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。再给…

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区&#xff0c;您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…

《向量数据库指南》——文心大模型+Milvus向量数据库搭建AI原生应用

亲爱的科技探险家们和代码魔法师们: 未来的钟声已经敲响,预示着一场极度炫酷的虚拟现实游戏即将展开。从初期简单的智能识别,到设计师级别的图纸设计,生成式AI技术(Generative AI)以其独特理念和创新模式重塑了传统内容生产效率和交互模式,在无数领域展现着非凡的才华。…

清易低功耗智能雨量监测站概述

一、低功耗智能雨量监测站概述产品概述 低功耗智能雨量监测站基于智能传感、无线通信、智能处理与智能控制等物联网技术的开发&#xff0c;利用智能传感技术&#xff0c;通过传感器测量降雨量&#xff0c;并使用物联网进行传输。无需专门的通信线路&#xff0c;在联网的状态下…

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server 高级:固定android设备IP准备检查模块是否生效 windows 访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位…

zabbix网络管理安装教程

安装&#xff1a; apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent 参考资源&#xff1a; 官网&#xff1a; 下载&#xff1a; 其它&#xff1a; 常用指令&#xff1a; 目标与应用价值&#xff1a; 部署难点&#…

【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码

冒泡排序原理 每次比较两个相邻的元素&#xff0c;将较大的元素交换至右端 冒泡排序执行过程输出效果 冒泡排序实现思路 每次冒泡排序操作都会将相邻的两个元素进行比较&#xff0c;看是否满足大小关系要求&#xff0c;如果不满足&#xff0c;就交换这两个相邻元素的次序&…

在已知的二维坐标里找到最接近的点

一、业务场景 最近在研发的项目&#xff0c;在做可视化层&#xff0c;在全球地图上&#xff0c;对我们的国家的陆地地图经纬度按照步长为1的间隔做了二维处理。在得到一组整数的点位信息后&#xff0c;需要将我们已有的数据库数据(业务项目)按照地址的经纬度&#xff0c;映射到…

GUN、MIT、Apache、BSD、MPL各种开源协议介绍和区别

文章目录 目前主流的开源协议GNU通用公共许可证&#xff08;GNU General Public License&#xff0c;GPL&#xff09;MIT许可证Apache许可证BSD许可证MPL Mozilla公共许可证&#xff08;Mozilla Public License&#xff0c;MPL&#xff09; 各种主流开源协议的区别GNU通用公共许…

玩转Nginx

Nginx是什么 Nginx&#xff08;engine x&#xff09;是一款的Web服务器、反向代理服务器&#xff0c;能够实现前端Web应用的部署、请求反向代理及负载均衡处理等功能。 特点 轻量&#xff0c;占用内存少高可靠高并发、高性能可扩展性好支持热部署BSD许可证(开源、可修改再发…

使用FFmpeg+ubuntu系统转化flac无损音频为mp3

功能需求如上题,我们来具体的操作一下: 1.先在ubuntu上面安装FFmpeg:sudo apt install ffmpeg 2.进入有flac音频文件的目录使用下述命令: ffmpeg -i test.FLAC -c:a libmp3lame -q:a 2 output.mp3 3.如果没有什么意外的话,你就能看到你的文件夹里面已经有转化好的mp3文件了 批…

Python —— excel文件操作(超详细)

背景 很多公司还是用excel去管理测试用例的&#xff0c;所以为了减少重复繁琐的导出导出工作&#xff0c;学会如何用代码操作excel表格很实用~ 1、读取excel文件基本步骤 1、操作excel的一些库 1、xlrd&#xff1a;读取库&#xff0c;xlwt&#xff1a;写入&#xff0c;现在…

Golang Linux 安装与环境变量配置

下载 Go 二进制包 wget https://dl.google.com/go/go1.21.1.linux-amd64.tar.gz 解压文件并将其移至 /usr/local 目录 sudo tar -C /usr/local -xzf go1.20.1.linux-amd64.tar.gz -C 选项解压文件到 /usr/local 目录&#xff0c;查看 /usr/local/go 目录的内容 将 Go 二进…

token登录的实现

token登录的实现 我这种token只是简单的实现token&#xff0c;就是后端利用UUID 生成简单随机码&#xff0c;利用随机码作为在Redis中的键&#xff0c;然后存储的用户信息作为值&#xff0c;在每次合理请求的时候对token的有效时间进行刷新&#xff08;利用拦截器&#xff09;&…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及&#xff0c;网络攻击变得越来越普遍和复杂&#xff0c;对企业和个人的网络安全构成了重大威胁。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击和CC&#xff08;网络连接&#xff09;攻击是两种常见且具有破坏性的攻击类型&#xff0c;它们…

python实现命令tree的效果

把所有的文档都传到了git上,但是内容过多找起来不方便,突发奇想如果能在readme中,递归列出所有文件同时添加上对应的地址,这样只需要搜索到对应的文件点击就能跳转过去了… 列出文件总得有个显示格式,所以就按照tree的来了… 用python实现命令tree的效果 首先,这是tree的效果…

【力扣每日一题】2023.9.21 收集树中金币

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一棵树&#xff0c;不过这棵树不是普通的树&#xff0c;而是无向无根树。给我们一个二维数组表示节点之间的连接关系&#xff…

Open3D 进阶(11)使用GMM-Tree算法对点云配准

GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、