虎嗅注:XcodeGhost在不久前對國內的iOS系統造成了巨大的安全威脅,但在安全威脅下還暗藏著巨大的信任隱患,中國的特色網絡環境為這些隱患提供了溫床。其嚴重性往往不為我們所知,所以作者也不禁高呼「千萬不要低估安全問題能造成的後果,尤其是在中國特殊的網絡環境下。」除了希望讀者可以通過這篇文章意識到隱患的嚴重性,更希望程式員同學們可以有所收穫

原文來自微信公眾號「歪理邪說」,作者霍炬,原文標題為《牆、感染、信任和欺騙》

最近XcodeGhost導致的嚴重安全問題,相信大家已經從各個管道知道了。簡單概括一下,有人在中國網盤和論壇上傳播了一個修改過的Xcode,這個版本的Xcode會在編譯出來的App上面加一些可以被遠程式控制制的代碼,並且發送數據到某個服務器上。這是iOS出現以來,未越獄系統遭遇的最大安全威脅,在此之前蘋果的Sandbox模式幾乎沒遇到過挑戰,iPhone用戶甚至大量iOS開發者都認為系統固若金湯,不可能遇到問題

XcodeGhost開始被媒體報道的時,很多人大大低估了它的風險。我在烏雲報道這個問題的當天,在朋友圈上建議大家先把中招的app都刪掉,並且立刻修改iCloud密碼,開兩步驗證。甚至遭到了不少人反對,還有好幾位iOS開發者告訴我這件事沒什麼大問題,因為iOSSandbox,不會造成什麼傷害。當時網易也發了一個關於雲音樂被感染的說明,也是類似不痛不癢的口氣。這些說法當然都是大錯特錯的,會有這種想法,是因為只會站在程式員角度看問題,如果對安全問題稍微有一點敏感性,就會立刻意識到這是極嚴重的威脅,稍微發揮一些想像力就會被嚇著

所謂安全威脅,大部分都是在獲取到非常有限資源的情況下,利用社會工程學(俗稱:騙)來達到目的。比如,你覺得讓別人看到你的通訊錄有什麼問題嗎?很多人會認為雖然不舒服,但不會有什麼威脅。實際上,騙子會從通訊錄裡面挑出來你父母的電話,打電話去騙他們。所以,這和iOS有沒有sandbox,能不能保護系統安全沒關係,只要我獲得了一個機會,能控制你信任的app上彈出對話框,我就可以利用這個對話框來騙你輸入系統的重要密碼。程式員應該想像力再豐富一點,不要把目光局限於「系統給了我什麼權限」,而是要擴展到「如果我被完全信任了,我能進行什麼樣的欺騙」

我不打算在這裡講太多直接的安全問題,畢竟已經很多人分析過了,在好幾篇非常不完善,極大低估這次事件威脅的分析文章之後,騰訊給出了一篇相當詳細的分析,比較符合我的觀點,也把問題的嚴重性說的非常清楚。在騰訊的分析裡面,說可以利用OpenUrl來操作用戶撥打電話,同樣又有iOS開發者說「OpenUrl不能控制iPhone打電話」。事實上,OpenUrl可以彈出一個帶有固定電話號碼的彈窗,上面有「撥打」和「取消」兩個按鈕,這確實不算直接撥打了電話,但如果給一千萬個用戶在某個特定環境下彈出一個這樣的視窗,其中有多大比例的人會去點「撥打」呢?如果程式員不去提高想像力,總把安全問題和功能局限在系統文檔提供的「能做什麼」這個範圍內,軟件的安全性實在讓人難以信任

具體的安全問題有更專業的人去普及,本文不多說,在這裡我更想談談關於信任的問題。在這次事件中,也有一些人想起了Ken Thompson大神(Unix系統/C語言的前身B語言/Go語言的直接貢獻者,稱作Unix之父也不過分)在1984年的一次演講,在那次演講中中,Ken講了他在70年代在貝爾實驗室捉弄同事的一次惡作劇,在那段時間裡面,實驗室裡面所有的Unix系統,Ken都可以隨便以最高權限登錄,而同事反覆檢查用戶,權限,甚至是當時使用的Unix代碼,都沒查不到後門,百思不得其解。14年之後,Ken在這次演講裡面才公開,後門其實隱藏在他寫的編譯器中,當用編譯器編譯Unix系統的時候,後門就被放在了編譯出來的系統裡面,但Unix本身的代碼是乾淨的,所以同事無論如何也查不到問題。Ken的演講所提到的核心問題並不是如何入侵一個操作系統,而是信任。其標題「Reflections on Trusting Trust(我翻譯為"深入思考我們信任的可信",以下簡稱RoTT)開宗名義,明確強調這一點

