Kritische Sicherheitslücke in PolKit, die Root-Zugriff auf die meisten Linux-Distributionen ermöglicht

Qualys hat eine Schwachstelle (CVE-2021-4034) in der Systemkomponente Polkit (ehemals PolicyKit) identifiziert, die in Distributionen verwendet wird, um unprivilegierten Benutzern die Durchführung von Aktionen zu ermöglichen, die erhöhte Zugriffsrechte erfordern. Die Sicherheitslücke ermöglicht es einem unprivilegierten lokalen Benutzer, seine Rechte auf Root auszuweiten und die volle Kontrolle über das System zu erlangen. Das Problem trug den Codenamen PwnKit und zeichnet sich dadurch aus, dass es einen funktionierenden Exploit erzeugt, der in der Standardkonfiguration auf den meisten Linux-Distributionen läuft.

Das Problem tritt im Dienstprogramm pkexec von PolKit auf, das mit dem SUID-Root-Flag ausgestattet ist und darauf ausgelegt ist, Befehle mit den Berechtigungen eines anderen Benutzers gemäß den angegebenen PolKit-Regeln auszuführen. Aufgrund der falschen Handhabung der an pkexec übergebenen Befehlszeilenargumente könnte ein unprivilegierter Benutzer die Authentifizierung umgehen und dazu führen, dass sein Code unabhängig von den festgelegten Zugriffsregeln als Root ausgeführt wird. Für einen Angriff spielt es keine Rolle, welche Einstellungen und Einschränkungen in PolKit festgelegt sind. Es reicht aus, dass das SUID-Root-Attribut für die ausführbare Datei mit dem Dienstprogramm pkexec festgelegt wird.

Pkexec überprüft nicht die Gültigkeit des beim Starten eines Prozesses übergebenen Befehlszeilenargumentzählers (argc). Die Entwickler von pkexec gingen davon aus, dass der erste Eintrag im argv-Array immer den Namen des Prozesses (pkexec) enthält und der zweite entweder einen NULL-Wert oder den Namen des über pkexec gestarteten Befehls. Da die Anzahl der Argumente nicht mit dem tatsächlichen Inhalt des Arrays verglichen wurde und davon ausgegangen wurde, dass sie immer größer als 1 ist, würde pkexec NULL als erstes Argument behandeln, wenn einem Prozess ein leeres argv-Array übergeben würde, wie es die Linux-Execve-Funktion zulässt ( der Prozessname) und der nächste als außerhalb des Pufferspeichers, wie der nachfolgende Inhalt des Arrays. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV „Programm“ „-Option“ NULL „Wert“ „PFAD=Name“ NULL

Das Problem besteht darin, dass nach dem argv-Array ein envp-Array im Speicher vorhanden ist, das Umgebungsvariablen enthält. Wenn das argv-Array also leer ist, extrahiert pkexec Daten über die Befehlsausführung mit erhöhten Rechten aus dem ersten Element des Arrays mit Umgebungsvariablen (argv[1] wurde identisch mit envp[0]), deren Inhalte gesteuert werden können durch den Angreifer.

Nachdem pkexec den Wert von argv[1] erhalten hat, versucht es unter Berücksichtigung der Dateipfade in PATH den vollständigen Pfad zur ausführbaren Datei zu ermitteln und schreibt einen Zeiger auf die Zeichenfolge mit dem vollständigen Pfad zurück zu argv[1], was führt zum Überschreiben des Werts der ersten Umgebungsvariablen, da argv[1] identisch mit envp[0] ist. Durch Manipulation des Namens der ersten Umgebungsvariablen kann ein Angreifer eine andere Umgebungsvariable in pkexec ersetzen, beispielsweise die Umgebungsvariable „LD_PRELOAD“, die in suid-Programmen nicht zulässig ist, und dafür sorgen, dass ihre gemeinsam genutzte Bibliothek in pkexec geladen wird Verfahren.

Der funktionierende Exploit beinhaltet das Ersetzen der Variablen GCONV_PATH, die zur Bestimmung des Pfads zur Symboltranskodierungsbibliothek verwendet wird, die beim Aufruf der Funktion g_printerr() dynamisch geladen wird, deren Code iconv_open() verwendet. Durch die Neudefinition des Pfads in GCONV_PATH kann ein Angreifer sicherstellen, dass nicht die Standard-Iconv-Bibliothek geladen wird, sondern eine eigene Bibliothek, deren Handler ausgeführt werden, wenn eine Fehlermeldung angezeigt wird, während pkexec noch läuft Root-Rechte und Vor-Start-Berechtigungen werden überprüft.

Es wird darauf hingewiesen, dass das Problem trotz der Tatsache, dass es sich um eine Speicherbeschädigung handelt, unabhängig von der verwendeten Hardwarearchitektur zuverlässig und wiederholt ausgenutzt werden kann. Der vorbereitete Exploit wurde erfolgreich auf Ubuntu, Debian, Fedora und CentOS getestet, kann aber auch auf anderen Distributionen eingesetzt werden. Der ursprüngliche Exploit ist noch nicht öffentlich verfügbar, was darauf hindeutet, dass er trivial ist und von anderen Forschern leicht nachgebildet werden kann. Daher ist es wichtig, das Patch-Update so schnell wie möglich auf Mehrbenutzersystemen zu installieren. Polkit ist auch für BSD-Systeme und Solaris verfügbar, wurde jedoch nicht für den Einsatz darauf untersucht. Bekannt ist, dass der Angriff nicht auf OpenBSD durchgeführt werden kann, da der OpenBSD-Kernel die Übergabe eines Null-Argc-Werts beim Aufruf von execve() nicht zulässt.

Das Problem besteht seit Mai 2009, seit der Einführung des Befehls pkexec. Der Fix für die PolKit-Schwachstelle ist derzeit als Patch verfügbar (es wurde kein Patch-Release veröffentlicht), aber da die Distributionsentwickler im Voraus über das Problem informiert wurden, veröffentlichten die meisten Distributionen das Update gleichzeitig mit der Offenlegung von Informationen über die Schwachstelle. Das Problem wurde in RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux und Manjaro behoben. Als vorübergehende Maßnahme zur Blockierung der Schwachstelle können Sie das SUID-Root-Flag aus dem Programm /usr/bin/pkexec („chmod 0755 /usr/bin/pkexec“) entfernen.



Source: opennet.ru

Kommentar hinzufügen