Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]9787[/thread]

CGI-Script, das /root-Rechte hat

Leser: 1


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
pug
 2006-03-08 16:01
#95601 #95601
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,
ich bin gerade dabei ein CGI-Script zu schreiben, das /root-Rechte hat. Und bevor ich einfach mal so drauf los code, möchte ich bei Euch mal anfragen, wie man so etwas am besten und vor allem elegantesten realisiert? Es gab doch so etwas wie "sperl" oder so? In Debian-Linux heist das Packet perl-suid und bringt gleich einen eigenen Perl-Compiler mit. Nur wie spricht man den an?
Code: (dl )
#/usr/bin/sperl
oder, mit einem Modul? Worauf muss man noch achten, denn daß das eine heikle Sache ist, ist mir wohl bekannt.

Vorgestellt habe ich mir das so, es gibt eine statische HTML-Seite, in die ich einige Parameter eingebe, und die beim abschicken ein Perl-Skript aufruft (oder besser mod_perl?) welches dann mit einem System-Call ein Shell-Skript aufruft und die Parameter übergibt.

Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
Taulmarill
 2006-03-08 16:23
#95602 #95602
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
imho währe es ein besserer ansatz, das cgi script ganz normal zu coden, und nur den teil, der root-rechte braucht, in ein anderes script auszulagern, dass über die unix-dateiattribute mit root-rechten ausgeführt wird. dieses unabhängige script sollte dann die eingabewerte selbst sehr genau prüfen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pug
 2006-03-08 17:14
#95603 #95603
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Ja, aber das Problem ist doch, wenn ich dieses Skript Web-Seitig aus aufrufe, dann mit einer anderen User-ID als der von /root (also bei Debian wäre das z.B. www-data). Es nützt ja nichts, wenn das Skript alle möglichen Rechte hat, es muß die richtige uid haben!

Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
Froschpopo
 2006-03-08 18:21
#95604 #95604
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
die dienste startet der apache als wwwrun. du musst also im apache einstellen, unter welchem user er die scripte starten soll.
betterworld
 2006-03-08 19:03
#95605 #95605
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=pug,08.03.2006, 16:14]Ja, aber das Problem ist doch, wenn ich dieses Skript Web-Seitig aus aufrufe, dann mit einer anderen User-ID als der von /root (also bei Debian wäre das z.B. www-data). Es nützt ja nichts, wenn das Skript alle möglichen Rechte hat, es muß die richtige uid haben!

Gruss Christian[/quote]Hm, setuid-Programme haben normalerweise nur die euid auf 0 gesetzt. Die reale UID ist immer noch die des aufrufenden Prozesses. (Ich weiss nicht, ob das bei suidperl ebenso ist.) Hilft Dir das?

Ich wuerde das vielleicht so machen, dass das eigentliche Programm, wie von irgendwem oben vorgeschlagen wurde, kein CGI-Skript ist sondern nur von einem solchen aufgerufen wird. Das Programm bekommt dann den Benutzer root, die Gruppe www-data und den Mode 4454 (set-uid und nur group-executable)

Uebrigens hat auch Apache ein Setuid-Modul. Es ist aber sehr restriktiv und fordert z. B., dass die Skripte in einem Unterverzeichnis des Home-Verzeichnisses liegen (in diesem Fall also /root)\n\n

<!--EDIT|betterworld|1141837846-->
pug
 2006-03-08 19:13
#95606 #95606
User since
2005-08-17
91 Artikel
BenutzerIn
[default_avatar]
Bleibt nur die Frage, wie ich das mache. Wenn ich das Script als Eigner und als Gruppe /root übergebe, führt er es als www-data nicht aus. Irgendwo brauche ich eine Schnittstelle um mich als /root zu tarnen.

Gruss Christian
Ein Betriebssystem sie zu knechten, sie alle zu finden, Ins Dunkel zu treiben und ewig zu binden.

William Gates III
ptk
 2006-03-08 20:48
#95607 #95607
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=pug,08.03.2006, 18:13]Bleibt nur die Frage, wie ich das mache. Wenn ich das Script als Eigner und als Gruppe /root übergebe, führt er es als www-data nicht aus. Irgendwo brauche ich eine Schnittstelle um mich als /root zu tarnen.[/quote]
Ein Wrapperskript, das nur das suid-Programm aufruft, könnte helfen.
Evtl. gibt es eine Apache-Option, um root-Skripte zu erlauben?
pq
 2006-03-08 22:01
#95608 #95608
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
wrapper.c:
Code: (dl )
1
2
3
4
5
6
#define REAL_PATH "/pfad/zum/perl-cgi-script"
main(ac, av)
char **av;
{
execv(REAL_PATH, av);
}

$ # als root
$ gcc -o wrapper.cgi wrapper.c
$ chmod u+xs wrapper.cgi

das perl-script wird dann im taint-modus ausgeführt, siehe perldoc perlsec\n\n

<!--EDIT|pq|1141848248-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
betterworld
 2006-03-08 22:55
#95609 #95609
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
pq: Wird bei einem execv(e) nicht die euid auf die uid gesetzt, falls das auszufuehrende Programm nicht setuid ist?

pug: Warum schreibst Du eigentlich immer /root? Fuer mich ist root der Benutzer und /root das Verzeichnis...\n\n

<!--EDIT|betterworld|1141851486-->
Ronnie
 2006-03-08 23:08
#95610 #95610
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
oder man erlaubt dem Skript ein anderes aufzurufen, das via sudo gestartet wird. In /etc/sudoers ist dann der www-run als ausführungsberechtigt für dieses Skript ohne PW einzugeben.
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2006-03-08 16:01.