12.1 关于用户空间实时修补 #
用户空间实时修补 (ULP) 是指在不中断正在运行的进程的情况下,将补丁应用到该进程所使用的库的过程。每次以实时补丁的形式提供安全修复程序时,在应用实时补丁后,客户服务的安全性即会得到保障,而无需重启动相关进程。
实时修补操作使用作为 libpulp
的一部分的 ulp
工具来执行。libpulp
是一个由 libpulp.so
库和 ulp
二进制文件组成的框架。该二进制文件用于使库可实时修补以及应用实时补丁。
您可以通过 sudo
机制以普通用户或特权用户身份运行 ulp
命令。区别在于通过 sudo
运行 ulp
,您可以查看 root
所运行的进程或修补进程的信息。
12.1.1 先决条件 #
要使 ULP 正常工作,必须满足两个要求。
运行以下命令在系统上安装 ULP:
>
sudo
zypper in libpulp0 libpulp-tools必须在加载
libpulp.so.0
库之前启动具有所需实时修补支持的应用程序。有关详细信息,请参见第 12.1.3 节 “使用libpulp
”。
12.1.2 支持的库 #
当前,仅支持 glibc
和 openssl
(openssl1_1
)。其他软件包将在它们准备好实时修补后可用。要接收 glibc
和 openssl
实时补丁,请安装 glibc-livepatches 和 openssl-livepatches 软件包:
>
zypper install glibc-livepatches openssl-livepatches
12.1.3 使用 libpulp
#
要实现对某个应用程序的实时修补,您需要在启动该应用程序时预装载 libpulp.so.0
库:
>
LD_PRELOAD=/usr/lib64/libpulp.so.0 APPLICATION_CMD
12.1.3.1 检查库是否可实时修补 #
要检查库是否可实时修补,请使用以下命令:
>
ulp livepatchable PATH_TO_LIBRARY
12.1.3.2 检查 .so
文件是否为实时补丁容器 #
如果共享对象 (.so
) 包含嵌入其中的 ULP 补丁描述,则表示其为实时补丁容器。您可以使用以下命令验证它:
>
readelf -S SHARED_OBJECT | grep .ulp
如果输出显示共享对象中有 .ulp
和 .ulp.rev
部分,则表示其为实时补丁容器。
12.1.3.3 应用在线补丁 #
可以使用 ulp trigger
命令应用在线补丁,例如:
>
ulp trigger -p PID LIVEPATCH.so
以正在运行的进程(使用了要修补的库)的进程 ID 替换 PID
,以实际的实时补丁文件替换 LIVEPATCH.so
。该命令会返回以下状态消息之一:
- SUCCESS
实时修补操作成功。
- SKIPPED
已跳过该补丁,因为它不适用于进程中装载的任何库。
- ERROR
发生错误,您可以检查
libpulp
内部消息缓冲区以获得更多信息。有关更多信息,请参见第 12.1.3.6 节 “查看内部消息队列”。
您也可以使用通配符来应用多个实时补丁,例如:
>
ulp trigger '*.so'
该命令会尝试将当前文件夹中的每个补丁应用到已装载 libpulp
库的每个进程。如果补丁不适合该进程,则会自动跳过该补丁。最后,该工具会显示它成功地将多少个补丁应用到多少个进程。
12.1.3.4 还原在线补丁 #
您可以使用 ulp trigger
命令还原实时补丁。可以通过两种方法还原在线补丁。您可以使用 --revert
开关传递实时补丁容器来还原实时补丁:
>
ulp trigger -p PID --revert LIVEPATCH.so
或者,您也可以去除与特定库关联的所有补丁,例如:
>
ulp trigger -p PID --revert-all=LIBRARY
在示例中,LIBRARY 指的是实际的库,例如 libcrypto.so.1.1
。
当原始实时补丁的源代码不可用时,后一种方法可能很有用。或者,您希望在目标应用程序仍在运行安全代码时去除特定的旧补丁并应用新补丁,例如:
>
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.so
12.1.3.5 查看应用的补丁 #
您可以运行以下命令来验证已为哪些应用程序应用实时补丁:
>
ulp patches
输出会显示可实时修补的库和程序中装载的补丁,以及补丁解决的 bug:
PID: 10636, name: test Livepatchable libraries: in /lib64/libc.so.6: livepatch: libc_livepatch1.so bug labels: jsc#SLE-0000 in /usr/lib64/libpulp.so.0:
您还可以查看实时补丁修补的功能:
>
ulp dump LIVEPATCH.so
12.1.3.6 查看内部消息队列 #
来自 libpulp.so
的日志消息存储在库内的缓冲区中,除非用户请求,否则不会显示。要显示这些消息,请运行:
>
ulp messages -p PID
12.2 更多信息 #
项目的 Git
repository 中提供了有关 libpulp
的更多信息。