12 Userspace-Live-Patching #
In diesem Kapitel werden die Grundlagen und die Verwendung des Userspace-Live-Patchings erläutert.
12.1 Info zu 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. Jedes Mal, wenn eine Sicherheitskorrektur als Live-Patch verfügbar ist, werden die Kundendienste nach der Anwendung des Live-Patches ohne Neustart der Prozesse gesichert.
Live-Patching-Vorgänge werden mit dem Werkzeug ulp
durchgeführt, das Teil von libpulp
ist. libpulp
ist ein Framework, das aus der Bibliothek libpulp.so
und der Binärdatei ulp
besteht. Es ermöglicht Live-Patching für Bibliotheken und wendet Live-Patches an.
Sie können das Kommando ulp
entweder als normaler Benutzer oder als privilegierter Benutzer über den Mechanismus sudo
ausführen. Der Unterschied besteht darin, dass Sie durch Ausführen von ulp
über sudo
Informationen über ausgeführte Prozesse oder Patch-Prozesse nach root
anzeigen können.
12.1.1 Voraussetzungen #
Für das ULP müssen zwei Anforderungen erfüllt sein.
Installieren Sie das ULP auf Ihrem System, indem Sie Folgendes ausführen:
>
sudo
zypper in libpulp0 libpulp-toolsAnwendungen mit gewünschter Live-Patch-Unterstützung müssen vor dem Laden der Bibliothek
libpulp.so.0
gestartet werden. Weitere Einzelheiten finden Sie unter Abschnitt 12.1.3, „Verwenden vonlibpulp
“.
12.1.2 Unterstützte Bibliotheken #
Derzeit werden nur glibc
und openssl
(openssl1_1
) unterstützt. Weitere Pakete werden verfügbar sein, sobald sie für das Live-Patching vorbereitet sind. Um glibc
- und openssl
-Live-Patches zu erhalten und zu aktivieren, installieren Sie die Pakete glibc-livepatches und openssl-livepatches:
>
zypper install glibc-livepatches openssl-livepatches
12.1.3 Verwenden von libpulp
#
Um Live-Patching für eine Anwendung zu aktivieren, müssen Sie die Bibliothek libpulp.so.0
beim Starten der Anwendung vorladen:
>
LD_PRELOAD=/usr/lib64/libpulp.so.0 APPLICATION_CMD
12.1.3.1 Prüfen, ob Live-Patching für eine Bibliothek möglich ist #
Prüfen Sie mit dem folgenden Kommando, ob Live-Patching für eine Bibliothek möglich ist:
>
ulp livepatchable PATH_TO_LIBRARY
12.1.3.2 Prüfen, ob eine .so
-Datei ein Live-Patch-Container ist #
Ein gemeinsam genutztes Objekt (.so
) ist ein Live-Patch-Container, wenn es die ULP-Patch-Beschreibung enthält. Sie können dies mit dem folgenden Kommando überprüfen:
>
readelf -S SHARED_OBJECT | grep .ulp
Wenn die Ausgabe zeigt, dass das gemeinsam genutzte Objekt die Abschnitte .ulp
und .ulp.rev
enthält, handelt es sich um einen aktiven Patch-Container.
12.1.3.3 Anwenden von Live-Patches #
Live-Patches werden mit dem Kommando ulp trigger
angewendet, beispielsweise:
>
ulp trigger -p PID LIVEPATCH.so
Ersetzen Sie PID
durch die Prozess-ID des laufenden Prozesses, der die Bibliothek verwendet, auf die ein Patch angewendet werden soll. Ersetzen Sie LIVEPATCH.so
durch die entsprechende Live-Patch-Datei. Das Kommando gibt eine der folgenden Statusmeldungen zurück:
- ERFOLG
Der Live-Patching-Vorgang war erfolgreich.
- ÜBERSPRUNGEN
Der Patch wurde übersprungen, da er nicht für eine Bibliothek konzipiert wurde, die bei diesem Prozess geladen wird.
- FEHLER
Es ist ein Fehler aufgetreten. Weitere Informationen erhalten Sie im internen Nachrichtenpuffer von
libpulp
. Weitere Informationen zu diesem Thema finden Sie unter Abschnitt 12.1.3.6, „Anzeigen der internen Nachrichtenwarteschlange“.
Es ist auch möglich, mehrere Live-Patches anzuwenden, indem Sie z. B. Platzhalter verwenden:
>
ulp trigger '*.so'
Das Kommando versucht, jeden Patch im aktuellen Ordner auf jeden Prozess anzuwenden, der die Bibliothek libpulp
geladen hat. Wenn der Patch nicht für den Prozess geeignet ist, wird er automatisch übersprungen. Am Ende zeigt das Werkzeug an, wie viele Patches es erfolgreich auf wie viele Prozesse angewendet hat.
12.1.3.4 Zurücksetzen von Live-Patches #
Mit dem Kommando ulp trigger
können Sie Live-Patches zurücksetzen. Für das Zurücksetzen von Live-Patches stehen zwei Möglichkeiten zur Auswahl. Sie können einen Live-Patch zurücksetzen, indem Sie den Schalter --revert
verwenden und den Live-Patch-Container übergeben:
>
ulp trigger -p PID --revert LIVEPATCH.so
Alternativ können Sie alle Patches einer bestimmten Bibliothek entfernen, beispielsweise:
>
ulp trigger -p PID --revert-all=LIBRARY
In dem Beispiel steht LIBRARY für die entsprechende Bibliothek, beispielsweise für libcrypto.so.1.1
.
Der letztgenannte Ansatz kann nützlich sein, wenn der Quellcode des ursprünglichen Live-Patches nicht verfügbar ist. Sie können diesen Ansatz auch verwenden, wenn Sie einen bestimmten alten Patch entfernen und einen neuen anwenden möchten, während die Zielanwendung noch einen sicheren Code ausführt, beispielsweise:
>
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.so
12.1.3.5 Anzeigen angewendeter Patches #
Mit dem folgenden Kommando können Sie überprüfen, auf welche Anwendungen Live-Patches angewendet wurden:
>
ulp patches
Die Ausgabe zeigt, bei welchen Bibliotheken Live-Patching möglich ist und welche Patches in Programmen geladen sind sowie welche Fehler der Patch behebt:
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:
Sie können auch feststellen, welche Funktionen durch den Live-Patch gepatcht werden:
>
ulp dump LIVEPATCH.so
12.1.3.6 Anzeigen der internen Nachrichtenwarteschlange #
Protokollmeldungen von libpulp.so
werden in einem Puffer innerhalb der Bibliothek gespeichert und nur auf Anfrage des Benutzers angezeigt. Um diese Meldungen anzuzeigen, führen Sie Folgendes aus:
>
ulp messages -p PID
12.2 Weitere Informationen #
Weitere Informationen zu libpulp
finden Sie im Git
repository des Projekts.