Was sich geändert hat, ist, dass es /bin/sh
entweder wurde bash
oder blieb, dash
was eine zusätzliche Flagge erhielt -p
, die das Verhalten von Bash nachahmt.
Für Bash muss das -p
Flag die Setuid-Berechtigung nicht löschen, wie in der Manpage erläutert :
Wenn die Shell mit einer effektiven Benutzer- (Gruppen-) ID gestartet wird, die nicht der tatsächlichen Benutzer- (Gruppen-) ID entspricht, und die Option -p nicht angegeben wird, werden keine Startdateien gelesen, Shell-Funktionen werden nicht von der Umgebung, den SHELLOPTS, geerbt Die Variablen BASHOPTS, CDPATH und GLOBIGNORE werden ignoriert, wenn sie in der Umgebung angezeigt werden, und die effektive Benutzer-ID wird auf die tatsächliche Benutzer-ID festgelegt . Wenn die Option -p beim Aufruf angegeben wird, ist das Startverhalten dasselbe, aber die effektive Benutzer-ID wird nicht zurückgesetzt.
Vorher war dash
das egal und erlaubte die Ausführung von Setuid (indem nichts unternommen wurde, um dies zu verhindern). Auf der dash
Manpage von Ubuntu 16.04 ist jedoch eine zusätzliche Option beschrieben, ähnlich wie bash
:
-p priv
Versuchen Sie nicht, die effektive UID zurückzusetzen, wenn sie nicht mit der UID übereinstimmt. Dies ist nicht standardmäßig festgelegt, um eine falsche Verwendung durch setuid-Root-Programme über System (3) oder Popen (3) zu vermeiden .
Diese Option gab es weder im Upstream (der möglicherweise nicht auf einen vorgeschlagenen Patch * reagiert hat ) noch in Debian 9, sondern in Debian Buster, der den Patch seit 2018 erhalten hat.
HINWEIS: wie von Stéphane Chazelas erklärt, es ist zu spät zum Aufruf "/bin/sh -p"
in system()
da system()
läuft alles gegeben durch /bin/sh
und so die setuid ist bereits gesunken. Die Antwort von derobert erklärt im vorherigen Code, wie damit umzugehen istsystem()
.
* mehr Details zur Geschichte hier und da .
system("bash -p")
läuftsh -c "bash -p"
so haben die Privilegien bereits fallen gelassen worden , wennbash
ausgeführt wird.