12 Userspace-Live-Patching #
In diesem Dokument werden die Grundlagen und die Verwendung des Userspace-Live-Patchings erläutert.
12.1 Informationen zum Userspace-Live-Patching #
Das Userspace-Live-Patching (ULP) bezeichnet die Anwendung von Patches auf Bibliotheken, die von laufenden Prozessen verwendet werden, ohne diese zu unterbrechen. Live-Patching-Vorgänge werden mit dem Werkzeug ulp
durchgeführt, das Teil von libpulp
ist.
Das Framework libpulp
bildet den Rahmen für das Userspace-Live-Patching. Es besteht aus der Bibliothek libpulp.so
und aus Werkzeugen, die die Bibliotheken livepatchfähig machen und die Live-Patches anwenden (die Binärdatei ulp
).
12.1.1 Voraussetzungen #
Für das ULP müssen zwei Anforderungen erfüllt sein.
Eine Bibliothek muss mit dem GCC-Flag
-fpatchable-function-entry
kompiliert und damit livepatchfähig gemacht werden. Änderungen am Quellcode der Bibliothek fallen nicht an.Prozesse müssen die Bibliothek
libpulp.so
vorab laden.
12.1.2 Verwenden von libpulp #
Zur Verwendung von libpulp
mit einer Anwendung gehen Sie wie folgt vor:
Machen Sie eine Bibliothek livepatchfähig.
Wenn Sie die Anwendung starten, laden Sie
libpulp
vorab mit dem KommandoLD_PRELOAD=/usr/lib64/libpulp.so ./ANWENDUNG
.
12.1.2.1 Vorbereiten der Live-Patch-Fähigkeit einer Bibliothek #
Damit eine Bibliothek livepatchfähig ist, müssen ihre Funktionsaufrufe allesamt den Prolog NOP
enthalten. GCC ab Version 8 (und die in SUSE Linux Enterprise Server enthaltene GCC-Version) bietet speziell für diesen Zweck das Flag -fpatchable-function-entry
. Auf der AMD64/Intel 64-Architektur reicht es daher aus, eine in C geschriebene Bibliothek mit dem Flag ‑fpatchable-function-entry=16,14
zu kompilieren, um sie livepatchfähig zu machen.
Die Bibliotheken glibc, libssl.so.1.1 und libcrypto.so.1.1 sind unter SUSE Linux Enterprise 15 SP4 bereits livepatchfähig.
12.1.2.2 Prüfen der Live-Patch-Fähigkeit einer Bibliothek #
Prüfen Sie mit dem folgenden Kommando, ob eine Bibliothek livepatchfähig ist:
ulp livepatchable LIBRARY
12.1.2.3 Anwenden von Live-Patches #
Live-Patches werden mit dem Kommando ulp trigger
angewendet, beispielsweise:
ulp trigger -p PID LIVEPATCH.ulp
In diesem Beispiel bezeichnet PID
die PID des laufenden Prozesses, der die zu patchende Bibliothek enthält, und LIVEPATCH.ulp
ist die eigentliche Live-Patch-Datei.
Die Meldung live patching succeeded
(Live-Patching erfolgreich) weist darauf hin, dass der Live-Patching-Vorgang erfolgreich abgeschlossen wurde.
12.1.2.4 Zurücksetzen von Live-Patches #
Live-Patches können mit ulp trigger
zurückgesetzt werden. Für das Zurücksetzen von Live-Patches stehen zwei Möglichkeiten zur Auswahl. Sie können einen Live-Patch durch Anwendung des zugehörigen .rev
-Patch zurücksetzen:
ulp trigger -p PID LIVEPATCH.rev
Alternativ können Sie alle Patches einer bestimmten Bibliothek zurücksetzen. Beispiel:
ulp trigger -p PID --revert-all=LIBRARY
Im obigen Beispiel steht LIBRARY (BIBLIOTHEK) für die eigentliche Bibliothek, z. B. libcrypto.so.1.1
.
Das zweite Verfahren kann von Nutzen sein, wenn der Quellcode des ursprünglichen Live-Patches nicht verfügbar ist oder wenn Sie einen bestimmten älteren Patch entfernen und einen neuen anwenden möchten, ohne dass die Zielanwendung potenziell unsicheren Code ausführt. Beispiel:
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.ulp
12.2 Weitere Informationen #
Weitere Informationen zu libpulp
finden Sie im Git-Repository des Projekts.