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