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