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.system()
mit erhöhten Privilegien machen wollen (wassetresuid()
natürlich nicht der Fall sein sollte), machen am Ende ein Vorher, was viel schlimmer ist, da die Shell dann nicht weiß, dass es suid ist, also nicht Aktivieren Sie den Modus, in dem es seiner Umgebung nicht vertraut.Wahrscheinlich ändert die Shell aus irgendeinem Grund ihre effektive Benutzer-ID im Rahmen ihres Startvorgangs wieder in die tatsächliche Benutzer-ID. Sie können dies überprüfen, indem Sie Folgendes hinzufügen:
vor deinem
system()
. (Selbst unter Linux müssen Sie wahrscheinlich nur die echten festlegen. Die gespeicherten sollten in Ordnung sein, um sie in Ruhe zu lassen. Dies ist nur brutale Gewalt zum Debuggen. Je nachdem, warum Sie die Set-ID verwenden, müssen Sie diese möglicherweise natürlich verwenden um die echten IDs auch irgendwo zu speichern.)[Wenn dies nicht nur eine Übung ist, in der Sie lernen, wie Setid funktioniert, gibt es viele Sicherheitsprobleme, über die Sie sich Sorgen machen müssen, insbesondere beim Aufrufen einer Shell. Es gibt beispielsweise viele Umgebungsvariablen, die das Verhalten der Shell beeinflussen. Bevorzugen Sie einen bereits bestehenden Ansatz,
sudo
wenn dies überhaupt möglich ist.]quelle