Perché "() {:;};"?

2

Volevo capire perché il codice qui sotto serve come proof-of-concept per dirmi se il mio server è vulnerabile o meno. Inoltre, come funziona la vulnerabilità a livello inferiore?

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' 

Quindi quando eseguo il comando di seguito

bash -c "echo test"

Posso ottenere entrambi (ovvero sono vulnerabile):

vulnerable
bash: BASH_FUNC_x(): line 0: syntax error near unexpected token ')'
bash: BASH_FUNC_x(): line 0: 'BASH_FUNC_x() () { :;}; echo vulnerable'
bash: error importing function definition for 'BASH_FUNC_x'
test

o (che significa che non sono vulnerabile):

bash: warning: x: ignoring function definition attempt
bash: error importing function definition for 'BASH_FUNC_x'
test
    
posta James 02.10.2014 - 14:09
fonte

1 risposta

2

Prima di tutto, il comando che eseguirai sarebbe:

$ env 'x=() { :;}; echo vulnerable' 'BASH_FUNC_x()=() { :;}; echo vulnerable' bash -c "echo test"

Tutto si riduce al modo in cui la vulnerabilità funziona. Quando le esportazioni di bash funzionano, lo fa attraverso l'ambiente, con una funzione x memorizzata in una variabile x o (dopo l'ultima patch) BASH_FUNC_x.

il codice bash quindi rileva che il valore inizia con '() {' e esegue:

x () { :;}; echo vulnerable

(che è la voce di ambiente con = sostituita con uno spazio) che è una definizione di funzione con: nel corpo (un comando do-nothing). In una bash vulnerabile CVE-2014-6271, eseguirebbe la definizione della funzione (fino a } ), quindi proseguirà con l'esecuzione del resto del codice (la patch iniziale quindi non ha eseguito il resto del codice) .

    
risposta data 02.10.2014 - 14:26
fonte

Leggi altre domande sui tag