80年代曾經有很多人用這樣的辦法給開發工具加各種外殼和後門,但當時聯網條件並不好,很難產生大規模影響。很多案例是發生在相對封閉的企業內網和教育網中,Ken捉弄同事的原始案例也可以看作是企業內網上的傳播。可以說,RoTT能產生的影響一直被人們低估,因為在現實世界想要具備適合它的條件,實在是太難了。歷史上,雖然有很多底層代碼Bug導致的安全事件(比如之前的OpenSSL心臟出血漏洞,可以參考我的另外一篇文章,點閱讀原文可見),但直接通過這種在基礎工具上製造的後門,從而衍生的大規模安全事件,從來沒有真正發生過。這種手法一般是用在有限範圍的網絡上,比如在早年的教育網上或者企業網絡裡面,那時候在內網上傳遞一個被下了毒的軟件,很容易傳播開

在互聯網上,如果要重現Ken的案例,首先需要找到一個可信的源頭感染,這本身就已經是極其困難的事了。用這次的事件做例子的話,在正常情況下,用戶是通過Mac App Store來下載Xcode的,在下載安裝的過程中,OS X本身會替用戶進行加密簽名校驗,保證下載的東西確實是蘋果原始分發的軟件,這樣才能被安裝到用戶的機器上。如果想把在Xcode中嵌入一個後門,你得先找到Apple服務器的漏洞,才能有機會把自己改過的包上傳上去,而且還要弄到蘋果的私鑰去進行簽名,才能裝到用戶計算機上。但如果同時具備了這兩個條件,已經是榮華富貴唾手可得,有的是更可靠,獲利更大的做法,誰又肯去捨近求遠感染一個Xcode

所以,只有在相對封閉的網絡環境下,才有可能玩這個把戲。80年代,網絡遠遠沒有今天發達,人們更多的下載和網絡活動是分佈在各大機構自己的網絡裡面的,比如大型企業的內部網絡,相對於互聯網,這些內部網絡網絡速度會快的多,人們通常更傾向於從內部網絡獲得軟件。這就給了入侵者(通常是商業間諜)通過替換內容軟件來侵入公司內部的機會。但內網又造成了另外一個問題,在封閉網絡下,入侵者獲得的數據也沒這麼容易拿走,必須還要回到內網才有機會拿到之前的戰果。這些特性造成了這種做法始終在小範圍內有效,在公眾網絡上性價比不高

這次XcodeGhost事件會給很多人啟發,中國目前的網絡環境類似於80年代的企業內網,但規模又比當年的內網大的多,而且不像那麼難以進入。於是,一些80年代流行但沒造成大規模影響的辦法,有機會可以在中國環境下重新應用了,並且造成巨大影響。以前的創業是Copy to China,現在同樣可以複製30年前的安全問題

Ken的演講最後指出,你沒辦法信任那些不是自己寫的代碼。80年代達到這個目標尚且有可能,那時候的軟件規模還很小。而今天,任何工作都需要建立在大量的現成軟件基礎之上,換句話說,你必須去信任其他人,才有可能製作出產品。如今的可信任環境就變得更加重要

但在中國,因為GFW和相關政策的存在,要獲得一個可信環境變得非常困難。在這個環境裡面,大量國外網站不能訪問或者難於訪問,非常多怕麻煩的人會使用國內替代品,這次的事件之所以影響巨大,就是因為通過蘋果官方管道升級Xcode速度太慢,少則10多個小時,多則幾十個小時,其間還有可能中斷和重新下載。從國內隨便下載一個Xcode用當然是錯的,但在這樣的環境下也不是完全不能理解,考慮一下互聯網的下載速度只有50K,企業內網速度能高達10M的時候,誰會不從內網下載呢

用一個現實世界的例子做個比喻吧,前面說了騙子拿到你父母的電話之後,會打電話去騙他們,比如跟你父母說你出了車禍,急需用錢。要讓這個騙術成功,一個前提條件是要阻止你父母去找你驗證真假,所以騙子同時會用各種辦法來騷擾你的電話,迫使你不堪其擾關機或者始終佔線。這樣你父母和你的聯繫就斷開了,他們沒法找你驗證了,此時騙子的話就更容易被相信。在這次事件裡面,GFW讓人們無法訪問國外的可信網站,或者訪問速度極慢,它起的作用就如同迫使你佔線或者關機,從而讓人們只能從不可信的地方獲取軟件

