这操作真牛!APT杜绝软件包被篡改

0x00 简介

我们介绍了传统包管理器、新型包管理器的工作方式,其中用了大篇幅介绍 APT 包管理器,但是没有对安全人员比较关心的软件包校验问题进行介绍

0x01 大众疑问环节

这部分主要是从常规 Linux 使用者的视角,提出一些平时工作过程中的疑问,通过文章内容,最后解决这些疑问

1. 更新源被黑客攻击,软件包被替换,使用这个更新源的 Linux 电脑会中招吗?
2. 官方以及第三方更新源好多都是 http 协议的,这会不会被劫持篡改?
3. 全世界各个更新源的软件包都是一样的吗? 还是各自维护的
4. 如何确定安装后的软件包是否被篡改?

0x02 APT 软件包校验机制

以 Ubuntu 为例

软件包校验本质上就是验证下载的软件包是来自官方的

验证有没有被修改过。这很简单啊,只要官方计算每一个软件包的 hash ,之后公布在网站上就好了。如果软件包被修改过,那么 hash 就会变,不就可以了吗?

但是这里存在一个问题,如果网站被入侵了,攻击者修改软件包后,又篡改了 hash 公示文件怎么办?即使将软件包和 hash 公示文件分别放在不同的网站还是存在同时被入侵的可能

所以此时就需要一个具有唯一性的标志来证明“我是没有被篡改过的我”,此时签名就出现了,官方做一个签名,之后将其赋给每一个官方发布的软件包,这样用户就可以通过签名来判断软件是否被篡改过

签名也不是没有风险的,自古以来就有临摹,伪造签名也是很常见,既然设计了签名,就要保证签名后的软件即使被挨个字节分析,也不能伪造出官方签名

这个时候就要用到  GnuPG 了,GPG 是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。使用 GPG 就可以让用户验证该文件(软件包)是否为官方原版

1)非对称加密

先说对称加密,对称加密就是通信的两端使用约定好的“密码”将通信信息进行加密

图片

对称加密只要有一方被攻破,整个通信内容就被解密泄漏了,同时中间人还可以通过这个“密码”伪造通信内容

非对称加密则采用密钥对儿的方式,一对儿密钥分为公钥和私钥

公钥发给所有要与你通信的人,公钥用来加密通信内容,只能用私钥来解密,这样只要私钥不泄漏,这个过程就是相对安全的

图片

上面的两个例子都是单向的,如果是双向的通信,可以参考 https 的通信模式

2)GPG

GPG 是加密工具,上面介绍了非对称加密,GPG 就是实际使用非对称加密算法对文件等进行签名、加密的工具

现在的需求是 Ubuntu 官方需要证明软件包是官方发布的,所以就需要使用密钥对软件包进行签名,公钥是要发布给用户的,所以使用私钥签名,使用公钥验证签名

这里就和上面非对称加密通信相反了。也就是说公钥和私钥都可以用来保密,公钥发布给用户,发布方式可以以文件的形式,也可以使用公共的密钥服务器

引用知乎上某个匿名用户的一个回答

RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?- 知乎 https://www.zhihu.com/question/25912483/answer/46649199

不要去硬记。

你只要想:既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密;同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证

3)APT 软件包校验机制

a. 设置更新源

软件更新源情况

图片

b. 更新软件包索引
sudo apt update

我这里更换了一个软件源,记录第一次执行 sudo apt update 情况下的通信情况

图片

图片

主要是以下 URL 地址

host:mirrors.aliyun.com


/ubuntu/dists/jammy-security/InRelease
/ubuntu/dists/jammy/InRelease
/ubuntu/dists/jammy-updates/InRelease
/ubuntu/dists/jammy-backports/InRelease

/ubuntu/dists/jammy-updates/main/binary-amd64/Packages.xz
/ubuntu/dists/jammy-updates/universe/binary-amd64/Packages.xz
/ubuntu/dists/jammy-updates/universe/binary-i386/Packages.xz

此时我们观察一下软件源目录结构

图片

