Das Unternehmen Qualys hat eine SicherheitsanfĂ€lligkeit (CVE-2021-4034) im Systemkomponenten Polkit (ehemals PolicyKit) entdeckt, die in Distributionen verwendet wird, um unprivilegierten Benutzern die AusfĂŒhrung von Aktionen, die erhöhte Berechtigungen erfordern, zu ermöglichen. Die SicherheitsanfĂ€lligkeit ermöglicht es einem unprivilegierten lokalen Benutzer, seine Berechtigungen bis zum Root-Benutzer zu erhöhen und somit die vollstĂ€ndige Kontrolle ĂŒber das System zu erlangen. Das Problem trĂ€gt den Codenamen PwnKit und ist bemerkenswert, da ein funktionierender Exploit bereitgestellt wurde, der in der Standardkonfiguration der meisten Linux-Distributionen funktioniert.
Das Problem betrifft das PolKit-Utility pkexec, das mit dem SUID root-Flag geliefert wird und zum AusfĂŒhren von Befehlen mit den Berechtigungen eines anderen Benutzers gemÀà den festgelegten PolKit-Regeln vorgesehen ist. Aufgrund einer fehlerhaften Verarbeitung der ĂŒbergebenen Befehlszeilenargumente konnte ein nicht privilegierter Benutzer die Authentifizierung umgehen und seinen Code mit root-Rechten ausfĂŒhren, unabhĂ€ngig von den festgelegten ZugriffsbeschrĂ€nkungen. FĂŒr den Angriff sind die Einstellungen und EinschrĂ€nkungen in PolKit unerheblich, es genĂŒgt, dass die ausfĂŒhrbare Datei des pkexec-Utilities das SUID root-Flag gesetzt hat.
Pkexec ĂŒberprĂŒft nicht die Korrektheit des ZĂ€hlers der Befehlszeilenargumente (argc), die beim Starten eines Prozesses ĂŒbergeben werden. Die Entwickler von pkexec gingen davon aus, dass der erste Eintrag des argv-Arrays immer den Namen des Prozesses (pkexec) enthĂ€lt, wĂ€hrend der zweite entweder NULL oder den Namen des ĂŒber pkexec auszufĂŒhrenden Befehls enthĂ€lt. Da der ZĂ€hler der Argumente nicht auf die tatsĂ€chlichen Inhalte des Arrays ĂŒberprĂŒft wurde und davon ausgegangen wurde, dass er immer gröĂer als 1 ist, fĂŒhrte das Ăbergeben eines leeren argv-Arrays an den Prozess, was die Funktion execve in Linux zulĂ€sst, dazu, dass pkexec NULL als erstes Argument (Prozessname) und den darauf folgenden Speicher auĂerhalb des Puffers als weitere Inhalte des Arrays interpretiert. |âââ+âââ+ââ+ââââ|âââ+âââ+ââ+ââââ| | argv[0] | argv[1] | ⊠| argv[argc] | envp[0] | envp[1] | ⊠| envp[envc] | |â-|â-+â-|â-+ââ+ââ|ââ|â-|â-+â-|â-+ââ+ââ|ââ| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL
Das Problem ist, dass direkt nach dem argv-Array im Speicher ein envp-Array folgt, das Umgebungsvariablen enthĂ€lt. Somit extrahiert pkexec bei einem leeren argv-Array die Informationen ĂŒber den Befehl mit erhöhten Berechtigungen aus dem ersten Element des Umgebungsvariablen-Arrays (argv[1] wird identisch zu envp[0]), dessen Inhalt von einem Angreifer kontrolliert werden kann.
Nachdem pkexec den Wert von argv[1] erhalten hat, versucht es, unter BerĂŒcksichtigung der Dateipfade im PATH den vollstĂ€ndigen Pfad zur ausfĂŒhrbaren Datei zu bestimmen und den entsprechenden Zeiger auf die vollstĂ€ndige Pfadzeichenfolge zurĂŒck in argv[1] zu schreiben, was dazu fĂŒhrt, dass der Wert der ersten Umgebungsvariablen ĂŒberschrieben wird, da argv[1] identisch mit envp[0] ist. Durch Manipulation des Namens der ersten Umgebungsvariablen kann ein Angreifer eine andere Umgebungsvariable in pkexec einschleusen, beispielsweise die Umgebungsvariable âLD_PRELOADâ, die in suid-Programmen nicht erlaubt ist, und so das Laden seiner eigenen Shared Library in den Prozess organisieren.
Im Arbeits-Exploit wird die Variable GCONV_PATH gesetzt, die verwendet wird, um den Pfad zur Zeichenkodierungsbibliothek zu bestimmen, die dynamisch beim Aufruf der Funktion g_printerr() geladen wird, in deren Code iconv_open() verwendet wird. Indem der Pfad in GCONV_PATH ĂŒberschrieben wird, kann ein Angreifer bewirken, dass nicht die standardmĂ€Ăige iconv-Bibliothek, sondern seine eigene Bibliothek geladen wird, deren Handler wĂ€hrend der Ausgabe einer Fehlermeldung ausgefĂŒhrt werden, wĂ€hrend pkexec noch mit Root-Rechten lĂ€uft und bevor die Berechtigungen geprĂŒft werden.
Es wird berichtet, dass das Problem trotz eines Speicherschadens zuverlĂ€ssig und reproduzierbar unabhĂ€ngig von der verwendeten Hardwarearchitektur betrieben werden kann. Der vorbereitete Exploit wurde erfolgreich unter Ubuntu, Debian, Fedora und CentOS getestet, kann jedoch auch in anderen Distributionen verwendet werden. Der originale Exploit ist derzeit nicht öffentlich verfĂŒgbar, was darauf hindeutet, dass er trivial ist und von anderen Forschern leicht reproduziert werden kann. Deshalb ist es wichtig, dass auf Mehrbenutzersystemen so schnell wie möglich ein Update mit einem Patch installiert wird. Polkit ist auch fĂŒr BSD-Systeme und Solaris verfĂŒgbar, jedoch wurde die Möglichkeit einer Ausnutzung in diesen Systemen nicht untersucht. Bekannt ist nur, dass ein Angriff in OpenBSD nicht durchgefĂŒhrt werden kann, da der OpenBSD-Kernel die Ăbertragung eines null-Wertes fĂŒr argc bei einem execve()-Aufruf nicht zulĂ€sst.
Das Problem besteht seit Mai 2009, seit der EinfĂŒhrung des pkexec-Befehls. Der Fix fĂŒr die PolKit-Schwachstelle ist derzeit als Patch verfĂŒgbar (ein regulĂ€res Release wurde nicht erstellt). Da die Entwickler der Distributionen vorab ĂŒber das Problem informiert wurden, haben die meisten Distributionen ein Update gleichzeitig mit der Offenlegung der Schwachstelle veröffentlicht. 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 kann das SUID-Root-Flag von dem Programm /usr/bin/pkexec entfernt werden ("chmod 0755 /usr/bin/pkexec").
Quelle: opennet.ru
