Oltre a CGI, un uso trascurato di sh
è nelle chiamate exec()
, o tramite l'uso di system()
e popen()
, sulla maggior parte dei sistemi Linux questo significa bash
. La famiglia di chiamate exec()
viene spesso utilizzata con " /bin/sh -c
" per fornire varie funzionalità come il reindirizzamento della shell, le pipeline o anche solo l'espansione degli argomenti durante il richiamo dei processi.
Apache usa esattamente questo (tramite APR, vedi l'uso di SHELL_PATH
in apr/threadproc/unix/proc.c
) quando si utilizzano i registri in pipe e anche in altre circostanze, come l'output esterno filtri (tramite ExtFilterDefine
) e l'elaborazione di #exec cmd
SSI include . Questo comportamento si applica quasi certamente anche a molti moduli di terze parti.
I migliori passi da fare per proteggere il tuo server web:
-
patch o aggiorna il tuo pacchetto bash (se fai questo tu stesso assicurati che non ci siano istanze
sh
vaganti, controlla sh
in qualsiasi chroot impostato manualmente)
-
esegui Apache in un chroot, usa un /bin/sh
minimo se e solo se è richiesto:
- nello switch httpd 2.2 di Apache dall'utilizzo di "
|
" a " ||
" in log reindirizzati , ciò elimina la necessità di /bin/sh
(disponibile da Apache 2.2.12)
- in Apache httpd 2.4 assicurati di non utilizzare "
|$
" in log con pipe , questo ritorna al comportamento di httpd.2.2. 2.4 supporta |
e ||
, né usa /bin/sh
-
assicurati che gli script CGI predefiniti siano disabilitati, verifica due volte il Options
di livello superiore (ad esempio <Directory />
in basso per ExecCGI
-
considera mod_security
se non lo stai già utilizzando. Red Hat ha fornito alcune regole che possono essere utilizzate per registrare e ripulire l'ambiente in articolo KB 1212303 .
Potresti anche prendere in considerazione l'utilizzo di " #!/bin/sh -p
" negli script, questo costringe a colpire in modalità privilegiata , questo impedisce l'importazione di funzioni dall'ambiente (insieme ad altre modifiche). Questo potrebbe essere utile se si hanno script CGI vulnerabili su un sistema, ma nessuna patch e nessun compilatore. Questo potrebbe non funzionare su Debian e sui sistemi derivati , quindi controlla attentamente.
(Inoltre, se /bin/sh
è bash
, non sostituirlo ciecamente con qualcos'altro, potrebbe influenzare i tuoi script di avvio.)
Qualsiasi codice applicativo che viene eseguito tramite CGI (diverso dagli script di bash) o in moduli Apache (Python e PHP nel tuo caso) può svolgere anche un ruolo in questo. Se qualsiasi variabile può essere sufficientemente controllata da un utente malintenzionato (la codifica URI può essere una sfida) e se l'applicazione utilizza /bin/sh
durante il richiamo di processi e se tali variabili vengono mantenute mentre si esegue questa operazione, si potrebbe avere un problema. / p>
Se stai usando un sistema Linux contemporaneo, ma non hai impostato un chroot o qualche altro contenitore per Apache, dovresti essere in grado di usare unshare
e un bind mount per sostituire /bin/sh
all'avvio di Apache (o qualsiasi altro servizio).
unshare -m -- sh -c "mount --bind /usr/local/bin/bash /bin/sh &&
/usr/local/apache2/bin/apachectl start"
I vantaggi di questo sono
- meno rischi di rompere le cose, dal momento che puoi sostituire selettivamente
bash
- puoi registrare e verificare i tentativi di richiamare
sh
più facilmente
(Ciò che non puoi fare facilmente con questo è scrivere uno script bash come wrapper per ispezionare e registrare variabili sospette, dovrai ovviamente usare qualcos'altro ...)
Se stai utilizzando auditd
su Linux, puoi facilmente osservare l'uso di /bin/sh
aggiungendo un paio di regole a audit.rules
e ricaricando:
-w /bin/sh -p x
-w /bin/bash -p x
(Ho bisogno di entrambi, poiché sh
è un collegamento simbolico a bash
)
Red Hat ha pubblicato un approccio alternativo, una "correzione" in runtime che puoi utilizzare con LD_PRELOAD
, puoi trovare in l'advisory . Questo potrebbe anche essere adattato per registrare variabili dubbie, se necessario. Dato che attualmente ci sono domande sulla completezza delle patch, questa soluzione è probabilmente una buona soluzione a breve termine per Apache.
Puoi trovare anche suggerimenti generali per l'indurimento di Apache qui: Server Hardening di Apache