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
輸出會顯示可即時修補的程式庫和程式中載入的修補程式,以及修補程式解決的錯誤:
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
的更多資訊。