Directory traversal e autorizzazioni file system predefinite (755) per web server

1

Sto cercando di capire meglio i potenziali buchi di sicurezza che potrebbero essere creati dalle autorizzazioni del filesystem predefinito. Sembra che io sia in grado di attraversare il mio filesystem, servendo pagine php semplici che visualizzano informazioni da file al di fuori del mio / var / www Web Root:

echo file_exists('../../../bin/filename');

Non so se questa capacità è normale se le autorizzazioni della mia Web Root sono impostate correttamente. Ho le autorizzazioni di / var / www come 750, dove owner: group = root: www-data.

Poiché le directory madri del mio Web Root, / e / var, hanno il proprietario: group = root: root, le loro autorizzazioni devono essere 755 perché le directory figlio non saranno in grado di avere più permessi dei loro genitori, e i dati www l'utente che apache è in esecuzione rientrerà nella categoria "altro" dei suoi genitori. Quindi, sembra che la capacità di attraversare al di fuori del Web Root sia normale.

Supponendo che questo comportamento sia normale, è una buona pratica impostare directory che non siano i genitori della mia Web Root, come / bin, / sbin, ecc., con le autorizzazioni di 750 così i dati www in questo caso non possono arrivare a loro?

    
posta Kevin 22.02.2014 - 20:23
fonte

2 risposte

1

In termini di restrizioni su cosa può fare un server web - di solito concedo l'accesso al contenuto dal server web tramite l'altra entità (rw-rw-r-- / drwxrwsr-x) - questo mi permette di impostare un gruppo (in alcuni casi più gruppi) di persone che possono mantenere (scrivere) i file. Su una macchina semplice significa anche che posso eliminare le autorizzazioni di esecuzione e di lettura in altri punti di impatto minimo. Ma usare chroot (o container) è una soluzione più efficace, dove applicabile.

Sembra che il tuo codice di esempio stia usando PHP: disabilitando allow_url_include e impostando open_basedir sono essenziali i primi passi per rafforzare un server (ce ne sono molti di più - ma questo è fuori discussione). L'impostazione open_basedir impedisce quasi tutti i meccanismi di attraversamento delle directory. Ma la cosa veramente importante è non elaborare i percorsi forniti dal web a meno che tu non sia possibile evitare il problema - e anche allora convalidare a fondo i dati usando una whitelist e realpath ().

    
risposta data 23.02.2014 - 01:46
fonte
0

Per accedere a un file o una directory, devi avere eseguire l'accesso alla sua directory principale (e quindi a tutti i genitori sopra di esso).

Pertanto, se riesco ad accedere a "/ var / www / html", allora posso anche accedere in modo implicito a /var/www/ e /var e / . Ciò non significa che faccio molto con esso, però, perché il mio per qualsiasi altro sottoalbero è determinato dall'autorizzazione su tale directory.

Quindi mentre posso arrivare a /var/www/html , ciò non significa che io possa arrivare a /var/www/docs - dipende dalle autorizzazioni su docs .

Ora, ecco i dettagli importanti per le autorizzazioni dei file e, una volta compreso, puoi creare un set di autorizzazioni ragionevole:

Per file

  • leggi : significa che hai accesso per aprire il file di sola lettura e accedere ai suoi contenuti
  • scrivi : significa che hai accesso per aprire un file esistente in lettura-scrittura e modificare o eliminare il suo contenuto. Ciò non significa che puoi cancellare la voce file , ma puoi troncare il file per svuotarlo o cambiarlo per dire qualcos'altro.
  • esegui : significa che hai il permesso di eseguire il file. Potresti non vederne il contenuto perché il sistema operativo leggerà il file per tuo conto e lo eseguirà per te.

Per le directory

  • leggi : significa che hai accesso a elenca i file in una directory. Potresti non avere accesso a fare nulla con loro, ma puoi almeno vedere i loro nomi, dimensioni, permessi, ecc.
  • scrivi : significa che hai accesso a modifica dell'elenco di file in una directory. Cioè, puoi creare file, cancellarli, rinominarli, ecc. Potresti non essere in grado di aprire (leggere o scrivere) alcun file esistente, ma puoi modificare l'elenco.
  • execute : significa che puoi accedere ai file o alle directory invece della directory, purché tu conosca il nome e disponga delle autorizzazioni appropriate sul file secondario o sulla directory. Puoi utilizzare la directory, ma non hai i permessi per modificare o visualizzare l'elenco dei file.

Quindi per accedere a una determinata directory figlio, tutto ciò di cui hai bisogno è il bit di esecuzione. Ad esempio, su /home/ , non è raro vedere le autorizzazioni impostate su rwx--x--x e di proprietà di root , con le directory degli utenti impostate su rwx------ e di proprietà dell'utente. Ciò consente a ciascun utente di accedere alla propria directory, ma non può accedere o persino elencare le altre directory in /home .

Ancora meglio

Un sistema ancora migliore, che è ancora in sviluppo ma abbastanza stabile per i primi utenti, è quello di usare i cgroup di Linux per dare ad ogni utente o sito o programma il proprio filesystem interamente. Questo viene fatto usando una combinazione di chroot e mount --bind e spesso unione di filesystem (come unionfs o aufs) per dare ad ogni processo l'accesso solo ai file di cui ha bisogno, senza inutili duplicazioni.

Inoltre, i cgroup consentono ai singoli processi di vivere su reti isolate con domini di memoria e socket e risorse simili. Questo crea il potenziale per ciò che sembra e agisce molto come una macchina virtuale, ma senza la macchina virtuale. Questa tecnologia sta ancora avanzando, ma è abbastanza chiaro che questa sarà la via da seguire per l'isolamento dei processi in Linux.

I progetti pertinenti che utilizzano questa tecnologia includono LXC e Docker , offre un modo molto user-friendly di configurare contenitori isolati che includono il loro intero" mondo "da una prospettiva di esecuzione (molto simile a una VM), ma senza aggiungere sovraccarico di virtualizzazione .

    
risposta data 22.02.2014 - 22:23
fonte

Leggi altre domande sui tag