【看中國2015年09月22日訊】最近XcodeGhost導致的嚴重安全問題,相信大家已經從各個渠道知道了。簡單概括一下,有人在中國網盤和論壇上傳播了一個修改過的Xcode,這個版本的Xcode會在編譯出來的App上面加一些可以被遠程式控制制的代碼,並且發送數據到某個伺服器上。這是iOS出現以來,未越獄系統遭遇的最大安全威脅,在此之前蘋果的Sandbox模式幾乎沒遇到過挑戰,iPhone用戶甚至大量iOS開發者都認為系統固若金湯,不可能遇到問題。
在XcodeGhost開始被媒體報導的時,很多人大大低估了它的風險。我在烏雲報導這個問題的當天,在朋友圈上建議大家先把中招的app都刪掉,並且立刻修改iCloud密碼,開兩步驗證。甚至遭到了不少人反對,還有好幾位iOS開發者告訴我這件事沒什麼大問題,因為iOS有Sandbox,不會造成什麼傷害。當時網易也發了一個關於雲音樂被感染的說明,也是類似不痛不痒的口氣。這些說法當然都是大錯特錯的,會有這種想法,是因為只會站在程序員角度看問題,如果對安全問題稍微有一點敏感性,就會立刻意識到這是極嚴重的威脅,稍微發揮一些想像力就會被嚇著。
所謂安全威脅,大部分都是在獲取到非常有限資源的情況下,利用社會工程學(俗稱:騙)來達到目的。比如,你覺得讓別人看到你的通訊錄有什麼問題嗎?很多人會認為雖然不舒服,但不會有什麼威脅。實際上,騙子會從通訊錄裡面挑出來你父母的電話,打電話去騙他們。所以,這和iOS有沒有sandbox,能不能保護系統安全沒關係,只要我獲得了一個機會,能控制你信任的app上彈出對話框,我就可以利用這個對話框來騙你輸入系統的重要密碼。程序員應該想像力再豐富一點,不要把目光侷限於「系統給了我什麼許可權」,而是要擴展到「如果我被完全信任了,我能進行什麼樣的欺騙」。
我不打算在這裡講太多直接的安全問題,畢竟已經很多人分析過了,在好幾篇非常不完善,極大低估這次事件威脅的分析文章之後,騰訊給出了一篇相當詳細的分析,比較符合我的觀點,也把問題的嚴重性說的非常清楚。在騰訊的分析裡面,說可以利用OpenUrl來操作用戶撥打電話,同樣又有iOS開發者說「OpenUrl不能控制iPhone打電話」。事實上,OpenUrl可以彈出一個帶有固定電話號碼的彈窗,上面有「撥打」和「取消」兩個按鈕,這確實不算直接撥打了電話,但如果給一千萬個用戶在某個特定環境下彈出一個這樣的窗口,其中有多大比例的人會去點「撥打」呢?如果程序員不去提高想像力,總把安全問題和功能侷限在系統文檔提供的「能做什麼」這個範圍內,軟體的安全性實在讓人難以信任。
Ken Thompson (sitting)and Dennis Ritchie working together at a PDP-11 是Ken和Dennis兩位大神在PDP-11計算機上工作時的合影,當年Ken就是在PDP-11上搞出本文提到的惡作劇的。來自Wikipedia
具體的安全問題有更專業的人去普及,本文不多說,在這裡我更想談談關於信任的問題。在這次事件中,也有一些人想起了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設想的RoTT在2015年大規模流行,40多年的時間跨度…著名科幻作家韓松說過:「中國的現實變得比科幻還要科幻」。深以為然。
延伸閱讀:
到底誰才是真正的隱形戰友—開源軟體和OpenSSL的真實故事
前 幾天,在朋友圈看到轉來的原發於「界面」關於OpenSSL和開源項目的「隱形戰友」一文。開始覺得不過是炒冷飯,「心臟出血」 這個OpenSSL嚴重漏洞,從去年(2014)4月初被公眾知道,到現在已有將近一年了,這件事已經算告一段落。儘管這篇文章充滿了誤解、硬傷和企業宣 傳,我也沒太在意。結果,今天看到界面的網站上竟然還在用支付寶給OpenSSL募捐,這就荒唐了。之前有一些朋友說,無論怎麼樣,多一些關注總是好的, 從現在的結果看,界面的文章造成的壞影響更大,這篇文章扭曲了開源社區的本來狀況,對其他組織和企業也不公平。開源軟體、安全、隱私確實是大部分普通用戶 不瞭解的領域,但記者要寫一篇文章,總應該對歷史有個基本瞭解。
界面網路的創始人何力先生,曾經創建了經濟觀察報和第一財經,都是不錯的 媒體,再次創業界面,也備受關注。可惜界面這篇文章,給我帶來的失望比較大。更好笑的是,當年羅永浩對戰王自如的時候,羅粉說王自如的公司是雷軍投資的, 所以王自如一定是傾向小米的。而今天,界面,這個小米參與投資的媒體,登了一篇錘子的軟文。這兩者之間對比,實在讓人哭笑不得。
我想聊聊開源軟體的模式和OpenSSL存在的問題,以及到底誰在捍衛我們的隱私,這些都是界面的文章弄錯的地方。我也會寫到在「心臟出血」這個漏洞從發現到公布的過程中,驚心動魄和爭分奪秒的故事,這個過程暴露出OpenSSL嚴重的管理問題,
先從開源說起。
1 開源是一種商業模式
界 面一文,把OpenSSL描述成沒有捐款就沒法生存的組織,但開源組織並不是這樣,開源和免費一樣,是一種商業模式,他們之間有諸多不同,但有一個基本的 相同點,就是都希望盡量多的人免費使用它。大家已經免費使用了很多網際網路服務,對於免費模式應該非常理解,我們從未給Google付款,從未為我們每一次 搜索買單。但我們搜索的行為,我們的注意力、數據,都會變成Google的廣告收入。我們每一次使用Google搜索,都是在幫助Google賺錢,儘管 沒直接付錢給他們。
開源軟體也是如此。開源軟體的世界是激烈競爭的,任何一個組織,都可以從當前代碼分支一份繼續開發新的版本,這個行為 叫做Fork。一個開源組織要想生存下去,最重要的基礎就是普遍被使用,不然很快就會被競爭者替代。一個軟體被普遍被使用之後,就會因此衍生出相關服務, 團隊可以通過這些服務獲得比較好的收入,商業模式就成型了。最著名的例子應該算是Red Hat Linux,中文叫做紅帽,他們免費提供Linux發行版,企業可以通過付費訂閱獲得技術支持,他們收入相當不錯,現在已經是一家市值100多億美金的上 市公司。
OpenSSL採用的也是同樣的開源和服務收費的方式運轉,OpenSSL基金會的負責人Steve說他們最多一年有將近100 萬美金的商業諮詢項目(資金來源是美國國防部和美國國土安全部),這已經是相當不錯的狀況。開源軟體的全職工作人員都不會太多,大部分項目的核心貢獻者同 時也都會承擔商業性項目,這是很正常的情況。在開源社區中,像Linux創始人Linus這樣全職為開源項目工作的程序員,反而不是普遍現象,Linus 得以這麼做,一方面是Linux基金會財力豐厚,另外一方面也是因為Linux衍生項目太多,影響力也太大,Linus本身又是精神領袖,他不得不全職為 Linux工作。同時從事商業服務和開源項目,並不是界面那篇文章描述的那麼悲情。
再來個例子,最好的開源UNIX操作系統 FreeBSD,其核心開發者Poul-Henning Kamp(社區內叫他phk)到今天仍然承擔商業性項目。即使從1994年到現在,他的一直在FreeBSD代碼貢獻的排行榜上排第一,也仍然不是 FreeBSD基金會的全職員工,他對自己的描述是「自雇」。phk在自己主頁上公開了最近正在做的一個商業項目,報酬每月3000美金。以 OpenSSL的項目規模,有一個全職開發者已經是相當不錯的狀況了。
為什麼有這麼多人會放棄傳統的賣軟體的方式,轉向免費軟體和開源軟 件?除了個人興趣和理想之外,開源軟體是一個成熟可靠的商業模式,這個商業模式有自己的收入方式和生態。界面這篇文章極力製造普通網際網路用戶對於 OpenSSL的愧疚感,指責普通用戶從來沒付錢給他們,這種一種道德綁架。任何一個用戶,只要在使用OpenSSL,就是在幫助這個組織獲得市場份額, 在競爭中獲得更大優勢,無論有沒有直接捐款給他們,用戶都已經做出了貢獻。
2 為什麼OpenSSL之前只能收到很少捐款?——基金會、捐贈和募資
雖 然開源組織可以通過商業服務來讓自己生存的不錯,但是一般也都很願意接受捐款。有足夠的捐款,可以少做一些商業項目,把精力往開源軟體方面傾斜一些,這當 然是好事。大部分軟體和IT企業,每年都有不小的一筆錢用來支持開源項目們,同時也爭取自己在開源社區的影響力和發言權,開源組織們每年接受的捐款按照各 自項目狀況,都不算少。但為什麼一年前,OpenSSL這個項目每年只能收到幾千美金的捐款呢?答案很簡單,因為他們從來沒有搞過募捐活動。
開 源組織通常會設立一個註冊為非盈利機構的基金會,通過這個基金會募集資金、組織活動、推廣自己的開源產品,視項目情況給專職或者兼職開發者付報酬,其中募 集資金是基金會相當重要的工作。如果經常使用維基百科的用戶,應該會有印象。維基百科每年都有一個固定時段,會在網站上放置非常明顯的籌資通告,設定好本 年度預算目標,讓大家捐款。達到數額之後,捐款就停止,不再接受更多。幾乎所有開源組織,都會通過這種方式募集捐贈。
OpenSSL基金 會從來沒公開募集過資金,如果沒有捐款目標,沒公開募捐,就很難有成批的捐款進入,畢竟,需要資金的項目實在太多了。對於OpenSSL這種項目,募資相 當容易,他們只需公開發一份籌款通知,各大企業的錢就可以立刻到手。當「心臟出血」發生之後,諸多企業驚訝的不是只有一個全職開發者這件事,而 是,為什麼你們一直沒籌款。OpenSSL從來沒公布過自己的財務狀況,沒有設置過募款目標,這讓人們如何去捐款給他?
更有意思的 是,OpenSSL基金會並沒有註冊為非盈利機構,而是一個盈利性企業。捐助OpenSSL的人和企業無法從美國政府獲得減稅。按照他們自己的說法,是他 們沒有時間維護一個非盈利組織,這不是個好理由。對於一個開源項目,註冊一個非盈利組織比註冊公司難不了多少,再說,基金會之所以成立,不就是為了去做這 些事嗎?盈利性企業已經定義了他們是希望靠商業活動獲得收入,而不是靠捐款生存。捐款給盈利性企業,錢的利用率就會變低很多,按照美國稅法粗算,最多的情 況下要多交出30%~40%的稅,是巨大的浪費。這也解釋了為什麼美國企業很少捐款給OpenSSL基金會。
不過,就算如此,事情也是在 快速好轉的。「心臟出血」事件之後,Linux基金會在極短的時間內就成立了核心基礎架構聯盟(CII,Core Infrastructure Initiative),這個聯盟和以往最大的區別是,他們主動挑選缺乏資金的重要開源項目進行資助,無論對方是否募款,OpenSSL是他們資助的第一 個項目。這個聯盟集結了世界各國的科技企業共同出資,其中包括了Google、Amazon、Facebook、思科、富士、惠普、IBM…目前已經有了 10多家企業。其中中國企業只有一家,是華為。特別值得一提的是,除了給CII出資,華為也單獨資助了OpenSSL基金會每年5萬美金。可惜,界面的文 章似乎把華為忘了。參加CII聯盟的企業每年出至少10萬美金,按照2014年的數字,CII每年總共有170萬美金基金可以使用,第一期資金主要用來資 助OpenSSL和OpenSSH,資金相當富裕。
上面這些事情都發生在去年5月,也就是「心臟出血」事件之後的一個多月時間 裡。無論是各大科技企業,還是Linux基金會,他們的行動都非常迅速,這是開源世界的做事方式和效率。到去年5月,OpenSSL的資金問題就算解決 了。從這個結果看,之前OpenSSL沒有得到足夠捐款的直接原因就是其基金會失職。
做為對比,再看看去年OpenBSD募款的經歷。 OpenBSD是最關注安全的開源Unix操作系統,他們同時也是OpenSSH的維護者(看到SS是不是覺得和加密也有關係?沒錯,這也是一種加密工 具,只不過不是給客戶用的,是給伺服器管理者和程序員用的),去年的募款目標僅僅是15萬加幣。相比起來,170萬美金實在已經是太多了,如果CII給的 錢不夠讓OpenSSL變好,恐怕再多的錢也不會好了。
除了直接捐錢,各大企業支持開源項目的方式還有很多,比如捐獻自己員工的時間。任 何一個開源項目中,都有來自各大公司工程師的貢獻,這些公司給自己員工發薪水,他們寫的代碼會回饋給開源項目,比起捐款,這是更直接的支持。比如去年發現 「心臟出血」漏洞的工程師,是Google員工,他在上班時間全職對OpenSSL代碼做安全審計,找到了這個Bug。他確實不是OpenSSL 基金會的直接僱員,但這份由Google買單的全職勞動成果是貢獻給了OpenSSL項目的,說所有大公司都沒支持過這個項目,未免太不公平。而這種錯誤 言論,正是界面文章宣傳的論調,按照這篇文章的說法,一個中國小公司救了全世界網際網路用戶,這是何等荒唐。
說到這裡,再說說捐款問題。我 非常反對界面渲染的這種捐款情緒,這是利用人們的愧疚捐款。錢是非常寶貴的資源,需要用錢的地方太多了,正確的捐款是在捐款者對項目的充分瞭解後,基於對 其價值觀和方向認同,按照自己的願望進行長期而小額的固定捐助。在這個過程中,稅務問題也是必須要考慮的,這直接決定了資金利用率,比如美國稅務居民,捐 贈給OpenSSL,資金的利用率就很低,而捐款給CII再由他們資助OpenSSL,就可以得到一部分免稅,利用率高了很多,如果是加拿大稅務居民,想 對操作系統方面的項目捐款,應該首選OpenBSD,因為它是加拿大註冊的非盈利組織。捐款是一個非常理性的行為,隱藏部分信息,利用人們對開源項目的不 瞭解,煽情,製造愧疚感,這是不可持續的,也是不公平的,這些都是界面的文章和之後的運營所做的事情。
3 OpenSSL的問題和未來
界 面的文章中說基層程序員批評他們的代碼「令人作嘔」,實際上,說這句話的人是Theo de Raadt,是OpenBSD項目的創始人,他可不是「基層程序員」,而是操作系統領域最好的計算機科學家之一。OpenBSD開發者們並沒止步 於批評,而是立刻決定從當前OpenSSL版本創建一個叫做LibreSSL的獨立項目,從清理OpenSSL的代碼重新開始。他們在第一週就刪除了9萬 多行代碼,OpenSSL整個項目只有38萬行,相當於刪減了近1/4的代碼。可見Theo的批評並不是順口胡說。幾年來,OpenSSL出過各種漏洞, 在「心臟出血」之後,仍然有隱藏了10年以上的漏洞被發現,很多熟悉這個項目的人看法都是「除了重寫別無辦法」。
OpenBSD有一份文檔說明瞭他們在清理過程中遇到的問題,去掉其中的技術細節,我把主要觀點列在這裡,這些也基本是業內主流看法:
OpenSSL的代碼混亂不堪,難以閱讀。開源軟體一般通過讓更多人看到代碼來發現bug,如果代碼難以閱讀,這個辦法就失效了。
他們使用了大量自己的代碼封裝和編程風格,這些代碼有的有bug,有的不符合現代主流做法。這讓常見的檢測工具沒法應用於他們的項目,更難以發現Bug。
他們的開發者更關心增加功能,而不是維護和修補。
其他開發者提供的修改和貢獻,一般不會被合併到最終代碼裡。
很多用戶指出的Bug,包括一些相當嚴重的,公開放在追蹤系統裡面長達幾年,沒被修補。
其中存留了大量無用的舊代碼,比如給windows 2000之前的16位系統寫的兼容代碼,仍然包含在最新版本的OpenSSL中。
基 於以上原因,OpenBSD認為這個項目已經沒法維護了,必須要重新開始。這就是他們創建一個分支,從清理代碼這種基礎工作開始的原因。可見,這個項目根 本不是錢的問題,而是管理方式和社區文化有問題。比起來其他項目,他們在有一個全職開發者和一個全職基金會主席的情況下還能響應如此緩慢,實在更令人沮 喪。順便說一句,做清理代碼這件事的OpenBSD開發者,也不是全職工作,他還在這份文檔前面特別註明瞭「可以被雇佣」。一年之後的今 天,LibreSSL已經基本算可用了,除了清理和改變了原有代碼風格,他們也增加了一些更先進的特性,看起來很有前途。另外,這個項目也很需要捐款,如 果更認同他們的做法,可以捐款給他們。
除此之外,OpenSSL公布「心臟出血」漏洞的過程也非常有問題。一般出現嚴重漏洞的流 程,是先不對公眾公布,立即通知主流操作系統維護者和相關廠商,讓大家先修改,之後一起發布安全公告和升級。之所以這樣做,是因為如果操作系統不去打補 丁,很多普通用戶知道漏洞也沒辦法修補,反而讓黑客們更容易利用這些漏洞。OpenSSL不是這麼做的,在Google告知了他們漏洞之 後,OpenSSL沒有告知任何一家操作系統廠商,反而奇怪的被幾家主要CDN廠商知道了,也就是說,在不知道哪個環節發生了泄密。之後開源社區中開始有 關於這個重大Bug的傳言,直到這個時候,幾大操作系統仍然沒得到正式通知。又過了3天,OpenSSL才告知了Red Hat,當天,參與處理這件事的一位Red Hat員工在一個私密郵件組裡面把這個消息分享給了SuSE/Debian/FreeBSD等幾個重要操作系統相關負責人。多虧了他,因為此時 OpenSSL仍然表示沒有任何細節提供,這是加州灣區的太平洋時間4月6日晚上,從Red Hat得到具體細節的幾大操作系統,連夜開始忙著打補丁,到這個時候,Red Hat提供的消息是OpenSSL將在9號,也就是3天之後公開這個漏洞。可惜,轉天,4月7日一大早,OpenSSL就直接發布了公告,媒體們知道了, 全世界都知道了。如果沒有Red Hat提前放的消息,最後的影響恐怕還會大的多,就算如此,因為時差的原因(Red Hat那位員工在印度),很多在他夜裡睡覺之後的郵件沒來得及回覆,仍然有很多廠商沒能提前得知細節。關鍵廠商對於如此重大的漏洞比媒體知道消息還晚,近 年來恐怕這是第一次。這造成了不少損失,比如加拿大國稅局CRA在漏洞被公開之後發現數據被盜,此時已經來不及打補丁了,所以乾脆直接把電子報稅系統關掉 了,當時是4月9號,加拿大2014年的報稅截至日期是4月30日,正是電子報稅系統最繁忙的日子,其間的尷尬可想而知。整個過程的時間線,在 theage的一篇文章有完整記載,我列在最後,供參考。
針對這個反常的流程,社區中有不少陰謀論的看法,我不轉述這些看法,我只是想說,這是另外一個證據證明OpenSSL有嚴重的管理問題,而不是錢的問題,人們說他們把事情做的一團混亂絕對不是沒理由的指責。
另 外,OpenSSL並不是憑空出現的項目,而是繼承了另一個項目SSLeay的代碼。在SSLeay的開發者去RSA公司工作,不能繼續這個開源項目之 後,有好幾個項目繼承了它的代碼繼續開發,OpenSSL只是其中比較成功的一個。維基百科上列出了SSL庫的實現,包括OpenSSL,現在還在使用的 也有10多個,其中開源的佔了將近一半。
這也是我不贊成吹捧OpenSSL的原因,歷史的選擇往往存在偶然,具體到SSL軟體上,就更複雜,這是混合了技術,商業,歷史,政治複雜因素之後的偶然結果。現在OpenSSL暫時有最多的用戶,以後則未必會如此,我相信,早晚會有一個新的替代者出現。
4 誰是真正的人類隱私捍衛者?——電子前線基金會的故事
界面這篇文章認為OpenSSL是人類隱私的捍衛者,事實上,OpenSSL只是同類加密軟體中的一個,他們當不起隱私捍衛者這個頭銜。今天,我們可以不知不覺獲得加密軟體的保護,背後有一些曲折的故事,那是真正的隱私捍衛者的故事。
曾 經,加密技術是被美國政府禁止出口的,就像很多武器禁止出口一樣,其他國家的人,想要使用這些加密演算法,就像要從美國買導彈一樣,是不可能的。轉機發生在 1995年,這一年,加州伯克利大學的研究生Bernstein在一個叫做電子前線基金會的律師幫助下,起訴美國政府。他的主張是自由發表加密演算法,屬於 言論自由的一部分,從而受美國憲法第一修正案保護,史稱Bernstein v. United States。這個案子進行了4年,到1999年,美國聯邦第九巡迴上訴法院出了判決,依據第一修正案,判決美國政府禁止公開密碼演算法違憲。在這之後,各 種密碼協議和開源演算法才從美國流傳出來,被自由使用。
電子前線基金會EFF(Electronic Frontier Foundation),創建於1990年,是一個法律援助組織,他們的使命是捍衛隱私,自由表達和公民權利。這也是一個基金會,而且是一個完全靠捐款運 作的非盈利組織。EFF創始人之一是Lotus公司創始人卡普爾,曾經是和比爾蓋茨齊名的軟體天才。80年代,Lotus是最大的獨立軟體公司,幾年之後 微軟才超過它。卡普爾是一個極具前瞻精神的奇才,1990年,卡普爾意識到未來技術、隱私、法律和政治的衝突,自己出資創建了EFF,後來的資助者中還有 著名的蘋果聯合創始人沃茲。當時,商業網際網路尚未成型,可見他們前瞻性之強。關於EFF的傳奇故事可以寫很多篇文章,這裡我們先說和OpenSSL有關的 部分。
曾經瀏覽器的領導者Netscape,於1995年開發了第一個SSL協議。SSLeay也在1995年完成了第一個實 現,1998年SSLeay中止開發,由社區接手。直到1999年美國政府敗訴,加密技術終於可以自由流通。這才是人類隱私保護工程的歷史脈絡。在這個復 雜的故事裡面,OpenSSL是受益者之一,也是整個故事中的一小段,界面的文章把OpenSSL開發者捧為人類隱私的捍衛者,不僅過譽,而且顯得非常無 知。
EFF及其創始人卡普爾,是真正的理想主義者,他們沒有商業收入,自己掏錢,做這一件事做了25年之久,通過一個又一個的訴訟案和對隱私相關案件的法律援助,他們成功推動了社會進步。這才是網際網路時代真正的隱私的捍衛者。
5 媒體的責任
有 朋友說,寫寫文章,讓大家捐點錢,怎麼也不會有害,不應該被批評。我不這麼認為。媒體傳播是可以影響人群選擇的。這在開源領域有先例,比如,BSD是最正 宗的UNIX繼承者,但曾經的一場訴訟,讓BSD應用廣泛程度至今不及Linux,媒體在這個過程中起了相當重要的作用。直到今天,談起開源軟體,媒體都 更關注Linux,質量更可靠的BSD缺少關注,從而影響了人們的選擇。界面文章中說「如果一個開源項目在商業世界獲得了成功,那決不會是出於僥倖, 決不會是因為其它競爭者恰好被規章制度所累、被知識產權法約束」,BSD的歷史正好是一個反例。(「決不會」此處錯字為界面原文引用)
所 以,界面這篇文章的影響是很負面的。我在前面指出了不少他們在整體認知上的錯誤,其他的小錯和不合理之處更是多的說不完。比如,界面的文章說「有了錘 子科技的那筆捐款」OpenSSL的開發者在德國Linux會議期間才終於有機會見了一次面。文章中有一張OpenSSL開發者的合影和人名,就算這 些人你之前完全不知道,現在立刻Google一下就知道,這些人裡面有Debian開發者,也有Google全職員工,這些人都不是OpenSSL付薪 的,就憑這張照片,說大企業一分錢沒出過也實在說不過去。再說OpenSSL開發者大部分在英國和歐洲,從倫敦飛德國法蘭克福,往返機票也就300美元, 硬要說這些有工作,有正常收入的工程師連300美金機票都要等這筆捐款,未免太過誇張。
我想問問界面編輯部,你們認為這篇文章到底是不是 軟文。如果作者是在寫付費軟文,那麼是職業道德問題,如果沒收費,而是作者出於對羅永浩的崇拜寫了一篇軟文,那麼是公器私用,也是職業道德問題,如果作者 沒收費又不是公器私用,仍然寫出了一篇如此軟,錯誤如此多的文章,那不僅僅是職業道德問題,還是能力問題。界面網路的編審流程看起來也不那麼靠譜,讓這麼 一篇文章發表出來,還四處推廣,恐怕編審團隊沒做什麼背景調查,甚至都沒去搜索點相關文章讀讀。另外,整篇文章連一個觀點相反的平衡意見都沒有,完全是單 方面的觀點闡述,這也違背了平衡報導準則。一篇好的報導,應該兼顧各方意見,給讀者展示各種觀點,提供多方面信息,界面沒能做到這一點。
互 聯網的安全,不取決於一個特定的軟體,即使這個軟體是用來加密的。發現「心臟出血」漏洞的Google員工Mehta說過,libjpeg如果出 問題,可能會有極大影響。libjpeg用來生成和顯示大部分網站和軟體的圖片,被普通人用到的範圍比OpenSSL更廣,威脅也會更嚴重。當人們被媒體 把關注轉向OpenSSL上時,大量更重要的問題就會缺少關注。希望能有更多人關注更多的基礎項目,而不是和汶川地震一樣,盯著看各大企業誰給 OpenSSL捐款更多。一年了,炒作也應該結束了。
界面的這篇文章對華為、諾基亞,Google這樣出錢出力,沒自我炒作的廠商不公 平,對於其他開源組織也不公平。界面是一家有正規編審流程的機構,嚴謹程度還不如我這種完全靠個人愛好寫作的非專業人員,雖然不嚴謹,但他們的煽情技巧確 實是出色而專業的,這篇文章被很多人稱為精彩,這令人失望,也非常遺憾。