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
的更多資訊。