PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Insecure dependency bei mit chown & mkdir



Kernel Fallback
20-04-2002, 21:12
Hi Leute!

Ich hab mir eine perl-script geschrieben, das aus übergeben parametern, nämlich uid und homedir, ein verzeichnis anlegen (welches dann wwwrun gehört) soll und mit dem chown befehl den benuzter auf uid setzt.

das Problem ist, bei der Ausführung erhalte ich einen Software-Error und sowas wie insecure dependency. Ich hab da mal was gelesen, dass solche dateinamen, die ich bei mkdir bzw. chown angebe nicht mit führendem "/" angegeben sein dürfen. Ich mache das aber so. Im Moment hab ich nämlich auch die homedir variable einfach nur mit einem "test" beschrieben, aber es geht trotzdem nicht. Weiß jemand, woran das noch liegen kann?

edit: Das Script läuft übrigens mit suid-bit - auch das suidperl ist mit suid ausgestattet.
nochmal edit: Der Fehler bei mkdir tritt nicht auf, wenn ich im Skript stehen hab:

$homedir = "/mein/verz/neu";
mkdir($homedir,0755);

aber wenn ich schreibe:

$homedir = cgi->param('homedir');
mkdir($homedir,0755);

und das skript mit "skript.pl?homedir=/mein/verz/neu" aufrufe, kommt der fehler

Danke schon jetz!

P.S. Ich bin auch für Links zum Thema dankbar, da ich mich in Perl/CGI wohl noch etwas mehr einrarbeiten muss ;)

ponzellus
21-04-2002, 11:06
hi!

ich kenne cgi-modul nicht, aber wandelt das die sonderzeichen automatisch um?
wenn ich den wert "manuell" aus dem QUERY_STRING raushole wuerde da bei dir naemlich stehen:
homedir=%2Fmein%2Fverz%2Fneu

das hiesse, du muesstest erst die codes in ascii-zeichen umwandeln...

Links zu perl/cgi:
http://www.pronix.de
http://www.teamone.de/selfhtml

MfG ponzellus

Kernel Fallback
21-04-2002, 11:28
Hallo,

ich glaub nicht, dass er daran liegt, denn wenn ich einfach nur

print $cgi->param('homedir');

dann schreibt er "/mein/verz/neu".

Trotzdem Danke - auch für die links

lolli
21-04-2002, 22:01
Das hat sicherheitsrelavante Gründe. Wenn jemand in dein Formular z.B. /etc eingibt, könnte ja möglicherweise das Verzeichnis gelöscht werden. Die Rechte hat das Perl-Skript ja dann auch (SETUID). Ich hatte dazu mal irgendwo Informationen, wie man es dennoch hinbekommt, weiss aber im Moment nicht mehr wo.
Ich melde mich, wenn ich weitere Infos rausbekommen.

oliver

Hast du schon mal eine Lösung mit sudo versucht? Es ist extrem unkompliziert!!

Kernel Fallback
21-04-2002, 22:45
Hi,

ich dachte mir schon, das es daran liegt, aber es ist so, dass das skript verzeichnisse erzeugen soll, die schon in einer sql-datenbank festgelegt sind. Genauer: mein proftpd macht seine benutzer-authen... über diese sql-datenbank, und in der steht dann auch das homedir, und zwar nach dem muster /irgendein/verz/usera - dasselbe/verz/userb, also ist es dem script nicht möglich, verz. wie /etc zu erstellen/überberschreiben. ich hab auch schon versucht, mit

chdir(das/verz)

in das verz zu wechseln und dann mkdir ohne die pfadangabe auszuführen, aber das geht auch nicht.

Kannst du mir bitte etwas genauer beschreiben, wie das mit sudo aussehen soll? wir dann sudo von dem perl-script aus aufgerufen? Ich muss es halt vom webserver aus machen lassen können

Danke :)

lolli
22-04-2002, 07:10
Hallo Kernel-Fallback,
wie sieht denn deine Interpreterzeile aus? Ich habe es einmal lokal bei mir versucht und konnte mit dem Skript

#!/usr/bin/suidperl -U
print "Content-type: text/plain\n\n";
print "Hallo\n";
mkdir("/test/$ENV{'QUERY_STRING}",0755) || print "Fehler: $!";

ein entsprechendes Verzeichnis anlegen. Schau dir doch mal die Hilfeseiten ( /usr/bin/suidperl --help) an. Es geht aber nur mit der Option -U für "erlaube unsichere Operationen"...
Also immer schon vorsichtig und alle übergebenen Parameter 1 mal, besser 2malsudo mehr prüfen!! :D

oliver

Kernel Fallback
22-04-2002, 08:08
Hi,

Danke!
Bei mir war wohl das Problem, dass ich als Befehlsinterpreter

#! /usr/bin/perl -w

benutzt hab. Ich versuchs mal mit deinem Vorschlag!

Das ich suidperl benutzen muss, wusste ich nicht...

Merci :D

Kernel Fallback
22-04-2002, 16:59
Hallo :)

Also es funktioneirt jetzt - danke sehr!

Grüße - Markus

lolli
22-04-2002, 18:58
Hi,
du kannst auch weiterhin !#/usr/bin/perl nehmen. Nur wenn eben das Skript SETUID ist, wird eh' suidperl aufgerufen...

oliver