Warum wird das Suid-Bit nach einer Dateiänderung gelöscht?

Warum wird das Suid-Bit nach einer Dateiänderung gelöscht?

Ich habe eine (s|g)uid-Datei, die für alle beschreibbar ist:

ls -lh suid_bin.sh
-rwsr-srwx 1 root root 168 mai   23 16:46 suid_bin.sh

mit einem Nicht-Root-Benutzerkonto angemeldet. Ich verwende vi (oder einen anderen Editor), um "suid_bin.sh" zu ändern. Nach dem Speichern des neuen Inhalts werden die (s|g)uid-Bits zurückgesetzt:

ls -lh suid_bin.sh 
-rwxr-xrwx 1 root root 168 mai   23 16:46 suid_bin.sh

Warum? Gibt es eine Möglichkeit, (s|g)uid-Bits nach der Änderung beizubehalten?

Antwort1

Unix-Berechtigungen erlauben das Schreiben in die Datei, wenn jemand versehentlich das Gruppen- oder allgemein schreibbare Bit für die Setuid-Datei setzt, erlauben aber nicht, dass Fremde Besitzer- und Gruppen-IDs für solche Dateien ändern.

Daher löscht der Kernel nach der Änderung Setuid/Setgid-Bits aus der Datei, um sicherzustellen, dass kein Schadcode in die Datei geschrieben wurde.

Der Root-Benutzer kann natürlich das Setuid-Bit wiederherstellen, aber der normale Benutzer kann keinen Schreibzugriff auf eine privilegierte ausführbare Datei ausnutzen, wenn er durch einen Fehler Schreibzugriff erlangt hat.

Und da ich Teile des Kernels in diesem Bereich kenne, bin ich nicht sicher, ob Sie das deaktivieren können, ohne den Quellcode des Kernels zu bearbeiten und ihn neu zu kompilieren.

Beachten Sie, dass Setuid-Skripte in Linux nach der Ausführung keinen Setuid-Status erhalten, da der Kernel den Skriptinterpreter tatsächlich ohne Setuid-Status mit dem vollständigen Pfad zum Skript als letztes analysiertes Argument startet und der Interpreter das Skript dann als normale Datei liest. Dies kann jedoch auf anderen Unix-Systemen abweichen.

verwandte Informationen