Der Aufruf eines Skripts aus einem setuid root C-Programm - Skript nicht als root ausgeführt wird

StackOverflow https://stackoverflow.com/questions/556194

  •  05-09-2019
  •  | 
  •  

Frage

Ich brauche einen Bash-Skript als root (passwordless sudo oder su nicht lebensfähig) laufen und da Sie keinen Skript in Linux setuid können, dachte ich darüber von einer ausführbaren Datei aufrufen und macht es setuid:

$ cat wrapper.c
int main(void)
{
        system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$

Das funktioniert - wie in das Skript läuft richtig -. Aber das Skript ausgeführt wird, wenn der Benutzer die „./wrapper“

führt

Warum? Und wie man diese richtig umsetzen?

Danke!

War es hilfreich?

Lösung

Da die suid Bit auf ausführbare Dateien ändert sich nur die effektive UID (EUID) die ausführbare Datei ausgeführt werden soll, wie, und nicht die reale UID (RUID), die Renditen getuid(), und zusätzlich zur Beschränkung suid Skripten interpretiert (ausführbare Dateien, beginnend mit „#!“), einige Shells wie bash als zusätzliche Sicherheitsmaßnahme wird die EUID zurück zum RUID in diesem Fall festgelegt, müssen Sie den Anruf setuid(0) im C-Code verwenden, bevor das Skript ausgeführt wird.

Sehen Sie man Seiten des setuid, seteuid, getuid und geteuid die genaue Semantik der realen und effektive UIDs zu lernen.

( WARNING ) Natürlich ist dies eine geeignete Stelle zu erwähnen, dass die Beschränkung auf suid Skripte in vielen Unix-Systemen, Muscheln und Dolmetschern, ist es für einen Grund, das ist, dass, wenn das Skript nicht sehr vorsichtig über seinen Eingang Hygienisierung und den Zustand der Umwelt ist, wenn es ausgeführt wird, sind sie gefährlich und für die Sicherheit Eskalation genutzt werden können. So sehr vorsichtig sein, wenn dies zu tun. Stellen Sie den Zugriff auf Ihr Skript und Wrapper so streng wie möglich, lassen Sie nur diese sehr spezifische Skript, das Sie ausgeführt werden mögen, und deaktivieren Sie die Umgebung in Ihrem C-Programm, bevor das Skript starten, Umgebungsvariablen wie PATH enthalten genau das, was in der richtigen Reihenfolge und keine Verzeichnisse notwendig ist, die anderen beschreibbar sind.

Andere Tipps

Eine andere Sache zu beachten ist hier, dass die Begrenzung hier von bash und nicht die * nix-System selbst. Bash tatsächlich Prüfungen auf SUID Skripte machen sie nur mit EUID root ausführen. Wenn Sie ältere Schalen nehmen, werden Sie oft bekommen, was Sie aus dem Kasten heraus wollte. Zum Beispiel ist sh nicht diese Art von Prüfungen machen:

$ cat wrapper.c
int main(void)
{
            system("/bin/sh -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:15 wrapper
$ ./wrapper
root

Mit bash:

$ cat wrapper.c
int main(void)
{
            system("/bin/bash -c whoami");
}

$ ls -l wrapper
-rwsr-sr-x 1 root users 8887 Feb 17 14:18 wrapper
$ ./wrapper
skinp

Still, Tom Antwort ist in der Regel die Art und Weise zur Herstellung eines Wrapper für SUID root Programme zu gehen

Fügen Sie die setuid (0) im Skript und kompiliert. Es soll danach arbeiten.

$ cat wrapper.c 
int main(void) 
{ 
        setuid(0);
        system("/bin/bash ./should_run_as_root.sh"); 
} 
$ gcc -o wrapper wrapper.c 
$ sudo chown root wrapper 
$ sudo chmod ug+s wrapper 
$ ll wrapper 
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper 
$ 

Die Beispiele sind schrecklich unsicher und erlaubt es jedem, mit zwei Bits von Wissen jedes Programm sie wollen als setuid Benutzer ausgeführt werden.

Sie nie durch eine Schale gehen, wenn Sie die Umgebung zuerst sanieren, sind die meisten Beispiele hier verwundbar gezeigt zu haben, IFS und PATH gesetzt, bevor es ausgeführt wird.

Warum ist sudo nicht lebensfähig? Es vermeidet Sicherheitslücken tobt wie:

bash-3.2$ cat test
#!/bin/bash
echo ima shell script durp durp
bash-3.2$ chmod +x test
bash-3.2$ ./test
heh heh
bash-3.2$ 

Durch die Umwelt nicht ausreichend bereinigt wird, zum Beispiel in diesem Fall:

export echo='() { builtin echo heh heh; }'

sudo reinigt diesen Fall, und vielleicht auch andere Grenzfälle und gotchas, die gut nicht in einen benutzerdefinierten suid Wrapper zu schreiben wären.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top