Come posso proteggere Apache dalla vulnerabilità di Bash Shellshock?

43

Ho un server web Apache in esecuzione, e con le recenti notizie sull'uso di Shellsock contro bash mi chiedevo se il mio server web fosse vulnerabile. Non penso che lo sia, ma voglio assicurarmi che non mi sbagli.

Non uso intenzionalmente alcun CGI bash sul server, sta eseguendo alcune cose PHP usando mod_php e un sito WSGI Python. Ma mi piacerebbe essere sicuro che nessuno dei software in esecuzione sul server stia utilizzando CGI senza che me lo aspetti.

Come posso assicurarmi che il mio server web non sia vulnerabile?

    
posta user56147 25.09.2014 - 09:56
fonte

4 risposte

28

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

    
risposta data 25.09.2014 - 12:19
fonte
9

Secondo la consulenza di Redhat:

mod_php, mod_perl, and mod_python do not use environment variables and we believe they are not affected.

Ulteriori informazioni a riguardo: link

    
risposta data 25.09.2014 - 10:30
fonte
1

Assicurati bash e ti sei assicurato la scatola. Ci sono patch disponibili nella maggior parte delle distribuzioni oppure puoi compilare e patchare tu stesso se esegui una distribuzione che non è ancora stata riparata.

    
risposta data 25.09.2014 - 10:27
fonte
1

Se non sei sicuro di poter disabilitare il modulo cgi sudo a2dismod mod_cgi o rimuovere LoadModule in httpd.conf . Poiché shaomoon ha menzionato mod_php, mod_perl e mod_python non sono interessati.

In ogni caso dovresti semplicemente installare la patch . Se la tua bash non è vulnerabile, anche il tuo apache sarà protetto da questo attacco.

    
risposta data 25.09.2014 - 12:06
fonte

Leggi altre domande sui tag