GFW讓中國本來開放的互聯網環境,變成了一個巨大的企業內網,或者叫做中國局域網。除了速度和難以訪問的影響,各種各樣的DNS投毒,電信運營商幹擾也是嚴重問題,你拿回來的DNS結果往往也未必是可信的,而運營商試圖在HTTP請求中插入廣告的行為,又經常會導致正常的應用表現不正常,而這些亂七八糟的毛病還經常變化,今天你可以這樣對付,下周可能就需要換一個辦法。要維持一個可信的軟件環境,需要付出巨大的精力,能願意付出這個代價的人越來越少

在這個環境中,我們能信任的什麼呢?網絡鏈接不可信,運營商不可信,DNS不可信,大企業不可信。最後這一點更荒唐,如果是在正常的網絡環境下,你很難相信蘋果或者Google會坑害自己的用戶,因為這和他們的利益直接相關,他們總是要盡量保護自己的用戶。但在中國,如果你敢信任百度,基本意味著你生活各方面都會出問題,用百度查個搬家公司,騙死你沒商量,用百度查個快遞電話,騙死你也沒商量,用百度查個醫院,你猜會怎麼樣?那是真要騙死你沒商量,這裡的騙死都不再是比喻了。你要信任百度的軟件,更好玩了,它莫名其妙就給你把百度出的所有軟件都裝在你機器上了,人們管這個不請自來的大禮叫做百度全家桶。如此致力於坑害自己用戶的大公司,在中國之外還真是罕見

在中國的網絡環境下,這次事件產生的危害本身也更加危險。事件發生時,我告訴朋友們立刻刪除所有被感染的軟件,直至問題被修復。有人說,駭客自己的網站已經關閉了,沒什麼危險。這麼說當然是錯的,因為遍佈中國各處的DNS投毒和劫持,創造一個一樣功能變數名稱的網站再簡單不過了。比如到遊客聚集的區域,帶一個路由器,創建一個沒有密碼的WIFI熱點,等著人們連上來,在這個熱點上劫持XcodeGhost使用的功能變數名稱,就可以利用已經中毒的app來騙iCloud密碼了。這些都是非常容易實現的辦法,千萬不要低估安全問題能造成的後果,尤其是在中國特殊的網絡環境下

目前中國的網絡環境和食品安全有諸多共同之處,你沒法信任路邊的小飯館,但同時你也沒法信任昂貴的大飯館。你沒法信任菜市場買的肉,但超市買的肉也並不那麼可靠。在一切的背後是土壤和水的全面污染,可能一家好的飯館未必打算毒害自己的顧客,但他們也很難保證自己原材料的供貨商可靠,要保證使用的所有材料可靠,這是一家飯館不可能具備的能力。比如,奶粉的三聚氰胺事件之前,一家有追求的飯館大概會覺得,我不用來路不明的奶粉,我用大品牌的三鹿,伊利,這算是對顧客負責了吧?可惜,這些大品牌一樣出問題。這絕非飯館所希望的,他們也是受害者,就像是這次事件中的網易雲音樂,他們確實沒打算坑自己的用戶,不過網易、騰訊這樣的大公司一樣中招了

相對封閉的iOS尚且如此(單一開發工具,單一軟件分發管道,獨家封閉系統iOS,獨家硬體iPhone)尚且能出這麼大問題,想想Android會怎麼樣?Android官方網站幾年前就被封了無法訪問,大部分開發者都是從國內管道下載的開發工具。App的安全可靠嗎?國內無數家忙著改Android皮膚就稱自己是「操作系統」廠商,他們能保證自己的定製Android版本是安全嗎?他們有真正的操作系統廠商級別的能力嗎?進一步,他們能保證自己使用的開發工具安全嗎?每家手機廠商都恨不得做自己的Android app下載管道,他們能保證這些管道上分發的app安全嗎?甚至,他們能保證自己的下載市場安全嗎?請大家繼續聯想吧。有朋友跟我說,你想多了,Android哪需要這麼麻煩啊,本來國內環境就是木馬遍地了。真實情況恐怕只能用慘烈來形容。順便說一聲,傳說Google要把Play Store進入中國,提供一個受審查的版本,很多人說這是Google妥協了,我看這根本不是妥協了,是中國內部的Android環境太糟糕,已經威脅全球生態了,Google不得不自己出手解決這個問題。所以,一旦Google Play真的進了中國,請大家記得立刻把Play Store做為自己唯一的Android軟件下載管道,哪怕它不好用,不中國國情,甚至顯得有點傻裡傻氣千萬記得,安全比方便更重要

在這些前提下,重新認真考慮Ken的演講提到的觀點就顯得更加重要,深入思考我們信任的可信。到底什麼是可信的呢?開發工具可信嗎?操作系統可信嗎?你覺得下載來之後驗證一下md5或者sha512總應該可信了,但你用來計算sha的工具是哪下載來的?你又如何知道這個工具本身是可信呢?在一個封閉的,難以和真正源頭溝通的環境下,根本沒辦法談所謂的信任

