热补丁的全面调研
Posted rtoax
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了热补丁的全面调研相关的知识,希望对你有一定的参考价值。
1. 简介
热补丁(hotfix),又被称之为patch,意指能够修复软件漏洞的一些代码,是一种快速、低成本修复产品软件版本缺陷的方式。
2. 热补丁种类和方案
热补丁分为内核和用户态两种,内核中的热补丁以ftrace作为基础,用户态的实现则是五花八门,下面主要的几种:
2.1. 内核态热补丁
内核态热补丁根据不同的操作系统/平台,包括:
- Canonical Livepatch:For Ubuntu 14.04, 16.04, 18.04 LTS versions only and available as part of the Ubuntu Advantage program
- kernelCare:Developed independently and available for multiple platforms on a per-server, per-month subscription basis
- kpatch:Developed by Red Hat. Source code is freely available on github but patches must be purchased via a commercial license for Red Hat Enterprise Linux Server
- kgraft:Developed by SUSE and now offered by them under the name SUSE Linux Enterprise Live Patching
- ksplice:The first to offer commercial live patching for Linux. Available only on Oracle Linux as part of their Oracle Linux Premier Support
2.2. 用户态热补丁
用户态热补丁包括:
- libcare/libcareplus
- LibraryCare
3. 内核热补丁
内核态热补丁官方文档Kernel Livepatching。
查看内核是否支持热补丁功能:
内核中的热补丁以ftrace作为基础,它的实现目前主流的有两种,kpatch和kgraft:kgraft-analysis-tool
3.1. kpatch
这可以具体参考openEuler内核热补丁使用指南。
3.2. kgraft
4. 用户态热补丁
4.1. libcare/libcareplus
Libcareplus的使用方法可以在OpenEuler LibcarePlus或LibcarePlus中查看,因为OpenEuler的libcarePlus我提交了补丁,但是基本不会通过,所以我自己维护了一套代码libcareplus,代码中有很多测示例。
4.2. LibraryCare
要安全地操作服务器,仅修补其 Linux 内核是不够的。他们的共享软件库也必须打补丁。否则,企业就会面临利用 Heartbleed 或 GHOST 等漏洞的攻击。企业处理库漏洞的常用方法是重启服务器或重启导致停机和漏洞窗口的应用程序。此外,管理员很少知道服务正在使用的确切库,因此他们只需重新启动整个服务器以更新它们。
如果服务器已手动修补,无需重新启动,共享库可能仍包含漏洞。当库在磁盘上更新时,未打补丁的旧文件可以保留在服务器的内存中。此外,漏洞扫描程序不会在内存中检测到这些未修补的旧库文件。
以前称为 KERNELCARE+,LIBRARYCARE 可检测和更新内存中易受攻击的共享库,而不会中断使用它们的应用程序。
它的工作流程如下:
- 库的源代码(原始的和修补的)被翻译成汇编语言。比较这些文件,并将新的修补代码放在同一个 ELF 文件的新部分中。代码编译和链接后,补丁将从生成的二进制文件中提取。补丁文件是从 ELF 部分中提取的。
- 二进制文件被视为单个补丁,然后上传到专用的 KernelCare 补丁服务器。然后补丁服务器将补丁分发到客户的服务器。
- 每个本地服务器上的代理程序 lcarectl 与补丁服务器“对话”,后者在本地服务器上查找已知库。然后,代理程序下载本地服务器上存在的每个库所需的补丁。
- 使用 Linux API,分配库附近的内存,并将补丁复制到其中。在确保没有线程正在执行旧库代码后,代理程序通过无条件跳转将调用从旧代码重新路由到新的修补版本。
该流程与LibcarePlus如出一辙。
5. 其他方案猜想
5.1. 用户态ftrace
既然内核中的livepatching是采用的ftrace,那么能不能在用户态使用ftrace实现补丁功能呢?
用户态ftrace功能 uftrace开源于github,在gitee中有镜像。
5.2. MORE
6. 参考链接
- OpenEuler:LibcarePlus使用方法、LibcarePlus使用方法、Libcareplus源码
- Kernel:Kernel Livepatching官方文档
- kernelCare:kernelCare主页
- kpatch:kpatch源码,openEuler内核热补丁使用指南
- kgraft:kgraft-analysis-tool、kgraft-examples
- ksplice:ksplice主页
- LibraryCare:LibraryCare主页
- QEMU Live Update
- https://lore.kernel.org/qemu-devel/1596122076-341293-1-git-send-email-steven.sistare@oracle.com/
- https://lore.kernel.org/lkml/1588812129-8596-1-git-send-email-anthony.yznaga@oracle.com/
- https://lore.kernel.org/lkml/1595869887-23307-1-git-send-email-anthony.yznaga@oracle.com/
- History of Linux Kernel Live Patching
- What Is Linux Kernel Live Patching?
- Introducing kpatch: Dynamic Kernel Patching
- Live Kernel Patching Using kGraft
- https://www.linux-magazine.com/Issues/2008/95/KSplice
以上是关于热补丁的全面调研的主要内容,如果未能解决你的问题,请参考以下文章