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