12.1 ユーザ空間ライブパッチについて #
ユーザ空間ライブパッチ(ULP)とは、実行中のプロセスで使用されるライブラリに、中断することなくパッチを適用するプロセスのことです。ライブパッチとしてセキュリティ修正が利用できるようになるたびに、ライブパッチを適用した後にプロセスを再起動することなくカスタマサービスが保護されます。
ライブパッチ操作は、libpulp
の一部であるulp
ツールを使用して実行されます。libpulp
は、libpulp.so
ライブラリおよび、ライブラリをライブパッチ可能にし、ライブパッチを適用するulp
バイナリから構成されるフレームワークです。
標準ユーザまたは特権を持つユーザのいずれかとしてsudo
メカニズムを使用してulp
コマンドを実行できます。両者の違いは、sudo
を使用してulp
を実行すると、root
によって実行されているプロセスまたはパッチプロセスの情報を表示できることです。
12.1.1 前提条件 #
ULPを機能させるには、2つの要件を満たす必要があります。
次を実行してシステムに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
PID
を、パッチ対象のライブラリを使用する実行中のプロセスのプロセスIDに置き換え、LIVEPATCH.so
を実際のライブパッチファイルに置き換えます。このコマンドは、次のステータスメッセージのいずれかを返します。
- SUCCESS
ライブパッチ操作は成功しました。
- SKIPPED
パッチは、プロセスでロードされたどのライブラリ用にも設計されていなかったためスキップされました。
- ERROR
エラーが発生しました。
libpulp
内部メッセージバッファを調べて詳細情報を取得できます。詳細については、12.1.3.6項 「内部メッセージキューの表示」を参照してください。
ワイルドカードを使用して複数のライブパッチを適用することもできます。次に例を示します。
>
ulp trigger '*.so'
このコマンドは、現在のフォルダ内のすべてのパッチをlibpulp
ライブラリがロードされているすべてのプロセスに適用しようとします。パッチは、プロセスに不適である場合、自動的にスキップされます。最後に、適用に成功したパッチ数および適用されたプロセス数がツールに表示されます。
12.1.3.4 ライブパッチを元に戻す #
ulp trigger
コマンドを使用してライブパッチを元に戻します。ライブパッチを元に戻すには、2つの方法があります。--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 詳細情報 #
libpulp
に関する詳細については、プロジェクトのGit
repositoryを参照してください。