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:
- Utilizzo della funzione php open_basedir
- Configurazione di un ambiente chroot per Apache
- Applicazione delle regole di selinux per Apache
- 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.
- 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/
- 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.