2014年10月2日 星期四

BASH ShellShock 漏洞分析


這回的 bash 漏洞很有趣,定義一個 script 函式竟然能夠被自動觸發執行。CVE-2014-6271 漏洞揭露後,經過數日,許多人不斷地在找尋可利用此漏洞的方法,試圖可以進行遠端入侵或本地提權等,也有不少人瘋狂找尋 bash 或其它 shell 的類似問題,當然各資安相關媒體或廠商也不斷 "提醒" 大家要盡快升級 bash,彷彿有了 bash 就會被入侵一般。

目前 shellshock wiki 描述及收集了詳細的資訊,這篇 BASH 代碼注入的安全漏洞 也針對漏洞作了詳細說明,以及 DevCore 的 Shaolin 寫的這篇。所以我打算針對漏洞成因,以及漏洞利用環境作探討。


漏洞原因


在 bash 的原始碼 variables.c 中可以看到 bash 在初始化環境變數時,會掃瞄環境變數中是否有函式定義,其函式定義的 keywords 為 "() {",見第 11 行。若有函式定義的字串,應該僅轉換為函式內容,不應該執行該函式,見第 21 行。


Patch 的方式可見 patch ,主要是導入兩個參數定義
+ #define SEVAL_FUNCDEF 0x080  /* only allow function definitions */
+ #define SEVAL_ONECMD 0x100  /* only allow a single command */



然後在原來呼叫 parse_and_execute() 的地方改用
parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);

並且在 parse_and_execute() 裡再去檢查是否有 SEVAL_FUNCDEF|SEVAL_ONECMD。



遠端執行指令碼



想要利用這個 bash 漏洞,就要非常了解 Linux 的環境變數繼承關係。事實上,在 Unix 系統中以環境變數來傳遞參數或資料是很平常的事,因為環境變數是 key=value 格式,又具有行程間繼承的作用。

因此,要找到可利用的情況,首先要找尋一個網路服務程式,此程式會將網路上接收的資料或請求(Request)轉換為環境變數,若是網路服務程式再透過 execle()/execvpe()/execve() 或是 system()/popen() 來執行其它程式時,因為上述函式會繼承環境變數的關係,才有成功利用的機會。


以 httpd 為例,其實 httpd 並不會接收遠端傳來的環境變數,而是 httpd 在 mod_rewrite 模組執行時將 HTTP Request 中的欄位轉換填入對應的環境變數中,再經由 mod_cgi 模組執行 CGI 程式。所以 CGI 程式可以透過環境變數的方式取得 HTTP Request 所需要的內容。
例如,將 HTTP Request 中的 User-Agent 欄位的內容,轉換為環境變數為 HTTP_USER_AGENT 的內容,以便任何語言開發的 CGI 程式可以透過環境變數 HTTP_USER_AGENT 取得  User-Agent 欄位內容。


C 語言 CGI 範例



在此 C 語言的範例中,即便 system() 中執行的命令是固定,不可被 Command Injection,但透過 CVE-2014-6271,則可以執行任意命令,因為 system() 是透過 /bin/sh -c 來執行 /bin/hostname。

事實上,不只 C 語言開發的 CGI,任何語言開發的 CGI 程式透過 httpd mod_cgi 執行,都可能會被利用此漏洞。不過若是直接用 bash script 開發的 CGI 程式,則不需要再透過呼叫 system(),直接就可以利用此漏洞。


bash script 語言 CGI 範例


經過測試 mod_cgi 搭配各語言,發現 perl 和 ruby 在某些情況下無法利用此漏洞。原因是,
perl 和 ruby 在進行 system()/popen() 之類的呼叫時,會先經過最佳化,判斷是否只是執行外部程式而非真的 script 命令,只有是 script 命令才會透過 /bin/sh -c 來執行,否則會直接執行(execve)該外部程式。
例如 perl 語言中:

system ("/bin/env > /dev/null");
system("/bin/uname -a");

第一行的命令字串中因為有 > 重新導向輸出的符號,因此會透過 /bin/sh -c 來執行該命令,但是第二行的命令字串中,僅是直接執行 /bin/uname,因此並不會透過 /bin/sh -c 來執行該命令,也就不會造成漏洞利用。

下列是我在 CentOS 6.4 + Apache 2.2.15 測試了各語言版本 CGI 程式,搭配不同的環境,所測試的結果:

