- 軟件開(kāi)發(fā)安全之道:概念、設(shè)計(jì)與實(shí)施
- (美)洛倫·科恩費(fèi)爾德
- 4663字
- 2024-01-31 18:37:16
1.2 信任
信任在數(shù)字世界也同樣重要,但是在數(shù)字世界中,人們常常認(rèn)為信任是理所當(dāng)然的。軟件安全從根本上都要依賴(lài)于信任,因?yàn)闆](méi)有人可以控制一個(gè)系統(tǒng)的所有組件,沒(méi)有人可以自己編寫(xiě)所有的軟件,也沒(méi)有人可以對(duì)自己合作的所有供應(yīng)商進(jìn)行審查。如今的數(shù)字系統(tǒng)全都非常復(fù)雜,復(fù)雜到哪怕是全球頂尖科技“巨頭”也不可能從零開(kāi)始搭建一個(gè)完整的科技棧,從硅材料到操作系統(tǒng)、網(wǎng)絡(luò)、外設(shè),再到把它們結(jié)合起來(lái),讓它們形成各司其職的軟件體系。我們?nèi)粘J褂玫南到y(tǒng)無(wú)不是大規(guī)模、復(fù)雜的卓絕技術(shù)成就。因?yàn)闆](méi)有人可以自己從頭搭建所有這些系統(tǒng),所以企業(yè)都會(huì)根據(jù)功能或者價(jià)格來(lái)選擇自己的軟硬件產(chǎn)品——這里值得留意的是,所有選擇本質(zhì)上都是建立在信任基礎(chǔ)上的決策。
安全性要求我們認(rèn)真地分析信任關(guān)系——哪怕沒(méi)人有時(shí)間、有資源來(lái)對(duì)所有資源進(jìn)行徹底的調(diào)查和驗(yàn)證。如果無(wú)法做到充分信任,就意味著企業(yè)必須完成大量不必要的工作去保護(hù)一個(gè)很可能不會(huì)面臨任何實(shí)質(zhì)威脅的系統(tǒng)。反之,如果無(wú)條件地信任,未來(lái)則有可能會(huì)措手不及。說(shuō)白了,如果你完全信任一個(gè)實(shí)體,它們也就基本上不需要為失敗承擔(dān)任何后果了。違背信任有下面兩種完全不同的形式:惡意行為(如欺騙、謊言、詭計(jì)等)和失職行為(如錯(cuò)誤、誤解、疏忽等)。
在信息缺失的情況下做出重要決策,是人們最需要信任關(guān)系的場(chǎng)景。不過(guò),我們與生俱來(lái)的信任感依賴(lài)的是微妙的感官信號(hào),而這種本能不適用于數(shù)字世界。在下文中我們會(huì)首先探討“信任感”這個(gè)概念,剖析我們?nèi)粘.a(chǎn)生的信任感到底為何物,然后把信任感的概念推廣到軟件領(lǐng)域。隨著閱讀的深入,讀者應(yīng)該嘗試把自己對(duì)軟件的看法和自己建立信任感的本能聯(lián)系起來(lái)。利用好自己的信任本能是一種強(qiáng)有力的手段。久而久之,我們就可以對(duì)軟件安全運(yùn)用類(lèi)似的信任本能,這比多少技術(shù)分析都更加有效。
1.2.1 信任感
理解信任感的最好方法就是在我們依靠信任來(lái)做出判斷的時(shí)候,仔細(xì)品味那種感受。讀者可以進(jìn)行一個(gè)思想實(shí)驗(yàn),也可以找一位自己能夠絕對(duì)信任的人在現(xiàn)實(shí)生活中進(jìn)行嘗試。想象和一位朋友走過(guò)一條繁華的大街,前面不遠(yuǎn)處就是熙熙攘攘的車(chē)流,街道中有一條人行橫道,告訴這位朋友你想讓他/她引導(dǎo)你走過(guò)這條人行橫道。在這個(gè)過(guò)程中,你完全依靠這位朋友來(lái)安全地走過(guò)這條人行橫道,你會(huì)閉上雙眼,絕對(duì)按照他/她的指示行動(dòng)。你們兩人手拉手走過(guò)這條人行橫道,你任憑這位朋友幫你轉(zhuǎn)過(guò)身,讓你面對(duì)這條人行橫道;在前方出現(xiàn)危險(xiǎn)時(shí)擋住你,不讓你繼續(xù)前進(jìn)。你聽(tīng)到耳邊汽車(chē)呼嘯而過(guò),知道自己的朋友在等待安全的時(shí)刻才會(huì)讓你繼續(xù)前行——這一刻你的朋友已經(jīng)化身為你的保鏢。這時(shí),你的心跳可能會(huì)明顯加速,你可能會(huì)警惕地傾聽(tīng)著身邊一切預(yù)示著有可能出現(xiàn)危險(xiǎn)情況的聲音。
現(xiàn)在,這位朋友準(zhǔn)確無(wú)誤地指引你前行。如果你打算就這樣閉著眼走在馬路上,你的這種感受就是真正的信任——當(dāng)然也有可能還達(dá)不到完全的信任。你的意識(shí)可以敏銳地察覺(jué)到顯而易見(jiàn)的危險(xiǎn),你的感官高度緊張從而快速確認(rèn)周遭的安全,你的內(nèi)心深處則有個(gè)聲音在不斷警告你不要再走了。你與生俱來(lái)的內(nèi)部安全監(jiān)控系統(tǒng)無(wú)法收集足夠的信息,因此希望你先把眼睛睜開(kāi)再繼續(xù)前行。如果這位朋友判斷出現(xiàn)了失誤怎么辦?如果這位朋友口蜜腹劍,想要置你于死地又當(dāng)如何?歸根結(jié)底,是你對(duì)這位朋友的信任讓你忽略這些本能,走過(guò)面前的人行橫道。
我們應(yīng)該提升自己對(duì)數(shù)字信任方面的決策的認(rèn)識(shí),這樣才能幫助別人看清這些決策給安全帶來(lái)的影響。在理想情況下,當(dāng)我們給一項(xiàng)重要的服務(wù)選擇組件或者廠商時(shí),在剛才那種練習(xí)中我們用來(lái)指導(dǎo)自己做出信任決策的直覺(jué)同樣能夠發(fā)揮作用。
1.2.2 比特不是肉眼可見(jiàn)的
上述討論是為了強(qiáng)調(diào)一點(diǎn),當(dāng)我們自以為“眼睜睜地看著這些數(shù)據(jù)”的時(shí)候,我們其實(shí)看到的只是一種與數(shù)據(jù)本身距離十萬(wàn)八千里的數(shù)據(jù)展示方式。其實(shí),我們看到的是屏幕上的一系列像素點(diǎn),雖然我們認(rèn)為這些像素點(diǎn)展示了數(shù)據(jù),但是我們對(duì)這些數(shù)據(jù)的物理保存位置并不知情,這些數(shù)據(jù)很可能經(jīng)歷了數(shù)百萬(wàn)條命令才被轉(zhuǎn)換為人類(lèi)可以讀懂的信息,并且最終顯示在我們的顯示器上。數(shù)字科技讓信任這件事變得相當(dāng)棘手,因?yàn)樗绱顺橄蟆⒀附荩床灰?jiàn)、摸不著。當(dāng)我們?yōu)g覽數(shù)據(jù)時(shí),一定要切記內(nèi)存中的數(shù)據(jù)與我們閱讀數(shù)據(jù)時(shí)看到的那些像素點(diǎn)之間隔著大量的軟硬件操作。我們又怎么知道這里面有沒(méi)有哪個(gè)環(huán)節(jié)惡意歪曲了數(shù)據(jù)的含義呢?數(shù)字信息的基本事實(shí)是極難直接進(jìn)行分辨的。
網(wǎng)頁(yè)瀏覽器上顯示的鎖形圖標(biāo)表示瀏覽器和網(wǎng)頁(yè)站點(diǎn)之間建立的是安全的連接。這些圖標(biāo)出現(xiàn)與否,只是為了向用戶(hù)表明一點(diǎn),即連接是否安全。但是在這個(gè)圖標(biāo)的背后,包含一系列數(shù)據(jù)和大量的計(jì)算(這些內(nèi)容我們會(huì)在第11章詳細(xì)介紹),這些最終都被包含到一個(gè)二進(jìn)制的“是/否”提示符中。哪怕是專(zhuān)家級(jí)別的開(kāi)發(fā)人員,讓他們手動(dòng)確認(rèn)一個(gè)實(shí)例的可靠性也是一個(gè)相當(dāng)艱巨的任務(wù)。我們能做到的只有信任這些軟件,我們當(dāng)然也有理由信任這些軟件。這里的關(guān)鍵在于,我們必須弄清楚這種信任的深度和廣度,而不是認(rèn)為所有的信任都是理所當(dāng)然的。
1.2.3 能力與不足
大多數(shù)攻擊始于軟件的缺陷或者誤配,這些問(wèn)題可能都是那些誠(chéng)信有加、心存善念的程序員和IT人員制造出來(lái)的——畢竟,是人就會(huì)犯錯(cuò)。因?yàn)檐浖褂迷S可都會(huì)包含免責(zé)聲明,所以一切軟件都是在用戶(hù)知悉和認(rèn)可風(fēng)險(xiǎn)的前提下使用的。如果誠(chéng)如人們所言,“所有軟件都有bug”,那么其中總有一些bug可以被利用,攻擊者也總能找到一些bug并且加以利用。軟件專(zhuān)家一般很少因?yàn)殄e(cuò)信了惡意軟件,而成為攻擊者的目標(biāo)。
好消息是,我們并不難判斷哪些操作系統(tǒng)、編程語(yǔ)言比較可靠。大型企業(yè)在提供和支持高質(zhì)量軟硬件時(shí),都有可供追溯的歷史,因此信任這些企業(yè)就在情理之中。而對(duì)于那些難以追溯歷史的軟件供應(yīng)商來(lái)說(shuō),信任它們則存在一定的風(fēng)險(xiǎn)。它們固然也有一些技術(shù)高超、動(dòng)力十足的員工為之努力工作,但這個(gè)行業(yè)本身缺乏透明性,因此人們很難判斷它們的產(chǎn)品是否安全。開(kāi)源提供了這種透明性,但是開(kāi)源軟件的安全水平取決于項(xiàng)目甲方對(duì)開(kāi)發(fā)者的監(jiān)管是否嚴(yán)格到足以防止開(kāi)發(fā)者在軟件中有意無(wú)意地插入惡意代碼。顯然,沒(méi)有一家軟件公司會(huì)承諾在發(fā)生攻擊事件時(shí)提供更高級(jí)別的安全性或者向用戶(hù)提供賠償,以此彰顯自己在業(yè)內(nèi)的特殊地位。因此,作為客戶(hù),我們也沒(méi)有這樣的安全選項(xiàng)。無(wú)論法律、規(guī)范還是商業(yè)協(xié)議,都提供了一些額外的方法來(lái)減輕人們執(zhí)行信任決策時(shí)面臨的不確定性。
信任決策的重要性固然不可小覷,但是也沒(méi)人能夠永遠(yuǎn)做出正確的決策。實(shí)際情況是,信任決策從來(lái)都是不完美的。這就像美國(guó)證券交易委員會(huì)警告人們的那句話(huà)一樣:“過(guò)去的表現(xiàn)無(wú)法擔(dān)保未來(lái)的結(jié)果。”好在人們已經(jīng)學(xué)會(huì)了如何權(quán)衡信任感(雖然人們更擅長(zhǎng)面對(duì)面,而不是通過(guò)數(shù)字媒體來(lái)判斷誰(shuí)更值得信任),而且在絕大多數(shù)情況下,我們的信任決策都是正確的——只要我們信息準(zhǔn)確,目標(biāo)清晰。
1.2.4 信任是一個(gè)頻譜
信任永遠(yuǎn)是分不同程度的,在對(duì)信任的評(píng)估過(guò)程中也總是包含一定的不確定性。信任是一個(gè)頻譜,在這個(gè)頻譜的一端,比如在進(jìn)行一場(chǎng)大手術(shù)的過(guò)程中,我們就是把自己的性命托付給了那些醫(yī)療從業(yè)者,我們不僅放棄了對(duì)自己身體的控制權(quán),也放棄了監(jiān)控手術(shù)操作的任何意識(shí)和能力。在最糟糕的情況下,一旦手術(shù)失敗,我們其實(shí)也就沒(méi)有了任何追訴的機(jī)會(huì)(關(guān)于遺產(chǎn)的合法權(quán)利除外)。日常的信任程度就會(huì)小得多:信用卡額度的上限是銀行沒(méi)有收到欠款也能承受的損失;汽車(chē)則有代客鑰匙,我們可以用它限制人們打開(kāi)后備箱。
鑒于信任是一個(gè)頻譜,“信任但仍要驗(yàn)證”的策略就是一個(gè)強(qiáng)大的工具,可以讓我們?cè)诮^對(duì)信任與絕對(duì)不信任之間建立起一座橋梁。在軟件領(lǐng)域,我們可以通過(guò)授權(quán)和審計(jì)來(lái)達(dá)到這樣的效果。一般來(lái)說(shuō),審計(jì)包括自動(dòng)審計(jì)(準(zhǔn)確地校驗(yàn)大量重復(fù)的活動(dòng)日志)與手動(dòng)審計(jì)(選擇性校驗(yàn),以處理那些比較罕見(jiàn)的情況,它把人工核查作為最終決策的依據(jù))。本章后文還會(huì)對(duì)審計(jì)進(jìn)行進(jìn)一步的探討。
1.2.5 信任決策
在軟件領(lǐng)域,人們有兩種選擇:信任或不信任。有些系統(tǒng)對(duì)應(yīng)用設(shè)置了各式各樣的許可,人們需要手動(dòng)來(lái)允許或者禁止它們。如果存在疑問(wèn),我們大可以選擇不信任——只要我們有理由信任另一個(gè)候選的解決方案。如果你在評(píng)估的時(shí)候標(biāo)準(zhǔn)過(guò)高,導(dǎo)致沒(méi)有任何一種產(chǎn)品可以獲得你的信任,那么你就只能大費(fèi)周章、自己動(dòng)手開(kāi)發(fā)組件了。
做出信任決策的過(guò)程就像給一棵“信任樹(shù)”剪枝,這棵樹(shù)如果不加修剪就會(huì)長(zhǎng)出無(wú)窮的枝杈。如果我們相信某項(xiàng)服務(wù)或者某臺(tái)計(jì)算機(jī)是安全的,我們就不需要花費(fèi)大量精力進(jìn)行深入分析了。如果我們無(wú)法做到信任,那么我們就需要對(duì)系統(tǒng)的更多組成部分(包括很多微組件)加以保護(hù)。圖1-1演示了做出信任決策的過(guò)程。如果沒(méi)有完全信任的云服務(wù)來(lái)保存我們的數(shù)據(jù),那么我們就必須自己運(yùn)維服務(wù)器,這又需要我們繼續(xù)加以判斷:到底是使用一項(xiàng)可靠的托管服務(wù)還是自己搭建Web服務(wù)器,到底是使用我們可以信任的現(xiàn)成數(shù)據(jù)庫(kù)軟件還是自己編寫(xiě)一個(gè)數(shù)據(jù)庫(kù)軟件?不難發(fā)現(xiàn),如果我們不信任供應(yīng)商,我們就需要繼續(xù)做出信任決策,畢竟我們不可能完全靠自力更生。
對(duì)于那些顯然不能信任的輸入信息(尤其是從公共互聯(lián)網(wǎng)或者客戶(hù)端發(fā)來(lái)的輸入信息),我們當(dāng)然應(yīng)該表示懷疑,怎么謹(jǐn)慎都不為過(guò)(詳見(jiàn)本書(shū)第4章)。即使在處理那些可以信任的輸入信息時(shí),我們?nèi)匀徊粦?yīng)以絕對(duì)可靠視之。如果我們只是希望降低整個(gè)系統(tǒng)的脆弱性,防止因軟件問(wèn)題導(dǎo)致錯(cuò)誤傳播,則可以在條件允許的情況下,盡可能增加一些安全校驗(yàn)。