这里以 /ubuntu/dists/jammy/InRelease 为例解释一下这个文件的含义

     该文件记录了当前目录以及子目录各个文件的hash值

     该文件是 GPG 签名后的 Release 文件的 ASCII 可读文件

     这个文件就只是 Release 文件的签名,也被称为“分离的GPG签名”

  • Release

  • InRelease

  • Release.gpg

目前 APT 主要使用的就是 InRelease 文件

Release

图片

InRelease

图片

图片

Release.gpg

图片

通过检查  InRelease  文件,可以确定该文件是否为官方签名文件,并且获取各个Packages.xz 的 hash 值

由于本次下载的都是 jammy-updates 目录下的 Packages.xz,所以我们先获取  jammy-updates 目录下的 InRelease 文件

之后下载对应支持的CPU架构的 Packages.xz 文件,这里以 /ubuntu/dists/jammy-updates/main/binary-amd64/Packages.xz 为例

图片

图片

我们查看一下 Packages.xz 中的内容

图片

Package: accountsservice
Architecture: amd64
Version: 0.6.45-1ubuntu1.3
Priority: standard
Section: gnome
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian freedesktop.org maintainers <pkg-freedesktop-maintainers@lists.alioth.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 440
Depends: dbus, libaccountsservice0 (= 0.6.45-1ubuntu1.3), libc6 (>= 2.4), libglib2.0-0 (>= 2.37.3), libpolkit-gobject-1-0 (>= 0.99)
Suggests: gnome-control-center
Filename: pool/main/a/accountsservice/accountsservice_0.6.45-1ubuntu1.3_amd64.deb
Size: 62420
MD5sum: ae68808224b8386f0ee66aefa3e27103
SHA1: a3df4c138960ad2547b4aa8e3f3f1e58fb27ef92
SHA256: 3d76bac7ae425b8eff2599da2b02b2874ad2df6603d0b7b645cf8cc1f830c9a1
SHA512: e8db8f52ee6b04475d2de596179d5a2c64645a134f0426937bfd2771880b9b739cdd126617043b48933e80ff4fa11db3934e8a8d2a574692e753fc5f9c21edb3
Homepage: https://www.freedesktop.org/wiki/Software/AccountsService/
Description: query and manipulate user account information
Task: standard
Description-md5: 8aeed0a03c7cd494f0c4b8d977483d7e
Supported: 5y

Packages 文件中标记了该分类目录下软件包的元信息,其中包括依赖信息、软件包位置、大小、hash信息等

c. 安装软件包

以 nmap 为例

sudo apt install nmap 

图片

/ubuntu/pool/main/l/lapack/libblas3_3.10.0-2ubuntu1_amd64.deb
/ubuntu/pool/universe/libl/liblinear/liblinear4_2.3.0+dfsg-5_amd64.deb
/ubuntu/pool/universe/l/lua-lpeg/lua-lpeg_1.0.2-1_amd64.deb
/ubuntu/pool/universe/n/nmap/nmap-common_7.91+dfsg1+really7.80+dfsg1-2ubuntu0.1_all.deb
/ubuntu/pool/universe/n/nmap/nmap_7.91+dfsg1+really7.80+dfsg1-2ubuntu0.1_amd64.deb

这一步就直接下载并安装软件包以及其依赖了

d. Ubuntu 默认公钥位置
sudo apt-key list

图片

0x03 答疑环节

现在我们回顾最开始的问题

1. 更新源被黑客攻击,软件包被替换,使用这个更新源的 Linux 电脑会中招吗?

按照当前的 GPG 验证来说,即使更新源被黑客控制,默认情况下篡改的软件包也安装不上。但是可能有大聪明设置什么忽略提醒、忽略安全问题之类的,导致中招

2. 官方以及第三方更新源好多都是 http 协议的,这会不会被劫持篡改?

不会,http篡改后的软件包hash值校验不过去,篡改后的软件包无法通过验证,那为什么很多更新源还是默认使用了 https 呢?这里引用中科大软件源的一个说法

图片

https://mirrors.ustc.edu.cn/help/ubuntu.html#

3. 全世界各个更新源的软件包都是一样的吗? 还是各自维护的

全世界各地的更新源都是从官方源同步的,但是同步的进度不一样,所以会导致有部分延迟,这里还是要引用中科大的帮助说明文档

图片

https://mirrors.ustc.edu.cn/help/ubuntu.html#

