==Ph4nt0m Security Team==
Issue 0x01, Phile #0x04 of 0x06
|=---------------------------------------------------------------------------=|
|=----------------------=[ 安全幻想曲2008 ]=---------------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=--------------------=[ By axis ]=--------------------=|
|=--------------------=[ <axis_at_ph4nt0m_dot_org> ]=--------------------=|
|=---------------------------------------------------------------------------=|
我見(jiàn)過(guò)的大多數(shù)安全人員,都對(duì)技術(shù)有著一種狂熱,甚至是一種偏執(zhí)。這種情緒在做安
全研究員的時(shí)候是非常有好處的,因?yàn)樽鳛檠芯繂T,可能要偏執(zhí)考慮到一些極端的情況。這
種鉆研精神,是光靠勤奮所無(wú)法達(dá)到的。但是在甲方做安全的話,可能更多時(shí)候需要的就不
是狂熱,而是掌握平衡的藝術(shù)。在商業(yè)利益與安全性發(fā)生沖突時(shí),如何處理好這個(gè)平衡,是一
個(gè)關(guān)鍵。
舉一個(gè)簡(jiǎn)單的例子來(lái)說(shuō),眼下最流行的XSS攻擊,其修補(bǔ)方案從總體上來(lái)說(shuō),大致可以分
為escape output和filter input兩種。對(duì)于狂熱的安全人員來(lái)說(shuō),當(dāng)然是恨不得把網(wǎng)站全
部弄成靜態(tài)的,輸出都采用escape output,全部輸出純文本,就天下太平了。然而現(xiàn)實(shí)與理
想總是有差別的,首道難關(guān)就是網(wǎng)站肯定會(huì)有些富文本的需求。
當(dāng)安全和需求相抵觸時(shí),一定是安全給商業(yè)需求讓路。這里要避免一個(gè)誤區(qū),就是安全
應(yīng)該是為需求而服務(wù)的,而不是成為需求的障礙。其實(shí)這個(gè)觀點(diǎn)大多數(shù)人都心知肚明,但是
在實(shí)際操作起來(lái)的時(shí)候往往會(huì)事與愿違。
再回到富文本上來(lái),當(dāng)需求決定需要有富文本輸出的時(shí)候,狂熱的安全人員(下稱為狂戰(zhàn)
士吧)就只好退而求其次,要求對(duì)富文本做filter input,對(duì)其他沒(méi)有富文本的地方做escape
output。接下來(lái)問(wèn)題來(lái)了,對(duì)于程序員來(lái)說(shuō),富文本往往采用了一些第三方的,或者是基于第
三方的富文本編輯器,還有的是自己實(shí)現(xiàn)了一個(gè)。而這些富文本編輯器,往往在考慮
xss defense的時(shí)候有所欠缺。這時(shí)候采用什么樣的策略來(lái)做filter input,就成為了新的
問(wèn)題。
第一個(gè)難關(guān)就是程序員會(huì)拉上商業(yè),一起來(lái)和狂戰(zhàn)士PK,說(shuō)filter input很容易誤殺客
戶的正常操作,還會(huì)影響到性能。當(dāng)然這小小的難關(guān)還難不倒狂戰(zhàn)士。狂戰(zhàn)士往往會(huì)輕蔑的
一笑,然后把風(fēng)險(xiǎn)推到商業(yè)上,說(shuō)出了問(wèn)題讓他背黑鍋之類。這種狠話一放出來(lái),商業(yè)往往就
會(huì)退縮了,畢竟狂戰(zhàn)士這么個(gè)狠角色是擺在那里的。所以最后會(huì)決定讓程序員去整filter。
于是程序員簡(jiǎn)單寫(xiě)了個(gè)基于正則的blacklist,并且禁用了部分標(biāo)簽,比如script??駪?zhàn)
士這時(shí)候又蹦了出來(lái),對(duì)程序員指手畫(huà)腳,要求禁用style,因?yàn)檫@玩意太難控制了,黑客有幾
百種利用style的方式;狂戰(zhàn)士還說(shuō),基于正則的匹配這個(gè)魔法等級(jí)太低了,要換個(gè)高級(jí)魔法,
比如個(gè)語(yǔ)法分析器,類似html purify這種,還要有l(wèi)og analysis和realtime monitor功能。
一般到了這個(gè)時(shí)候,程序員對(duì)狂戰(zhàn)士的忍耐已經(jīng)差不多到極限了,因?yàn)榧追骄W(wǎng)站很少以
安全為主要考核因素,沒(méi)人會(huì)認(rèn)為一個(gè)視頻網(wǎng)站或者是交友網(wǎng)站的安全需要做的比FBI更好,
因?yàn)闆](méi)那么大的成本投入。于是程序員說(shuō)要釋放這么個(gè)高級(jí)魔法需要一個(gè)團(tuán)的程序員配合,
還需要召喚很長(zhǎng)時(shí)間才能放出來(lái),所以狂戰(zhàn)士的這個(gè)非常牛B的魔法無(wú)法完成。而一般在這
個(gè)時(shí)候,程序員往往會(huì)用啥性能和穩(wěn)定性之類的因素來(lái)忽悠狂戰(zhàn)士,說(shuō)這種魔法一般有一定
概率會(huì)反噬,沒(méi)整好就把自己整殘了。
狂戰(zhàn)士無(wú)奈之下,只好同意程序員實(shí)現(xiàn)一部分的魔法,filter部分過(guò)濾完整有效就行了。
做好這個(gè)之后,狂戰(zhàn)士還讓程序員去對(duì)沒(méi)有富文本需求的地方使用escape output。程序員
這時(shí)候?qū)駪?zhàn)士已經(jīng)忍無(wú)可忍了,因?yàn)橛捎谝郧皬膩?lái)沒(méi)有注意過(guò)xss這方面的問(wèn)題,所以需要
escape的地方是以“千”或者是“萬(wàn)”為單位的,多如牛毛。于是程序員開(kāi)始消極怠工,并且開(kāi)
始訴苦。這條路走不通了,狂戰(zhàn)士只好開(kāi)始尋求更好的方案。
后來(lái)狂戰(zhàn)士回家睡了一覺(jué),在夢(mèng)中有仙人傳授武藝,于是馬上想到了新的辦法。第一招
是filter output,不過(guò)這個(gè)扯淡的方法根本屬于yy,因?yàn)閷?duì)服務(wù)器壓力太大。第二招是使用
WAF,就是web application firewall,開(kāi)個(gè)虛擬補(bǔ)丁,這樣程序員不補(bǔ)也能搞定web漏洞。不
過(guò)這樣就依賴于WAF的規(guī)則了,而且治標(biāo)不治本。看來(lái)昨晚那個(gè)仙人估計(jì)是灶君一類低級(jí)的
小神,盡出餿點(diǎn)子??磥?lái)狂戰(zhàn)士還得繼續(xù)和程序員PK下去了。
可以見(jiàn)到,那些牛圈里的狂戰(zhàn)士常認(rèn)為是“奇技淫巧”的XSS問(wèn)題里,有這么多頭疼的問(wèn)題。
簡(jiǎn)單的問(wèn)題變得越來(lái)越復(fù)雜。
安全是一個(gè)持續(xù)的過(guò)程(process)。既然是過(guò)程,就會(huì)有第一步、第二步 ... 第N步,有
一個(gè)持續(xù)的概念在里面,不能今天整了,明天就不管了。今天的安全并不代表明天的安全,新
的技術(shù)和應(yīng)用在不斷發(fā)展,就會(huì)不斷帶來(lái)新的問(wèn)題。經(jīng)??吹揭粋€(gè)升級(jí)反而把漏洞升級(jí)出來(lái)
的例子。所以安全是一個(gè)持續(xù)的對(duì)抗過(guò)程,hacking與anti-hacking的過(guò)程,廣義來(lái)說(shuō),更是
一個(gè)弱化風(fēng)險(xiǎn)的過(guò)程。
很多BOSS往往都會(huì)這么問(wèn)狂戰(zhàn)士:我上了這個(gè)720安全衛(wèi)士是不是桌面安全就不用管了?
我上了這個(gè)賣(mài)紅茶IPS是不是就能擋住所有刺客入侵了? 狂戰(zhàn)士這時(shí)候很無(wú)奈的說(shuō):不行,還
是有很多trojan和rootkit可以bypass主動(dòng)防御,很多shellcode和0day可以anti IPS。 于
是BOSS很生氣的說(shuō): 那我花這么多錢(qián)買(mǎi)這個(gè)做啥? 狂戰(zhàn)士一般會(huì)忽悠他說(shuō):上了這個(gè)可以解
決90%的攻擊。 于是BOSS會(huì)很不滿意,讓狂戰(zhàn)士出技術(shù)分析報(bào)告,一定要有充分的理由才行,
狂戰(zhàn)士往往要面對(duì)這種煩惱。
其實(shí)BOSS的這種觀點(diǎn)是一種急功近利的想法,沒(méi)有認(rèn)識(shí)到安全是一個(gè)過(guò)程,并且是一個(gè)
持續(xù)改進(jìn)的過(guò)程。不是買(mǎi)個(gè)box就能解決問(wèn)題的。沒(méi)有100%的安全,有漏洞的地方太多了。
經(jīng)常有魔法師用木桶原理來(lái)闡述安全問(wèn)題,但其實(shí)很多時(shí)候,連木板在哪里,到底那塊木板才
是短板,都沒(méi)有一個(gè)很清晰的認(rèn)識(shí),因?yàn)楹芏鄷r(shí)候根本無(wú)法量化,所以狂戰(zhàn)士的工作經(jīng)常陷入
誤區(qū)。板子太多了,系統(tǒng)、網(wǎng)絡(luò)、用戶、應(yīng)用、數(shù)據(jù)、桌面......
放眼看去,全是短板,每塊板子都能讓刺客或盜賊輕松的進(jìn)來(lái),偷走核心數(shù)據(jù)或者弄攤網(wǎng)
站然后揚(yáng)長(zhǎng)而去。或者各種短板互相組合,讓問(wèn)題變得更加撲朔迷離。
前面說(shuō)的WAF就是一種比較功利的做法,雖然廠商經(jīng)常會(huì)蹦出來(lái)說(shuō)這玩意是需要有專人
維護(hù)的,也是一個(gè)持續(xù)的過(guò)程。但實(shí)際上很多購(gòu)買(mǎi)WAF的用戶都沒(méi)有好好的去做這個(gè)過(guò)程。
其實(shí)WAF、IPS最大的軟肋不是在沒(méi)人跟進(jìn)上,而是在于其是串聯(lián)的網(wǎng)絡(luò)上的,特別是開(kāi)了虛
擬補(bǔ)丁的阻斷模式的時(shí)候。這對(duì)于高可用性的應(yīng)用來(lái)說(shuō),絕對(duì)是無(wú)法忍受的。沒(méi)人敢背這個(gè)
誤殺的黑鍋。要是因此導(dǎo)致了PV下降,可能老板就要喊到辦公室去喝茶了。不過(guò)WAF也不是
完全沒(méi)用,如果能夠用好的話,對(duì)于網(wǎng)站還是還是很有幫助的,至少在monitor和攻擊流量分
析上起著積極的意義。不過(guò)前提是用好。
剛才說(shuō)了安全是一個(gè)過(guò)程(Process),其實(shí)有人跟進(jìn)這個(gè)過(guò)程還不夠,下面還要重點(diǎn)說(shuō)說(shuō)
深度防御的思想。經(jīng)??吹結(jié)Y小說(shuō)的作者在寫(xiě)到黑客攻防的時(shí)候,說(shuō)到XXX在xx分鐘內(nèi)就突
破了N道防火墻,N大于100;變形金剛里也這么有這種場(chǎng)景。其實(shí)這純粹是扯淡,沒(méi)事整那么
多防火墻做什么,無(wú)端影響了可用性。不過(guò)YY作者深度防御的理念還是正確的,只是他不知
道那玩意不應(yīng)該單純叫防火墻,要想表達(dá)這個(gè)思想,可以整個(gè)專業(yè)名詞,比如:多層防御體系。
這樣裝B就可以裝的比較像樣了。舉例來(lái)說(shuō),可以在應(yīng)用層校驗(yàn)用戶輸入數(shù)據(jù),DB層面檢查每
條sql,操作系統(tǒng)上細(xì)分權(quán)限,服務(wù)最少化,網(wǎng)絡(luò)上防御arp spoof,加密傳輸通道,做好ACL…類
似措施還有很多,防御的方案交叉層疊起來(lái),就能起來(lái)一個(gè)比較好的保護(hù)效果。
不過(guò)偏偏還有不識(shí)趣的,比如前面的很多程序員都會(huì)說(shuō),我都已經(jīng)做了filter input,還
要escape output做啥??駪?zhàn)士一般聽(tīng)到后會(huì)有想要狂化的沖動(dòng)。按耐住狂化,告訴程序員,
說(shuō)filter input可能會(huì)做不干凈,會(huì)被bypass,畢竟如果遇到一個(gè)手執(zhí)絕世0day(bypass
filter)的9級(jí)刺客,什么牛B的防御魔法都擋不住,所以能escape output的地方,最好escape
掉,這樣最干凈??墒羌幢闶沁@樣做好了,還是有些會(huì)有很難處理和發(fā)現(xiàn)的地方,比如在DOM
里的XSS,比如在JS里面一些寫(xiě)的很BT的地方,等。這些只能靠肉眼去看了。PK還得進(jìn)行下去。
但是程序員還是不能很好的理解,他們跑出來(lái)說(shuō):我這里做了完善的access control,只
有管理員才看的到,這里就算有注射有跨站就隨他去了,不需要修復(fù)。想偷這種懶的人其實(shí)
不在少數(shù)。這種想法違背了深度防御的思想。先姑且不論如果管理員密碼泄露,或者管理員
是個(gè)內(nèi)鬼的情況。如果刺客通過(guò)注射拿到了管理員密碼,或者是直接通過(guò)XSS和CSRF來(lái)對(duì)后
臺(tái)進(jìn)行注射,那么前面的access control就完全沒(méi)作用了。
在一定程度上,是可以容忍風(fēng)險(xiǎn)的存在的,但是從長(zhǎng)期來(lái)看,這種做法是非常不可取的。
比如有的管理員會(huì)說(shuō)防火墻只允許80端口,那么RPC漏洞或開(kāi)其他端口的應(yīng)用漏洞是否就可
以不補(bǔ)了。也許一時(shí)來(lái)說(shuō)是沒(méi)什么問(wèn)題,但是如果放置不管將導(dǎo)致沒(méi)有人來(lái)維護(hù)漏洞,也許
哪天的防火墻策略變更,或者來(lái)自內(nèi)部系統(tǒng)的威脅,都有可能導(dǎo)致當(dāng)時(shí)看起來(lái)無(wú)害的漏洞被
利用。而這種做法的一個(gè)后果往往是難以檢查原因,就是說(shuō)咋死的都不知道。所以這又回到
了開(kāi)始的話題:安全是一個(gè)持續(xù)的過(guò)程。
在灌輸完深度防御的思想給程序員以后,狂戰(zhàn)士又被另外一種程序員打擊到崩潰了。面
對(duì)滿目都是紅色的掃描報(bào)告,他們說(shuō):我這個(gè)xxx ftp沒(méi)漏洞,除非狂戰(zhàn)士可以證明黑客能搞
進(jìn)來(lái)拿到shell。一般狂戰(zhàn)士聽(tīng)到這種要求,狂化的概率在80%以上。首先,不是只有能拿到
shell的才叫漏洞。一個(gè)dos可能會(huì)造成業(yè)務(wù)的中斷,一個(gè)infomation leak可能會(huì)為后續(xù)攻
擊帶來(lái)便利,等等。
面對(duì)scan report以及CVE查詢出來(lái)的漏洞,大部分都是沒(méi)有現(xiàn)成的exp能夠利用的,而且
要利用漏洞可能有各種苛刻的條件,比如要求本地交互shell啊,或者要求有帳戶之類。而更
多的時(shí)候,漏洞根本連細(xì)節(jié)的都沒(méi)有,只有一個(gè)漏洞公告里一個(gè)簡(jiǎn)單的劃分critical,標(biāo)紅。
就算有exp,可能還要考慮到exp的穩(wěn)定性和成功率、語(yǔ)言版本啥的,打過(guò)去也不一定能成功。
更何況狂戰(zhàn)士無(wú)法處心積慮了為了POC給程序員看,而花費(fèi)大量的精力來(lái)追求一個(gè)可能沒(méi)有
結(jié)果的漏洞。
但是無(wú)法POC不代表就沒(méi)有風(fēng)險(xiǎn)了。我們的目標(biāo)是要保證一個(gè)系統(tǒng)長(zhǎng)期的在任何情況下
都能安全運(yùn)行,機(jī)密數(shù)據(jù)不會(huì)外泄,業(yè)務(wù)不會(huì)中斷。所以這種程序員犯的錯(cuò)誤就是偷換了概
念,把威脅范圍縮小了,用個(gè)體來(lái)代替全局。很多時(shí)候威脅可能來(lái)自內(nèi)部,可能來(lái)自誤操作,
可能來(lái)自其他的風(fēng)險(xiǎn)。要說(shuō)服這種程序員很辛苦,只能夠靠長(zhǎng)期的“忽悠”,來(lái)慢慢感化他們,
要是運(yùn)氣好還能做出一兩個(gè)POC來(lái)震撼下他們,劉震撼(ZhenHan.Liu)就是為此而生的。佛曰:
我不下地獄誰(shuí)下地獄。
作為一個(gè)優(yōu)秀的狂戰(zhàn)士,往往要有相當(dāng)程度的mission impossible的修為。很多時(shí)候,
需要為瀏覽器漏洞、操作系統(tǒng)漏洞擦屁股,不然最后吃虧的還是自己的用戶。面對(duì)釣魚(yú)和詐
騙,很多時(shí)候那些認(rèn)為web安全是“奇技淫巧”狂戰(zhàn)士們認(rèn)為解決方案是impossible的,認(rèn)為
no patch for stupid。比如phishing,誠(chéng)然,如果有一個(gè)一勞永逸的方案,那么這種完美魔
法要是放出來(lái)了絕對(duì)可以獲得圣階魔導(dǎo)師的稱號(hào)。但是YY歸YY,現(xiàn)實(shí)歸現(xiàn)實(shí)。狂戰(zhàn)士們很頭
疼這種問(wèn)題,但是卻不得不去面對(duì)它。
魔法最終還是放出來(lái)了,可惜不完美。目前anti-phishing的魔法,有整到瀏覽器里內(nèi)置
對(duì)抗的(IE7/8),也有瀏覽器toolbar、擴(kuò)展的,有在IM里做過(guò)濾的,還有窮舉malicious sites
的,更有發(fā)動(dòng)人民戰(zhàn)爭(zhēng)來(lái)維護(hù)一個(gè)blacklist的,其難度和成本從低到高什么都有,不過(guò)基本
都無(wú)法一次性解決問(wèn)題。比較有創(chuàng)意的魔法屬于yahoo發(fā)明的sign seal,基于認(rèn)證機(jī)器的原
理來(lái)識(shí)別真實(shí)網(wǎng)站,不過(guò)這個(gè)方法的缺陷在于需要長(zhǎng)期教育用戶,實(shí)際使用效果不一定好。
yahoo還整了個(gè)domainkey技術(shù)來(lái)在郵件里對(duì)抗phishing,不過(guò)這個(gè)缺陷更明顯,需要郵件服
務(wù)商支持。yahoo的狂戰(zhàn)士挺有想法的,就是太理想化了一點(diǎn)。
說(shuō)到安全世界的另外一股強(qiáng)大力量不能不提教廷,這個(gè)宗教從精神上統(tǒng)治了安全世界,
一群群紅衣主教們整出來(lái)了一堆標(biāo)準(zhǔn)、規(guī)范比如BS7799之類來(lái)幫助狂戰(zhàn)士們更好的忽悠他
們的BOSS。其實(shí)標(biāo)準(zhǔn)是死的,主教們的出發(fā)點(diǎn)是好的,不過(guò)這些標(biāo)準(zhǔn)啥的就和秘籍差不多,狂
戰(zhàn)士們以為他們讀明白了,其實(shí)很少人真正讀懂了。那玩意如果拿來(lái)忽悠BOSS們確實(shí)是一套
套的,但用在實(shí)處則有一個(gè)本地化的過(guò)程。必須要把標(biāo)準(zhǔn)之類的東西和實(shí)際情況結(jié)合起來(lái),
不然就只能停留在忽悠的層面上。
最能體現(xiàn)問(wèn)題的出在編碼規(guī)范上??赡苡蠳個(gè)權(quán)威的機(jī)構(gòu)都出了他們自己的code規(guī)范,
或者某些狂戰(zhàn)士傭兵團(tuán)(安全公司)也自己整了套。不過(guò)在具體使用的時(shí)候,很多狂戰(zhàn)士都是
拿了一套去用在所有的公司身上,其實(shí)這樣的結(jié)果就是到最后沒(méi)有程序員遵守用那玩意,因
為在實(shí)際情況中往往不好用。每個(gè)公司都有自己的體系、環(huán)境和編碼習(xí)慣。系統(tǒng)的designer
和architect只要不是小白一般都或多或少的會(huì)考慮點(diǎn)安全風(fēng)險(xiǎn),規(guī)范只有本地化以后才能
很好的用起來(lái),不然絕對(duì)會(huì)水土不服。所以要是再遇到什么安全公司拿標(biāo)準(zhǔn)、規(guī)范來(lái)忽悠的
時(shí)候,狂戰(zhàn)士們就要睜亮了眼睛了!
胡侃瞎吹了這么多其實(shí)也沒(méi)說(shuō)到重點(diǎn),不過(guò)重點(diǎn)已經(jīng)不是本文要講的事情了,想要講的
東西還有很多,也許以后會(huì)陸續(xù)寫(xiě)出來(lái)。狂戰(zhàn)士是份很好的職業(yè),希望有更多的狂戰(zhàn)士甚至
是半獸人朋友能夠加入我所在的狂戰(zhàn)士傭兵團(tuán)!
-EOF-