lfi

Nella prima parte dell’articolo ho spiegato cosa è la vulnerabilità LFI soffermandomi anche su alcune tecniche di protezione a livello di programmazione, mentre in questo post affronterò l’aspetto sistemistico.

Per circoscrivere l’area di lavoro di un applicativo web, e quindi di un eventuale Local File Inclusion, è possibile ricorrere almeno a tre soluzioni:

  1. Utilizzo della funzione php open_basedir
  2. Configurazione di un ambiente chroot per Apache
  3. Applicazione delle regole di selinux per Apache
  1. PHP openbasedir anti LFI

La funzione php open_basedir permette di limitare l’area d’azione di un applicativo ed è possibile configurarla a livello globale  o tramite virtualhost specifici.

url: www.miotestantilfi.it
homedir: /web/htdocs/miotestantilfi

Per le regole globali di php, quindi valide per tutti gli applicativi residenti sul server web, si deve modificare il file di configurazione php.ini .

Il percorso del file php.ini può cambiare a seconda del tipo o versione di sistema operativo, ad esempio su Linux CentOS risiede dentro la directory /etc.

Una volta editato il file basta aggiungere uno o più path nell’opzione open_basedir:

; open_basedir, if set, limits all file operations to the defined directory
; and below.  This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.open-basedir
open_basedir = /mnt/pippo:/web/htdocs:/home/repositories

Dopo aver salvato le modifiche è necessario riavviare il demone web.

Nell’esempio appena mostrato qualsiasi applicativo presente sul web server potrà navigare soltanto all’interno delle directory specificate, quindi la cartella /etc con relativo contenuto diventa inaccessibile.

Per limitare un determinato applicativo php è possibile configurare un virtualhost di Apache:

<VirtualHost *:80>
        ServerAdmin [email protected]
        
        DocumentRoot /web/htdocs/miotestantilfi
        ServerName www.miotestantilfi.it

        php_admin_value open_basedir /web/htdocs/miotestantilfi/:/usr/share/pear/
        
        <Directory /web/htdocs/miotestantilfi>
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
</VirtualHost>

Tramite php_admin_value all’interno del virtualhost è possibile richiamare la funzione php open_basedir.

In caso di un eventuale script affetto dalla vulnerabilità LFI, la pagina non potrà includere files al di fuori della propria home directory /web/htdocs/miotestantilfi.

  1. Configurare il server web Apache in ambiente chroot

Un altro metodo per proteggersi dai Local File Inclusion è la configurazione del server web Apache in chroot.

L’ambiente chroot non è altro che un sottosistema indipendente (chiamato jail) che permette di eseguire processi in un ambiente circoscritto e sicuro.

Compromettendo l’applicativo php nella jail, un eventuale LFI andrebbe a leggere ad esempio il file /etc/passwd fittizzio e non quello del sistema root principale.

Questo argomento  da parte mia era già stato affrontato qualche mese fa, quindi riporto il link:

http://www.homelab.it/index.php/2014/04/02/apache-2-chroot-modsecurity-centos-6/

  1. Apache e Selinux

Security-Enhanced Linux (SELinux) è un modulo implementato dalla versione 2.6 del kernel linux creato dalla famosa/famigerata NSA americana.

Questa infrastruttura fornisce tutte le interfacce possibili che consentono di controllare completamente l’accesso a tutti gli 
oggetti di sistema quando vengono avviate dalle azioni degli utenti. Questi sono, per esempio, l’apertura di un file, 
la creazione di una nuova cartella, o il mettere un demone in ascolto su una porta. Come funziona? 
Beh, SELinux si collega semplicemente all’interfaccia e impone l’uso di una politica di sicurezza al sistema. 
Dal punto di vista del amministratore che installa SELinux, questo sistema è semplicemente una caratteristica del kernel.

Fonte: Linuxaria

Attivando Selinux sul proprio sistema linux verrà impedito ad apache di accedere a file/directory non autorizzate.

Su CentOS già dalla versione 5.x selinux viene abilitato di default all’installazione e il demone apache viene autorizzato a elaborare gli applicativi sotto la directory /var/www/html.

Per dare i permessi selinux ad apache su altre directory basta eseguire i comandi:

# chcon -v --type=httpd_sys_content_t /web/htdocs
context of /web/htdocs changed to user_u:object_r:httpd_sys_content_t

In maniera ricorsiva il comando diventa:

# chcon -Rv --type=httpd_sys_content_t /web/htdocs

Per controllare i permessi di file e cartelle basta utilizzare lo switch “-Z”  del comando ls.

# ls -Z /web | grep htdocs
drwxr-xr-x  root root user_u:object_r:httpd_sys_content_t    htdocs

Anche in questo caso un eventuale LFI verrebbe bloccato dalle policy di Selinux.

Questo è solo un piccolo anticipo per quanto riguarda Selinux e presto scriverò un articolo che spiegherà come muovere i primi passi, nel frattempo vi consiglio di documentarvi su questo fantastico modulo.