12.1 ユーザ空間ライブパッチについて #
ユーザ空間ライブパッチ(ULP)とは、実行中のプロセスで使用されるライブラリに、中断することなくパッチを適用するプロセスのことです。ライブパッチとしてセキュリティ修正が利用できるようになるたびに、ライブパッチを適用した後にプロセスを再起動することなくカスタマサービスが保護されます。
ライブパッチ操作は、libpulpの一部であるulpツールを使用して実行されます。libpulpは、libpulp.soライブラリと、ulpバイナリで構成されるフレームワークで、ライブラリをライブパッチ可能にし、ライブパッチを適用します。
標準ユーザまたは特権を持つユーザのいずれかとしてsudoメカニズムを使用してulpコマンドを実行できます。両者の違いは、sudoを使用してulpを実行すると、rootによって実行されているプロセスまたはパッチプロセスの情報を表示できることです。
12.1.1 前提条件 #
ULPを機能させるには、2つの要件を満たす必要があります。
次を実行してシステムにULPをインストールしている。
>sudozypper 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-livepatches12.1.3 libpulpの使用 #
アプリケーションでライブパッチを有効にするには、アプリケーション起動時にlibpulp.so.0ライブラリをプリロードする必要があります。
> LD_PRELOAD=/usr/lib64/libpulp.so.0 APPLICATION_CMD12.1.3.1 ライブラリがライブパッチ可能かどうかの確認 #
ライブラリがライブパッチ可能かどうかを確認するには、次のコマンドを使用します。
> ulp livepatchable PATH_TO_LIBRARY12.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.so12.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.so12.1.3.6 内部メッセージキューの表示 #
libpulp.soからのログメッセージは、ライブラリ内のバッファに格納され、ユーザが要求しない限り表示されません。これらのメッセージを表示するには、次を実行します。
> ulp messages -p PID12.2 詳細情報 #
libpulpに関する詳細については、プロジェクトのGit
repositoryを参照してください。