一把鎖的傳奇——從 OpenSSL 到 MesaLink
來自專欄淺黑科技
大家好~我是史中,我的日常生活是開撩五湖四海的科技大牛,我會嘗試各種姿勢,把他們的無邊腦洞和溫情故事講給你聽。如果你特別想聽到誰的故事,不妨加微信(微信號:shizhongst)告訴我,反正我也不一定撩得到。
一把鎖的傳奇——從 OpenSSL 到 MesaLink
文 | 史中
一、神奇小鎮,手信和鎖
從前有一座神奇的小鎮。
小鎮上的居民天生都不會說話,但是他們每人都能寫一手好字。依靠「傳紙條」,他們每天都能快樂地交流。
於是,郵差們成了小鎮上最忙碌的人。他們不斷地從一些居民手上收信,然後把它們送到另一些居民手上,從早到晚不停歇,在小鎮上跑過的路線就像蜘蛛網一樣。
漸漸地,出現了一點兒小狀況:
雖然只是負責送信,但是八卦的郵差們總忍不住偷看小紙條上的內容。誰家的小秘密,用不了幾天所有人就都知道了。
一位叫鋼蛋的姑娘戀愛了,她覺得如果自己給心上人說的情話,讓郵差就這樣明晃晃地拿去,肯定傳得滿城風雨,實在是太害羞了。
於是,鋼蛋想到了一個好主意,她去村頭鎖匠「老O」那裡買了幾把鎖。把自己的信封鎖起來交給郵差,而郵差把帶鎖的信送給情人之後,對方再用準備好的相同的鑰匙把鎖打開。
其他人看到了,紛紛驚呼「還有這種騷操作?」於是都去「老O」那裡買鎖,把自己的信「加密」,這回郵差就別想偷看信里的內容啦。小鎮居民於是又像從前一樣過上了沒羞沒臊的生活。
這座神奇的小鎮,名字就叫「互聯網」。
而給信件加鎖的套路,就是你每天都在用的 SSL 加密傳輸協議。(使用 SSL 協議傳輸的時候,在網址的最左邊會出現「HTTPs」字樣,有的瀏覽器還會顯示一把小鎖,你一定見過。)
而小鎮中的那個鎖匠老O,對應在現實世界的互聯網中,就是著名的「OpenSSL」加密傳輸組件。
簡單來說,加密傳輸的技術是醬紫的:
在你訪問網站的時候,你和網站共同商量出一個「秘鑰」,你們之間傳遞的信息,都用這個秘鑰加密。那麼在整個傳輸的過程中,無論是什麼人都沒辦法窺探傳輸內容。
正如神奇小鎮上的鎖匠「老O」三輩祖傳做鎖,所以鎮上大多數人都在用他家的鎖一樣,由於OpenSSL 從1995年就開始維護這套加密傳輸技術,所以目前大多數網站都選擇他家的「老字號」加密傳輸組件。
好,中哥今天的故事講完了。
再見。
。。。
。。。
。。。
等等,淺友們你們坐下。這個世界上從來就沒有 Happy Ending。接下來就是今天的 ONE MORE THING。。。
2014年,這個小鎮上新來了一位奇怪的郵差。。。
姑娘鋼蛋發現,這個郵差賊眉鼠眼,於是決定跟蹤著他。
高潮緊接著來了。這個郵差拿到信之後,拐進了一個黑漆漆的衚衕,然後從兜里掏出一把「萬能鑰匙」,把所有的鎖都打開了,津津有味地讀著別人的隱私。。。
鋼蛋頓時如五雷轟頂,手扶胸口,一口老血噴出來,嗷一聲昏死過去。。。
鎮上的捕頭聞訊趕來,當場發現了郵差「私自開鎖」的勾當。
原來,這位郵差原本是一個「開鎖愛好者」,他發現了一個驚天秘密——所有老O家生產的鎖,都有一個缺陷,只要自制一把萬能鑰匙就能打開,這才動了心思要來假扮郵差盜取人們的隱私。
此事一出,老O顏面掃地,專門挨家挨戶賠禮道歉,並且把家家戶戶的鎖都修復成了「最新版」。
小鎮上為了紀念這次安全事件,專門在廣場上立了一個石碑,上面畫著鋼蛋手扶胸口噴血的樣子,以警示世人。於是這個鎖的漏洞,也被命名為「心臟滴血」。。。
我說的可不是神話故事,而是發生在我們身邊的真實歷史。
2014年,著名的 OpenSSL 組件爆發了心臟滴血漏洞:黑客通過簡單的方法進行攻擊,就可以不費吹灰之力拿到用戶和網站的隱私。這就像一枚核彈爆炸,讓全球大多數網站的密文傳輸系統瞬間崩塌。各大網站紛紛火速修補,然而直到 2018 年,仍然有很多網站在使用帶有漏洞的安全協議。
你可能已經明白我想說什麼了——「心臟滴血」絕不是 ONE MORE THING,而是一部恐怖續集的第一幕。
二、老鎖匠 OpenSSL,小鎖匠 MesaLink
讓我們再回到那個小鎮。
「心臟滴血」以後,鎖匠老O壓力賊大,之後每年都推出一個新版的鎖改進安全性。但是人們逐漸發現,他家的鎖還是時不時出問題。好心人幫助老O追根溯源,問題可能出在了祖傳的制鎖工藝「C++」上。。。
好,現在我們來到真實的互聯網世界。
SSL 加密傳輸組件早在1998年就被 OpenSSL 項目組推出,它的一大特點也就是使用了「祖傳工藝」:C/C++ 語言。
使用C語言好處很明顯,那就是和其他程序適配起來像德芙一樣絲滑,像老壇酸菜面一樣酸爽,這也是 OpenSSL 在各個服務中使用率居高不下並且一直穩如狗的原因。
但是,C語言的弊端同樣很明顯。那就是,這種源於1970年代的語言,多多少少有點古老了。人間一天,賽博世界一年。如果這麼看的話,C語言相當於計算機界的「古文」,看上去有點「鄭伯克段於鄢」的感覺。
於是,問題來了。
這種古老的語言,有些邏輯機制天生就存在缺陷和含混,即便 SSL(Secure Sockets Layer 安全套接層協議) 後來升級成為了 TLS(Transport Layer Security 安全傳輸層協議),也做了修補升級,但還是會有新的漏洞不斷爆出。這就像一個用了30年的木桶,經常莫名從某個縫隙漏出水來,很煩。
這個問題「老鎖匠」 OpenSSL 眼看就要無解,於是村裡的「小鎖匠」們挺身而出了。
全世界很多公司、團隊、個人,都嘗試根據 TLS 協議的國際標準,開發了自己加密傳輸協議,試著拯救千瘡百孔的互聯網隱私。
這其中,有谷歌開發的 BoringSSL,有蘋果開發的 LibreSSL。當然也有一群中國人在為之努力,這就是:百度安全實驗室矽谷團隊的研究員和他們的 MesaLink。
看這圖標,像不像「黑拱門」?Bincat ,就是百度安全「黑拱門計劃」的負責人。
他用一句話概括了 MesaLink 和 TLS(就是SSL的升級版)的最大區別,那就是 :
MesaLink 放棄了 C++ 語言,而是用了 Rust 語言寫成的。
在 Bincat 看來,MesaLink 就像「加密傳輸界的特斯拉」。雖然看上去和傳統汽車差不多,但是因為使用了 Rust 語言編寫,它從內部結構,到安全性能,都是顛覆式的。
那麼,問題來了。
1、Rust 究竟是一種神馬語言呢?
2、為什麼這個名不見經傳的語言最近那麼火?3、為什麼百度安全的小哥們要用命來奶這種語言?
接下來就會涉及一些比較難的內容,前方高能,鐵汁們扶穩坐好。
三、Rust:「處女座」專屬語言
Rust 這兩年挺火,它是由火狐瀏覽器的公司 Mozilla 開發的編程語言。
說到 Rust,用一個關鍵詞形容,就是「處女座」。實際上,Rust 已經強迫症到「古板」和「殘酷」的地步。
Bincat 給我舉了兩個例子:
1)處女座的「所有權機制」
在現實生活中,你一定遇到過處女座的妹子,她用的水杯一定要放在桌子左上角的圓圈裡;她用過的文件一定歸檔收好,電腦桌面空空如也。她借給你一本書,你必須在三天之後下午四點十六分送還給她。
Rust 在內存管理上,就是這樣的處女座。
如果這段內存屬於A進程,那麼它就一直屬於A進程,如果B進程來借這段內存,那麼它就必須按時歸還。如果不歸還,整個程序都會卡在原地,無法繼續。
如果A進程不想要這段內存了,它就要決定把它過戶給B進程,或者直接把它釋放掉。所以,這段內存要麼屬於A,要麼屬於B,要麼被系統回收。這樣嚴密的邏輯,會有模稜兩可的情況出現?不存在的。
而在C語言中,情況就亂得多,各種借調和歸還都沒有明確的制度保證。也正是基於這種機制問題,十幾年來黑客們研究出了很多類型的漏洞。
記得上幼兒園的那時候,一本小(xiao)人(huang)書(shu)在全班傳著看,一個小朋友給另一個小朋友,根本不打借條。。。到最後,究竟是誰的書大家都忘了,這也就造成沒人對它負責。到最後這本書很容易被老師發現,順桿爆炸。
這就是所有權機制不嚴謹的鍋。
2)處女座的「生命周期機制」
你記不記得,在我們身邊有一種奇葩的送禮 Style:中秋節送的月餅,A送給B,B送給C,C送給D,等到D準備吃的時候,發現上面已經覆蓋了一層調皮的白毛。。。
這就展現了一個經典的 Bug,你對月餅的使用周期已經超過了月餅的生命周期。
在賽博世界底層的內存空間里,存在著同樣的問題。
一個內存指針本身是有生命周期的,它的生命周期由編譯器指定。這個時候,如果有人獲取了同為這段內存上的另一個指針,那麼 Rust 就會自動規定這個指針的生命周期要小於之前的那個。
這種情況下,就保證了一套完整的內存生命流程。
就好像一本書,最開始在小A家的書架上,後來小A借給了小B,小B又借給了小C,但是在歸還的時候,會有警察叔叔專門監督著小C先還給小B,再由小B還給小A,最後由小A放回自家的書架。這裡的「警察叔叔」,就是 Rust 系統的邏輯機制。
你可能會問,這本書本來就是小A的,如果讓小C直接還給小A,不是更簡單嗎?對不起,我只能說你還是不夠了解處女座。
在 Rust 的世界裡,規矩就是規矩。
Rust 世界的每個公民,每天出門要邁哪只腳,吃飯要吃多少口,說話要用什麼辭彙,交流要用什麼語法,借別人東西要怎麼還,都已經被規定得死死的。如果有人想要在 Rust 的世界裡閑聊鬼扯,放浪形骸,對不起,出門左轉,C++。
Rust 語言的「生命周期機制」,其實杜絕了C語言中一個重要的基因缺陷,那就是 Double Free。在C語言中,由於沒有嚴格的管理,會發生一個內存被兩次釋放的「神操作」。每當這時,系統就會因為這個「非定義行為」而進入神經錯亂狀態,難免發生「打架鬥毆」「社會不安定」等等的悲劇。
當然,在 Rust 上類似的邏輯機制還有很多。總之這種語言是非常處女座,非常講規矩的語言,用它編寫出來的程序,各個都是「強迫症」。
在生活中,你身邊的「強迫症」也許很煩,但他說到做到,從來不會讓你失望。說到底,強迫症們都是很可靠的朋友。你仔細品品。
其實,隨著2017年 Rust 語言走向成熟,有很多軟體都在使用 Rust 編寫,這已經形成了一個非常有影響力的技術圈子。MesaLink 就是神秘的安全研究員們利用 Rust 的一個經典案例。
四、MesaLink 的理想國
說到這裡,我得總結一下。
1)MesaLink 是什麼?
簡單來說,MesaLink 其實就是用 Rust 語言編寫的 TLS 協議。是百度安全的小夥伴為了讓互聯網傳輸更安全而發明的一把與眾不同的精巧的鎖。
2)MesaLink 的目標是什麼?
當然就是更多網站和服務提供商可以使用這種更安全的傳輸協議, 讓普通用戶的隱私不會被泄露,從而構建社會主義和諧社會。
這裡順便說一下,無論是 OpenSSL 還是 MesaLink,都是開源的項目,百度安全的童鞋是不會從這裡面賺錢的。作為安全研究員,他們的目標很簡單:讓這個世界更安全。
而且,不僅不賺錢,這絕對是一個菜錢粉心的工作。
因為「做鎖」這件事非常特殊。
你想想看,如果你買了一把鎖,用起來不方便你會罵人,用起來不安全你更要罵人。而實際上,方便性和安全性本來生來就是一個蹺蹺板的兩端,一邊升高几乎必然會造成另一邊降低。
但用戶可不管這麼多,他們只管用腳投票。
所以,MesaLink 雖然是免費的,但是要想不斷發展,至少要符合以下兩點:
1、比傳統的 TLS 更加安全;
2、和傳統的 TLS 一樣易用。
剛才說了半天,實際上都在說第一點: MesaLink 比 TLS 更加安全。但是,真正的挑戰在於第二點,怎麼把 MesaLink 做得和 TLS 一樣性格隨和、兼容萬物。
實際上,在2017年開始這個項目之前,百度首席安全科學家、百度安全實驗室的老大韋韜就已經發下了「宏願」:
要想 MesaLink 和當年的 OpenSSL 一樣輝煌,它就必須讓更多人方便使用;要想方便使用,就必須要兼容 C 語言。這事兒沒商量。
也就是說,即使網站原來正使用流行的 TLS,也可以不用改動代碼,直接零成本切換到 MesaLink。
用戶沒成本了,成本就都壓在 Bincat 頭上了。
為了兼容 C語言,他必須把 MesaLink 做成一個「黑匣子」。
顧名思義,外面的信息傳進來,不用管黑匣子裡面程序如何慘絕人寰生不如死地運行,總之最後吐出一個完美的答案就可以了。
這就涉及到一個本質的問題:黑匣子內外如何進行數據交換?
這時,就要抬出韋韜大神制定的「混合代碼內存安全架構三原則」。
話不多說,上乾貨:
1、隔離代碼(隔離並模塊化由非內存安全代碼編寫的組件,並最小化其代碼量)
軟體的核心部分都用 Rust 來寫, 只有涉及到和外界溝通的介面(C-API)不得已時才使用C語言編寫。然後重點來了,MesaLink 要把Rust語言的部分和C語言的部分仔細隔離開,對他們分別管理。
這就好像火箭中的液氫倉和液氧倉,他們同時存在在火箭里,但是絕對不能相互泄露,只有在發動機中那一個點,才允許他們「牛郎織女鵲橋震」。
2、外部數據不能影響安全模塊的安全性(由非內存安全代碼編寫的組件不應減弱安全模塊的安全性,尤其是公共 API 和公共數據結構)
你想想,一段代碼來自兇險的火星(C),乍一來到地球(Rust)上,當然要先進行免疫隔離,消毒水洗衣液敵敵畏DDT先噴一遍再說。
按照這個原則,外來的代碼一定不能接觸核心的數據結構。
這個具體怎麼實現呢?
我曾經看過一部講外星生物的電影《異星覺醒》,這裡面有一個「隔離操作箱」。它的作用就是,既能把有危險的東西和隔離開,又能對它進行一些操作。
當然,你懂的,隔著一層塑膠套,總有些隔靴搔癢的感覺。在內存空間里,這種強制隔離就表現為性能損失。但是 Bincat 說,這個性能損失並不大,而且是必要的。畢竟,安全第一。
3、清晰可辨(由非內存安全代碼編寫的組件需清晰可辨識並且易於更新。)
由於 MesaLink 是開源軟體,理論上所有程序猿都可以對它進行改編。這個時候就要注意,由於設置了 Rust 語言和 C語言的強隔離,所以很多「機關」很多「梗」都只有最初的開發團隊才能理解。
為了讓其他程序猿都能看懂並且不會成為「豬隊友」。這些代碼的位置和作用,Bincat 都要詳細歸類寫清,還恨不得在旁邊寫上一個1500字的說明文做注釋。這就叫做「清晰可辨」。
你可能會說,這些標準聽上去很簡單啊。Bincat 可不這麼認為,為了研發 Mesalink,作為核心開發者的他可謂翻過三座大山。
「首先,Rust 這種處女座的語言比C語言更難;其次,TLS 協議非常複雜,單是指導手冊就有100多頁;再次,Rust 語言編出的程序,因為邏輯感太強,所以稍有不慎就跑不通,如果還要和C語言互通,就更要反覆地調試直至精疲力竭而跪倒;最後,還要遵循剛才說的『安全架構三原則』。。。」
這事有多複雜,也許只有老司機才能體會。
不過,好在 Bincat 一個人坐在牆角狂躁地砸鍵盤的日子已經過去了。最近 MesaLink 0.6 版本已經上線了。根據業內的標準,一個軟體到 1.0.0 版本,才算完成十月懷胎一朝分娩。「不過要到1.0.0 還有很長的路要走。」他說。
五、中國其實更需要 Mesalink
前面提到,雖然很多巨頭公司都在做 TLS 的替代品,但是 MesaLink 還挺特別的:
1、它是中國巨頭 BAT 里,唯一一個做純開源的加密傳輸軟體;
2、它是世界上,唯一一個用 Rust 寫的與 OpenSSL 兼容的純開源加密傳輸軟體。
這兩個特別之處,其實讓 MesaLink 可以解決一些有中國特色的問題。Bincat 舉了一個小例子:
國內有很多智能電視,其實都在用 Android 4.4.4 版本。但是這個版本已經不兼容 TLS 最新的1.3版,而這些硬體廠商又沒有很強的開發能力,所以只能繼續使用已經被證明不安全的 TLS 舊版本。
他說。
其實,不僅是智能電視,還有很多智能音箱,只要用到嵌入式 Android 操作系統的地方,中國最成熟最便宜的解決方案都是 Android 4.X 或者 5.X 的。就這一點,就足以讓這些硬體和安全無緣。。。而在未來,人們肯定會通過智能電視、智能音箱進行支付活動,如果到那時底層的傳輸協議還像今天這樣千瘡百孔,那麼你的錢八成會成為黑客的囊中之物。
而這,就是我們身邊大多數智能硬體的現狀。
如果你能像鳥兒一樣,飛越華強北一帶,那些林立的廠區代表著中國工業強大的生命力,但是在這些我們引以為傲的硬體背後,卻有這麼多難言的傷痛。
之前我曾經寫過百度安全的另一個開源項目 OASP(想看的童鞋可以點擊《百度安全的 OSAP 究竟是什麼?》),以及未來可能要寫一些的 KARMA 熱修復技術,包括剛才說的 MesaLink,他們同屬百度安全的 OASES 聯盟,一直在試著療愈這種「中國特色硬體生態」。
雖然普通人還沒聽過 MesaLink,不過在技術圈,這個獨特的軟體還是小有名氣的。
在某同性交友網站 GitHub 上,MesaLink 一上線,就立刻遭到了圍觀。程序員看這種純用 Rust 寫的安全傳輸協議棧,就像車迷在大街上看到一部純碳纖維外殼的跑車一樣。
截止2018年5月,MesaLink 在 GitHub 上已經獲得了600多顆星星,穩居 Rust 榜前列。而相比之下,谷歌的 BoringSSL
才只有三百多顆星。從這裡,也足見我們中國的程序員絕不比外國差。
可能你會問,MesaLink 完全開源免費不賺錢,為什麼百度安全的童鞋會花這麼大力氣,動用矽谷研究院來搞這個東西呢?
其實,韋韜和 Bincat 從最一開始,就根本沒有想過用 MesaLink 變現。他們只是從技術人的角度出發,看到安全傳輸協議棧對於未來 AI 世界具有基石的作用。
正如 OpenSSL 一樣,他們也並未從 SSL 協議棧中盈利,但最終他們成為受人尊敬的團隊。究其原因,也許是因為他們承擔了未來世界的責任。
「從你手中締造的生命一旦形成生態,它的價值自然會體現。正如上帝造人一般。」
這也許正是我們說的極客精神。
雖然 MesaLink 在百度內部被戲稱為「黑拱門」,不過 Bincat 皺皺眉,說他覺得這 Logo 看上去更像自行車鏈條。
我們每天都在用它提醒自己,希望自己別掉鏈子。
他笑。
P.S.
1、第一張小鎮的圖片來自《雷頓教授和不可思議的小鎮》,中哥吐血推薦這款遊戲。
2、MesaLink 在 GitHub 上的鏈接為 https://github.com/mesalock-linux/mesalink ,感興趣的童鞋可以走波關注。
再自我介紹一下吧。我叫史中,是一個傾心故事的科技記者。我的日常是和各路大神聊天。如果想和我做朋友,可以關注微博:@史中方槍槍,或者搜索微信:shizhongst。
不想走丟的話,你也可以關注我的自媒體公眾號「淺黑科技」
推薦閱讀:
※B站、愛奇藝赴美上市,開啟史無前例IPO大年
※在大數據領域裡,你們是不是忽略了數據產品這個崗位?
※新媒體運營喵:你們離精緻女孩,只差一個神器!
※MobData獲「年度最佳消費金融大數據服務平台獎」
※什麼是seo? 為什麼要做seo? 這裡有一份通俗易懂的答案