- 軟件開發(fā)安全之道:概念、設(shè)計(jì)與實(shí)施
- (美)洛倫·科恩費(fèi)爾德
- 3595字
- 2024-01-31 18:37:15
前言
本書是針對軟件專業(yè)人士編寫的技術(shù)指南,適合那些希望更好地理解軟件安全原則、學(xué)習(xí)如何實(shí)踐軟件安全設(shè)計(jì)和實(shí)施的專業(yè)人員閱讀。我有幸對本書介紹的很多主題進(jìn)行了自己的創(chuàng)新,此外,我也見證了這個(gè)領(lǐng)域大量技術(shù)的發(fā)展與落地。本書是根據(jù)我自己的從業(yè)經(jīng)驗(yàn)創(chuàng)作的,其中包含了很多實(shí)用性很強(qiáng)的觀點(diǎn),讀者可以把這些觀點(diǎn)付諸實(shí)踐,讓自己正在編寫的軟件更加安全。
本書有兩大核心主題:一是鼓勵(lì)軟件從業(yè)者在軟件開發(fā)過程的早期就關(guān)注軟件的安全性;二是讓整個(gè)團(tuán)隊(duì)都參與到安全流程當(dāng)中,并且對軟件安全承擔(dān)起自己的那一份職責(zé)。這兩方面必然存在很大的改進(jìn)空間,本書則展示了如何實(shí)現(xiàn)這些目標(biāo)。
在我的職業(yè)生涯中,我有得天獨(dú)厚的機(jī)會(huì)可以一直奮斗在軟件領(lǐng)域的一線。如今,我希望與盡可能多的人分享我的學(xué)習(xí)成果。二十多年以前,我是微軟公司某團(tuán)隊(duì)的成員,這個(gè)團(tuán)隊(duì)首次把威脅建模大規(guī)模應(yīng)用于大型軟件公司。后來我在谷歌公司參與了同一項(xiàng)基本實(shí)踐的演化,同時(shí)也體驗(yàn)到了一種應(yīng)對挑戰(zhàn)的全新方式。本書第二部分參考了我所完成的百余項(xiàng)設(shè)計(jì)評審。過去的經(jīng)歷為我提供了一個(gè)極佳的視角來對這些要點(diǎn)重新進(jìn)行解釋。
設(shè)計(jì)、搭建和操作軟件系統(tǒng)是一項(xiàng)存在固有風(fēng)險(xiǎn)的工作。我們的每一次選擇、前進(jìn)的每一步,都會(huì)在不經(jīng)意間升高或者降低系統(tǒng)中引入安全漏洞的風(fēng)險(xiǎn)。本書涵蓋了我最熟悉的內(nèi)容,這些內(nèi)容來源于我個(gè)人的經(jīng)驗(yàn)。安全意識是我希望傳達(dá)的首要原則,我也同時(shí)展示了如何把安全融入整個(gè)開發(fā)過程當(dāng)中。在本書中,我提供了很多設(shè)計(jì)和代碼示例,它們在很大程度上不會(huì)依賴某項(xiàng)特定的技術(shù),這是為了讓它們的應(yīng)用盡可能廣泛。本書包含大量的故事、類比和示例,這是為了增加閱讀的趣味性,同時(shí)盡可能有效地表達(dá)抽象的概念。
安全意識對有些人來說很容易理解,對另一些人來說則比較難。鑒于此,我著重強(qiáng)調(diào)培養(yǎng)這種直覺的方法,幫助讀者用全新的方式思考,這類方法可以簡化我們工作中的軟件安全任務(wù)。我應(yīng)該補(bǔ)充一點(diǎn),根據(jù)我的個(gè)人經(jīng)驗(yàn),即使對那些比較容易培養(yǎng)安全意識的人來說,他們也一定可以從中獲益良多。
本書雖然簡潔,但是涵蓋了很多方面的問題。在撰寫本書的過程中,我已經(jīng)意識到簡潔對這本書的成功至關(guān)重要。軟件安全領(lǐng)域在廣度和深度上都令人生畏,所以我才希望本書盡可能簡短,從而讓它能夠被更多人理解。我的目標(biāo)是讓讀者用一種全新的方式來思考安全問題,并且應(yīng)用在自己的日常工作當(dāng)中。
讀者對象
本書適合在軟件設(shè)計(jì)、開發(fā)等領(lǐng)域已經(jīng)有所專長的人閱讀,包括架構(gòu)師、UX/UI設(shè)計(jì)師、程序管理員、軟件工程師、編程人員、測試人員和管理人員。技術(shù)從業(yè)者在理解本書中的概念時(shí)應(yīng)該不會(huì)遇到什么障礙——只要他們理解了軟件行業(yè)的一些基本概念,以及軟件架構(gòu)的基本方法。如今,軟件的使用已經(jīng)非常廣泛,類型也相當(dāng)豐富,我不能說所有軟件均依賴安全性,但絕大多數(shù)軟件確實(shí)如此,尤其是那些需要連接到互聯(lián)網(wǎng)或者需要與人互動(dòng)的軟件。
在撰寫本書的過程中,我意識到應(yīng)該把潛在的讀者分為三類。
安全行業(yè)的新人——尤其是那些一聽到安全就皺眉頭的人,他們是我寫作時(shí)思考的主要受眾,因?yàn)樽屗熊浖臉I(yè)者都對安全有所理解是非常重要的,這樣大家才能全部參與到提升軟件安全性的工作當(dāng)中。為了讓未來的軟件更加安全,我們需要所有人的參與,我也希望本書能夠幫助那些剛剛開始學(xué)習(xí)安全技術(shù)的人迅速踏上正途。
具備安全基礎(chǔ)的讀者——是指那些對安全抱有一定的興趣,但知識層面仍然有待提升的人,他們希望加深自己的理解,學(xué)習(xí)更多實(shí)用技能,從而應(yīng)用到他們的工作當(dāng)中。希望本書能夠彌補(bǔ)他們的知識空白,提供各種方式讓他們可以學(xué)以致用。
安全專家——他們或許熟悉本書中的大部分內(nèi)容,但我相信本書一定會(huì)提供一些新的視角,可以給他們提供很多新的內(nèi)容。具體來說,本書會(huì)探討一系列重要內(nèi)容,包括安全設(shè)計(jì)、安全審查和一些很少見諸文字的“軟技能”。
本書第三部分會(huì)介紹漏洞實(shí)施與緩解的方法,包括一些用C或Python語言編寫的代碼的簡短摘錄。有些例子假定讀者已經(jīng)熟悉了內(nèi)存分配的概念,也理解了整數(shù)和浮點(diǎn)類型,以及二進(jìn)制運(yùn)算。在為數(shù)不多的地方,我使用了數(shù)學(xué)公式,但是復(fù)雜度不會(huì)超過模和指數(shù)運(yùn)算。如果讀者認(rèn)為這些代碼和數(shù)學(xué)知識的技術(shù)性太強(qiáng),可以跳過這些章節(jié),完全不需要擔(dān)心因此而無法把握本書敘事的主線。
本書涵蓋的主題
本書共有13章,分為三大部分,其中包含了概念、設(shè)計(jì)和實(shí)施,以及最終的結(jié)論。
第一部分:概念
本書第1~5章介紹了基礎(chǔ)概念。第1章是對信息安全和隱私基礎(chǔ)所做的概述。第2章則介紹了威脅建模,以保護(hù)資產(chǎn)為背景,對攻擊面和信任邊界的核心概念進(jìn)行了具體說明。接下來的三章介紹了一些可供讀者使用以實(shí)現(xiàn)軟件安全的重要工具。第3章探討了對可識別威脅進(jìn)行防御性緩解的通用策略。第4章介紹了一些有效的安全設(shè)計(jì)模式,同時(shí)著重說明了一些應(yīng)該避免的反模式。第5章用工具箱的方式解釋了如何使用標(biāo)準(zhǔn)的加密庫來緩解常見的風(fēng)險(xiǎn),同時(shí)本章并沒有探討底層的數(shù)學(xué)原理(這些知識在實(shí)踐當(dāng)中很少用到)。
第二部分:設(shè)計(jì)
這一部分也許代表了本書對潛在讀者最獨(dú)特也是最重要的貢獻(xiàn)。第6章和第7章介紹了如何使軟件設(shè)計(jì)變得安全,以及可以應(yīng)用哪些技術(shù)來實(shí)現(xiàn)安全性,它們分別從設(shè)計(jì)者和審查員的角度分析了問題。在這個(gè)過程中,解釋了為什么一開始就將安全性融入軟件設(shè)計(jì)是很重要的。
這兩章借鑒了本書第一部分介紹的思想,提供了如何將它們結(jié)合起來構(gòu)建安全設(shè)計(jì)的具體方法。審查方法直接來自作者的行業(yè)經(jīng)驗(yàn),其中包括了能夠適應(yīng)你的工作方式的分步過程。你可以在閱讀這些章節(jié)時(shí)瀏覽附錄A中的設(shè)計(jì)文檔示例,以此當(dāng)作將這些想法付諸實(shí)踐的示例。
第三部分:實(shí)施
第8~13章涵蓋了實(shí)施階段的安全性,涉及部署、運(yùn)維直至生命周期結(jié)束。在你有了一個(gè)安全的設(shè)計(jì)后,這一部分將會(huì)闡釋如何在不引入額外漏洞的情況下進(jìn)行軟件開發(fā)。這些章節(jié)中包含了代碼片段,用來說明漏洞是如何潛入代碼中的,以及如何避免出現(xiàn)漏洞。第8章介紹了程序員面臨的安全挑戰(zhàn),以及代碼中真正的漏洞是什么樣的。第9章涵蓋了計(jì)算機(jī)在計(jì)算上的弱點(diǎn),并說明了針對動(dòng)態(tài)內(nèi)存分配的C風(fēng)格顯式管理是如何對安全性造成破壞的。第10章和第11章涵蓋了許多眾所周知,但還沒有消失的常見錯(cuò)誤(比如注入攻擊、路徑遍歷、XSS和CSRF漏洞)。第12章介紹了那些在很大程度上還沒有得到充分利用的測試實(shí)踐,目的是保證我們的代碼都是安全的。第13章介紹了安全實(shí)施的指導(dǎo)方針,包括一些一般性的最佳實(shí)踐,同時(shí)也對常見的陷阱提出了警示。
本書這一部分摘錄的代碼一般都會(huì)展示需要加以避免的漏洞,同時(shí)也會(huì)給出修補(bǔ)之后的版本來展示如何讓代碼更加安全(在書中這兩類代碼分別標(biāo)記為“易受攻擊的代碼”和“修復(fù)后的代碼”)。書中提供的代碼不是為了讓讀者進(jìn)行復(fù)制,然后運(yùn)用到生產(chǎn)軟件當(dāng)中的。即使是修復(fù)后的代碼仍然會(huì)因?yàn)槠渌蚨诓煌尘跋麓嬖诼┒矗宰x者不應(yīng)該把本書提供的任何代碼視為絕對安全的代碼并加以應(yīng)用。
結(jié)論
后記對本書的內(nèi)容做了總結(jié),同時(shí)對我希望能夠產(chǎn)生積極影響的一些方法進(jìn)行了介紹。在這里,我對本書中的幾大重點(diǎn)進(jìn)行了總結(jié),也對未來進(jìn)行了展望,并提供了有助于提升軟件安全性的一些預(yù)測——其中,首要的一點(diǎn)是本書如何為提升未來軟件的安全性做出貢獻(xiàn)。
附錄
附錄A是一份設(shè)計(jì)文檔示例,展示了在實(shí)踐中安全設(shè)計(jì)文檔大致應(yīng)該如何編寫。
附錄B是本書中出現(xiàn)的所有軟件安全術(shù)語的列表。
附錄C包含了一些開放式的練習(xí)題,以供需要的讀者進(jìn)一步探索。
附錄D是一系列重要概念和流程的備忘單。
此外,本書中提到的參考文獻(xiàn)匯編可以從異步社區(qū)下載獲得。
祝一路順風(fēng)
在開始介紹正式內(nèi)容之前,出于對本書中介紹的安全知識負(fù)責(zé)的考慮,我想先提出一些警告。為了解釋清楚如何讓軟件更加安全,我需要介紹各類漏洞如何發(fā)揮作用,以及攻擊者如何對這些漏洞加以利用。從攻擊和防御兩個(gè)方向?qū)嵺`是磨練技能的理想方式,但我們在使用這些知識的時(shí)候也需要謹(jǐn)慎。
永遠(yuǎn)不要在生產(chǎn)系統(tǒng)上試探安全性。比如,在讀到有關(guān)跨站腳本(XSS)的內(nèi)容時(shí),讀者或許想要試著用經(jīng)過修改的URL來瀏覽自己最喜歡的網(wǎng)站,看看會(huì)發(fā)生什么。千萬不要這么干!即使我們的動(dòng)機(jī)是善意的,這種做法從站點(diǎn)管理員角度看仍然和真正的攻擊別無二致。讀者必須考慮到別人可能會(huì)把這類行為解讀成威脅。而且與此同時(shí),這種行為在有些國家和地區(qū)可能存在法律問題。我們要運(yùn)用常識,包括思考別人會(huì)如何解讀我們的行為、我們行為出現(xiàn)差錯(cuò)以及我們的行為跨越紅線的后果。因此,如果我們希望嘗試一下XSS,可以用偽造的數(shù)據(jù)來建立自己的Web服務(wù)器,然后用這個(gè)服務(wù)器來練手。
另外,雖然我根據(jù)自己在軟件領(lǐng)域的多年經(jīng)驗(yàn)盡可能為讀者提供了最好的建議,但沒有任何指導(dǎo)方針是無懈可擊的,也沒有任何指導(dǎo)方針適用于所有環(huán)境。本書提到的解決方案絕不是什么“仙丹”,它們只是我提供的建議,或者讀者應(yīng)該掌握的一些常見方法。在對安全決策進(jìn)行評估的時(shí)候,讀者應(yīng)該依靠自己的判斷力。沒有一本書可以替讀者做出判斷,但本書可以協(xié)助讀者找出正確的做法。
- 攻守道:企業(yè)數(shù)字業(yè)務(wù)安全風(fēng)險(xiǎn)與防范
- DevSecOps敏捷安全
- 計(jì)算機(jī)使用安全與防護(hù)
- Penetration Testing with Perl
- Web安全與攻防入門很輕松(實(shí)戰(zhàn)超值版)
- CTF競賽權(quán)威指南(Pwn篇)
- 信息安全導(dǎo)論(第2版)
- 網(wǎng)絡(luò)安全設(shè)計(jì)、配置與管理大全
- 人工智能安全(精裝版)
- 互聯(lián)網(wǎng)企業(yè)安全高級指南
- 網(wǎng)絡(luò)安全大數(shù)據(jù)分析與實(shí)戰(zhàn)
- 捍衛(wèi)隱私
- 互聯(lián)網(wǎng)域名國際化與安全技術(shù)導(dǎo)論
- 大數(shù)據(jù)時(shí)代的云安全
- 防火墻和VPN技術(shù)與實(shí)踐