Schrift
[thread]8071[/thread]

$0 und chmod: "Set user ID"-Bit (Seite 2)



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
GwenDragon
 2006-06-09 16:37
#67176 #67176
User since
2005-01-17
14563 Artikel
Admin1
[Homepage]
user image
Ich mach mich gern unsichtbar.
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

betterworld
 2006-06-10 04:27
#67177 #67177
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Ich habe auch mal davon gelesen, habe allerdings kein System gefunden, auf dem das tatsaechlich funktioniert. Welche Unix-Variante hast Du denn genau? Edit: Solaris 8, wie Du oben ueberlesenerweise schriebst.

Die in dem Zitat angesprochene Race-Condition ist folgende: Wenn ein Set-UID-Script gestartet wird, muesste der Kernel zunächst den Interpreter privilegiert starten (Der Schritt vom Script zum Interpreter (ueber das Shebang)) und ihm als Parameter den Scriptnamen geben. Der Interpreter wird dann das Script oeffnen (das ist der Schritt wieder zurueck: vom Interpreter zum Script). Das koennte jetzt inzwischen aber ein anderes Script sein, welches gar nicht mehr das sid-Bit gesetzt hat.

Man koennte nun meinen, dass dieses Problem nicht nur fuer Setuid-Scripte gilt. Doch sollte man sich folgendes Szenario vor Augen halten: Ich lege in meinem Home-Verzeichnis einen Hardlink auf ein Setuid-Root-Script an, starte es ueber "./script" und sofort danach ersetze ich es durch ein beliebig böswilliges Script meiner Wahl. Mit diesem Mittel kann ich mein beliebiges Script mit Root-Rechten ausfuehren.

Die Loesung dafuer ist simpel: Der Interpreter muss das Script nicht selbst ueber einen vertrauensunwuerdigen Dateinamen oeffnen. Stattdessen wird die Datei kernelintern geoeffnet (z. B. als Deskriptor 4), und der Interpreter bekommt den Dateinamen "/dev/fd/4" als Parameter, womit es auf diesen Dateideskriptor zugreifen kann. Zwischen dem Oeffnen der Datei und dem privilegierten Ausfuehren des Interpreters kann nun ohne Race-Condition die Richtigkeit des Setuid-Bits ueberprueft werden.

/dev/fd ist unter Linux normalerweise ein Symlink auf /proc/self/fd, wobei /proc/self ein Symlink auf das aktuelle Prozess-Verzeichnis in /proc ist, z. B. /proc/43134. In dem fd-Verzeichnis ist fuer jeden offenen Dateideskriptor ein etwas magischer Symlink. Wenn man ihn oeffnet, passiert wohl ungefaehr so etwas wie bei dem dup-Systemcall (siehe dup(2)).\n\n

<!--EDIT|betterworld|1149980351-->
docsnyder
 2006-06-12 11:38
#67178 #67178
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@betterworld

Danke für die ausführliche Beschreibung!

Wenn man's weiss, leuchtet das auch ein. Wenn man's nicht weiss, kann man sich über $0 schon wundern ;o)

Gruß, Doc
murphy
 2006-06-12 20:00
#67179 #67179
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
An dieser Abhilfe fuer die Race-Condition ist nur unguenstig, dass man nicht mehr ueber den 0. Kommandozeilenparameter und den Pfad die Lage der eigenen Programmdatei ermitteln kann. Leider schliesst das dann die Verwendung des FindBin Modules aus.
When C++ is your hammer, every problem looks like your thumb.
docsnyder
 2006-06-12 21:10
#67180 #67180
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=murphy,12.June.2006, 18:00]An dieser Abhilfe fuer die Race-Condition ist nur unguenstig, dass man nicht mehr ueber den 0. Kommandozeilenparameter und den Pfad die Lage der eigenen Programmdatei ermitteln kann. Leider schliesst das dann die Verwendung des FindBin Modules aus.[/quote]
Das wäre schade!

