在寫這篇文章的時候,系統(tǒng)管理員們正忙于確保自己的網(wǎng)絡(luò)足以應(yīng)對 CVE-2014-6271,也就是所謂的 “Shellshock” 漏洞。攻擊報告表明通過漏洞可以獲得 bash
shell 的權(quán)限,從而使攻擊者可以控制其運行某些功能。而 bash shell 廣泛存在在大多數(shù) Linux 以及 OS X 甚至是 iOS 系統(tǒng)中(雖然大部分人都不太可能使用它)。實際上,人們從上世紀 60 年代開始設(shè)計相容分時系統(tǒng)(CTTS)時就已經(jīng)開始考慮安全性了,但為何到現(xiàn)在這個問題都沒有解決?為什么軟件系統(tǒng)仍有安全問題?又是為什么我們應(yīng)用開發(fā)者被告誡必須在安全上有所行動?
CTSS 所面臨的最大挑戰(zhàn)是允許多用戶訪問同一臺計算機而互不干擾,這也影響了之后系統(tǒng)的架構(gòu)設(shè)計,其中也包括衍生了 OS X 和 iOS 的 UNIX 系統(tǒng)。解決的辦法是,每個用戶在一個仿佛是真實電腦的環(huán)境中獨立運行任務(wù),但實際上卻使用的是共享計算機生成的一個沙箱。
當一個用戶需要大量資源,這一解決方案應(yīng)避免對其他用戶的資源產(chǎn)生不利影響。而這個方案也導(dǎo)致了擁有配額資源的多用戶賬戶以及賬戶管理系統(tǒng)的出現(xiàn)。這種想法頗為有效:在 2006 年,我使用了這個系統(tǒng),讓超過 1000 名用戶訪問了共享的 OS X 電腦。
不幸的是,當初對這個問題的看法并不完整。那些防止某個賬號去使用分配給其他賬號的資源的技術(shù)手段,往往并不能防止某個用戶使用分配給其他用戶的資源。如果一個用戶可以獲得其他賬戶的權(quán)限,或者能說服其他用戶運行自己的程序的話,那賬戶和權(quán)限系統(tǒng)將可以被規(guī)避。這也是 Shellshock 漏洞所暴露的問題的根源:攻擊者可以獲得受害者的權(quán)限和資源來運行自己的程序。
從 UNIX 設(shè)計的時代開始,計算機就開始變得更小、更快和更容易連接。越來越多的情況是當初軟件創(chuàng)建時所沒有預(yù)見到的。當電子郵件的所有用戶都在同一所大學(xué),且所有終端都歸大學(xué)所有時,作為一個有效且公開的純文本系統(tǒng),它能良好的運行。但是當它要支持來自不同組織、不同地點甚至不同網(wǎng)絡(luò)的人進行溝通時,就需要不一樣的解決方案了。
在某種程度上,iOS 仍然算是一個多用戶系統(tǒng)。與 UNIX 設(shè)計的環(huán)境不同,iOS 所有用戶訪問的賬號和手機持有者所操作的賬號是同一個。所有這些用戶都是手機賬號的持有者,他們包括:你、我、手機上所裝應(yīng)用的開發(fā)者以及蘋果。
這的確有點過于簡單粗暴,畢竟許多應(yīng)用的功能不止局限于開發(fā)者提交到應(yīng)用商店的那些。SDK、遠程分析服務(wù)以及開源組件意味著許多應(yīng)用中實際上包含了來自多個機構(gòu)的源碼,并且必須通過網(wǎng)絡(luò)進行通信就有潛在被監(jiān)視的風(fēng)險。游戲規(guī)則已經(jīng)不再是保護不同的人彼此使用同一臺計算機,而是保證同一個人的不同任務(wù)不會互相干擾。
這些聽起來挺糟糕的,就好像有點輕微的偏執(zhí)狂癥狀?,F(xiàn)實情況是,安全能夠成為推動力量,因為它減少了在新的場景和過程中的風(fēng)險,為人們進入更廣闊的空間提供了可能。想象一下如果沒有使用密碼學(xué),移動銀行業(yè)務(wù)將會增加多少風(fēng)險,而又會有多少人(甚至包括銀行)愿意開展這項業(yè)務(wù)。
UNIX 仍然與現(xiàn)代的軟件安全討論息息相關(guān)的唯一原因是,我們?nèi)匀粵]有擺脫這個系統(tǒng),這主要是因為我們從來都沒有嘗試過。計算的歷史充滿了這樣的例子,明明有些系統(tǒng)已經(jīng)暴露出重大的安全問題,但它依然在使用,因為這個行業(yè)在清理自己爛攤子方面集體都表現(xiàn)得很差。即使是最新版本的 iOS,擁有最新的工具和最新的編程語言,我們在其中所調(diào)用的方法,例如 C 語言的字符串庫,也被認為在幾十年前就需要被重構(gòu)。
在軟件系統(tǒng)的演變史中,補丁一直存在。接受不完整的技術(shù)有利于定位已發(fā)現(xiàn)的問題。雖然我們喜歡聲稱我們發(fā)明了未來,而實際上,我們花費了大量時間和資源來堅守過去。當然,也許更換這些系統(tǒng)也會引入許多我們已經(jīng)修復(fù)的問題。
蘋果告訴我們每一個版本的 iOS 都比過去更安全,甚至公布了一份系統(tǒng)安全特性細則的白皮書。在其中蘋果介紹它如何使用了不斷更新的(希望是更加先進的)加密算法和協(xié)議,更健壯的鑒定表單以及其他技術(shù)。為什么這樣還是不夠?
操作系統(tǒng)只能提供適用任意應(yīng)用的安全特性;但不能提供你的應(yīng)用所需的一切。雖然蘋果能告訴你,你的 app 連接到了一個提供了一些有效身份證明的服務(wù)器,但它不能告訴你這是否是一個值得你信任的身份。
蘋果可以提供文件保護來加密你的數(shù)據(jù),并且在收到請求時解鎖。但它不會告訴你什么時候可以進行這樣的請求。
蘋果可以限制應(yīng)用之間的溝通方式,使得數(shù)據(jù)只能在受控的方式如 URL scheme 中進行。蘋果既不能決定哪個級別的控制適合你的應(yīng)用,也不能告訴你你的應(yīng)用應(yīng)該接受什么形式的數(shù)據(jù),以及什么形式的數(shù)據(jù)是不合適的。
和操作系統(tǒng)的特性相似,移動應(yīng)用程序漏洞排行榜能告訴你哪些問題是許多應(yīng)用都遇到的,但卻不能告訴你具體哪些和你的應(yīng)用相關(guān),以及它們是如何暴露的。它們也絕對不會告訴你當你的用戶使用你的應(yīng)用程序時漏洞被利用的詳細情況---漏洞從執(zhí)行的任務(wù)、上下文和環(huán)境中產(chǎn)生并且隨著用戶操作的過程中浮現(xiàn)出來。
安全是你應(yīng)用程序架構(gòu)的一部分:它是一個約束集合,你必須像顧慮 app 的響應(yīng)時間、客戶群的規(guī)?;蛘呤峭獠肯到y(tǒng)的兼容性那樣來考慮安全的問題。這意味著你必須將安全模塊設(shè)計到你的應(yīng)用中,就像你設(shè)計應(yīng)用時遵循的其他約束條件一樣。
一個評估應(yīng)用安全常用的設(shè)計技巧是風(fēng)險建模 :找到黑客們想要攻擊你系統(tǒng)的原因,查出他們在使用現(xiàn)有的資源下的攻擊方式,以及探索在系統(tǒng)設(shè)計中的可能被成功攻擊的漏洞。
即便你已經(jīng)確定了漏洞,還是要使用許多方法來應(yīng)對。拿個現(xiàn)實生活中的例子打比方,假設(shè)你正打算確定假期行程,但在這周你老板仍有需要你保持聯(lián)系甚至隨時準備出現(xiàn)在辦公室以應(yīng)對緊急情況的可能性。你可以做如下應(yīng)對:
所有這些可能性也都可以在軟件安全中使用。你可以選擇一個或者結(jié)合多個方法。我們的目標通常是不是規(guī)避風(fēng)險,而是減輕風(fēng)險。風(fēng)險減輕到多少是合理的?這取決于你、你的公司、你的客戶和你的合作伙伴能夠接受剩余多少風(fēng)險。
你緩解風(fēng)險的技術(shù)同樣取決于你的目標:當你可以引入任何安全對策時你想要達到什么目標?你們是要保護客戶隱私、保證服務(wù)的持續(xù)可用性還是只要遵循相應(yīng)的法律?如果這些目標沖突,你需要比較它們的優(yōu)先級。你的決定可能取決于具體情況,這未必是你能提前設(shè)計出來的。建立充足的應(yīng)急預(yù)案能讓大家在再次發(fā)生不好的事的時候知道應(yīng)該如何處理就好。
盡管軟件安全技術(shù)和系統(tǒng)(比如 iOS)的安全保障能力一直在進步和創(chuàng)新,但風(fēng)險分析和設(shè)計安全對策依然是應(yīng)用開發(fā)者們的責(zé)任。那些使用我們應(yīng)用時所產(chǎn)生的風(fēng)險是不可能通過操作系統(tǒng)供應(yīng)商或者框架開發(fā)人員解決的。這些風(fēng)險是由應(yīng)用所提供給用戶的功能,或者在應(yīng)用部署的環(huán)境或系統(tǒng)中所產(chǎn)生的。
蘋果用 iOS SDK 中的安全和加密功能幫助我們找到了水源。而喝水的事情,得靠我們自己。