12 Userspace-Live-Patching #
Dieses Kapitel beschreibt die Grundprinzipien und die Verwendung von Userspace-Live-Patching.
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 libpulp.so
-Bibliothek und der ulp
-Binärdatei besteht, die dafür sorgt, dass Bibliotheken live gepatcht werden können, und Live-Patches anwendet.
Sie können den Befehl 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, installieren Sie die beiden 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 Befehl, 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 Befehl überprüfen:
>
readelf -S SHARED_OBJECT | grep .ulp
Wenn die Ausgabe zeigt, dass das gemeinsam genutzte Objekt sowohl als den Abschnitt .ulp
als auch .ulp.rev
enthält, handelt es sich um einen Live-Patch-Container.
12.1.3.3 Anwenden von Live-Patches #
Live-Patches werden mit dem Befehl ulp trigger
angewendet, beispielsweise:
>
ulp trigger -p PID LIVEPATCH.so
Ersetzen Sie PID
durch die Prozess-ID des laufenden Prozesses, der die zu patchende Bibliothek verwendet, und LIVEPATCH.so
durch die tatsächliche Live-Patch-Datei. Der Befehl 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 und Sie können weitere Informationen abrufen, indem Sie den internen
libpulp
-Nachrichtenpuffer prüfen. 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'
Der Befehl 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 Befehl 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. Oder Sie möchten einen bestimmten alten Patch entfernen und einen neuen anwenden, während die Zielanwendung weiterhin einen sicheren Code ausführt, z. B.:
>
ulp trigger -p PID --revert-all=libcrypto.so.1.1 new_livepatch2.so
12.1.3.5 Anzeigen angewendeter Patches #
Mit dem folgenden Befehl können Sie überprüfen, auf welche Anwendungen Live-Patches angewendet wurden:
>
ulp patches
Die Ausgabe zeigt, welche Bibliotheken live gepatcht werden können und welche Patches in Programme geladen werden und welche Fehler die Patches beheben:
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 angezeigt, wenn der Benutzer dies anfordert. 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.