可以通过各个更新源的官方站点的同步状态处获取当前同步情况,以清华更新源为例

https://mirrors.tuna.tsinghua.edu.cn/status/#syncing-status

图片

4. 如何确定安装后的软件包是否被篡改?

这个内容在 《Linux 应急响应手册》中可以查到,位于 小技巧 -> 0x04 系统完整性检查 章节

> sudo apt install debsums 
> debsums --all --changed

 「你即将失去如下所有学习变强机会」

学习效率低,学不到实战内容,花几千、上万报机构没有性价比

一顿自助钱,我承诺一定让用户满意,也希望用户能给予我一份信任

【详情下方图片了解】,【扫下方二维码加入】:只做高质量优质精品内容」

图片

 

免费红队知识库:

图片

图片

免责声明

由于传播、利用本公众号所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,本公众号及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

到底什么是爬虫

1. 引言 在数据驱动的世界里&#xff0c;网络爬虫&#xff08;Web Crawling&#xff09;技术扮演着获取和处理网上数据的关键角色。无论是为了数据分析、机器学习项目的数据集构建还是简单地监测网页变化&#xff0c;学习如何创建一个基本的网页爬虫可以大大提升你的工作效率和…

万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

文章目录 前言&#xff1a;1、ARP协议详解2、ARP工作机制 二、ARP_RX模块设计三、ARP_TX模块设计四、ARP_table模块5、仿真5.1、发送端5.2、接收端5.3、缓存表 总结 前言&#xff1a; 1、ARP协议详解 ARP数据格式&#xff1a; 硬件类型:表示硬件地址的类型。它的值为1表示以太…

postman接口自动化

1.基础知识 1.打开postman新建一个文件夹。 &#xff08;建立每一部分文件夹可以更好的管理接口信息&#xff09; 2.postman基本介绍 这里用到的是我自己的一个项目。 params&#xff1a;查询字符串&#xff0c;一般作为url的一部分。 authorization &#xff1a;鉴权&…

CentOS 7.9.2007 中Docker使用GPU

一、安装nvidia驱动 1.1&#xff0c;查看显卡驱动 # 查看显卡型号 lspci | grep -i nvidia 1.2&#xff0c;进入 PCI devices &#xff0c;输入上一步查询到的 2204 1.3&#xff0c;进入 官方驱动 | NVIDIA&#xff0c;查询 Geforce RTX 3090 驱动并下载 1.4&#xff0c;禁用…

数据结构(C):时间复杂度和空间复杂度

目录 &#x1f680; 0.前言 &#x1f680; 1.为何会有时间复杂度和空间复杂度的概念 &#x1f680; 2.时间复杂度 2.1初步时间复杂度 2.2大O表示法 2.2.1.O&#xff08;N*N&#xff09; 2.2.2.O&#xff08;N&#xff09; 2.2.3.O&#xff08;1&#xff09; 2.3最坏情况…

Set A Light 3D Studio:轻松上手,打造专属3D作品!

set a light 3d studio mac版是mac上一款功能方面相当强大的3D摄影棚布光工具&#xff0c;可以帮助摄影行业的工作用户在进行3D室内拍摄的时候&#xff0c;完成对灯光的位置调整设置&#xff0c;只要运用该软件&#xff0c;支持对各种灯光的道具摆放位置&#xff0c;灯光的反射…

Pycharm远程连接实验室服务器Conda环境配置

如何配置Pycharm和远程服务器 这类博客较多&#xff0c;参考内容 https://blog.csdn.net/fengbao24/article/details/125515542 Python解释器选择&#xff08;conda3&#xff09; 1. Settings -> Add Interpreter -> On SSH 注意&#xff0c;这里的SSH需要在你把远程…

Python读写文本URL蓝牙WIFI自动连接电子名片位置坐标智能海报等NDEF标签

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.60ad789erlonvk 近场通信&#xff08;Near Field Communication&#xff0c;简称NFC&#xff09;&#xff0c;是一种新兴的技术&…

雨云 湖北十堰 8272CL 高防高性能云服务器测评

