虎嗅注:XcodeGhost在不久前對國內(nèi)的iOS系統(tǒng)造成了巨大的安全威脅,但在安全威脅下還暗藏著巨大的信任隱患,中國的特色網(wǎng)絡(luò)環(huán)境為這些隱患提供了溫床。其嚴(yán)重性往往不為我們所知,所以作者也不禁高呼“千萬不要低估安全問題能造成的后果,尤其是在中國特殊的網(wǎng)絡(luò)環(huán)境下。”除了希望讀者可以通過這篇文章意識到隱患的嚴(yán)重性,更希望程序員同學(xué)們可以有所收獲。
原文來自微信公眾號“歪理邪說”,作者霍炬,原文標(biāo)題為《墻、感染、信任和欺騙》。
最近XcodeGhost導(dǎo)致的嚴(yán)重安全問題,相信大家已經(jīng)從各個渠道知道了。簡單概括一下,有人在中國網(wǎng)盤和論壇上傳播了一個修改過的Xcode,這個版本的Xcode會在編譯出來的App上面加一些可以被遠(yuǎn)程控制的代碼,并且發(fā)送數(shù)據(jù)到某個服務(wù)器上。這是iOS出現(xiàn)以來,未越獄系統(tǒng)遭遇的最大安全威脅,在此之前蘋果的Sandbox模式幾乎沒遇到過挑戰(zhàn),iPhone用戶甚至大量iOS開發(fā)者都認(rèn)為系統(tǒng)固若金湯,不可能遇到問題。
在XcodeGhost開始被媒體報道的時,很多人大大低估了它的風(fēng)險。我在烏云報道這個問題的當(dāng)天,在朋友圈上建議大家先把中招的app都刪掉,并且立刻修改iCloud密碼,開兩步驗證。甚至遭到了不少人反對,還有好幾位iOS開發(fā)者告訴我這件事沒什么大問題,因為iOS有Sandbox,不會造成什么傷害。當(dāng)時網(wǎng)易也發(fā)了一個關(guān)于云音樂被感染的說明,也是類似不痛不癢的口氣。這些說法當(dāng)然都是大錯特錯的,會有這種想法,是因為只會站在程序員角度看問題,如果對安全問題稍微有一點敏感性,就會立刻意識到這是極嚴(yán)重的威脅,稍微發(fā)揮一些想象力就會被嚇著。
所謂安全威脅,大部分都是在獲取到非常有限資源的情況下,利用社會工程學(xué)(俗稱:騙)來達(dá)到目的。比如,你覺得讓別人看到你的通訊錄有什么問題嗎?很多人會認(rèn)為雖然不舒服,但不會有什么威脅。實際上,騙子會從通訊錄里面挑出來你父母的電話,打電話去騙他們。所以,這和iOS有沒有sandbox,能不能保護(hù)系統(tǒng)安全沒關(guān)系,只要我獲得了一個機會,能控制你信任的app上彈出對話框,我就可以利用這個對話框來騙你輸入系統(tǒng)的重要密碼。程序員應(yīng)該想象力再豐富一點,不要把目光局限于“系統(tǒng)給了我什么權(quán)限”,而是要擴展到“如果我被完全信任了,我能進(jìn)行什么樣的欺騙”。
我不打算在這里講太多直接的安全問題,畢竟已經(jīng)很多人分析過了,在好幾篇非常不完善,極大低估這次事件威脅的分析文章之后,騰訊給出了一篇相當(dāng)詳細(xì)的分析,比較符合我的觀點,也把問題的嚴(yán)重性說的非常清楚。在騰訊的分析里面,說可以利用OpenUrl來操作用戶撥打電話,同樣又有iOS開發(fā)者說“OpenUrl不能控制iPhone打電話”。事實上,OpenUrl可以彈出一個帶有固定電話號碼的彈窗,上面有“撥打”和“取消”兩個按鈕,這確實不算直接撥打了電話,但如果給一千萬個用戶在某個特定環(huán)境下彈出一個這樣的窗口,其中有多大比例的人會去點“撥打”呢?如果程序員不去提高想象力,總把安全問題和功能局限在系統(tǒng)文檔提供的“能做什么”這個范圍內(nèi),軟件的安全性實在讓人難以信任。
具體的安全問題有更專業(yè)的人去普及,本文不多說,在這里我更想談?wù)勱P(guān)于信任的問題。在這次事件中,也有一些人想起了Ken Thompson大神(Unix系統(tǒng)/C語言的前身B語言/Go語言的直接貢獻(xiàn)者,稱作Unix之父也不過分)在1984年的一次演講,在那次演講中中,Ken講了他在70年代在貝爾實驗室捉弄同事的一次惡作劇,在那段時間里面,實驗室里面所有的Unix系統(tǒng),Ken都可以隨便以最高權(quán)限登錄,而同事反復(fù)檢查用戶,權(quán)限,甚至是當(dāng)時使用的Unix代碼,都沒查不到后門,百思不得其解。14年之后,Ken在這次演講里面才公開,后門其實隱藏在他寫的編譯器中,當(dāng)用編譯器編譯Unix系統(tǒng)的時候,后門就被放在了編譯出來的系統(tǒng)里面,但Unix本身的代碼是干凈的,所以同事無論如何也查不到問題。Ken的演講所提到的核心問題并不是如何入侵一個操作系統(tǒng),而是信任。其標(biāo)題“Reflections on Trusting Trust” (我翻譯為"深入思考我們信任的可信",以下簡稱RoTT)開宗名義,明確強調(diào)這一點。
在80年代曾經(jīng)有很多人用這樣的辦法給開發(fā)工具加各種外殼和后門,但當(dāng)時聯(lián)網(wǎng)條件并不好,很難產(chǎn)生大規(guī)模影響。很多案例是發(fā)生在相對封閉的企業(yè)內(nèi)網(wǎng)和教育網(wǎng)中,Ken捉弄同事的原始案例也可以看作是企業(yè)內(nèi)網(wǎng)上的傳播。可以說,RoTT能產(chǎn)生的影響一直被人們低估,因為在現(xiàn)實世界想要具備適合它的條件,實在是太難了。歷史上,雖然有很多底層代碼Bug導(dǎo)致的安全事件(比如之前的OpenSSL心臟出血漏洞,可以參考我的另外一篇文章,點閱讀原文可見),但直接通過這種在基礎(chǔ)工具上制造的后門,從而衍生的大規(guī)模安全事件,從來沒有真正發(fā)生過。這種手法一般是用在有限范圍的網(wǎng)絡(luò)上,比如在早年的教育網(wǎng)上或者企業(yè)網(wǎng)絡(luò)里面,那時候在內(nèi)網(wǎng)上傳遞一個被下了毒的軟件,很容易傳播開。
在互聯(lián)網(wǎng)上,如果要重現(xiàn)Ken的案例,首先需要找到一個可信的源頭感染,這本身就已經(jīng)是極其困難的事了。用這次的事件做例子的話,在正常情況下,用戶是通過Mac App Store來下載Xcode的,在下載安裝的過程中,OS X本身會替用戶進(jìn)行加密簽名校驗,保證下載的東西確實是蘋果原始分發(fā)的軟件,這樣才能被安裝到用戶的機器上。如果想把在Xcode中嵌入一個后門,你得先找到Apple服務(wù)器的漏洞,才能有機會把自己改過的包上傳上去,而且還要弄到蘋果的私鑰去進(jìn)行簽名,才能裝到用戶計算機上。但如果同時具備了這兩個條件,已經(jīng)是榮華富貴唾手可得,有的是更可靠,獲利更大的做法,誰又肯去舍近求遠(yuǎn)感染一個Xcode呢?
所以,只有在相對封閉的網(wǎng)絡(luò)環(huán)境下,才有可能玩這個把戲。80年代,網(wǎng)絡(luò)遠(yuǎn)遠(yuǎn)沒有今天發(fā)達(dá),人們更多的下載和網(wǎng)絡(luò)活動是分布在各大機構(gòu)自己的網(wǎng)絡(luò)里面的,比如大型企業(yè)的內(nèi)部網(wǎng)絡(luò),相對于互聯(lián)網(wǎng),這些內(nèi)部網(wǎng)絡(luò)網(wǎng)絡(luò)速度會快的多,人們通常更傾向于從內(nèi)部網(wǎng)絡(luò)獲得軟件。這就給了入侵者(通常是商業(yè)間諜)通過替換內(nèi)容軟件來侵入公司內(nèi)部的機會。但內(nèi)網(wǎng)又造成了另外一個問題,在封閉網(wǎng)絡(luò)下,入侵者獲得的數(shù)據(jù)也沒這么容易拿走,必須還要回到內(nèi)網(wǎng)才有機會拿到之前的戰(zhàn)果。這些特性造成了這種做法始終在小范圍內(nèi)有效,在公眾網(wǎng)絡(luò)上性價比不高。
這次XcodeGhost事件會給很多人啟發(fā),中國目前的網(wǎng)絡(luò)環(huán)境類似于80年代的企業(yè)內(nèi)網(wǎng),但規(guī)模又比當(dāng)年的內(nèi)網(wǎng)大的多,而且不像那么難以進(jìn)入。 于是,一些80年代流行但沒造成大規(guī)模影響的辦法,有機會可以在中國環(huán)境下重新應(yīng)用了,并且造成巨大影響。以前的創(chuàng)業(yè)是Copy to China,現(xiàn)在同樣可以復(fù)制30年前的安全問題。
Ken的演講最后指出,你沒辦法信任那些不是自己寫的代碼。80年代達(dá)到這個目標(biāo)尚且有可能,那時候的軟件規(guī)模還很小。而今天,任何工作都需要建立在大量的現(xiàn)成軟件基礎(chǔ)之上,換句話說,你必須去信任其他人,才有可能制作出產(chǎn)品。如今的可信任環(huán)境就變得更加重要。
但在中國,因為GFW和相關(guān)政策的存在,要獲得一個可信環(huán)境變得非常困難。在這個環(huán)境里面,大量國外網(wǎng)站不能訪問或者難于訪問,非常多怕麻煩的人會使用國內(nèi)替代品,這次的事件之所以影響巨大,就是因為通過蘋果官方渠道升級Xcode速度太慢,少則10多個小時,多則幾十個小時,其間還有可能中斷和重新下載。從國內(nèi)隨便下載一個Xcode用當(dāng)然是錯的,但在這樣的環(huán)境下也不是完全不能理解,考慮一下互聯(lián)網(wǎng)的下載速度只有50K,企業(yè)內(nèi)網(wǎng)速度能高達(dá)10M的時候,誰會不從內(nèi)網(wǎng)下載呢?
用一個現(xiàn)實世界的例子做個比喻吧,前面說了騙子拿到你父母的電話之后,會打電話去騙他們,比如跟你父母說你出了車禍,急需用錢。要讓這個騙術(shù)成功,一個前提條件是要阻止你父母去找你驗證真假,所以騙子同時會用各種辦法來騷擾你的電話,迫使你不堪其擾關(guān)機或者始終占線。這樣你父母和你的聯(lián)系就斷開了,他們沒法找你驗證了,此時騙子的話就更容易被相信。在這次事件里面,GFW讓人們無法訪問國外的可信網(wǎng)站,或者訪問速度極慢,它起的作用就如同迫使你占線或者關(guān)機,從而讓人們只能從不可信的地方獲取軟件。
GFW讓中國本來開放的互聯(lián)網(wǎng)環(huán)境,變成了一個巨大的企業(yè)內(nèi)網(wǎng),或者叫做中國局域網(wǎng)。除了速度和難以訪問的影響,各種各樣的DNS投毒,電信運營商干擾也是嚴(yán)重問題,你拿回來的DNS結(jié)果往往也未必是可信的,而運營商試圖在HTTP請求中插入廣告的行為,又經(jīng)常會導(dǎo)致正常的應(yīng)用表現(xiàn)不正常,而這些亂七八糟的毛病還經(jīng)常變化,今天你可以這樣對付,下周可能就需要換一個辦法。要維持一個可信的軟件環(huán)境,需要付出巨大的精力,能愿意付出這個代價的人越來越少。
在這個環(huán)境中,我們能信任的什么呢?網(wǎng)絡(luò)鏈接不可信,運營商不可信,DNS不可信,大企業(yè)不可信。最后這一點更荒唐,如果是在正常的網(wǎng)絡(luò)環(huán)境下,你很難相信蘋果或者Google會坑害自己的用戶,因為這和他們的利益直接相關(guān),他們總是要盡量保護(hù)自己的用戶。但在中國,如果你敢信任百度,基本意味著你生活各方面都會出問題,用百度查個搬家公司,騙死你沒商量,用百度查個快遞電話,騙死你也沒商量,用百度查個醫(yī)院,你猜會怎么樣?那是真要騙死你沒商量,這里的騙死都不再是比喻了。你要信任百度的軟件,更好玩了,它莫名其妙就給你把百度出的所有軟件都裝在你機器上了,人們管這個不請自來的大禮叫做百度全家桶。如此致力于坑害自己用戶的大公司,在中國之外還真是罕見。
在中國的網(wǎng)絡(luò)環(huán)境下,這次事件產(chǎn)生的危害本身也更加危險。事件發(fā)生時,我告訴朋友們立刻刪除所有被感染的軟件,直至問題被修復(fù)。有人說,黑客自己的網(wǎng)站已經(jīng)關(guān)閉了,沒什么危險。這么說當(dāng)然是錯的,因為遍布中國各處的DNS投毒和劫持,創(chuàng)造一個一樣域名的網(wǎng)站再簡單不過了。比如到游客聚集的區(qū)域,帶一個路由器,創(chuàng)建一個沒有密碼的WIFI熱點,等著人們連上來,在這個熱點上劫持XcodeGhost使用的域名,就可以利用已經(jīng)中毒的app來騙iCloud密碼了。這些都是非常容易實現(xiàn)的辦法,千萬不要低估安全問題能造成的后果,尤其是在中國特殊的網(wǎng)絡(luò)環(huán)境下。
目前中國的網(wǎng)絡(luò)環(huán)境和食品安全有諸多共同之處,你沒法信任路邊的小飯館,但同時你也沒法信任昂貴的大飯館。你沒法信任菜市場買的肉,但超市買的肉也并不那么可靠。在一切的背后是土壤和水的全面污染,可能一家好的飯館未必打算毒害自己的顧客,但他們也很難保證自己原材料的供貨商可靠,要保證使用的所有材料可靠,這是一家飯館不可能具備的能力。比如,奶粉的三聚氰胺事件之前,一家有追求的飯館大概會覺得,我不用來路不明的奶粉,我用大品牌的三鹿,伊利,這算是對顧客負(fù)責(zé)了吧?可惜,這些大品牌一樣出問題。這絕非飯館所希望的,他們也是受害者,就像是這次事件中的網(wǎng)易云音樂,他們確實沒打算坑自己的用戶,不過網(wǎng)易、騰訊這樣的大公司一樣中招了。
相對封閉的iOS尚且如此(單一開發(fā)工具,單一軟件分發(fā)渠道,獨家封閉系統(tǒng)iOS,獨家硬件iPhone)尚且能出這么大問題,想想Android會怎么樣?Android官方網(wǎng)站幾年前就被封了無法訪問,大部分開發(fā)者都是從國內(nèi)渠道下載的開發(fā)工具。App的安全可靠嗎?國內(nèi)無數(shù)家忙著改Android皮膚就稱自己是“操作系統(tǒng)”廠商,他們能保證自己的定制Android版本是安全嗎?他們有真正的操作系統(tǒng)廠商級別的能力嗎?進(jìn)一步,他們能保證自己使用的開發(fā)工具安全嗎?每家手機廠商都恨不得做自己的Android app下載渠道,他們能保證這些渠道上分發(fā)的app安全嗎?甚至,他們能保證自己的下載市場安全嗎?請大家繼續(xù)聯(lián)想吧。有朋友跟我說,你想多了,Android哪需要這么麻煩啊,本來國內(nèi)環(huán)境就是木馬遍地了。真實情況恐怕只能用慘烈來形容。順便說一聲,傳說Google要把Play Store進(jìn)入中國,提供一個受審查的版本,很多人說這是Google妥協(xié)了,我看這根本不是妥協(xié)了,是中國內(nèi)部的Android環(huán)境太糟糕,已經(jīng)威脅全球生態(tài)了,Google不得不自己出手解決這個問題。所以,一旦Google Play真的進(jìn)了中國,請大家記得立刻把Play Store做為自己唯一的Android軟件下載渠道,哪怕它不好用,不中國國情,甚至顯得有點傻里傻氣…千萬記得,安全比方便更重要。
在這些前提下,重新認(rèn)真考慮Ken的演講提到的觀點就顯得更加重要,深入思考我們信任的可信。到底什么是可信的呢?開發(fā)工具可信嗎?操作系統(tǒng)可信嗎?你覺得下載來之后驗證一下md5或者sha512總應(yīng)該可信了,但你用來計算sha的工具是哪下載來的?你又如何知道這個工具本身是可信呢?在一個封閉的,難以和真正源頭溝通的環(huán)境下,根本沒辦法談所謂的信任。
在中國目前的環(huán)境下,難以直接套用成熟的軟件開發(fā)和管理流程,除非保證團(tuán)隊所有人都必須翻墻,必須用Google查資料,必須不信任國內(nèi)網(wǎng)站。你的團(tuán)隊中有一個習(xí)慣用百度查資料,順著國內(nèi)論壇的鏈接從百度網(wǎng)盤或者迅雷下載工具的人,就不知道會惹出來多大麻煩。這次事件充分證明了這一點,我起初認(rèn)為騰訊應(yīng)該不會有問題,因為我知道騰訊內(nèi)部有極好的網(wǎng)絡(luò)環(huán)境,但最終不幸的是微信也中招了。我們的惡劣環(huán)境已經(jīng)改變了工程師的習(xí)慣,甚至改變了教育,就算是在騰訊內(nèi)部這么好的網(wǎng)絡(luò)環(huán)境下,仍然有人會去百度查資料,用百度網(wǎng)盤下載開發(fā)工具。就像很多留學(xué)生到了美國仍然用百度搜索一樣,環(huán)境的改變并不能直接逆轉(zhuǎn)已經(jīng)完成的用戶習(xí)慣。
比較諷刺的是,在中國特色的現(xiàn)實世界反而又制約了出現(xiàn)大規(guī)模安全災(zāi)難的可能性。比如,中國有相當(dāng)嚴(yán)重的網(wǎng)絡(luò)監(jiān)控、審查和實名制、以及互聯(lián)網(wǎng)公司必須保存(而且要向有關(guān)部門開放)的各種用戶數(shù)據(jù),并且互聯(lián)網(wǎng)和世界半隔絕,在出現(xiàn)這種問題的時候,要抓到始作俑者又相對簡單。現(xiàn)實世界中,只要在論壇發(fā)個貼,去你家查水表就是分分鐘的事情。這大概算是“不幸+不幸“互相抵消之后產(chǎn)生了一點點微小的幸運吧。
很多年前,我說招聘工程師有幾個原則,比如,必須使用Google而不是百度,必須翻墻而不是用國內(nèi)替代品,必須優(yōu)先使用國外的工具。經(jīng)常有人認(rèn)為這種要求過于苛刻,甚至認(rèn)為是裝逼。這次事件告訴了我們,這些良好的習(xí)慣確實是工程師的第一道防線,融入世界主流,可以讓你少遭遇很多中國特色的麻煩。雖然保持這些良好的習(xí)慣需要付出不小的代價,但事實證明這些代價是值得的。
這樣的網(wǎng)絡(luò)環(huán)境,是我們這一代工程師的恥辱,但我們?nèi)绱藨嵟诖?,又如此無能為力,這是這個時代最令人悲哀的事情。
我們對此有多么無能為力呢?我寫這篇文章的時候就在想,大家應(yīng)該趕快傳播它,因為我覺得它很快會被刪掉。這就是無能為力的具體表現(xiàn)。
順便說一句,1996年,受Ken的案例啟發(fā),我寫過一篇科幻小說,大意是一種病毒把編譯器做為感染的源頭,最終感染了操作系統(tǒng)。在這個操作系統(tǒng)上,它會判斷用戶指令對它是否會造成傷害,如果是有害的指令,就假裝執(zhí)行一下,實際并不真執(zhí)行,從而可以躲過殺毒軟件和人工清除。這同樣是信任問題,在這個環(huán)境下,沒有任何可信的東西,這種病毒將會在操作系統(tǒng)中永存,并且把自己附著于任何在這臺計算機上制造的軟件中。在一個計算機一開機就無線聯(lián)網(wǎng)的時代,病毒可以借此高速傳播,最后人類已經(jīng)找不到一臺干凈的計算機可以去編寫真正干凈的操作系統(tǒng)了。(90年代還沒有無線網(wǎng)絡(luò),那時候甚至連有線網(wǎng)絡(luò)都沒普及,Sun還在號稱網(wǎng)絡(luò)就是計算機,那時候一臺隨時聯(lián)網(wǎng)的計算機簡直太奢侈了,但如今看來…世界確實已經(jīng)發(fā)展到了這樣,想找一臺不聯(lián)網(wǎng)的計算機倒是不容易了)。
不知道這種幻想中的病毒什么時候會真正出現(xiàn)…其實,前幾年工信部推行綠壩的時候,我當(dāng)時就覺得那簡直是創(chuàng)造這種病毒的一個非常好的機會,還好最終綠壩計劃被放棄了。中國網(wǎng)絡(luò)和政策環(huán)境的特殊性,將來真的有可能制造出適合這種病毒生存的環(huán)境,就像這次因為GFW的正面和潛在影響,讓70年代Ken設(shè)想的RoTT在2015年大規(guī)模流行,40多年的時間跨度…著名科幻作家韓松說過:“中國的現(xiàn)實變得比科幻還要科幻”。深以為然。
最后給 范冰 XDash 寫的好書《增長黑客》做一個小廣告。其實很久很久之前我就答應(yīng)他下篇文章幫他推廣一下,但我也很自覺的告訴他可別著急…他也說沒關(guān)系不著急。不過大概也沒想到我真能拖這么久吧,慚愧啊…
Growth Hacker 是一個剛引進(jìn)入國內(nèi)的概念,雖然包含一個黑字,但它和這篇文章里面說的破壞系統(tǒng),威脅大家安全的黑客不是一回事,而是突破束縛、絕技在身、單槍匹馬挑戰(zhàn)既有規(guī)則的那種黑客。
無論你是正在創(chuàng)業(yè)、在大公司的上班 或者 只是自己業(yè)余開發(fā)工具或App,你都不應(yīng)該錯過這本書。畢竟把東西做出來只是邁出了一小步, 把你的產(chǎn)品或服務(wù)傳遞到用戶那才是關(guān)鍵的一大步。