Gibt es denn keine Möglich, mit einem File-Descriptor an Pfad+Dateinamen ranzukommen? Über den I-Node vielleicht (jedenfalls unter UNIX)?

Gruß, Doc
betterworld
 2006-06-12 22:16
#67181 #67181
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=murphy,12.06.2006, 18:00]An dieser Abhilfe fuer die Race-Condition ist nur unguenstig, dass man nicht mehr ueber den 0. Kommandozeilenparameter und den Pfad die Lage der eigenen Programmdatei ermitteln kann. Leider schliesst das dann die Verwendung des FindBin Modules aus.[/quote]
Unter Umständen nicht. Im FindBin-Modul gibt es die $RealBin-Variable, welche Symlinks aufloest. Zumindest bei Linux sind die Eintrage in /dev/fd immer Symlinks auf die tatsaechlichen Dateien. docsnyder kann ja mal probieren, ob das bei seinem System auch so ist und ob da $RealBin funktioniert.
murphy
 2006-06-12 23:54
#67182 #67182
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@betterworld: Ich habe vor meinem letzten Beitrag auf einer Sun-Kiste getestet und festgestellt, dass bei Verwendung von FindBin so ein setuid Skript gleich beim Kompilieren abschmiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
% uname -a
SunOS herdubreid.rhi.hi.is 5.9 Generic_118558-27 sun4u sparc SUNW,Sun-Fire-880
% cat test.pl
#!/usr/bin/perl

use strict;
use warnings;

use FindBin;

print "zeroth argument: $0\n";
print "path to binary : $FindBin::RealScript\n";
% ls -l test.pl
-rwx------ 1 tcc1 enem 138 Jun 12 15:58 test.pl
% ./test.pl
zeroth argument: ./test.pl
path to binary : test.pl
% chmod u+s test.pl
% ./test.pl
Cannot find current script '/dev/fd/4' at /usr/perl5/5.6.1/lib/FindBin.pm line 166
BEGIN failed--compilation aborted at /usr/perl5/5.6.1/lib/FindBin.pm line 166.
Compilation failed in require at /dev/fd/4 line 6.
BEGIN failed--compilation aborted at /dev/fd/4 line 6.
When C++ is your hammer, every problem looks like your thumb.
betterworld
 2006-06-13 01:50
#67183 #67183
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Hmm, ich habe ja leider nicht die Gelegenheit, legitim an mehrere Benutzer eines Sun-Systemes zu kommen, sodass ich mit setuid spielen kann, aber mit meinem einzelnen Benutzer habe ich gerade festgestellt, dass dort die Verzeichnisse /proc/self/fd und /dev/fd ganz anders aussehen als bei Linux und gar nicht mal dieselben sind. Naja, jedem das Seine...
docsnyder
 2006-06-13 10:42
#67184 #67184
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@betterworld
@murphy

Quote
docsnyder kann ja mal probieren, ob das bei seinem System auch so ist und ob da $RealBin funktioniert.


Hab's probiert und bei mir passiert das gleiche wie bei murphy: compilation failed!

Sobald ich FindBin rausnehme funktioniert es wieder (allerdings eben mit /dev/fd/4 als Ausgabe).

So etwas bin ich von Perl garnicht gewohnt, daß ein Standard-Modul beim compilieren abraucht.

Gruß, Doc
betterworld
 2006-06-13 14:25
#67185 #67185
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=docsnyder,13.06.2006, 08:42]So etwas bin ich von Perl garnicht gewohnt, daß ein Standard-Modul beim compilieren abraucht.

Gruß, Doc[/quote]
Beim Kompilieren heißt wohl eher "in BEGIN" bzw in "use". Wenn das Standardmodul nicht funktionieren kann, ist es verstaendlich, dass das einbindende Script auch nicht ausgefuehrt werden kann.
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2006-06-09 12:59.