Warum funktioniert setuid nicht mit ausführbaren Dateien?

9

Ich weiß, dass das Aktivieren von setuid für Skripte Sicherheitsprobleme hat und daher standardmäßig inaktiv ist, aber ich erwarte, dass es für ausführbare Dateien funktioniert. Ich habe eine ausführbare Datei erstellt, die uid als Ausgabe anzeigt. Befolgen Sie dazu die in diesem Beitrag beschriebenen Anweisungen: Erlauben Sie setuid für Shell-Skripte

Es wird jedoch vor und nach dem Ausführen dieselbe UID (1000) zurückgegeben sudo chmod +s ./setuid-test. Ich denke, dies bedeutet, dass setuid keine Auswirkungen auf meine ausführbare Datei hat. Warum und wie lösen?

Der Quellcode:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

Gebaut und betrieben mit

$ gcc -o setuid-test setuid-test.c
$ ./setuid-test
1000
$ sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
$ ./setuid-test
1000

Beim Laufen ls -labekomme ich Folgendes:

me@me:~$ ls -la setuid-test
-rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP-Lernender
quelle
2
Gehört die ausführbare Datei einem anderen Benutzer als dem, als den Sie sie ausführen? (setuid bedeutet nicht, zu root zu wechseln; es bedeutet, zu dem Benutzer zu wechseln, dem die ausführbare Datei gehört.)
cjm
PHPLearner Ich denke, Sie müssen eine Gruppe / einen Benutzer einbeziehen, um die SUID einer Datei zu ändern
Ryekayo
@cjm me@me:~$ ls -la setuid-test---- kehrt zurück -----rwsrwsr-x 1 nobody me 8572 Aug 19 16:39 setuid-test
PHP Learner
7
Ihr Programm funktioniert auf meinem Ubuntu 14.04-System wie erwartet, wenn es sich in meinem Home-Verzeichnis befindet, aber nicht, wenn es sich in / tmp befindet, da die zum Mounten von / tmp verwendeten Parameter setuid-Programme verbieten. Wo befindet sich Ihr Programm?
Mark Plotnick
2
Geben Sie dann df .das Verzeichnis ein, um den Einhängepunkt zu finden mount | grep nameofmountpoint. Ist dort eine nosuidFlagge aufgeführt?
Mark Plotnick

Antworten:

10

Die meisten für Unix / Linux entwickelten Dateisysteme können mit einem nosuidAttribut bereitgestellt werden, das verhindert, dass Setuid- oder Setgid-Binärdateien auf diesen Dateisystemen die effektive UID oder GID eines Prozesses ändern. Es wird häufig verwendet, wenn "nicht vertrauenswürdige" Dateisysteme bereitgestellt werden, die von einem Nicht-Administrator gesteuert werden.

In Ihrem Fall ist das von Ihnen verwendete Dateisystem der Typ ecryptfs, der laut askubuntu: Fehler beim Ausführen von Binärdateien mit root setuid im verschlüsselten Ausgangsverzeichnis nosuid (und nodev) automatisch erzwingt, beginnend mit den Versionen von vor einigen Jahren.

Hier finden Sie eine Beschreibung des Grundes für die Änderung unter https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3409 :

Vincent Danen 2012-07-20 11:25:56 EDT
Es wurde berichtet, dass der private ecryptfs-Mount-Helfer (/sbin/mount.ecryptfs_private), der setuid-root ist, einem nicht privilegierten lokalen Benutzer das Mounten benutzergesteuerter ecryptfs-Freigaben ermöglichen könnte auf dem lokalen System. Da der ecryptfs-Helfer keine Dateisysteme mit den Flags "nosuid" und "nodev" bereitstellt, kann ein Benutzer ein Dateisystem bereitstellen, das Setuid-Root-Binärdateien und / oder Gerätedateien enthält, die zur Eskalation ihrer Berechtigungen führen können. Dies kann über ein USB-Gerät erfolgen, wenn der Benutzer physischen Zugriff auf das System hat.
... Das
Erzwingen von MS_NOSUID- und MS_NODEV-Mount-Flags wurde zu Version 99 hinzugefügt.

Mark Plotnick
quelle
Wenn das System einem Benutzer erlauben würde, ein Dateisystem bereitzustellen, das setuid erlaubt, wäre es trivial, root zu werden. 1) Erstellen Sie eine ausführbare Datei 2) an anderer Stelle chown root, chmod +s3) Mounten Sie sie 4) Führen Sie eine ausführbare Datei aus
Strg-Alt-Delor
1

SetUID Bit auf ausführbare ermöglicht bei Datei ausführbar ausführen Besitzer (nicht Superuser). Führen Sie Folgendes aus, um die ausführbare Datei als root ausführen zu können:

sudo chown 0:0 ./setuid-test
hon
quelle
Sicher, aber das ist nicht das Problem. Es ist möglich, ein Programm zu haben, das für einen anderen Benutzer als root festgelegt ist. In dem Szenario in der Frage setuid-testsollte nobodydie UID angezeigt werden .
Gilles 'SO - hör auf böse zu sein'
@ Gilles Du hast recht. Ich erwarte, dass Setuid-Test nicht angezeigt nobodywirdroot
PHP Learner
"SetUID-Bit auf ausführbarer Datei ermöglicht es, ausführbare Datei beim Dateieigentümer auszuführen" und mein Dateibesitzer ist nobody, daher erwarte ich eine 65534Gegenleistung, aber ich sehe, 1000wer auch immer der Eigentümer ist!
PHP Learner
2
Überprüfen Sie die Mount-Optionen des Dateisystems, auf dem Ihr Testprogramm ausgeführt wird. Wenn es mit gemountet ist nosuid, kann Ihr Programm möglicherweise nicht funktionieren.
Gegenmodus
1
@countermode @MarkPlotnick mount | grep /home/mekehrt zurück /home/me/.Private on /home/me type ecryptfs (ecryptfs_check_dev_ruid,ecryptfs_cipher=xxx,ecryptfs_key_bytes=16,ecryptfs_unlink_sigs,ecryptfs_sig=0123456789abcdef,ecryptfs_fnek_sig=fedcba9876543210)
PHP Learner