編者註:本文轉自霍炬的微信公共帳號「歪理邪說」(微信號:wxieshuo) ,經原作者同意轉載,文章內容有所改動。
我想聊聊開源軟體的模式和 OpenSSL 存在的問題,以及到底誰在捍衛我們的隱私。我也會寫到在「心臟出血」這個漏洞從發現到公布的過程中,驚心動魄和爭分奪秒的故事,這個過程暴露出 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 之前只能收到很少捐款?——基金會、捐贈和募資雖然開源組織可以通過商業服務來讓自己生存的不錯,但是一般也都很願意接受捐款。有足夠的捐款,可以少做一些商業項目,把精力往開源軟體方面傾斜一些,這當然是好事。大部分軟體和 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,因為它是加拿大註冊的非盈利組織。捐款是一個非常理性的行為,隱藏部分信息,利用人們對開源項目的不了解,煽情,製造愧疚感,這是不可持續的,也是不公平的。
OpenSSL 的問題和未來Theo de Raadt 是 OpenBSD 項目的創始人,他可是作業系統領域最好的計算機科學家之一,他曾批評 OpenSSL 的代碼「令人作嘔」。
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 暫時有最多的用戶,以後則未必會如此,我相信,早晚會有一個新的替代者出現。
誰是真正的人類隱私捍衛者?——電子前線基金會的故事事實上,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 是受益者之一,也是整個故事中的一小段。
EFF 及其創始人卡普爾,是真正的理想主義者,他們沒有商業收入,自己掏錢,做這一件事做了 25 年之久,通過一個又一個的訴訟案和對隱私相關案件的法律援助,他們成功推動了社會進步。這才是網際網路時代真正的隱私的捍衛者。
相關資料:
標題圖是 eff 主題 T 恤,作者 Ben Ramsey,遵循 cc2.0 協議使用於非商業應用。來自 https://www.flickr.com/photos/benandliz/106772871/ ;
freeBSD 代碼貢獻榜第一人 phk 對他最近一個商業項目的描述 http://phk.freebsd.dk/time/20140926.html;
「心臟出血」事件時間線 http://www.theage.com.au/it-pro/security-it/heartbleed-disclosure-timeline-who-knew-what-and-when-20140415-zqurk.html;
點擊閱讀原文查看:界面新聞《隱形戰友》 供對比批判閱讀。