MIME sniffing臨陣倒戈導(dǎo)致IE被跨站攻擊
原創(chuàng)【51CTO.com 獨(dú)家特稿】IE有一個(gè)特性,那就是在將一個(gè)文件展示給用戶之前會(huì)首先檢查文件的類型,這乍看起來并沒什么問題,但實(shí)際上這是相當(dāng)危險(xiǎn)的,因?yàn)檫@會(huì)允許IE執(zhí)行圖片中的代碼,即嵌入在一個(gè)圖像中的JavaScript代碼。引入MIME sniffing功能的初衷是用來彌補(bǔ)Web服務(wù)器響應(yīng)一個(gè)圖像請(qǐng)求時(shí)有可能返回錯(cuò)誤的內(nèi)容類型信息這一缺陷。
但是事不遂人愿,心懷不軌的人可以輕易濫用這一特性,如通過精心制作一個(gè)圖像文件,并在其中嵌入可以被瀏覽器所展示和執(zhí)行的HTML和JavaScript代碼。本文將深入考察該問題,并為用戶和網(wǎng)站開發(fā)人員介紹如何降低此問題帶來的風(fēng)險(xiǎn)。
一、危險(xiǎn)的MIME sniffing功能
對(duì)于Web 2.0應(yīng)用程序來說,允許用戶上載圖像是一項(xiàng)基本的要求。但是,IE用戶面對(duì)這些圖片時(shí)卻要小心了,因?yàn)镮E的某些功能會(huì)為利用圖片進(jìn)行跨站點(diǎn)腳本攻擊大開方便之門。
雖然許多大型站點(diǎn)都設(shè)法保護(hù)其訪問者免受可能的JavaScript攻擊,例如實(shí)現(xiàn)專門用于防御活動(dòng)內(nèi)容的過濾器等,但是他們卻無法跟活動(dòng)內(nèi)容一刀兩斷,因?yàn)閷?duì)于個(gè)人簡(jiǎn)介、博客和論壇來說,JavaScript、HTML 代碼和Flash小應(yīng)用程序是不可或缺的活動(dòng)內(nèi)容。
此外,大部分交互型站點(diǎn)都允許用戶上載和鏈接他們的圖片,但是攻擊者卻可以利用此功能來顛覆IE為保證兼容性和提供額外的安全性而引入的某些功能。攻擊者只需在圖像的開頭部分嵌入一些HTML代碼和JavaScript,那么當(dāng)IE打開這個(gè)做過手腳的圖像時(shí),瀏覽器所做的不是顯示圖像,而是檢測(cè)并運(yùn)行圖像中嵌入的代碼。
之所以出現(xiàn)這種情況,是因?yàn)闉g覽器可以用來確定文件類型的方式多種多樣,例如文件擴(kuò)展名jpg可以指出一個(gè)圖像為JPEG格式,此外Web服務(wù)器還可以在HTTP報(bào)頭中定義Content-Type(在本例中為image/jpg),但是一般說來使用上載的文件的文件名擴(kuò)展部分來指出文件的類型。
最后,大多數(shù) Web 瀏覽器還會(huì)檢查一個(gè)文件的開始幾個(gè)字節(jié)(即通常所說的文件的“簽名”),這幾個(gè)字節(jié)通常為一些眾所周知的字節(jié)序列,例如PNG、PK、JPEG、JFIF等等。
迄今為止,我們介紹了瀏覽器可以確定文件內(nèi)容類型的三種方法,即通過文件本身的擴(kuò)展名或文件開頭部分的簽名,或通過服務(wù)器響應(yīng)報(bào)頭Content-Type來確定文件類型。
不過,后來IE4引入了第四種方法,即通常所說的MIME sniffing或者M(jìn)IME類型檢測(cè)方法。所以,現(xiàn)在的IE版本都不自動(dòng)地假定來自web的文件的內(nèi)容類型就是服務(wù)器在HTTP報(bào)頭中的所聲明的內(nèi)容類型。IE瀏覽器既不信任文件名擴(kuò)展部分,也不信任簽名,相反,它是通過檢查文件開頭的256字節(jié)內(nèi)容來確定文件的類型。
然而,只有當(dāng)用戶直接調(diào)用URL下載文件時(shí)IE才這樣做。當(dāng)使用IE打開HTML中的圖像標(biāo)簽(IMG)所連接的本地存儲(chǔ)的文件或者圖像的時(shí)候,則不會(huì)進(jìn)行嗅探。
IE引入MIME sniffing功能的初衷是用來提防服務(wù)器給出的錯(cuò)誤內(nèi)容類型指示的,但是攻擊者卻利用它來規(guī)避IE中的安全防御功能,即防止瀏覽器自動(dòng)地執(zhí)行所下載的文件(如hta文件)的那些功能。
此外,MIME sniffing還使得瀏覽器能夠容忍在Content-Type聲明中的偶然性錯(cuò)誤,例如,如果服務(wù)器聲明某文件類型為text/plain文件,然而實(shí)際提供的卻是一個(gè)HTML文件,那么IE將它作為HTML處理。
對(duì)于常見的GIF、JPEG和PNG格式,只要文件擴(kuò)展名、Content-Type和簽名所指的類型相一致,那么瀏覽器就會(huì)對(duì)MIME sniffing所得到的結(jié)果置之不理。只有當(dāng)文件擴(kuò)展名、Content-Type和簽名所指的類型有出入時(shí),IE才會(huì)以MIME sniffing所確定的結(jié)果為準(zhǔn)。
二、倒打一耙的MIME sniffing功能
現(xiàn)在,如何保護(hù)用戶免受惡意服務(wù)器的侵害與如何為不正確地配置服務(wù)器的管理員提供有效幫助已經(jīng)成為Web 2.0所面臨的一大問題。 如果文件的擴(kuò)展名、Content-Type和簽名相抵觸,那么瀏覽器會(huì)以內(nèi)容為準(zhǔn)。
所以,如果一幅圖片的開頭部分為一些HTML代碼的話,雖然乍一看好像是無害的,但是實(shí)際上卻可能相當(dāng)危險(xiǎn),因?yàn)镮E會(huì)執(zhí)行圖片中的代碼。這為攻擊者把JavaScript嵌入圖像提高了一個(gè)機(jī)會(huì),所以他們可以利用這種方式執(zhí)行跨站點(diǎn)腳本攻擊,使用精心制作的圖像來竊取受害者在當(dāng)前訪問的服務(wù)器上的身份驗(yàn)證cookie,然后以受害者的身份登錄到那個(gè)服務(wù)器。
三、援兵未至
微軟公司已經(jīng)認(rèn)識(shí)到這個(gè)問題,并計(jì)劃IE的新版本中加以修復(fù)。IE8不再探測(cè)圖像,因此,它會(huì)忽略嵌入的HTML。此外,對(duì)于特定的下載,還可以通過為私有的Content-Type以及authoritative指定值來關(guān)掉MIME sniffing功能,例如content-type=text/html; authoritative=true;。然后,IE會(huì)把文件當(dāng)作服務(wù)器指出的類型來處理。
關(guān)鍵情況下,可以使用新的“X-Download-Options: noopen”頭部來確保在站點(diǎn)上下文的外部顯示相應(yīng)的文件,這意味著即使HTML文件也能夠安全的投遞,因?yàn)闉g覽器只是將文件保存起來而已。遺憾的是,IE8要想全面替代其他版本的IE尚需時(shí)日,在此之前,Web站點(diǎn)對(duì)此還是指望不上的。
四、急救措施
實(shí)際上,如今想要抵擋這些精心制作的文件也并非難事。自Windows XP SP2以來,用戶已能禁用IE中的MIME sniffing功能,方法是打開瀏覽器的“工具”菜單中選擇“Internet 選項(xiàng)”,點(diǎn)擊“安全”選項(xiàng)卡,在“請(qǐng)為不同的區(qū)域的Web內(nèi)容指定安全設(shè)置(z)”下面選擇“Internet”圖標(biāo),在“該區(qū)域的安全級(jí)別(L)”下面點(diǎn)擊“自定義級(jí)別”按鈕,最后啟用“基于內(nèi)容打開文件,而不是文件擴(kuò)展名”選項(xiàng)即可。然而,這樣做會(huì)重新開放一些以前的古老漏洞!
這是否能夠提供安全性只能夠靠實(shí)踐來證明。我們的重點(diǎn)不應(yīng)該放在在用戶間推廣這個(gè)技巧,而是應(yīng)該設(shè)法讓web服務(wù)應(yīng)用提供安全保障措施來保護(hù)訪問者,并確保Web服務(wù)提供方的系統(tǒng)不向用戶傳送精心制作的圖像。
管理員可以使用腳本檢查上傳到其服務(wù)器中的文件的類型的一致性。舉例來說,如果某圖像的文件名擴(kuò)展部分為.jpg,并且文件起始字節(jié)部分的簽名也指出是相同的類型(在Linux下可以使用file image.jpg命令,而在PHP中可以使用getimagesize加以印證),經(jīng)過上述驗(yàn)證后,服務(wù)器才能發(fā)出該文件。
這樣,即使文件包含HTML 代碼,IE也不會(huì)執(zhí)行這些代碼。然而要注意的是,通過這種方式只能保護(hù)圖像的安全,同時(shí)服務(wù)器聲明的Content-Type必須完全正確才行。 這個(gè)方法對(duì)其它格式均不起作用。
然而,要想達(dá)到絕對(duì)的可靠性,需要檢查文件的前256字節(jié)是否HTML 代碼。IE使用常見的〈body〉、〈head〉、〈html〉、〈img〉、〈script〉等等標(biāo)簽來識(shí)別HTML代碼。如果在文件的前256字節(jié)中沒有發(fā)現(xiàn)任何標(biāo)簽的話,微軟的瀏覽器就無法解釋該文件了。
管理員也可以這樣配置服務(wù)器,當(dāng)文件被下載(而非打開)時(shí),服務(wù)器總是發(fā)出頭部“Content-disposition: attachment; filename="〈filename.ext〉”。 這樣就能防止瀏覽器在該站點(diǎn)的上下文中打開此文件,而是使用本地鏈接的應(yīng)用程序來打開此文件,但是這樣做會(huì)使用戶感覺很不爽。 遺憾的是,這種頭部重寫技術(shù)只對(duì)那些不允許直接訪問文件的用戶有效。鑒于此,所上傳的文件的存儲(chǔ)位置不應(yīng)該位于可公開訪問的地方,并且最好為文件隨機(jī)命名。
實(shí)際上,最有效的方法是使用ImageMagick或者類似的工具來轉(zhuǎn)換圖像文件的格式。這能從圖像中清除掉所有代碼段,從而徹底擺脫這些代碼為用戶帶來的威脅。像Facebook和Twitter這樣的大型站點(diǎn)會(huì)對(duì)用戶上傳的肖像照片進(jìn)行轉(zhuǎn)換,但是必須小心行事,因?yàn)檫@有可能打開另一個(gè)攻擊方式。例如,如果某人在ImageMagick中發(fā)現(xiàn)了一個(gè)緩沖區(qū)溢出問題,那么攻擊者可能進(jìn)行一番嘗試,并找到一種利用特制的相片來利用該問題的方法。
五、總結(jié)
MIME sniffing功能本是IE的忠誠(chéng)衛(wèi)士,誰知他如今突然“倒戈”,助紂為虐來危害IE用戶。對(duì)策當(dāng)然是有,但是這些對(duì)策是否靠譜卻是個(gè)懸而未解決的問題。目前,通過圖像發(fā)動(dòng)的跨站點(diǎn)腳本攻擊看起來還不太常見,但是世界正在發(fā)生急劇的改變:交互型網(wǎng)站正在變成犯罪的首選目標(biāo)。好在,我們還可以使用其它的瀏覽器,例如Firefox等,這倒不失為一個(gè)補(bǔ)救措施。當(dāng)然Firefox也進(jìn)行MIME sniffing,但是它卻不會(huì)莫名其妙地將圖像作為HTML進(jìn)行解釋。
【編輯推薦】





















