12.1 关于用户空间在线增补 #
用户空间在线增补 (ULP) 是指在不中断正在运行的进程的情况下将补丁应用到该进程所使用的库的过程。在线增补操作使用作为 libpulp
的一部分的 ulp
工具来执行。
libpulp
是可实现用户空间在线增补的框架。它由 libpulp.so
库和用于使库可在线增补以及应用在线补丁的工具(ulp
二进制文件)组成。
12.1.1 先决条件 #
要使 ULP 正常工作,必须满足两个要求。
要使库可在线增补,必须使用
-fpatchable-function-entry
GCC 标志编译库。不需要更改库源代码。进程必须预装载
libpulp.so
库。
12.1.2 使用 libpulp #
要对应用程序使用 libpulp
,必须执行以下步骤:
使库可在线增补。
启动应用程序时,使用以下命令预装载
libpulp
:LD_PRELOAD=/usr/lib64/libpulp.so ./APPLICATION
。
12.1.2.1 准备可在线增补的库 #
为了使库能够在线增补,它必须在所有函数调用中包含 NOP
序言。GCC 版本 8 及更高版本以及 SUSE Linux Enterprise Server 随附的 GCC 版本专门为此提供了 -fpatchable-function-entry
。因此,在 AMD64/Intel 64 体系结构上,使用 -fpatchable-function-entry=16,14
标志编译一个用 C 编写的库就足以使该库可在线增补。
Glibc、libssl.so.1.1 和 libcrypto.so.1.1 库原本就可在 SUSE Linux Enterprise 15 SP4 上在线增补。
12.1.2.2 检查库是否可在线增补 #
要检查库是否可在线增补,请使用以下命令:
ulp livepatchable LIBRARY
12.1.2.3 应用在线补丁 #
可以使用 ulp trigger
命令应用在线补丁,例如:
ulp trigger -p PID LIVEPATCH.ulp
在此示例中,PID
是正在运行的进程的 PID,该进程使用的库要进行增补,LIVEPATCH.ulp
是实际的在线补丁文件。
live patching succeeded
消息表示在线增补操作成功。
12.1.2.4 还原在线补丁 #
ulp trigger
可用于还原在线补丁。可以通过两种方法还原在线补丁。您可以通过应用相应的 .rev
补丁来还原在线补丁:
ulp trigger -p PID LIVEPATCH.rev
或者,可以去除与特定库关联的所有补丁。例如:
ulp trigger -p PID --revert-all=LIBRARY
在上面的示例中,LIBRARY 指的是实际的库,例如:libcrypto.so.1.1
。
当原始在线补丁的源代码不可用时,或者当您希望去除特定的旧补丁并应用新补丁,但又不想让目标应用程序运行可能不安全的代码时,后一种方法可能很有用。例如:
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.ulp
12.2 更多信息 #
项目的 Git 软件源中提供了有关 libpulp
的更多信息。