Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
documentation.suse.com / SUSE Linux Enterprise Desktop-Dokumentation / Verwaltungshandbuch / Häufige Tasks / Userspace-Live-Patching
Gilt für SUSE Linux Enterprise Desktop 15 SP6

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.

Tipp
Tipp

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-tools
  • Anwendungen 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 von libpulp.

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.