当前位置: 首页 > news >正文

步步为营,如何将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引用库的问题解决了
在这里插入图片描述

相关文章:

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

文章目录 引场景构建第一步、直接引用的第三方库升级修复策略1.确认是否为直接引用的第三方库2.找到需要升级的版本是否为release版本 第二步、间接引用的第三方库升级修复策略那么问题来了&#xff0c;我们这么间接引用库的对应的直接引用库是哪个呢&#xff1f; &#xff08;…...

as-if-serial与happens-before原则详解

文章目录 前言详解解决多线程下的问题 Happens-before原则总结as-if-serial语义happens-before的例子 前言 "as-if-serial"原则是Java内存模型中的一个重要概念。该规则规定&#xff1a;不管怎么重排序&#xff08;编译期间的重排序&#xff0c;指令级并行的重排序&…...

基于Yolov8的工业小目标缺陷检测(2):动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点 | ICCV2023

目录 1.工业油污数据集介绍 1.1 小目标定义 1.2 难点 1.3 工业缺陷检测算法介绍 1.3.1 YOLOv8...

ARM64汇编基础

ARM64汇编基础 主要内容 到目前为止&#xff0c;大部分的移动设备都是64位的arm架构&#xff0c;一直想抽个时间系统学习下&#xff0c;这个周末就专门来学习下。毕竟两天的时间&#xff0c;也只是简单的入门了解下&#xff0c;为后续工作和学习打下基础。 本次学习的主要内容…...

Nodejs 第十六章(ffmpeg)

FFmpeg 是一个开源的跨平台多媒体处理工具&#xff0c;可以用于处理音频、视频和多媒体流。它提供了一组强大的命令行工具和库&#xff0c;可以进行视频转码、视频剪辑、音频提取、音视频合并、流媒体传输等操作。 FFmpeg 的主要功能和特性&#xff1a; 格式转换&#xff1a;…...

k8s集群部署es

集群内创建需要用到存储&#xff0c;此处举例使用腾讯云cfs共享存储 内存limits限制不需要加&#xff0c;否则会经常内存溢出导致es集群故障 apiVersion: apps/v1 kind: StatefulSet metadata:name: es7-clusternamespace: elasticsearch spec:serviceName: es-clusterreplica…...

学习记忆——宫殿篇——记忆宫殿——记忆桩——火车+外院+客厅+卧室

护板 警示灯 烟筒 采集箱 司炉室 桥 电线杆 棚顶 车厢 护栏 植物 石阶 水泥台 竹门 树干 躺椅 柱子 墙 池 洞 方灯 枕头 树 浴池 墙 射灯 藤条 浴巾框 耳环 窗户 灯 沙发 壁炉 吊灯 兵马俑 门 石佛 沙发椅 圆木 弧形木箱盖 床 窗帘 画板 纸伞 花 沙发背 颜料 抽屉...

QT用户登录注册,数据库实现

登录窗口头文件 #ifndef LOGINUI_H #define LOGINUI_H#include <QWidget> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QMessageBox>#include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> …...

GEE学习总结(9)——像元二分法计算月度植被覆盖度(MODIS)

像元二分法计算植被覆盖度 通过MODIS的NDVI数据集MOD13Q1和像元二分法计算植被覆盖度 var multi_NDVI ee.ImageCollection(MODIS/006/MOD13Q1).filterDate(2015-06-01, 2016-09-01).select(NDVI).max().divide(10000).clip(geometry);var ndviVis {min: 0.0,max: 1,palette…...

RabbitMQ用户命令_策略_日志

RabbitMQ相关安装 Centos离线安装RabbitMQ并开启MQTT Docker安装rabbitMQ RabbitMQ集群搭建和测试总结_亲测 Docker安装RabbitMQ集群_亲测成功 RabbitMQ创建管理员命令 #查看当前用户命令&#xff1a; rabbitmqctl list_users#创建用户和密码 rabbitmqctl add_user admin…...

停车场系统、智慧城市停车、智慧社区、物业管理、新能源充电、人脸门禁 uniapp 系统源码

1. 智慧停车 支持模式 封闭性单个停车场路边停车(车位级管理)大小场(场中场)&#xff0c;多场子并行或嵌套 所有者模式 统一平台管理总平台下子账号(区域代理)自建场地资源&#xff0c;自行维护数据总平台下子账号(区域代理)再分配和单个停车场管理人员(物业管理/维保/保安/财务…...

Linux磁盘管理

物理设备的命名规则 在linux系统中一切都是文件&#xff0c;硬件设备也不例外。即然是文件&#xff0c;就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来&#xff0c;目的是让用户通过设备文件的名字可以看出设备大致的属性以及分区信息等&#xff1b;在…...

vue学习之vue cli创建项目

安装 node.js https://nodejs.org/en 安装 vue cli npm install -g @vue/cli --registry=https://registry.npm.taobao.org创建项目 执行创建命令,回车vue create vue-cli-learning选择 “Manually select features”,回车 “空格” 关闭 Linter / Formatter 选项,回车...

K8S:Pod容器中的存储方式及PV、PVC

文章目录 Pod容器中的存储方式一&#xff0e;emptyDir存储卷1.emptyDir存储卷概念2.emptyDir存储卷示例 二.hostPath存储卷1.hostPath存储卷概念2.hostPath存储卷示例 三.nfs共享存储卷1.nfs共享存储卷示例 四.PV和PVC1.PV、PVC概念2.PVC 的使用逻辑及数据流向3.storageclass插…...

uni-app跳转到另一个app

第一步&#xff1a; 首先要知道 app的包名 获取方式如下 第二步&#xff1a; 在第一个 demo1 app 一个页面中需要一个按钮去跳转 方法如下 <template><view class"content"><button click"tz">跳转</button></view> </…...

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中&#xff0c;我们经常需要对大量的文件进行重命名&#xff0c;以便更好地管理和查找文件。而且&#xff0c;有时候我们还需要将文件名称翻译成其他语言&#xff0c;以适应不同的工作需求。如何高效地完成这项任务呢&#xff1f;接下来&#xff0c;我将介绍一种方法…...

CTF —— 网络安全大赛(这不比王者好玩吗?)

前言 随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 \ ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff0c;种种迹象…...

3D模型转换工具HOOPS Exchange如何实现OBJ格式轻量化?

什么是OBJ模型轻量化&#xff1f; OBJ格式是一种常用的三维模型文件格式&#xff0c;通常包含模型的顶点、法线、纹理坐标等信息&#xff0c;但有时候这些信息可能会使模型文件变得较大&#xff0c;不利于网络传输、加载和运行。 OBJ&#xff08;Object&#xff09;模型轻量化…...

命令模式-

定义&#xff1a;又叫动作模式或事务模式。指的是将一个请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分割开&#xff0c;然后可以使用不同的请求把客户端参数化&#xff0c;这样可以使得两者之间通过命令对象进行沟通&#xff0c;从而方便将命令对象进行储…...

进程的管理

#include <unistd.h> void _exit(int status); #include <stdlib.h> void _Exit(int status); status参数&#xff1a;是进程退出时的状态信息&#xff0c;父进程在回收子进程资源的时候可以获取到 #include<stdio.h> #include<stdlib.h> #includ…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...