圖1-1 演示做出信任決策過(guò)程的決策樹(shù)
1.隱式信任組件
每個(gè)軟件項(xiàng)目都會(huì)依賴(lài)大量存在隱式信任(implicitly trusted)的技術(shù),包括硬件、操作系統(tǒng)、開(kāi)發(fā)工具、庫(kù)和其他很難核查可靠性的技術(shù),所以我們只能根據(jù)供應(yīng)商的聲譽(yù)選擇相信這些工具。不過(guò),讀者還是應(yīng)該對(duì)隱式信任的概念有所了解,并且給予適當(dāng)?shù)闹匾暋绕涫菧?zhǔn)備大幅度擴(kuò)展隱式信任的范圍之前。
管理隱式信任沒(méi)有簡(jiǎn)便方法,不過(guò)下面這種思路也許可以給讀者帶來(lái)啟迪:把你認(rèn)定為可靠的對(duì)象數(shù)量降至最低。如果你現(xiàn)在已經(jīng)選擇了使用微軟或蘋(píng)果等公司的操作系統(tǒng),就繼續(xù)使用它們提供的編譯器、庫(kù)、應(yīng)用以及其他產(chǎn)品和服務(wù),這樣可以把信息暴露的風(fēng)險(xiǎn)降到最低。你可以這樣理解個(gè)中邏輯,即每多信任一家公司,就給了這家公司一次讓你失望的機(jī)會(huì)。另外,從實(shí)用的角度來(lái)看,同一家公司產(chǎn)品線中的產(chǎn)品往往兼容性更好,這些產(chǎn)品之間的互操作也經(jīng)歷過(guò)更多的測(cè)試。
2.值得信賴(lài)
最后,也不要忘了從另一個(gè)角度來(lái)思考信任決策,那就是在我們提供產(chǎn)品和服務(wù)時(shí)也需要提升客戶(hù)的信任感。每個(gè)軟件產(chǎn)品都必須讓終端用戶(hù)認(rèn)為這個(gè)產(chǎn)品是值得信賴(lài)的。在大部分情況下,我們只需要展現(xiàn)出自己的專(zhuān)業(yè)性就可以了,但是如果這項(xiàng)產(chǎn)品提供的功能相當(dāng)重要,就必須讓客戶(hù)有堅(jiān)實(shí)的理由信任我們的產(chǎn)品。
下面是在工作中提升信任感的幾種基本方式。
● 保持透明可以提升信任感。公開(kāi)自己的工作可以讓客戶(hù)評(píng)估產(chǎn)品的安全性。
● 讓第三方參與,利用第三方的獨(dú)立性來(lái)提升信任感(比如,可以聘請(qǐng)獨(dú)立的審計(jì)人員)。
● 有時(shí),我們的產(chǎn)品就是需要和其他產(chǎn)品進(jìn)行集成的第三方產(chǎn)品,因?yàn)楠?dú)立交易的雙方很難相互勾結(jié),所以這項(xiàng)產(chǎn)品也可以提升客戶(hù)的信任感。
● 在出現(xiàn)問(wèn)題的情況下,要主動(dòng)接受客戶(hù)的反饋,然后果斷采取行動(dòng),并且公開(kāi)披露調(diào)查的結(jié)果,以及提出防止問(wèn)題再次發(fā)生的措施。
● 有些特性或者設(shè)計(jì)要素可以把信任感具象化,讓客戶(hù)可以親眼看到——比如,通過(guò)一種存檔解決方案來(lái)實(shí)時(shí)顯示在不同位置保存了多少份備份。
行動(dòng)可以提升信任感,空洞的口號(hào)則會(huì)讓那些精明的客戶(hù)產(chǎn)生懷疑。我們可以提供一些有形的證據(jù),最好是可以讓客戶(hù)自己進(jìn)行驗(yàn)證的證據(jù)。雖然真有能力審查開(kāi)源代碼質(zhì)量的人寥寥可數(shù),但是開(kāi)放代碼給人們審查(讓他們知道總有懂得如何審查代碼的人會(huì)去審查這些代碼)本身也能夠提升信任感。
- Android應(yīng)用安全實(shí)戰(zhàn):Frida協(xié)議分析
- 攻守道:企業(yè)數(shù)字業(yè)務(wù)安全風(fēng)險(xiǎn)與防范
- 工業(yè)互聯(lián)網(wǎng)安全
- 同態(tài)密碼學(xué)原理及算法
- 模糊測(cè)試:強(qiáng)制發(fā)掘安全漏洞的利器
- 計(jì)算機(jī)網(wǎng)絡(luò)安全基礎(chǔ)(第5版)
- 人工智能安全(精裝版)
- SQL Injection Strategies
- 網(wǎng)絡(luò)安全大數(shù)據(jù)分析與實(shí)戰(zhàn)
- 信息安全工程與實(shí)踐
- 白話(huà)零信任
- 黑客攻擊與防范實(shí)戰(zhàn)從入門(mén)到精通
- 計(jì)算機(jī)網(wǎng)絡(luò)安全實(shí)驗(yàn)指導(dǎo)
- Web安全攻防從入門(mén)到精通
- Blockchain Development with Hyperledger