雨云 湖北十堰 高防云服务器&#xff0c;铂金8272CL高性能处理器&#xff0c;2核2G 10兆 400G防御&#xff0c;仅需60元/月&#xff1b;8核16G 20兆 400G高防&#xff0c;仅需170元/月&#xff0c;年付8折1632元/年&#xff08;约136元/月&#xff09;。 企业级纯NVME固态硬盘高…

javase__进阶 day18 多线程02

1. 线程池 1.1 线程状态介绍 当线程被创建并启动以后&#xff0c;它既不是一启动就进入了执行状态&#xff0c;也不是一直处于执行状态。线程对象在不同的时期有不同的状态。那么Java中的线程存在哪几种状态呢&#xff1f;Java中的线程 状态被定义在了java.lang.Thread.Stat…

Nginx 防盗链

原文&#xff1a;https://blog.iyatt.com/?p14998 基于 Nginx 1.18 服务器默认配置文件路径&#xff1a;/etc/nginx/sites-available/default 屏蔽非指定域名的解析 我这里如果发现请求的地址不是我的 iyatt.com&#xff0c;就会返回 403 比如有人用其它域名指向我的服务器…

基于 Spring Boot 博客系统开发(四)

基于 Spring Boot 博客系统开发&#xff08;四&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;三&#xff09;&#x1f…

MySQL库表占用空间排序

在进行数据库备份恢复时&#xff0c;经常会碰到耗时很长的问题。大概率是因为某些库表的占用空间太大。 以下语句按照库表占用空间大小&#xff0c;进行降序排序&#xff1a; SELECT table_schema AS Database,table_name AS Table,ROUND((data_length index_length) / 1024…

【C语言】结构体,联合体,枚举--->自定义类型详解!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 结构体 1.1 结构体定义 1.2 结构体的声明 1.3 结构体变量的定义和初始化 1.4 结构体的特殊声明->匿名声明 1.5 结构体的自应用 2. 结构体内存对齐…

上海·得物技术沙龙-「无线技术」专场报名开启!

本次无线沙龙聚焦于最新的技术趋势和实践&#xff0c;将在上海/线上为你带来四个令人期待的演讲话题&#xff0c;包括&#xff1a;《快手主App启动接口带宽优化实践》、《得物App视频体验优化实践》、《Chromium内核架构和网络库优化介绍》、《得物App发热监控实践》。相信这些…

本地部署Llama3教程,断网也能用啦!

4月18日&#xff0c;Meta在官方博客官宣了Llama3&#xff0c;标志着人工智能领域迈向了一个重要的飞跃。经过笔者的个人体验&#xff0c;Llama3 8B效果已经超越GPT-3.5&#xff0c;最为重要的是&#xff0c;Llama3是开源的&#xff0c;我们可以自己部署&#xff01; 本文和大家…

C++感受9-Hello Object 生死版•上

你好对象&#xff01; 认识C中基础中的基础类型&#xff1b;创建用户自定义的复合类型&#xff1b;创建新类型的对象&#xff1b;定制新类型对象的生死过程 零、面向对象启蒙 之前我们一直在问候世界&#xff0c;从这节课开始&#xff0c;我们的问候对象就是“对象&#xff08…

验证 python解释器是否安装成功

一. 简介 前一篇文章学习了下载并安装 python解释器&#xff0c;文章如下&#xff1a; windows系统下python解释器安装-CSDN博客 本文验证 python解释器是否安装成功。 二. 验证 python解释器是否安装成功 1. 首先&#xff0c;打开 Windows系统的 "cmd" 界面。…

Netty学习——实战篇8 Handler链调用、TCP粘包和拆包

1 Handler链调用-需求 使用自定义的编码器和解码器来说明Netty的Handler调用机制。客户端发送long类型数据到服务端&#xff1b;服务端发送long到客户端。 2 Handler链调用-实战 2.1 NettyServer.java public class NettyServer {public static void main(String[] args) {…

C语言——小知识和小细节16

一、左旋字符串 例如字符串 abcd &#xff0c;左旋一个就是 bcda &#xff0c;左旋两个就是 cdab 。 方法一&#xff1a;循环 #include <stdio.h> #include <string.h>void func(char* str, int n) {int i 0;int j 0;int len (int)strlen(str);n % len;//超出…
最新文章