Eine kritische Schwachstelle in PolKit, die root-Zugriff in den meisten Linux-Distributionen ermöglicht.

Das Unternehmen Qualys hat eine Schwachstelle (CVE-2021-4034) im Systemkomponent Polkit (ehemals PolicyKit) entdeckt, die in Distributionen verwendet wird, um die AusfĂŒhrung von Aktionen, die erhöhte Berechtigungen erfordern, durch unprivilegierte Benutzer zu organisieren. Die Schwachstelle ermöglicht es einem unprivilegierten lokalen Benutzer, seine Berechtigungen auf den root-Benutzer zu erhöhen und die volle Kontrolle ĂŒber das System zu erlangen. Das Problem wurde unter dem Code-Namen PwnKit bekannt und ist bemerkenswert, weil ein funktionierender Exploit in den meisten Linux-Distributionen mit den Standardeinstellungen vorbereitet wurde.

Das Problem tritt in dem zu PolKit gehörenden Dienstprogramm pkexec auf, das mit dem SUID root-Flag geliefert wird und dafĂŒr gedacht ist, Befehle mit den Berechtigungen eines anderen Benutzers gemĂ€ĂŸ den festgelegten PolKit-Regeln auszufĂŒhren. Aufgrund der fehlerhaften Verarbeitung der an pkexec ĂŒbergebenen Argumente der Befehlszeile konnte ein unprivilegierter Benutzer die Authentifizierung umgehen und seinen Code mit root-Rechten ausfĂŒhren, unabhĂ€ngig von den festgelegten Zugriffsrichtlinien. FĂŒr einen Angriff sind die Einstellungen und EinschrĂ€nkungen in PolKit nicht relevant, es genĂŒgt, dass die ausfĂŒhrbare Datei des pkexec-Dienstprogramms mit dem SUID root-Flag versehen ist.

Pkexec ĂŒberprĂŒft die GĂŒltigkeit des ZĂ€hlers der Befehlszeilenargumente (argc), die beim Start des Prozesses ĂŒbergeben werden, nicht. Die Entwickler von pkexec gingen davon aus, dass der erste Eintrag im Array argv immer den Namen des Prozesses (pkexec) enthĂ€lt und der zweite entweder NULL oder den Namen des ĂŒber pkexec gestarteten Befehls. Da der ArgumentezĂ€hler nicht auf das tatsĂ€chliche Inhalt des Arrays ĂŒberprĂŒft wurde und angenommen wurde, dass er immer grĂ¶ĂŸer als 1 ist, fĂŒhrte die Übergabe eines leeren argv-Arrays an den Prozess, was die Funktion execve in Linux zulĂ€sst, dazu, dass pkexec NULL als erstes Argument (Prozessname) interpretierte und den nachfolgend außerhalb des Puffers liegenden Speicher als folgenden Inhalt des Arrays. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | 
 | argv[argc] | envp[0] | envp[1] | 
 | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «programm» «-option» NULL «wert» «PATH=name» NULL

Das Problem ist, dass direkt nach dem Array argv im Speicher das Array envp gespeichert ist, das Umgebungsvariablen enthĂ€lt. Daher extrahiert pkexec bei einem leeren Array argv die Informationen zum mit erhöhten Rechten ausgefĂŒhrten Befehl aus dem ersten Element des Arrays mit Umgebungsvariablen (argv[1] wird identisch mit envp[0]), dessen Inhalt der Angreifer kontrollieren kann.

Nachdem pkexec den Wert von argv[1] erhalten hat, versucht es, basierend auf den Dateipfaden in PATH den vollstĂ€ndigen Pfad zur ausfĂŒhrbaren Datei zu bestimmen und den Zeiger auf die Zeichenfolge mit dem vollstĂ€ndigen Pfad zurĂŒck in argv[1] zu schreiben, was zur Überschreibung des Wertes der ersten Umgebungsvariablen fĂŒhrt, da argv[1] identisch mit envp[0] ist. Durch Manipulation des Namens der ersten Umgebungsvariablen kann der Angreifer eine andere Umgebungsvariable in pkexec einfĂŒgen, beispielsweise die Umgebungsvariable 'LD_PRELOAD', die in suid-Programmen nicht zulĂ€ssig ist, und somit das Laden seiner eigenen Shared Library im Prozess organisieren.

Im funktionierenden Exploit wird die Variable GCONV_PATH eingefĂŒgt, 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 der Angreifer erreichen, dass nicht die Standardbibliothek iconv, sondern seine eigene Bibliothek geladen wird, deren Handler wĂ€hrend der Fehlermeldungsausgabe ausgefĂŒhrt werden, wĂ€hrend pkexec noch mit root-Rechten lĂ€uft und vor der BerechtigungsprĂŒfung.

Es wird festgestellt, dass, obwohl das Problem durch einen Speicherschaden verursacht wird, es zuverlĂ€ssig und reproduzierbar unabhĂ€ngig von der verwendeten Hardware-Architektur ausgebeutet werden kann. Der vorbereitete Exploit wurde erfolgreich unter Ubuntu, Debian, Fedora und CentOS getestet, kann aber auch in anderen Distributionen verwendet werden. Der originale Exploit ist derzeit nicht öffentlich verfĂŒgbar, was darauf hinweist, dass er trivial ist und leicht von anderen Forschern reproduziert werden kann; daher ist es wichtig, in Mehrbenutzersystemen so schnell wie möglich das Update mit dem Patch zu installieren. Polkit ist auch fĂŒr BSD-Systeme und Solaris verfĂŒgbar, aber die Möglichkeit einer Ausnutzung dort wurde nicht untersucht. Bekannt ist nur, dass der Angriff in OpenBSD nicht durchgefĂŒhrt werden kann, da der OpenBSD-Kernel die Übertragung eines Nullwerts fĂŒr argc 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 Schwachstelle in PolKit ist derzeit als Patch verfĂŒgbar (ein korrigierendes Release wurde nicht erstellt), aber da die Entwickler der Distributionen im Voraus ĂŒ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
60GB SSD 8Gb DDR4