編寫安全代碼的3項(xiàng)準(zhǔn)備
編碼安全是應(yīng)用程序安全的基礎(chǔ)。在準(zhǔn)備階段,開發(fā)團(tuán)隊(duì)除了要根據(jù)其技術(shù)特長選擇一種符合項(xiàng)目要求、特點(diǎn)的安全語言之外,還要做好以下三方面的準(zhǔn)備。
一、制定一個(gè)安全的開發(fā)過程
安全的軟件開發(fā)是一個(gè)涉及到需求、設(shè)計(jì)、編碼、測試等諸多方面的過程。此過程的一個(gè)關(guān)鍵要素是,在軟件開發(fā)期間不同團(tuán)隊(duì)之間的信息傳遞。這個(gè)過程必須支持安全編碼的各種努力。
安全的開發(fā)周期要從始至終為整體的開發(fā)定義過程要素。在編碼過程中,典型的過程要素包括六方面:明確的編碼標(biāo)準(zhǔn)、為安全編碼而對編譯器進(jìn)行設(shè)置、源代碼工具的分析和使用、經(jīng)核準(zhǔn)的和被禁用的功能、安全編碼的清單等。
安全的開發(fā)周期的主要目的是,使項(xiàng)目的管理實(shí)現(xiàn)協(xié)調(diào),確保軟件滿足整體要求,其中也包括安全要求。指望開發(fā)團(tuán)隊(duì)沒有協(xié)調(diào)好所有其它各方的努力而生產(chǎn)出安全的代碼是不現(xiàn)實(shí)的。許多安全問題并非源自句法、語法錯(cuò)誤,而是源自設(shè)計(jì)問題。在不同團(tuán)隊(duì)之間的正確協(xié)調(diào)是安全開發(fā)周期過程的主要功能。這種跨團(tuán)隊(duì)交流的一個(gè)主要例子就是威脅建模的形式。威脅建模技術(shù)要分析一個(gè)系統(tǒng)的潛在威脅,并使用此結(jié)果來設(shè)計(jì)減輕威脅的措施。這要求不同團(tuán)隊(duì)的交流,使軟件體現(xiàn)出安全思維,從而挫敗潛在的威脅。
二、創(chuàng)建應(yīng)用指南
在開發(fā)團(tuán)隊(duì)開始編碼過程之前,開發(fā)者必須在應(yīng)用指南中制定策略,要求其明晰、易于理解,并且足夠全面,有助于程序員編寫規(guī)范的代碼。通過這種方法,任何開發(fā)人員都能輕易地維護(hù)代碼。該應(yīng)用指南應(yīng)當(dāng)包括如下信息:
從哪里得到特定軟件(也就是URL地址、服務(wù)器等)、將安件安裝到哪里(目錄結(jié)構(gòu)、硬盤、服務(wù)器等)、到哪里尋找許可信息、到哪里去發(fā)現(xiàn)部署要求、如何測試軟件及使用什么工具測試、在哪里將代碼投入生產(chǎn)(服務(wù)器名和IP地址等)、軟件檢驗(yàn)的過程、語言編碼標(biāo)準(zhǔn)的確認(rèn)等。
保持代碼的協(xié)調(diào)一致非常重要,但對于實(shí)現(xiàn)安全的代碼卻遠(yuǎn)遠(yuǎn)不夠。通過遵循應(yīng)用指南,開發(fā)人員就可以強(qiáng)化代碼的可讀性,并增加協(xié)同工作的可能性。如果開發(fā)團(tuán)隊(duì)能夠正確地創(chuàng)建應(yīng)用指南,它就可以在整個(gè)開發(fā)團(tuán)隊(duì)中貫徹實(shí)施。雖然這個(gè)過程可能需要根據(jù)不同項(xiàng)目或部門的需要而做出調(diào)整,但該指南必將有助于在整個(gè)開發(fā)團(tuán)隊(duì)中強(qiáng)化安全代碼的開發(fā)。#p#
三、確認(rèn)安全的軟件庫
如今,為不同語言和目的而開發(fā)的各種安全的軟件庫已經(jīng)不少了。其中的許多軟件庫都是為C和C++語言開發(fā)的,提供了針對容易被誤用的標(biāo)準(zhǔn)庫函數(shù)的替代代碼:
安全軟件庫的類型:開發(fā)團(tuán)隊(duì)必須高度關(guān)注這些軟件庫的來源。因?yàn)殚_發(fā)團(tuán)隊(duì)往往沒有時(shí)間查看庫中的代碼,檢驗(yàn)其純潔性,檢驗(yàn)代碼是否沒有被篡改,因而必須確保文件來自一個(gè)可信的源??尚旁吹亩x依賴于團(tuán)隊(duì)和正在開發(fā)的軟件。開發(fā)團(tuán)隊(duì)不妨考慮下面這些軟件庫的例子:
CERT的可管理字符串庫:計(jì)算機(jī)緊急響應(yīng)小組(CERT)庫的開發(fā)是為了應(yīng)對一個(gè)字符串庫的需要,主要用于改善新開發(fā)的C語言程序的質(zhì)量和安全性,同時(shí)排除程序的廣泛應(yīng)用和標(biāo)準(zhǔn)化的障礙。正如其名稱所暗示的那樣,可管理的字符串庫基于一種動(dòng)態(tài)的方法;可以根據(jù)需要分配和重新分配內(nèi)存。這種方法可以確??傆谐渥愕目臻g用于最終的字符串(包括終止性的空串)。
SafeInt:SafeInt是一個(gè)C++模板類。SafeInt在執(zhí)行一次操作之前要測試操作數(shù)的值,以決定是否會(huì)發(fā)生錯(cuò)誤。這個(gè)類被聲明為一個(gè)模板,因而它可用于任何整型類型。SafeInt被微軟廣泛用于其Windows及Office系列產(chǎn)品。如果您僅對微軟的編譯器感興趣,現(xiàn)在的Visual Studio版本就有一個(gè)類似的簡版。它可用于擁有良好模板支持的任何編譯器。
OWASP(開放式Web應(yīng)用程序安全項(xiàng)目)的企業(yè)安全API:該API可以簡化許多安全任務(wù),如輸入驗(yàn)證或訪問控制。
antiXSS庫:該庫可用于Web應(yīng)用程序。antiXSS庫主要用于防止跨站腳本(XSS)攻擊。這些antiXSS庫至少支持對所有源自不可信的用戶輸入的所有輸出進(jìn)行HTML編碼。其中的例子包括,OWASP PHP AntiXSS 和SAFECode 11
保障庫的安全性:在選擇了一個(gè)安全庫之后,很重要的一點(diǎn)是確保其安全性。對于JAVA的JAR文件,任何人都可以輕易地解壓文件、損害JAVA類,然后重新壓縮文件。在發(fā)現(xiàn)問題時(shí),就得花費(fèi)幾周或幾個(gè)月的時(shí)間才能決定JAR文件中的問題。因而,應(yīng)當(dāng)將庫放到一個(gè)安全的目錄中,設(shè)置有限的訪問權(quán)限,確保其不受到破壞。其目標(biāo)不僅是為了確保庫不會(huì)被重新打包,而且要限制操作人員。
代碼簽名:這種技術(shù)可用于確保庫和函數(shù)不會(huì)遭受損害或篡改。確保代碼在使用之前的完整性的方法包括:認(rèn)證代碼、強(qiáng)健的命名、WinSxS等。代碼簽名還可以在開源代碼庫工具中使用,如Mercurial and GIT。關(guān)鍵在于:開發(fā)團(tuán)隊(duì)需要定義并遵循一個(gè)適當(dāng)?shù)拇a簽名策略,使其成為安全編碼的一部分。
代碼庫的集中化:將軟件項(xiàng)目的代碼庫以及項(xiàng)目代碼庫的其它部分存放到一個(gè)可控的庫中。代碼庫可以使所有項(xiàng)目代碼存放到一個(gè)集中的位置,并可以有效地管理其更改。這種做法的安全好處是,易于備份整個(gè)代碼庫,如果代碼受到損害還可以在日后進(jìn)行恢復(fù)。將代碼放置到一個(gè)中央位置也可以使開發(fā)團(tuán)隊(duì)有效地控制誰可以訪問代碼庫。