erlug
[Top] [All Lists]

Re: [Erlug] /tmp dir e permessi (o meglio dove mettere tmp dir)

To: erlug@xxxxxxxxxxxxxx
Subject: Re: [Erlug] /tmp dir e permessi (o meglio dove mettere tmp dir)
From: Ivan Sergio Borgonovo <mail@xxxxxxxxxxxxxxx>
Date: Fri, 19 May 2006 00:22:17 +0200
On Thu, 18 May 2006 21:50:09 +0200
Maurizio Lemmo - Tannoiser <tannoiser@xxxxxxxxxxx> wrote:

> * giovedì 18 maggio 2006, alle 21:10, Ivan Sergio Borgonovo scrive:
> > banalmente in php:
> > 
> > $workdir = "/tmp/".basename($argv[0])."/";
> > mkdir( $workdir, 700 );
> > mkdir( $workdir."results", 700 );
> > 
> > La prima dir la crea... il problema è che non la crea 700 (sticky
> > bit etc...).

Auto clue mancato!

> > Immagino ci sia una buona ragione "sistemistica" la spiegazione
> > della quale mi risulterebbe interessante e gradita ma che al
> > momento è accessoria.
> > 
> > Se però un proggy deve creare una struttura di directory
> > temporanea... allora dove è "cosa buona e giusta che la faccia"?
> 
> In generale, questa roba e` bruttaccina, ed espone a un "noto bug di
> security".

Quale? Che altri ci possono guardare dentro?
Che uno sa che scrivi il file X e la dir Y, le scrive lui *prima* e tu finisci 
per dargli accesso? per questo basta controllare l'uscita di mkdir credo.

Decisamente dal punto di vista sistemistico non capisco q.che cosa.
Ora se il problema fosse "non ci deve guardare nessuno", /tmp sarebbe sempre 
vuota, ma non è così.
Anzi, non solo è così ma le ownership e i permessi ci sono e funzionano.
A parte il mio errore da pistola che involontariamente mi hai fatto notare 
700!=0700 e che risolve la questione trovo il tuo codice non permetta "cleanup" 
sicuro.
Ovvero, visto che tempdir(...) non garantisce che il tutto vada in un posto che 
verrà automaticamente pulito se il programma chioda la roba rimane in $dir con 
l'aggravante che effettivamente una volta morto il programma non ne sai più il 
path effettivo... che vuol dire che a) se c'erano dati "salvabili" te li sei lo 
stesso fottuti b) se non c'erano stai buttando via disco perchè l'unico 
programma che potrebbe "pulire" è lo stesso che non li userebbe.

Il while (!mkdir(...)) mi sembra in cerca di guai.
Il problema non è banalissimo nel senso che per i file c'è tempnam e tmpfile. 
Ma da php non c'è niente di equivalente a mkdtemp.
Per andare sul sicuro: hash dell'ora/giorno, del pid + rnd e segno zodiacale.
A meno che sto coso gira in multithread su bluegene.

> La soluzione IMHO appropriata, e`:
> 
> <?php
>   function tempdir($dir, $prefix='', $mode=0700) {
>    if (substr($dir, -1) != '/') $dir .= '/';
> 
>    do {
>      $path = $dir.$prefix.mt_rand(0, 9999999);
>    } while (!mkdir($path, $mode));
> 
>    return $path;
>   }
> ?>


> Oppure usa una system (che mi piace sempre poco).

che a parte i tempi di fork che svantaggi avrebbe?

ronf... zzz... salvo e chiudo.

<Prev in Thread] Current Thread [Next in Thread>