12 ユーザ空間ライブパッチ #
このドキュメントでは、ユーザ空間ライブパッチの基本的な原則と使用法について説明します。
12.1 ユーザ空間ライブパッチについて #
ユーザ空間ライブパッチ(ULP)とは、実行中のプロセスで使用されるライブラリに、中断することなくパッチを適用するプロセスのことです。ライブパッチ操作は、libpulp
の一部であるulp
ツールを使用して実行されます。
libpulp
は、ユーザ空間ライブパッチを可能にするフレームワークです。ライブラリをライブパッチ可能にしたり、ライブパッチ(ulp
バイナリ)を適用したりするためのlibpulp.so
ライブラリとツールで構成されています。
12.1.1 前提条件 #
ULPを機能させるには、2つの要件を満たす必要があります。
ライブパッチを可能にするには、ライブラリを
-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アーキテクチャでは、Cで記述されたライブラリを-fpatchable-function-entry=16,14
フラグでコンパイルすれば、ライブパッチ可能になります。
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
を使用してライブパッチを元に戻すことができます。ライブパッチを元に戻すには、2つの方法があります。適切な.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 詳細情報 #
libpulp
に関する詳細については、プロジェクトのGitリポジトリを参照してください。