在中國目前的環境下,難以直接套用成熟的軟件開發和管理流程,除非保證團隊所有人都必須翻牆,必須用Google查資料,必須不信任國內網站。你的團隊中有一個習慣用百度查資料,順著國內論壇的鏈接從百度網盤或者迅雷下載工具的人,就不知道會惹出來多大麻煩。這次事件充分證明瞭這一點,我起初認為騰訊應該不會有問題,因為我知道騰訊內部有極好的網絡環境,但最終不幸的是微信也中招了。我們的惡劣環境已經改變了工程師的習慣,甚至改變了教育,就算是在騰訊內部這麼好的網絡環境下,仍然有人會去百度查資料,用百度網盤下載開發工具。就像很多留學生到了美國仍然用百度搜索一樣,環境的改變並不能直接逆轉已經完成的用戶習慣

比較諷刺的是,在中國特色的現實世界反而又制約了出現大規模安全災難的可能性。比如,中國有相當嚴重的網絡監控、審查和實名制、以及互聯網公司必須保存(而且要向有關部門開放)的各種用戶數據,並且互聯網和世界半隔絕,在出現這種問題的時候,要抓到始作俑者又相對簡單。現實世界中,只要在論壇發個貼,去你家查水錶就是分分鐘的事情。這大概算是「不幸+不幸「互相抵消之後產生了一點點微小的幸運吧

很多年前,我說招聘工程師有幾個原則,比如,必須使用Google而不是百度,必須翻牆而不是用國內替代品,必須優先使用國外的工具。經常有人認為這種要求過於苛刻,甚至認為是裝逼。這次事件告訴了我們,這些良好的習慣確實是工程師的第一道防線,融入世界主流,可以讓你少遭遇很多中國特色的麻煩。雖然保持這些良好的習慣需要付出不小的代價,但事實證明這些代價是值得的

這樣的網絡環境,是我們這一代工程師的恥辱,但我們如此憤怒於此,又如此無能為力,這是這個時代最令人悲哀的事情

我們對此有多麼無能為力呢?我寫這篇文章的時候就在想,大家應該趕快傳播它,因為我覺得它很快會被刪掉。這就是無能為力的具體表現

順便說一句,1996年,受Ken的案例啟發,我寫過一篇科幻小說,大意是一種病毒把編譯器做為感染的源頭,最終感染了操作系統。在這個操作系統上,它會判斷用戶指令對它是否會造成傷害,如果是有害的指令,就假裝執行一下,實際並不真執行,從而可以躲過殺毒軟件和人工清除。這同樣是信任問題,在這個環境下,沒有任何可信的東西,這種病毒將會在操作系統中永存,並且把自己附著於任何在這台計算機上製造的軟件中。在一個計算機一開機就無線聯網的時代,病毒可以借此高速傳播,最後人類已經找不到一台乾淨的計算機可以去編寫真正乾淨的操作系統了。(90年代還沒有無線網絡,那時候甚至連有線網絡都沒普及,Sun還在號稱網絡就是計算機,那時候一台隨時聯網的計算機簡直太奢侈了,但如今看來世界確實已經發展到了這樣,想找一台不聯網的計算機倒是不容易了)

不知道這種幻想中的病毒什麼時候會真正出現其實,前幾年工信部推行綠壩的時候,我當時就覺得那簡直是創造這種病毒的一個非常好的機會,還好最終綠壩計劃被放棄了。中國網絡和政策環境的特殊性,將來真的有可能製造出適合這種病毒生存的環境,就像這次因為GFW的正面和潛在影響,讓70年代Ken設想的RoTT2015年大規模流行,40多年的時間跨度著名科幻作家韓松說過:「中國的現實變得比科幻還要科幻」。深以為然

最後給範冰 XDash 寫的好書《增長駭客》做一個小廣告。其實很久很久之前我就答應他下篇文章幫他推廣一下,但我也很自覺的告訴他可彆著急他也說沒關係不著急。不過大概也沒想到我真能拖這麼久吧,慚愧啊

Growth Hacker 是一個剛引進入國內的概念,雖然包含一個黑字,但它和這篇文章裡面說的破壞系統,威脅大家安全的駭客不是一回事,而是突破束縛、絕技在身、單槍匹馬挑戰既有規則的那種駭客。

無論你是正在創業、在大公司的上班或者只是自己業餘開發工具或App,你都不應該錯過這本書。畢竟把東西做出來只是邁出了一小步,把你的產品或服務傳遞到用戶那才是關鍵的一大步。


 在中國特色網絡環境下,千萬記得,安全比方便更重要