V: 可直接利用或透過 system()/popen() 利用
O: 在未最佳化執行的 system()/popen() 情況下可利用
X: 不可被利用
我建議 Linux 伺服器管理者優先將 Linux 伺服器作 bash 升級,並且將網站環境作分析,評估不再使用 mod_cgi 或 mod_fastcgi。另外也請將 Linux 作安全性強化,可參考 Kenduest Lee (小州)的 Security Enhanced Linux


另外一個例子是透過 DHCP 發送含執行代碼的封包,讓 Linux 的 dhclient 被利用此漏洞來入侵。從 Internet Systems Consortium DHCP Distribution Version 4.2.4 的原始碼來看,的確是 dhclient.c 會從 DHCP 封包中將參數值透過內建的 client_envadd() 轉換成環境變數,再經由 execve() 執行了 dhclient-script (bash script),所以當然也就中獎了。

下列兩道指令可用來檢測系統上的 dhclient 是否會被此漏洞影響,當然 patch bash 才是王道。

$ /sbin/dhclient - 2>&1 | grep "ISC"
This version of ISC DHCP is based on the release available
$ which dhclient-script
/sbin/dhclient-script

另一個漏洞 CVE-2014-7169


env X='() { (a)=>\' sh -c "echo date"; cat echo

這行環境變數的設定,會使得原來應該是 echo date,顯示 "date" 字串,變成執行 "date" 指令。從 bash 原始碼中可發現,在 shell_getc (y.tab.c) 讀取輸入字串遇到錯誤時會呼叫 reset_parser() (y.tab.c),然而控制字元讀取位置的 global 變數 int eol_ungetc_lookahead 卻沒有重置歸 0,修補方式請看 patch

