Schrift
[thread]8071[/thread]

$0 und chmod: "Set user ID"-Bit



<< |< 1 2 >| >> 20 Einträge, 2 Seiten
docsnyder
 2006-06-09 12:59
#67166 #67166
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo!

Ich führe ein Perl-Script unter UNIX mit der Berechtigung

Code: (dl )
-rws--x--x

aus ("Set user ID"-Bit gesetzt).

Wenn ich $0 (Script-Name) ausgebe, bekomme ich folgendes:

Code: (dl )
/dev/fd/4

Wenn ich das "Set user ID"-Bit nicht setze, wird (wie erwartet) der Script-Name ausgegeben.

Herausgefunden habe ich inzwischen folgendes:

Quote
> what's /dev/fd/4??

That's a temporary name for the interpreter of a script.

Mit dem Interpreter hat $0 eigentlich nichts zu tun, denn der sollte in $^X stehen und in $0 der "Script"-Name.

Und noch was: führe ich das Script mit

Code: (dl )
$ perl <script>

aus, anstatt mit

Code: (dl )
$ <script>

wird statt /dev/fd/4 tatasächlich der Script-Name ausgegeben.

Kann mir jemand sagen, was hier passiert???

Gruß, Doc\n\n

<!--EDIT|docsnyder|1149846759-->
GwenDragon
 2006-06-09 14:22
#67167 #67167
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Sollte das Skript nicht eher rwsr-xr-x haben?

Die Shell ruft doch das Skript über den Shebang auf.
Damit sollte doch dort sowas wie /usr/bin/perl o. ä. stehen.
Und mit which perl sollte doch angezeigt werden, wo dein Perl residert.

In /dev/fd/ sind die Filedescriptoren. Wieso die aber als $0 angezeigt werden, ist mir rätselhaft.

Unter http://lists.debian.org/debian-hurd/1999/07/msg00144.html wird was zum Problem /dev/fd/X geschrieben.
Quote
That's a temporary name for the interpreter of a script. If you use
"#!/bin/foobar", and the hurd can't find foobar anywhere, it will map this
to a temporary whatever (pipe I think) /dev/fd/4.


Ist vielleicht der Shebang NICHT derselbe wie bei which perl ausgegeben wird?

Wird perl als Wrapper(skript) aufgerufen?\n\n

<!--EDIT|GwenDragon|1149849216-->
docsnyder
 2006-06-09 15:09
#67168 #67168
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@GwenDragon

Quote
Sollte das Skript nicht eher rwsr-xr-x haben?


Warum? Zum Ausführen genügt doch "x" und lesen muss es niemand ausser root.

Quote
Die Shell ruft doch das Skript über den Shebang auf.
Damit sollte doch dort sowas wie /usr/bin/perl o. ä. stehen.
Und mit which perl sollte doch angezeigt werden, wo dein Perl residert.
...
Ist vielleicht der Shebang NICHT derselbe wie bei which perl ausgegeben wird?


perl liegt bei mir in /usr/local/bin und in /bin ist ein Link darauf. Sowohl "#!/usr/local/bin" als auch "#!/bin/perl" in der Shebang-Zeile führt zum gleichen Ergebnis.

Quote
Wird perl als Wrapper(skript) aufgerufen?


Wie gesagt, der Aufruf

Code: (dl )
$ <script>


resultiert in der Ausgabe "/dev/fd/4" für $0, während ich mit dem Aufruf

Code: (dl )
$ perl <script>


den Script-Namen erhalte.

Merkwürdig ist das auf jeden Fall.

Gruß, Doc
GwenDragon
 2006-06-09 15:18
#67169 #67169
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Verstehe ich das richtig?
Wenn du folgendes Skript hast:
Code: (dl )
1
2
3
4
5
6
#!/usr/bin/perl

use strict;
use warnings;

print $0;

Dann zeigt dir ein Aufruf mit ./skript /dev/fd/4 an,
während ein Aufruf perl ./skript skript anzeigt.

Sehr seltsam.
GwenDragon
 2006-06-09 15:20
#67170 #67170
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Ähm, du rufts aber nicht wirklich dein Skript als <script> auf, oder?
docsnyder
 2006-06-09 16:15
#67171 #67171
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein, nicht als <script>.

Mein Script heisst tst.pl und bei

Code: (dl )
$ tst.pl


kommt "/dev/fd/4" raus, und bei

Code: (dl )
$ perl tst.pl


kommt "tst.pl" raus. Wie gesagt: bei beiden Aufrufen ist das "Set-UID-Bit" gesetzt.

It's strange, isn't it?
GwenDragon
 2006-06-09 16:21
#67172 #67172
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
docsnyder
 2006-06-09 16:22
#67173 #67173
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Habe noch was gefunden, was einen Hinweis auf den auftretenden Effekt gibt:

Quote
However, if the kernel set-id script feature isn't
isabled, Perl will complain loudly that your set-id
script is insecure. You'll need to either disable the
kernel set-id script feature, or put a C wrapper around
the script. A C wrapper is just a compiled program that
does nothing except call your Perl program. Compiled
programs are not subject to the kernel bug that plagues
set-id scripts.

...

In recent years, vendors have begun to supply systems free
of this inherent security bug. On such systems, when the
kernel passes the name of the set-id script to open to the
interpreter, rather than using a pathname subject to
meddling, it instead passes /dev/fd/3. This is a special
file already opened on the script, so that there can be no
race condition for evil scripts to exploit.


Ist bei mir zwar Descriptor 4 statt 3, aber das scheint den Effekt wohl zu erklären.

Gruß, Doc
docsnyder
 2006-06-09 16:24
#67174 #67174
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
Welches Unix ist es denn?


Solaris 8
docsnyder
 2006-06-09 16:26
#67175 #67175
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
GwenDragon, wie kommt es eigentlich, daß ich Dich nicht in der Liste der Online-User sehe? Fällst Du unter "1 Anonymous Members"?

Gruß, Doc
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



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