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