所以 () { (a)=>\ 是用 = 字元故意製造錯誤,字元讀取位置因為沒被重設,還留在 > 字元,因此在讀取 "echo date" 後原本要執行 "echo" 變成了讀取 ">echo date",執行後結果變成執行 "date" 命令,將結果輸出至 "echo" 檔案中。

這個漏洞要利用的條件限制更多,而且不像 CVE-2014-6271 可以指定任何命令執行,而只能讓原本要執行的命令作改變,有點類似當年 Unix IFS 的問題。

結論

目前此漏洞仍然在發酵中,有些人找尋了特定 CGI 網站程式進行攻擊,也有人試圖找尋其它的相關漏洞,也許這漏洞真的有機會得到今年的 Pwnie Award 呢。



[References]
1. https://access.redhat.com/articles/1200223
2. https://securityblog.redhat.com/2014/09/26/frequently-asked-questions-about-the-shellshock-bash-flaws/
3. http://ftp.gnu.org/pub/gnu/bash/bash-3.2-patches/bash32-052
4. http://www.cnblogs.com/LittleHann/p/3992778.html
5. http://www.trendmicro.com/cloud-content/us/pdfs/security-intelligence/white-papers/wp-shellshock.pdf
6. http://jaxbot.me/articles/cases-where-bash-shellshock-is-safe-09-25-2014
7. http://security.stackexchange.com/questions/68448/where-is-bash-shellshock-vulnerability-in-source-code

2014年6月8日 星期日

十年

近日陰雨綿綿,潮溼略帶悶熱,轉進人潮擁擠的捷運站內,赫然見到一位身穿黑色T恤的男孩從身邊匆匆走過,看著衣服上的小灰帽,思緒不禁帶到那個充滿熱情的夏天。
一個年輕小夥子,站在坐滿百人的教室內,正在淊淊不絕地講述如何透過駭客技巧,免費觀賞熱情視訊(WebCam Girls),這一場壓軸讓全場充滿歡笑,代表第一次舉辦台灣駭客年會的成功,也開啟了台灣駭客們的夢。
2004 年六月,CHROOT 資安社群成立,匯集了當時台灣地下駭客組織成員、資深的資安專家和白帽駭客,並且決定參考美國拉斯維加斯的駭客年會(DEFCON) 在台灣舉辦一場屬於自己的駭客年會,定名為 Hacks In Taiwan (HIT),這個名稱的由來其中一個原因係紀念已解散的著名駭客組織(Hackers In Taiwan),另一方面強調對於駭客技術的熱情不只在資安領域,而是汎指各項技術上的 Hacking。中文名稱取作「台灣駭客年會」更是挑戰當時對於「駭客」名詞的負面看法,希望對「駭客」一詞有正面概念的傳達。
對於一群只熟悉網路技術的宅男們來說,辦一個研討會是大夥從沒有過的挑戰,不知道要探討什麼主題;不知道有沒有講師,不知道要有預算概念;不知道會議流程如何進行;不知道有沒有贊助商;不知道會有多少人報名參加。因此,CHROOT 決定花一年的時間準備,每個月固定聚會討論會議主題,分享研究成果,訓練演講技巧,觀摩其它研討會,找尋各方資源,選定在七月中旬於文化大學大新館舉辦,希望帶給參加者一個不同於商業性質,充滿駭客技術分享,充滿熱情有趣,具有表現自我機會的研討會,這些後來也成為每一屆的重要精神。
還記得,我們定了一個當時不算低的票價,而且還得先匯款才能完成報名,網站只有少數資訊且還放了一頁奇怪文字訊息,官方郵件服務還不穩定,偶爾會有退信情況發生。有趣的是,當時我向文化大學訂場地時,擔心用「駭客年會」名義會被校方拒絕,所以我用「資安社群研討會」,導致許多報名者想向文化大學求證時,都被回覆「文化大學並無駭客年會相關活動舉辦」。
第二屆舉辦時,我們就發現文化大學數位演講廳的兩百個位子已不夠,因此第三至第五屆移到台灣科技大學國際演講廳,同時,在更多的贊助商及各路先進協助下,參與人數近四百人,成長兩倍有餘。到了 2010 年,終於有了能滿足空間、設備及費用的場地 - 中研院人文社會科學館,直到 2013 年,HITCON 現場參與人數突破 850 人,報名開放僅三分鐘內門票即售磬,創記錄的讓 30 位國內外資安專家發表演講,這還真是台灣少見的大規模資訊技術研討會。
要舉辦大型的研討會,其實都靠優秀的工作人員齊心合力完成。前幾屆都是由 CHROOT 成員的女友、老婆或兄弟姊妹們,充當工作人員,他們的辛勞付出與經驗傳承,也讓 HITCON 在往後招募志工上,更為容易。不管是親朋好友找來幫忙,或是自願加入協助活動舉辦,都是每年 HITCON 能成功的背後重要因素,值得我們心存感激。
說實在的,一年舉辦一次研討會,其實已經讓 HITCON 籌辦團隊忙到焦頭爛耳,但又時時覺得希望多一點活動,讓台灣更多人重視資安,提起學生們對 Security 的興趣,進而發揮更大的影響力。為了讓重大資安事件被各界重視,我們開始辦 HITCON Freetalk,以小規模活動方式邀請各政府單位及企業參與,第一時間將完整訊息揭露,協助加速應變及處理,例如去年三月韓國發生的嚴重資安攻擊,今年 OpenSSL HeartBleed 嚴重漏洞。此外,這幾年我們見到每年在 HITCON 舉行的 Wargame 競賽逐漸受到重視,除了政府舉辦的資安金盾獎,今年四月初賽門鐵克第一次在台灣舉辦駭客攻防競賽,五月初,HITCON Wargame 組長 Alan,組團帶領台大 217 學生團隊,前往南京參加百度 BCTF 競賽獲取冠軍,憑著這股勢氣和不放棄的精神,在上週末的 DEFCON CTF 資格賽搶下寶貴名額,準備在八月以 HITCON CTF 團隊名義,代表台灣出賽,和全球頂尖駭客爭奪世界冠軍。
透過 HITCON ,我們逐漸實現多年前的夢想,確切來說,我們透過 HITCON 的力量協助台灣年輕的駭客們逐夢,也是實現我們的夢,而他們對 HITCON 的熱情和支持,也是我們在舉辦 HITCON 精疲力精後的一股強心針。
“I like the dreams of the future better than the history of the past.”
                                                                                      ― Thomas Jefferson
接下來,HITCON 籌辦團隊試著把 HITCON 帶向永續發展及培養更多資安人才的方向努力,我也期望 HITCON 的未來十年,能創造及完成更多的夢想。堅持、努力以及不放棄的挑戰,也是駭客心中的信念,不是嗎?
穿著小灰帽衣的男孩仍在捷運上滑著手機,聽著關門的催促聲,我踏出車箱,回頭望著駛離的捷運列車,視線逐漸模糊。
                                                                                                                                         By Tim 2014.5