2023軟件安全開發(fā)V3.0.2_第1頁
2023軟件安全開發(fā)V3.0.2_第2頁
2023軟件安全開發(fā)V3.0.2_第3頁
2023軟件安全開發(fā)V3.0.2_第4頁
2023軟件安全開發(fā)V3.0.2_第5頁
已閱讀5頁,還剩311頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

PAGE193《軟件安全開發(fā)》V3.0.2目錄第1章 軟件安全概述 11.1軟件 11.1.1軟件定義 11.1.2軟件分類 11.2軟件安全 31.2.1軟件安全概述 31.2.2軟件安全范疇 41.2.3軟件安全問題 51.3本書的結(jié)構(gòu)與內(nèi)容 11第2章軟件安全開發(fā)模型 132.1軟件開發(fā)模型 132.1.1瀑布型軟件開發(fā)模型 132.1.2漸增型軟件開發(fā)模型 142.1.3變換型軟件開發(fā)模型 152.2常用軟件開發(fā)方法 152.3安全開發(fā)模型 172.4微軟安全開發(fā)生命周期模型 182.4.1安全生命周期模型(SDL) 182.4.2SDL優(yōu)化模型 192.4.3SDL安全人員角色 202.4.4SDL模型安全活動 212.4.5培訓(xùn)階段 232.4.6需求階段 242.4.7設(shè)計(jì)階段 252.4.8實(shí)施階段 262.4.9驗(yàn)證階段 262.4.10發(fā)布和響應(yīng)階段 272.4.11可選的安全活動 282.5McGraw軟件安全開發(fā)模型 292.6NIST安全開發(fā)生命周期模型 332.6.1開始階段 342.6.2獲取與開發(fā)階段 352.6.3執(zhí)行階段 372.6.4操作和維護(hù)階段 372.6.5部署階段 38第3章安全漏洞管理 403.1概述 403.1.1漏洞分類 403.1.2漏洞等級 423.1.3漏洞管理流程 443.1.4漏洞管理機(jī)制 453.2安全內(nèi)容自動化協(xié)議(SCAP) 473.2.1SCAP及其元素 483.2.2可擴(kuò)展配置檢查列表描述格式XCCDF 503.2.3開放漏洞評估描述語言O(shè)VAL 513.2.4通用漏洞和披露列表CVE 523.2.5通用平臺枚舉CPE 523.2.6通用配置枚舉CCE 533.2.7通用漏洞評分系統(tǒng)CVSS 543.3典型軟件安全漏洞 543.3.1緩沖區(qū)溢出漏洞 553.3.2整數(shù)溢出漏洞 583.3.3格式化字符串漏洞 593.3.4指針覆蓋漏洞 623.3.5SQL注入漏洞 623.3.6ByPass漏洞 643.3.7信息泄露漏洞 653.3.8越權(quán)漏洞 653.4OWASPTop10 663.4.1注入攻擊 663.4.2失效的身份認(rèn)證和會話管理 683.4.3跨站腳本–XSS 703.4.4不安全的直接對象引用 723.4.5安全配置錯誤 743.4.6敏感數(shù)據(jù)暴露 763.4.7功能級別訪問控制缺失 773.4.8跨站請求偽造(CSRF) 783.4.9使用已知易受攻擊組件 803.4.10未驗(yàn)證的重定向和轉(zhuǎn)發(fā) 81第4章安全功能設(shè)計(jì) 834.1安全審計(jì) 844.1.1安全審計(jì)自動響應(yīng) 854.1.2安全審計(jì)數(shù)據(jù)產(chǎn)生 854.1.3安全審計(jì)分析 874.1.4安全審計(jì)查閱 884.1.5安全審計(jì)事件選擇 894.1.6安全審計(jì)事件存儲 904.2安全通信 914.2.1原發(fā)抗抵賴 924.2.2接收抗抵賴 934.3密碼支持 954.3.1密鑰管理 964.3.2密碼運(yùn)算 994.4用戶數(shù)據(jù)保護(hù) 1004.4.1訪問控制 1034.4.2數(shù)據(jù)流控制 1054.4.3數(shù)據(jù)鑒別 1094.4.4系統(tǒng)內(nèi)部傳送 1104.4.5殘余信息保護(hù) 1124.4.6回退 1134.4.7存儲數(shù)據(jù)的完整性 1144.5標(biāo)識和鑒別(身份認(rèn)證) 1154.5.1用戶鑒別 1164.5.2用戶標(biāo)識 1194.5.3鑒別失敗 1204.5.4用戶屬性定義 1214.5.5秘密的規(guī)范 1214.5.6主體-用戶綁定 1224.6安全管理 1234.6.1功能的管理 1234.6.2安全屬性的管理 1244.6.3數(shù)據(jù)的管理 1264.6.4安全管理角色 1274.7隱私保護(hù) 1284.7.1匿名 1294.7.2假名 1294.7.3不可關(guān)聯(lián)性 1314.7.4不可觀察性 1324.8安全功能的保護(hù) 1334.8.1底層抽象機(jī)測試 1364.8.2失效保護(hù) 1374.8.3安全功能數(shù)據(jù)的可用性 1374.8.4安全功能數(shù)據(jù)的保密性 1384.8.5安全功能數(shù)據(jù)的完整性 1394.8.6內(nèi)部數(shù)據(jù)傳送 1404.8.7物理保護(hù) 1414.8.8可信恢復(fù) 1434.8.9重放檢測 1464.8.10引用仲裁 1474.8.11域分離 1484.8.12狀態(tài)同步協(xié)議 1494.8.13時間戳 1504.8.14對外數(shù)據(jù)一致性 1514.8.15內(nèi)部數(shù)據(jù)復(fù)制一致性 1524.8.16安全功能自檢 1524.9資源利用 1534.9.1容錯 1544.9.2服務(wù)優(yōu)先級 1554.9.3資源分配 1564.10系統(tǒng)/子系統(tǒng)的訪問 1574.10.1可選屬性范圍限定 1584.10.2多重并發(fā)會話限定 1594.10.3會話鎖定 1604.10.4訪問旗標(biāo) 1624.10.5訪問歷史 1624.10.6會話建立 1634.11可信路徑/信道 1644.11.1安全功能之間的可信信道 1654.11.2可信路徑 165第5章 常見安全問題 1675.1概述 1675.2常見編程安全問題分類 1675.3常見編程安全問題 1695.3.1整數(shù)賦值錯誤問題 1695.3.2整型提升導(dǎo)致的內(nèi)存溢出錯誤 1695.3.3臨時變量溢出 1705.3.4整數(shù)截?cái)噱e誤問題 1705.3.5整數(shù)溢出問題 1715.3.6帶符號與無符號整型比較問題 1715.3.7size_t導(dǎo)致的死循環(huán) 1725.3.8誤用short引起緩沖區(qū)溢出 1735.3.9表達(dá)式中對同一變量多次寫入問題 1745.3.10空字符結(jié)尾錯誤問題 1745.3.11無界字符串復(fù)制問題 1755.3.12定長字符串越界問題 1765.3.13字符串截?cái)鄦栴} 1785.3.14與函數(shù)無關(guān)的字符串錯誤問題 1795.3.15修改字符串常量錯誤問題 1805.3.16字符串比較錯誤 1805.3.17數(shù)組越界問題 1815.3.18數(shù)組定義和值初始化括號形式混淆錯誤 1825.3.19未正確區(qū)分標(biāo)量和數(shù)組問題 1835.3.20二維數(shù)組的內(nèi)存泄露 1845.3.21釋放指針指向的對象引起內(nèi)存泄漏 1845.3.22數(shù)據(jù)指針被修改問題 1865.3.23函數(shù)指針被修改問題 1865.3.24刪除void*指針錯誤 1885.3.25printf函數(shù)輸出問題 1895.3.26格式化函數(shù)sprintf引起緩沖區(qū)溢出 1895.3.27指針變量的傳值和傳址混淆問題 1905.3.28驗(yàn)證方法參數(shù)問題 1915.3.29函數(shù)退出時內(nèi)存未釋放問題 1925.3.30continue和return混淆問題 1925.3.31非void返回類型函數(shù)問題 1935.3.32誤用sizeof操作符取字符串長度 1955.3.33基類未定義虛析構(gòu)函數(shù)引發(fā)錯誤 1955.3.34線程未join引起的內(nèi)存泄露 1975.3.35notify線程喚醒問題 1985.3.36多線程中Socket終止問題 1995.3.37程序異常退出時未關(guān)閉已打開文件 2015.3.38目錄打開后未關(guān)閉 2025.3.39寫文件沒有調(diào)用fflush 2025.3.40臨時文件未刪除問題 2035.3.41敏感信息硬編碼問題 2045.3.42引用未初始化的內(nèi)存錯誤問題 2065.3.43檢查和處理內(nèi)存分配錯誤問題 2065.3.44執(zhí)行零長度的分配錯誤問題 2075.3.45引用已釋放內(nèi)存的錯誤問題 2085.3.46雙重釋放內(nèi)存錯誤問題 2095.3.47不匹配的內(nèi)存管理函數(shù)問題 2095.3.48匿名對象引起的內(nèi)存泄漏 2105.3.49JVM內(nèi)存泄漏問題 2115.3.50覆蓋equals方法而沒有覆蓋hashCode方法問題 2125.3.51finally程序段非正常退出問題 2145.3.52非泛型的數(shù)據(jù)類型問題 2155.3.53類名稱比較問題 2155.3.54等同的對象得不到相等的結(jié)果問題 2165.3.55在嵌套類中暴露外部類的私有字段問題 2175.3.56靜態(tài)方法隱藏問題 2185.3.57構(gòu)造函數(shù)中拋出異常引發(fā)錯誤 2195.3.58構(gòu)造器調(diào)用可覆蓋方法問題 2205.3.59字符亂碼問題 2225.3.60功能級別訪問控制缺失問題 2225.3.61表單重復(fù)提交問題 2255.3.62不安全的直接對象引用問題 2275.3.63信息的不安全存儲問題 2285.3.64SQL注入攻擊 2295.3.65失效的身份認(rèn)證和會話管理問題 2315.3.66跨站腳本(XSS) 232第6章 安全編碼實(shí)踐 2346.1輸入驗(yàn)證和數(shù)據(jù)合法性校驗(yàn) 2346.1.1輸入數(shù)據(jù)有效性校驗(yàn) 2346.1.2避免SQL注入 2356.1.3避免XML注入 2356.1.4避免跨站點(diǎn)腳本(XSS) 2356.2聲明和初始化 2366.2.1避免類初始化相互依賴 2366.3表達(dá)式 2376.3.1勿忽略方法返回值 2376.3.2勿引用空指針 2376.3.3比較數(shù)組內(nèi)容 2386.4數(shù)值類型和操作 2386.4.1防止整數(shù)溢出 2386.4.2避免除法和取模運(yùn)算分母為零 2396.5類和方法操作 2406.5.1數(shù)據(jù)成員聲明為私有且提供可訪問的包裝方法 2406.5.2敏感類不允許復(fù)制 2406.5.3比較類的正確做法 2416.5.4不要硬編碼敏感信息 2416.5.5驗(yàn)證方法參數(shù) 2426.5.6勿使用過時或低效的方法 2426.5.7數(shù)組引用問題 2426.5.8勿產(chǎn)生內(nèi)存泄露 2436.6異常處理 2446.6.1不要忽略捕獲的異常 2446.6.2不允許暴露異常的敏感信息 2456.6.3不允許拋出RuntimeException、Exception和Throwable 2466.6.4不要捕獲NullPointerException或其他父類異常 2466.7多線程編程 2476.7.1確保被并發(fā)調(diào)用函數(shù)的可重入性 2476.7.2函數(shù)線程安全 2496.7.3確保共享變量的可見性 2506.7.4確保共享變量的操作是原子的 2516.7.5Thread.run()和Thread.stop() 2526.7.6確保執(zhí)行阻塞操作的線程可以終止 2536.7.7不在一個有限的線程池執(zhí)行相互依存的任務(wù) 2546.8輸入輸出 2546.8.1程序終止前刪除臨時文件 2546.8.2檢測和處理文件相關(guān)錯誤 2556.8.3及時釋放資源 2566.9序列化 2566.9.1不要序列化未加密的敏感數(shù)據(jù) 2576.9.2在序列化過程中避免內(nèi)存和資源泄漏 2576.9.3反序列化要在程序最小權(quán)限的安全環(huán)境中 258第7章 軟件安全測試 2597.1軟件安全測試方法 2597.2軟件安全測試過程 2607.3軟件安全測試組織 2617.4軟件安全測試舉例 2627.4.1系統(tǒng)測試概要 2637.4.2系統(tǒng)測試結(jié)果 2647.4.3系統(tǒng)安全建議 273參考文獻(xiàn) 275附錄A測試工具 2761源代碼分析器——SourceCodeAnalysis(FortifySCA) 2772字節(jié)碼掃描器——FindBugs 2783數(shù)據(jù)庫脆弱性掃描器——DatabaseScanner 2794網(wǎng)絡(luò)漏洞掃描器——NTOSpider 2805網(wǎng)絡(luò)漏洞掃描器——Metasploit 2816Web應(yīng)用漏洞掃描器——AppScan 2867Web應(yīng)用漏洞掃描器——JSky 2898Web應(yīng)用漏洞掃描器——WVS 2919Web服務(wù)掃描器——SOATest 29310動態(tài)分析工具——CLRProfiler 29411設(shè)計(jì)驗(yàn)證工具——SDMetrics 295軟件安全概述1.1軟件1.1.1軟件定義軟件與硬件一起組成了完整的計(jì)算機(jī)系統(tǒng)。1983年美國電氣和電子工程師協(xié)會IEEE(InstituteofElectricalandElectronicsEngineers)給出的軟件的定義是“計(jì)算機(jī)程序、方法、規(guī)則和相關(guān)文檔資料以及在計(jì)算機(jī)上運(yùn)行時所需的數(shù)據(jù)。”目前,對軟件通俗的解釋是:軟件=程序+數(shù)據(jù)+文檔資料。其中:程序是按事先設(shè)計(jì)的功能和性能要求執(zhí)行的指令序列;數(shù)據(jù)是使程序能正常操縱信息的數(shù)據(jù)結(jié)構(gòu);文檔資料是與程序開發(fā)、維護(hù)和使用有關(guān)的圖文材料。軟件已成為現(xiàn)代社會基礎(chǔ)設(shè)施的要素,對人們的生活和工作都產(chǎn)生了深遠(yuǎn)的影響。為了能全面、正確地理解軟件,必須了解軟件的特點(diǎn)。軟件是一種邏輯實(shí)體。對于軟件來說,用戶無法看到它的形態(tài),而必須通過觀察、分析、思考、判斷去了解它的功能、性能及其他特性。軟件是智力活動的產(chǎn)品。軟件開發(fā)過程中沒有明顯的制造過程。軟件是通過人們的智力活動,把知識與技術(shù)轉(zhuǎn)化成信息的一種產(chǎn)品。軟件在運(yùn)行和使用期間不存在磨損和老化問題。軟件的研發(fā)工作需要投入大量復(fù)雜的高強(qiáng)度腦力勞動,往往成本極高。軟件的復(fù)雜度隨著規(guī)模的增大而迅速增加。軟件系統(tǒng)各個模塊之間有各種邏輯聯(lián)系,一起運(yùn)行于同一個系統(tǒng)空間,模塊越多,相互的影響和關(guān)聯(lián)也就越復(fù)雜,導(dǎo)致整個軟件的復(fù)雜度隨著規(guī)模增大而成指數(shù)級增長。1.1.2軟件分類到目前為止,軟件尚無統(tǒng)一的分類。典型的分類方式包括按功能、規(guī)模和服務(wù)對象進(jìn)行分類。一般來說,要給計(jì)算機(jī)軟件做出科學(xué)的分類是很難的。但鑒于不同類型的工程對象,對其進(jìn)行開發(fā)和維護(hù)有著不同的要求和處理方法,仍然需要對軟件的類型進(jìn)行必要的劃分。按軟件的功能劃分按照軟件的功能進(jìn)行劃分,軟件可分為系統(tǒng)軟件、支撐軟件和應(yīng)用軟件三類。系統(tǒng)軟件:系統(tǒng)軟件是計(jì)算機(jī)運(yùn)行的必不可少的組成部分,它與計(jì)算機(jī)硬件緊密配合在一起,控制并協(xié)調(diào)計(jì)算機(jī)系統(tǒng)各個部件、相關(guān)的軟件和數(shù)據(jù)高效地工作。系統(tǒng)軟件通常包括操作系統(tǒng)、數(shù)據(jù)庫管理系統(tǒng)、設(shè)備驅(qū)動程序以及通信處理程序等。支撐軟件:包括系統(tǒng)支撐平臺軟件和應(yīng)用支撐平臺軟件。支撐軟件是協(xié)助用戶開發(fā)軟件的工具性軟件,其中包括幫助程序人員開發(fā)軟件產(chǎn)品的工具,也包括幫助管理人員控制開發(fā)進(jìn)程的工具。應(yīng)用軟件:應(yīng)用軟件是指在特定領(lǐng)域內(nèi)開發(fā),為特定目的服務(wù)的軟件。目前,計(jì)算機(jī)已經(jīng)成為大多數(shù)日常工作的必須工具,在很多應(yīng)用領(lǐng)域都需要專門的軟件支持,在這些種類繁多的應(yīng)用軟件中,商業(yè)數(shù)據(jù)處理軟件所占比例最大,此外還有工程與科學(xué)計(jì)算軟件、系統(tǒng)仿真軟件、計(jì)算機(jī)輔助設(shè)計(jì)(ComputerAidedDesign,CAD)軟件、人工智能軟件及各類辦公自動化軟件和信息處理軟件等。按軟件的規(guī)模進(jìn)行劃分按軟件規(guī)模分類(此處數(shù)據(jù)并無明確結(jié)論,僅供參考)即按照開發(fā)軟件所需的人力、物力、時間以及完成的源程序行數(shù)進(jìn)行分類,可將軟件分為微型、小型、中型、大型、極大型、巨大型,如表1-1所示。表1-1軟件的規(guī)模的分類類別參加人數(shù)研制期限產(chǎn)品規(guī)模(源程序行數(shù))微型軟件11周~1月5百小型軟件11~6月2千中型軟件2~51~2年0.5~5萬大型軟件5~152~3年5~10萬極大型軟件100~10004~5年1百萬巨大型軟件2000~50005~10年0.1~1千萬1)微型軟件:只有一個人,甚至是半時,在幾天之內(nèi)完成的軟件。寫出的程序不到500行語句;2)小型軟件:一個人半年之內(nèi)完成的2000行以內(nèi)的程序。例如,數(shù)值計(jì)算問題或是數(shù)據(jù)處理問題這種規(guī)模的課題。這種程序通常沒有與其他程序的接口;3)中型軟件:5人以內(nèi)在1~2年時間內(nèi)完成的0.5~5萬行的程序。這種課題開始出現(xiàn)在軟件人員之間,軟件人員與用戶之間的聯(lián)系、協(xié)調(diào)和配合關(guān)系的問題;4)大型軟件:5~15人在2~3年時間里完成5萬行~10萬行的程序。例如編譯程序、小型分時系統(tǒng)、應(yīng)用軟件包、實(shí)時控制系統(tǒng)等軟件;5)極大型軟件:100~1000人參加在4~5年時間里完成100萬行以上的程序;6)巨大型軟件:2000~5000人參加在5~10年的時間里完成1000萬行以上程序。3、按軟件服務(wù)對象劃分按軟件服務(wù)對象的范圍,可將軟件劃分為面向市場廣大用戶的軟件產(chǎn)品和面向部分客戶軟件項(xiàng)目。通用軟件:指的是不局限于特定領(lǐng)域的、可以被廣大用戶直接使用的軟件系統(tǒng)。如Windows、Office、WPS等。這類系統(tǒng)的特點(diǎn)是技術(shù)含量高,開發(fā)時要考慮到各種不同的用戶需求。2)定制軟件:是受某個特定客戶(或少數(shù)客戶)的委托,由一個或多個軟件開發(fā)機(jī)構(gòu)在合同的范圍內(nèi)進(jìn)行開發(fā)的軟件,如我們常說的管理信息系統(tǒng)和電子商務(wù)系統(tǒng)。這類軟件的特點(diǎn)是領(lǐng)域知識所占的比重較大,相對技術(shù)而言工程性更強(qiáng),如政府辦公系統(tǒng)、ERP系統(tǒng)、監(jiān)控系統(tǒng)等。1.2軟件安全1.2.1軟件安全概述軟件安全(SoftwareSecurity)是指將開發(fā)的軟件存在的風(fēng)險(xiǎn)控制在可接受的水平,以保證軟件的正常運(yùn)行。由于軟件存在漏洞是必然的,而這些漏洞有現(xiàn)存的攻擊方法,并且這些方法可以被利用來破壞一種或更多軟件的安全性能,或迫使軟件運(yùn)行到不安全的狀態(tài)。因此,軟件很容易成為攻擊目標(biāo)。安全的軟件是指即使它的安全性受到蓄意危害時仍然保持安全可靠運(yùn)行。那么如何評判一個軟件是否足夠安全?著名的軟件安全專家JuliaH.Allen給出了一個安全的軟件需要滿足的屬性,這些屬性是軟件安全的重要因素。主要包括以下幾種:1)機(jī)密性。軟件必須確保其特性(包括運(yùn)行環(huán)境和用戶之間的聯(lián)系)、資源管理和內(nèi)容對未授權(quán)實(shí)體隱藏。這一點(diǎn)對于開源軟件來說也仍然適用,盡管開源軟件的特性和內(nèi)容都可以公開使用(對授權(quán)實(shí)體),但其仍然要維持其資源管理的機(jī)密性。2)完整性。軟件及其管理的資源必須能夠抵御入侵(覆蓋、刪除、修改等)并能從中恢復(fù)。入侵破壞一般由未授權(quán)的修改引起,這些修改針對軟件源代碼、受管理的資源、配置或者授權(quán)用戶的合法操作,包括重寫、覆蓋、篡改、破壞、插入等,在軟件開發(fā)過程中必須保證其完整性。3)可用性。軟件必須對授權(quán)用戶(人或進(jìn)程)開放,即可操作和運(yùn)行,而對未授權(quán)用戶關(guān)閉。相反,對于未授權(quán)的用戶應(yīng)該永遠(yuǎn)關(guān)閉,既不可操作和運(yùn)行。4)可追溯性。所有與安全相關(guān)的軟件行為都必須跟蹤與記錄,并進(jìn)行責(zé)任歸因。5)抗抵賴性。這一屬性是指軟件防止用戶否認(rèn)執(zhí)行了某些行為的功能,以保證可追蹤性不受到破壞。上述安全屬性是緊密相關(guān)的,很難在不考慮其他屬性的情況下達(dá)到其中一個屬性的滿足。比如用戶的系統(tǒng)賬戶被人竊取,即意味著機(jī)密性的喪失,而完整性也必然得不到保障。為了從應(yīng)用軟件的數(shù)據(jù)庫中提取個人的相關(guān)信息而進(jìn)行的一次成功的SQL注入攻擊,違背了軟件的機(jī)密性。一次針對Web應(yīng)用的跨站腳本(Cross-SiteScripting,XSS)攻擊同時違背了軟件的完整性和可用性。許多其他的重要軟件特性隱含軟件安全的特性,其間的關(guān)聯(lián)通常能被描述為這些特性如何影響軟件安全范疇內(nèi)的屬性。由于我們越來越依賴軟件來解決關(guān)鍵性的工作,這使得軟件成為那些帶有惡意、犯罪、敵對、競爭心理的或帶恐怖主義性質(zhì)的攻擊者的高價(jià)值攻擊目標(biāo),所以設(shè)計(jì)安全的軟件很重要。而且McGraw博士提出“使安全成為軟件開發(fā)必需的部分(BuildSecurityIn,BSI)”的觀點(diǎn),已經(jīng)得到工業(yè)界和政府部門的廣泛認(rèn)同,美國國土安全部下屬的國家網(wǎng)絡(luò)安全處(NationalCyberSecurityDivision,NCSD)專門建立了BSI網(wǎng)站(/portal),并與美國國家標(biāo)準(zhǔn)技術(shù)研究所(TheNationalInstituteofStandardsandTechnology,NIST)、國際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandards,ISO)以及電氣工程師協(xié)會(InstituteofElectricalandElectronicsEngineers,IEEE)一起共同維護(hù)這個網(wǎng)站。1.2.2軟件安全范疇軟件的安全問題已經(jīng)出現(xiàn)多年,隨著軟件系統(tǒng)的不斷增加和越來越復(fù)雜,使得安全的潛在隱患不斷增多。在確定軟件安全特征并找到有效的改善方法之前,我們必須首先了解軟件安全的具體范疇。根據(jù)軟件的定義可知,軟件安全的范疇主要包括數(shù)據(jù)的安全性、程序的安全性以及文檔資料的安全性三大方面:1)數(shù)據(jù)安全:數(shù)據(jù)安全可定義為“保持?jǐn)?shù)據(jù)的機(jī)密性,完整性,可用性;另外也可包括諸如真實(shí)性,可核查性,不可否認(rèn)性和可靠性等”。數(shù)據(jù)安全包括兩方面:一是數(shù)據(jù)本身的安全,主要是指采用現(xiàn)代密碼算法對數(shù)據(jù)進(jìn)行主動保護(hù),主要解決了數(shù)據(jù)保密性、數(shù)據(jù)完整性、可追溯性、抗抵賴性等安全屬性等;二是數(shù)據(jù)防護(hù)的安全,主要是采用現(xiàn)代信息存儲手段對數(shù)據(jù)進(jìn)行主動防護(hù),例如通過磁盤陣列、數(shù)據(jù)備份、異地容災(zāi)等手段主要保證了數(shù)據(jù)的可用性、完整性、可靠性等安全屬性。2)程序安全:程序安全主要指在軟件開發(fā)周期中的代碼安全,是貫穿在整個開發(fā)周期的軟件安全保障。程序安全包括架構(gòu)設(shè)計(jì)安全和編碼測試安全兩方面,軟件工程師要盡量使用健全的和已經(jīng)驗(yàn)證為安全的開發(fā)工具來進(jìn)行代碼編寫以減少軟件實(shí)現(xiàn)時的漏洞,并使用靜態(tài)源碼分析攻擊,進(jìn)行源碼審查和人工審查方式來減少安全漏洞,除此之外,要使用大量的安全測試策略來檢驗(yàn)程序是否安全,包括白盒測試(基于對源碼的深度理解)、黑盒測試(關(guān)注軟件可見的外部行為)、滲透測試(在系統(tǒng)級別識別特殊的漏洞)。3)文檔資料安全:文檔資料安全指在軟件開發(fā)過程中對于軟件需求規(guī)格說明書、設(shè)計(jì)文檔等安全管理,即避免在開發(fā)周期的任意時候蓄意地刪除,新增和修改文檔資料來破壞軟件。由于文檔資料對于軟件開發(fā)者和使用者了解程序功能、代碼作用、程序的測試過程等具有十分重要的作用,所以對文檔資料的保護(hù)要與程序和數(shù)據(jù)同步進(jìn)行。1.2.3軟件安全問題由于軟件已成為那些帶有惡意、犯罪、敵對、競爭心理的,甚至帶恐怖主義性質(zhì)的攻擊者的高價(jià)值攻擊目標(biāo),因此軟件安全問題已經(jīng)成為上到國家下到個人的關(guān)鍵問題。本節(jié)中主要介紹軟件安全漏洞,軟件生命周期中的安全問題以及軟件安全問題產(chǎn)生的原因。軟件安全漏洞軟件安全漏洞指在計(jì)算機(jī)程序、系統(tǒng)或協(xié)議中存在的安全漏洞,它已成為被攻擊者用來非法侵入他人系統(tǒng)的主要渠道。對于軟件的安全漏洞問題,面對“如何開發(fā)出具有高安全性軟件”與“如何利用軟件漏洞進(jìn)行攻擊”,安全防護(hù)人員和黑客始終處于不斷相互較量的過程中。根據(jù)著名的咨詢公司GartnerResearch的報(bào)告,對于企業(yè)網(wǎng)絡(luò)的攻擊,超過70%來自軟件和應(yīng)用層,而不是網(wǎng)絡(luò)層或系統(tǒng)層。軟件和應(yīng)用層的漏洞的數(shù)目在各種環(huán)境中都在增加。而來自NIST的數(shù)據(jù)更為驚人,有92%被發(fā)現(xiàn)的漏洞屬于應(yīng)用層。這些數(shù)據(jù)表明,目前絕大部分的黑客攻擊都是利用了應(yīng)用軟件的安全漏洞實(shí)現(xiàn)的,而這些安全漏洞往往是由于軟件開發(fā)人員在編碼時的疏漏造成的。在面對惡意攻擊時,軟件的安全漏洞是普遍存在的,并且有可能導(dǎo)致嚴(yán)重風(fēng)險(xiǎn),所以軟件安全漏洞是最危險(xiǎn)的安全問題之一。在過去十年里,軟件安全漏洞這個問題變得越來越嚴(yán)重,圖1-1顯示了從2003年至2013年中國國家信息安全漏洞庫(ChinaNationalVulnerabilityDatabaseofInformationSecurity,CNNVD)統(tǒng)計(jì)的軟件漏洞數(shù)量變化情況。從圖中可以看出十年內(nèi)漏洞數(shù)量呈增長趨勢,并且在以后的時間里這一趨勢不會有很大的改變。而且CNNVD根據(jù)漏洞的影響等級范圍、利用方式、攻擊后果等,對漏洞危害進(jìn)行了量化評分。并將漏洞分為4個等級,即危急(CNNVD評分為10分)、高危(7.0~9.9分)、中危(4.0~6.9分)和低危級別(0.0~3.9分)。圖1-12003~2013年軟件漏洞數(shù)量分布圖目前,軟件中安全漏洞的種類非常繁多,它們彼此之間都有一些共同的特點(diǎn)和模式。常見的8種軟件安全中漏洞如下:(1)緩沖區(qū)溢出漏洞。嚴(yán)格的講,當(dāng)程序允許輸入的數(shù)據(jù)大于已分配的緩沖區(qū)大小時,就會產(chǎn)生緩沖區(qū)溢出。緩沖區(qū)溢出造成的后果小到系統(tǒng)崩潰,大到攻擊者完全控制程序。并且,如果運(yùn)行該程序的用戶擁有較高的權(quán)限,攻擊者還可以控制整個操作系統(tǒng)。如果出現(xiàn)此漏洞的應(yīng)用程序是一個網(wǎng)絡(luò)服務(wù),那么將會造成蠕蟲病毒的產(chǎn)生并蔓延。第一個著名的Internet蠕蟲病毒——RobertT.Morris蠕蟲病毒,就利用了finger服務(wù)器上的一個緩沖區(qū)溢出漏洞進(jìn)行攻擊。在1988年,一次緩沖區(qū)溢出攻擊差點(diǎn)使Internet癱瘓,之后,雖然我們似乎明白該如何避免緩沖區(qū)溢出,但是在許多種類的軟件中仍舊能常常見到有關(guān)緩沖區(qū)溢出漏洞的報(bào)告。而且即使很優(yōu)秀、很細(xì)心的程序員也會出現(xiàn)緩沖區(qū)溢出漏洞,但是優(yōu)秀的程序員知道如何有效的避免這種漏洞,以及如何進(jìn)行有效的測試來找出這種漏洞。(2)整數(shù)溢出漏洞對于不同語言,整數(shù)溢出漏洞的表現(xiàn)形式也有細(xì)微差別。自計(jì)算機(jī)編程出現(xiàn)之后,整數(shù)上溢、下溢以及各種類型的溢出就已經(jīng)存在了。簡單的棧粉碎攻擊被堆攻擊普遍替代后,整數(shù)溢出就變成了一個安全研究的主題。利用整數(shù)溢出進(jìn)行攻擊盡管存在一段時間了,但直到最近幾年,整數(shù)溢出才因許多安全問題報(bào)告的出現(xiàn)而真正浮出水面。(3)格式化字符串漏洞格式化字符串漏洞是近年來新出現(xiàn)的少數(shù)幾種攻擊類型之一。第一個涉及格式化字符串攻擊的漏洞是由LamagraArgamal于2000年6月23日發(fā)布的(/archive/1/66842)。大約1個月之后,PascalBouchareine更詳細(xì)的解釋了這類問題(/archive/1/10383),但是沒有將輸入和利用格式化字符串漏洞來寫入內(nèi)存。像其他安全漏洞一樣,格式化字符串漏洞的根源在于未對用戶提供的輸入進(jìn)行驗(yàn)證。在C/C++中,格式化字符串攻擊可以用來向任意內(nèi)存寫入數(shù)據(jù),最危險(xiǎn)的是這種漏洞發(fā)生時不會改變臨界內(nèi)容塊的內(nèi)容。這種情況在UNIX和Linux系統(tǒng)上更為普遍。在Windows系統(tǒng)上,應(yīng)用程序字符串表通常保存在可執(zhí)行程序中,或者DLL(DynamicLinkLibraries,動態(tài)鏈接庫)中。如果攻擊者可以重寫主執(zhí)行程序或者資源DLL,就可以執(zhí)行比格式化字符更為直接的攻擊,因?yàn)樗鼈兛梢孕薷恼谶\(yùn)行的代碼。(4)指針覆蓋漏洞指針覆蓋漏洞指由于程序在運(yùn)行中往往會將來自于程序外部的數(shù)據(jù)也存放進(jìn)入內(nèi)存中,如果某些數(shù)據(jù)恰好覆蓋了程序的指針,那么程序的執(zhí)行流程就會被這些外部數(shù)據(jù)所控制。指針覆蓋漏洞類似于緩沖區(qū)溢出漏洞,但是范圍則更廣泛一些,外部數(shù)據(jù)不僅可以覆蓋程序的函數(shù)返回地址,還可能覆蓋程序運(yùn)行中其他的關(guān)鍵地址。如程序正在調(diào)用指令callecx,此時,ecx寄存器中的數(shù)據(jù)來源于內(nèi)存中的某個地址。一旦程序發(fā)生指針覆蓋漏洞,ecx索取數(shù)據(jù)的這個內(nèi)存地址被一個執(zhí)行ShellCode代碼的地址所覆蓋,那么程序一旦調(diào)用callecx指令,ShellCode就會馬上被執(zhí)行。指針覆蓋漏洞可能是最近幾年軟件安全中出現(xiàn)最多的漏洞。尤其近幾年CPU硬件設(shè)計(jì)者采用的一些硬件級別的防止緩沖區(qū)溢出漏洞的方法,更加使得緩沖區(qū)溢出漏洞難以被利用。(5)SQL注入漏洞SQL注入漏洞是Web系統(tǒng)特有的一類漏洞,源于PHP、ASP等腳本語言對用戶輸入數(shù)據(jù)的錯誤解析。網(wǎng)站開發(fā)程序員在編寫代碼時,沒有對用戶輸入數(shù)據(jù)的合法性進(jìn)行判斷,使應(yīng)用程序存在安全隱患。以PHP語言為例,如果用戶的輸入能夠影響到SQL命令串的生成,那么很可能再添加了單引號、#號等轉(zhuǎn)義命令字符后,能夠改變數(shù)據(jù)庫最終執(zhí)行的SQL命令。(6)ByPass漏洞Bypass漏洞是一個大類,包含了很多小類,這些小類有一個共同的特點(diǎn),就是這些出現(xiàn)問題的軟件都在功能上存在對用戶的限制,而Bypass漏洞就可以繞過軟件的限制,使得軟件的限制形同虛設(shè)。Bypass漏洞不但可以讓普通軟件的限制功能作廢,還可能造成某些軟件安全功能完全形同虛設(shè)。(7)信息泄露漏洞信息泄露漏洞實(shí)際上指攻擊者獲取了可以破壞安全或隱私策略的數(shù)據(jù),而不管是采取顯式的還是隱式的手段。數(shù)據(jù)本身可能就是攻擊者的目標(biāo),或者數(shù)據(jù)提供的信息可以使攻擊者達(dá)到他們的目的。信息泄露的后果有時候不是很明顯,但是這個漏洞有時會使用弱權(quán)限或訪問控制表來放大。(8)越權(quán)型漏洞越權(quán)型漏洞是一個設(shè)計(jì)問題,當(dāng)發(fā)生故障時,攻擊者可以利用這個漏洞制造更危險(xiǎn)的事故,軟件會在其生命周期的某個時候失效,如果其代碼失效了,但允許攻擊者運(yùn)行惡意代碼,這些代碼的運(yùn)行通常會把權(quán)限賦予易受攻擊的進(jìn)程。例如,如果某進(jìn)程用Administrator或root權(quán)限來運(yùn)行,且這段代碼中有一個導(dǎo)致執(zhí)行任意代碼的整數(shù)溢出漏洞,則惡意代碼也會運(yùn)行為Administrator或root。另一個實(shí)例是攻擊者訪問不應(yīng)訪問的數(shù)據(jù),當(dāng)危及安全的代碼用足以訪問數(shù)據(jù)的權(quán)限來運(yùn)行時,就可以訪問不該訪問的數(shù)據(jù)。軟件安全漏洞會影響軟件安全的運(yùn)行,這是一個不爭的事實(shí)。這些漏洞可以被利用而影響到軟件的安全屬性并且迫使軟件運(yùn)行到一個不安全的、可被利用的狀態(tài)。考慮到基于軟件的系統(tǒng)廣泛的連接能力和其復(fù)雜度爆炸性地增長,軟件安全處理這些漏洞將是一個十足的挑戰(zhàn)。軟件生命周期中的安全問題軟件產(chǎn)品同任何其他事物一樣,也要經(jīng)歷孕育、誕生、成長、成熟、衰亡等各個階段,在軟件工程中一般將上述過程稱為軟件的生命周期。通過將整個軟件生命周期劃分為若干階段,使得每個階段都有明確的任務(wù)和目標(biāo),進(jìn)而使得規(guī)模大,結(jié)構(gòu)復(fù)雜和管理復(fù)雜的軟件開發(fā)變的易于控制和管理。通常,軟件生命周期包括可行性分析與項(xiàng)目開發(fā)計(jì)劃、需求分析、設(shè)計(jì)、編碼、測試、維護(hù)等活動,通常,可以將這些活動以適當(dāng)?shù)姆绞椒峙涞讲煌碾A段去完成。這種按時間分配不同任務(wù)的思想方法是軟件工程中的一種重要思想原則,即按部就班、逐步推進(jìn),每個階段都要有各自的定義、工作、審查、形成文檔以便工作交流或備查,進(jìn)而達(dá)到提高軟件質(zhì)量的目的。目前,按照軟件開發(fā)生命周期的思想進(jìn)行軟件設(shè)計(jì)和開發(fā)的理念已經(jīng)得到廣大軟件設(shè)計(jì)和開發(fā)人員的廣泛認(rèn)同,但是在軟件開發(fā)生命周期中對安全性的考慮則往往被忽略,進(jìn)而產(chǎn)生了很多的軟件產(chǎn)品漏洞,給使用軟件產(chǎn)品的人們帶來很多工作生活上的不便,甚至造成巨大的經(jīng)濟(jì)損失。在軟件生命周期的各個階段,如果缺乏良好的安全意識,則可能給軟件產(chǎn)品帶來如表1-2所示的各種安全問題。表1-2軟件開發(fā)生命周期中可能給軟件帶來的安全問題軟件開發(fā)生命周期各階段各階段安全問題需求分析階段沒有明確用戶對安全性方面的需求設(shè)計(jì)階段軟件設(shè)計(jì)沒有安全性的考慮軟件設(shè)計(jì)存在邏輯上的缺陷編碼階段代碼中存在安全漏洞,如存在SQL注入漏洞、對入口參數(shù)缺少有效性檢查等為了測試方便,開發(fā)人員在程序中留下后門開發(fā)人員在程序中植入惡意代碼引用沒有經(jīng)過安全性測試的開源代碼測試階段沒有對軟件進(jìn)行安全性測試運(yùn)行與維護(hù)階段軟件產(chǎn)品發(fā)布后沒有對軟件進(jìn)行合理的保護(hù),造成軟件被破解或被非法復(fù)制歷史遺留的軟件項(xiàng)目源代碼和文檔缺失,造成即使發(fā)現(xiàn)安全漏洞也無法修改的局面?zhèn)鹘y(tǒng)軟件開發(fā)生命周期主要從軟件功能實(shí)現(xiàn)的角度出發(fā),其基本目的是如何合理地組織開發(fā)流程以高效地完成軟件的各項(xiàng)功能,通常只是注重軟件功能的定義、實(shí)現(xiàn)與測試,安全策略沒有得到充分的考慮。即使是在測試環(huán)節(jié)考慮到軟件系統(tǒng)的安全性,也往往是在編碼完成后進(jìn)行,而沒有將軟件安全的思想貫穿到軟件開發(fā)的整個過程。對比而言安全軟件開發(fā)生命周期是將安全原則滲透到整個軟件開發(fā)的生命周期中,即在每個開發(fā)階段均需要考慮安全性。安全軟件開發(fā)生命周期是通過軟件開發(fā)的各個步驟來確保軟件的安全性,其目的是確保安全的軟件得以成功實(shí)現(xiàn)。在安全軟件開發(fā)生命周期的每一個階段都需要應(yīng)用安全風(fēng)險(xiǎn)管理。只有保證安全風(fēng)險(xiǎn)管理貫徹在整個開發(fā)周期中才能保證軟件的安全性。關(guān)于軟件安全開發(fā)模型的內(nèi)容將在本書第二章有詳細(xì)介紹,并且著重分析了近年來較主流的四種安全開發(fā)生命周期模型實(shí)例:微軟安全開發(fā)生命周期模型、McGraw軟件安全開發(fā)模型以及NIST安全開發(fā)生命周期模型。軟件安全問題的產(chǎn)生原因大多數(shù)商業(yè)和開源的應(yīng)用、中間件系統(tǒng)和操作系統(tǒng)都相當(dāng)龐大而復(fù)雜。在一般的執(zhí)行中,這些系統(tǒng)可以在大量不同的狀態(tài)之間轉(zhuǎn)換。這個特征使得軟件的開發(fā)和持續(xù)正常運(yùn)行變得特別困難,更不用說持續(xù)安全運(yùn)行了。面對不可避免的安全威脅和風(fēng)險(xiǎn),項(xiàng)目經(jīng)理和軟件工程師必須考慮到軟件的安全性。如果項(xiàng)目經(jīng)理和軟件工程師進(jìn)行過系統(tǒng)的處理缺陷的訓(xùn)練,那么軟件的大部分安全缺陷可以避免。不幸的是,在現(xiàn)實(shí)環(huán)境下,項(xiàng)目經(jīng)理和軟件工程師缺乏設(shè)計(jì)、開發(fā)安全的應(yīng)用軟件和進(jìn)行質(zhì)量保證的訓(xùn)練,在測試不安全代碼和識別拙劣開發(fā)技術(shù)方面亟待提升。軟件開發(fā)和設(shè)計(jì)人員通常都不理解在識別錯誤或消除缺陷過程中,或者在面對攻擊時,哪些安全條例更有效。開發(fā)人員常常對一些特定的軟件需求的安全因素不熟悉(或是缺乏)。同樣,設(shè)計(jì)人員也很少學(xué)習(xí)軟件構(gòu)架、設(shè)計(jì)、開發(fā)、部署和運(yùn)行的安全要素。這些知識的缺乏意味著軟件的安全需求很可能不充分,并且開發(fā)出來的軟件可能脫離特定的(和非特定)安全需求。此外,這些知識的缺乏將阻礙項(xiàng)目經(jīng)理和軟件工程師識別和理解當(dāng)軟件缺陷和漏洞遭受攻擊時,軟件會達(dá)到一個什么樣的錯誤狀態(tài)。錯誤不可避免,即使在需求分析和設(shè)計(jì)時可以避免(比如通過形式化方法),在開發(fā)時可以避免(比如通過全面的代碼審查和大量的測試),但卻還是會在軟件匯編、集成、部署和運(yùn)行時候被引入。不管如何忠實(shí)地遵守一個基于安全的開發(fā)過程,只要軟件的規(guī)模和復(fù)雜性繼續(xù)增長,一些可被挖掘出的錯誤和其他安全問題是肯定存在的,軟件安全專家JuliaH.Allen認(rèn)為這些問題主要有以下來源:1)復(fù)雜性,不完全性和軟件運(yùn)行模型的改變(比如,面向網(wǎng)絡(luò)或面向服務(wù)的結(jié)構(gòu)模型)。2)來自軟件工程師的錯誤假設(shè),包括軟件的功能、輸出和軟件運(yùn)行環(huán)境的行為狀態(tài),或者外部實(shí)體的預(yù)期進(jìn)入。3)軟件規(guī)格說明書或設(shè)計(jì)的瑕疵,或者來自以下方面有缺陷的情況:軟件和外部實(shí)體的接口,這類型的開發(fā)失誤包括不恰當(dāng)?shù)妮斎霗z查,錯誤處理和異常處理機(jī)制。軟件運(yùn)行環(huán)境的組件(從中間件級別到操作系統(tǒng)級別,再到固件級別和硬件級別的組件)。軟件安全問題越來越多,越來越復(fù)雜。那種用防火墻來定義系統(tǒng)的“邊界”,把軟件與外界隔離,過分依賴加密技術(shù),并且等到軟件出現(xiàn)問題時才被動修復(fù)的傳統(tǒng)的安全思想,已經(jīng)無法應(yīng)對不可避免的安全威脅和風(fēng)險(xiǎn)。為了改變這種狀況,我們應(yīng)該對傳統(tǒng)的軟件開發(fā)模型進(jìn)行安全方面的改造,對軟件設(shè)計(jì)和開發(fā)人員進(jìn)行全方位的安全培訓(xùn),使軟件安全能夠在軟件開發(fā)的整個流程中都能夠得到重視,提高軟件產(chǎn)品的本質(zhì)安全性。1.3本書的結(jié)構(gòu)與內(nèi)容軟件安全一直是軟件開發(fā)中的一個非常關(guān)鍵的問題,開發(fā)高安全性的軟件是每個軟件開發(fā)人員必須追求的目標(biāo)。開發(fā)人員如何在開發(fā)的全過程從根本上提高軟件的安全性,是每個軟件行業(yè)從業(yè)人員(包括項(xiàng)目經(jīng)理、系統(tǒng)分析人員、編碼人員、測試人員、維護(hù)人員)都必須思考的問題。但是,軟件安全是一門新興的學(xué)科,所覆蓋的范圍極其廣泛,需要探討和研究的內(nèi)容也非常之多。為了讓廣大軟件從業(yè)人員更好地了解并掌握軟件安全開發(fā)的相關(guān)理論和技術(shù),本書編寫組根據(jù)軟件行業(yè)特點(diǎn),從軟件從業(yè)人員的實(shí)際情況和知識結(jié)構(gòu)出發(fā),系統(tǒng)地、循序漸近地介紹了軟件安全的各個方面,分別對軟件安全的基礎(chǔ)理論和關(guān)鍵技術(shù)進(jìn)行詳細(xì)的介紹與講解。本書的組織結(jié)構(gòu)圖如圖1-2所示。圖1-2組織結(jié)構(gòu)圖第1章“軟件安全概述”。本章首先介紹了軟件的定義和軟件的分類,之后給出了軟件安全的范疇以及軟件安全中的一些典型問題。第2章“軟件安全開發(fā)模型”。本章從軟件安全開發(fā)模型和軟件生命周期入手,重點(diǎn)介紹了幾種典型的軟件開發(fā)模型,包括:微軟安全開發(fā)生命周期模型、MrGraw安全接觸點(diǎn)以及NIST安全開發(fā)生命周期。第3章“安全漏洞管理”。本章首先講解了漏洞管理主要元素和流程、我國的漏洞管理機(jī)制、安全內(nèi)容自動化協(xié)議(SecurityContentAutomationProtocol,SCAP)、典型的軟件安全漏洞以及開源Web應(yīng)用安全項(xiàng)目(OpenWebApplicationSecurityProject,OWASP)所列出的2013年10大安全漏洞。第4章“軟件安全功能設(shè)計(jì)”。本章所介紹的安全功能主要是參考了歐美國家制定的《信息技術(shù)安全評估通用準(zhǔn)則》,即CC(CommonCriteria)和我國制定的《信息技術(shù)安全性評估準(zhǔn)則》,即GB/T18336。本章具體的內(nèi)容包括:安全審計(jì)、安全通信、密碼支持、用戶數(shù)據(jù)保護(hù)、標(biāo)識和鑒別、安全管理、隱私保護(hù)、安全功能的保護(hù)、資源利用、系統(tǒng)/子系統(tǒng)的訪問以及可信路徑/信道等。第5章“常見安全問題”。本章重點(diǎn)介紹了軟件安全設(shè)計(jì)中經(jīng)常出現(xiàn)的編程安全問題,本章共列舉66個安全編碼問題,每個問題由問題描述、產(chǎn)生條件和問題涉及的編程語言3部分構(gòu)成,供開發(fā)人員參考。第6章“安全編碼實(shí)踐”,本章重點(diǎn)介紹的內(nèi)容是如何實(shí)現(xiàn)安全的編碼和安全編程實(shí)踐知識,有助于開發(fā)人員提高編碼的安全性。第7章“軟件安全測試”,本章首先對測試方法進(jìn)行了系統(tǒng)的概述,之后介紹了單元測試、集成測試、系統(tǒng)測試、功能測試、性能測試以及驗(yàn)收測試等內(nèi)容;本章前半部分側(cè)重對軟件測試過程進(jìn)行講解,后半部分對軟件安全測試進(jìn)行示例。供測試人員參考。本書面向的主要對象包括從事軟件開發(fā)工作的軟件技術(shù)人員、從事軟件漏洞分析的安全人員以及學(xué)習(xí)“軟件安全”課程的高等院校信息安全、計(jì)算機(jī)科學(xué)、軟件工程類專業(yè)本科生和研究生。第2章軟件安全開發(fā)模型2.1軟件開發(fā)模型軟件開發(fā)生命周期一般分為定義、開發(fā)、運(yùn)行維護(hù)三個階段。定義階段又可細(xì)分為問題定義、可行性研究、需求分析階段;開發(fā)階段又可細(xì)分為總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼、測試階段。運(yùn)行維護(hù)階段不再細(xì)分。從軟件開發(fā)全過程來看,軟件開發(fā)模型可歸納為三種基本類型:瀑布型、漸增型、變換型。2.1.1瀑布型軟件開發(fā)模型瀑布型軟件開發(fā)模型遵循軟件開發(fā)生命周期的定義、開發(fā)、運(yùn)行維護(hù)三個階段,明確規(guī)定了各個細(xì)分階段的任務(wù),每個階段將上一階段產(chǎn)生的相關(guān)文檔通過處理,完成本階段任務(wù)后生成的產(chǎn)品、文檔提交給下一階段,最終開發(fā)出軟件產(chǎn)品。瀑布型軟件開發(fā)模型各階段任務(wù)與輸出結(jié)果,如表2-1所示,其開發(fā)模型如圖2-1所示。表2-1瀑布型軟件開發(fā)模型各階段任務(wù)與輸出結(jié)果階段基本任務(wù)輸出結(jié)果問題定義目標(biāo)理解與范圍界定系統(tǒng)目標(biāo)與范圍說明書可行性研究理解工作范圍確定任務(wù)項(xiàng)目計(jì)劃任務(wù)書需求分析分析需求、定義用戶要求需求規(guī)格說明書總體設(shè)計(jì)構(gòu)建軟件結(jié)構(gòu)總體設(shè)計(jì)說明書詳細(xì)設(shè)計(jì)各模塊的功能設(shè)計(jì)程序功能說明書編碼編寫程序程序清單測試發(fā)現(xiàn)和排除錯誤軟件產(chǎn)品運(yùn)行維護(hù)運(yùn)行和管理改進(jìn)的軟件產(chǎn)品圖2-1瀑布型軟件開發(fā)模型2.1.2漸增型軟件開發(fā)模型漸增型軟件開發(fā)模型如圖2-2所示,在瀑布型軟件開發(fā)模型基礎(chǔ)上通過問題定義,從基本需求分析開始進(jìn)行定義、設(shè)計(jì)、編碼、測試,建立滿足用戶基本需求的原型系統(tǒng)。通過對原型系統(tǒng)的測試、運(yùn)行評估反饋,進(jìn)一步了解用戶需求進(jìn)行漸增式的設(shè)計(jì)、編碼,修改完善,再測試與運(yùn)行,如此循環(huán)直至用戶滿意,完成合同提交軟件產(chǎn)品?;谶@種模型的軟件開發(fā),要求用戶直接參與和配合,軟件文檔隨著軟件開發(fā)過程逐漸形成。圖2-2漸增型軟件開發(fā)模型2.1.3變換型軟件開發(fā)模型變換型軟件開發(fā)模型如圖2-3所示,該模型反映出一種形式化軟件開發(fā)的方法,從軟件需求形式化規(guī)格說明開始,通過一系列的形式變換處理,最終形成程序軟件系統(tǒng)。該方法主要是在軟件開發(fā)生命周期需求、設(shè)計(jì)、編程等不同階段對相關(guān)規(guī)格說明采用形式語言描述,構(gòu)建基于形式語言的代數(shù)模型(包含變換、演算規(guī)則),對系統(tǒng)的邏輯演繹結(jié)構(gòu)進(jìn)行變換、演算,實(shí)現(xiàn)應(yīng)用軟件系統(tǒng)的開發(fā)。例如:基于軟件需求和相關(guān)規(guī)格說明的形式化描述,采用進(jìn)程代數(shù)建立模型,通過變換、演算完成軟件開發(fā)。只要形式化描述、變換規(guī)則是正確的,則程序系統(tǒng)一定是正確的。形式化描述、變換處理需要形式語言理論、數(shù)學(xué)工具和技術(shù)的支持。原型檢查原型檢查軟件需求形式化規(guī)格說明(軟件需求形式化描述)軟件設(shè)計(jì)形式化規(guī)格說明(軟件設(shè)計(jì)形式化描述)變換、演算處理變換、演算處理程序變換、演算規(guī)則變換、演算規(guī)則圖2-3變換型軟件開發(fā)模型上述模型是我們在軟件開發(fā)過程中的常用模型,在開發(fā)過程中可以混合使用。如,采用基于形式化模型快速建立原型系統(tǒng),以漸增的方式改進(jìn)軟件需求形式化描述,進(jìn)行漸增式的設(shè)計(jì)、編碼,修改完善再測試,直至用戶滿意,完成合同提交軟件產(chǎn)品。2.2常用軟件開發(fā)方法隨著軟件開發(fā)方法的不斷發(fā)展,除了采用上述模型進(jìn)行開發(fā)外,還可采用以下各種軟件開發(fā)方法進(jìn)行軟件開發(fā)。結(jié)構(gòu)化軟件開發(fā)方法結(jié)構(gòu)化軟件開發(fā)模型核心思想是自頂向下和逐步求精。對于一個復(fù)雜的系統(tǒng),采用“分解和抽象”手段,使其逐層分解直至各子系統(tǒng)足夠簡單為止。模型使用數(shù)據(jù)流圖、數(shù)據(jù)詞典和小說明等規(guī)范工具描述系統(tǒng)。其中小說明的表示方法除了自然語言外,通常采用結(jié)構(gòu)化語言、判定表和判定樹等三種形式?;谏鲜鰧ο到y(tǒng)的描述,建立系統(tǒng)模塊結(jié)構(gòu)圖或軟件層次方框圖,在此基礎(chǔ)上使用程序語言完成編碼工作。模型采用“分解和抽象”手段,將整個系統(tǒng)逐層分解直至足夠簡單的各個子模塊,這種思想貫穿于軟件開發(fā)生命周期系統(tǒng)分析、設(shè)計(jì)和編程全過程。面向?qū)ο蟮能浖_發(fā)方法面向?qū)ο蟮能浖_發(fā)模型是圍繞著現(xiàn)實(shí)世界的概念來組織模型,通過對客觀領(lǐng)域的概念進(jìn)行分類和組織來創(chuàng)建軟件的模型。模型針對面向?qū)ο筌浖_發(fā)生命周期的四個階段來組織。=1\*GB2⑴分析階段,該階段的任務(wù)是從問題域中抽象出類和對象的模型。=2\*GB2⑵設(shè)計(jì)階段,設(shè)計(jì)是對時間問題域的行為進(jìn)行關(guān)鍵抽象再分解的過程。設(shè)計(jì)的結(jié)果反饋到分析結(jié)果上并進(jìn)行修正,直至關(guān)鍵抽象足夠簡單不需要再分解時設(shè)計(jì)結(jié)束。=3\*GB2⑶演化階段,演化實(shí)際上是將編碼、測試和集成組合在一起的活動。=4\*GB2⑷維護(hù)階段,維護(hù)是在軟件系統(tǒng)提交運(yùn)行后進(jìn)行的變更活動。組件開發(fā)方法基于組件開發(fā)是當(dāng)前軟件開發(fā)技術(shù)的趨勢,是面向?qū)ο筌浖l(fā)展過程的延伸,它實(shí)現(xiàn)了分析、設(shè)計(jì)、類等多層次上的重用?;诮M件的軟件開發(fā)模型(組件開發(fā)模型),將開發(fā)過程分為四個主要階段:=1\*GB2⑴標(biāo)識組件。將需要開發(fā)的應(yīng)用系統(tǒng)分解為粒度適宜的組件,進(jìn)行標(biāo)識。=2\*GB2⑵獲取組件。對于分解后的組件,盡可能地從現(xiàn)有的組件中獲取。=3\*GB2⑶設(shè)計(jì)組件。對于需要設(shè)計(jì)的新組件,也應(yīng)盡可能地從已有的組件中抽取、修改,對于需要重新設(shè)計(jì)的組件,在設(shè)計(jì)過程中要針對組件的復(fù)用性來設(shè)計(jì)。=4\*GB2⑷測試組件。對獲取、更改和設(shè)計(jì)的組件進(jìn)行測試,是否滿足功能需求。在組件被一個新的系統(tǒng)和運(yùn)行環(huán)境接受之前,必須確定組件是否能正確的按規(guī)范說明實(shí)現(xiàn)功能。組件開發(fā)模型充分體現(xiàn)了組件重用特征。值得說明的是,不同組件描述技術(shù)和規(guī)范的不同,如UML、JavaBean、EJB、Servlet等,其模型具體構(gòu)造也不同。敏捷軟件開發(fā)方法(Scrum)敏捷軟件開發(fā)技術(shù)與模型是敏捷開發(fā)的一種,近年內(nèi)逐漸流行起來。開發(fā)軟件就像開發(fā)新產(chǎn)品,無法一開始就能定義軟件產(chǎn)品最終的規(guī)程,過程中需要研發(fā)、創(chuàng)意、嘗試錯誤,所以沒有一種固定的流程可以保證方案的成功。Scrum是英式橄欖球隊(duì),模型將軟件開發(fā)團(tuán)隊(duì)比擬成橄欖球隊(duì),有明確的最高目標(biāo),熟悉開發(fā)流程中所需具備的最佳典范與技術(shù),具有高度自主權(quán),緊密地溝通合作,以高度彈性解決各種挑戰(zhàn),確保每天、每個階段都朝向目標(biāo)有明確的推進(jìn)。Scrum開發(fā)模型是一種靈活的軟件管理過程,它可以幫助開發(fā)者駕馭迭代、遞增的軟件開發(fā)過程。其輕量過程可以作為包裝器,也就是說可以把Scrum與其它靈活的過程框架組合起來,比如說RUP(Rational

Unified

Process,Rational統(tǒng)一過程),是一種被廣泛使用的軟件過程框架,可以很好地迎合開發(fā)者軟件開發(fā)過程的需要,還可以容納其他技術(shù)。本節(jié)給出的軟件開發(fā)模型保障了用戶需求和軟件系統(tǒng)功能、性能的實(shí)現(xiàn),但是從軟件安全開發(fā)生命周期的角度來看,上述軟件開發(fā)模型的安全性,并沒有系統(tǒng)、完整的體現(xiàn)。2.3安全開發(fā)模型從軟件開發(fā)生命周期全過程來看,軟件安全開發(fā)生命周期(SDL,SecureDevelopmentLifecycle)模型核心思想是在軟件開發(fā)生命周期的每個階段融合安全要素,用以解決軟件開發(fā)各階段可能出現(xiàn)的安全問題。在瀑布型、漸增型軟件開發(fā)模型基礎(chǔ)上融合安全要素,構(gòu)建的面向軟件開發(fā)生命周期的一類基本軟件安全開發(fā)模型如圖2-4所示。該模型通過項(xiàng)目啟動階段中安全原則制定、需求階段中的安全需求分析、設(shè)計(jì)階段中的架構(gòu)和設(shè)計(jì)安全分析與評審、編碼階段中的安全編碼原則與實(shí)施、測試階段中的安全測試等策略、方法,達(dá)到減少軟件開發(fā)過程中引入的安全漏洞數(shù)量,確保軟件開發(fā)的安全性及安全軟件的實(shí)現(xiàn)。圖2-4軟件安全開發(fā)模型該軟件安全開發(fā)模型面向軟件開發(fā)生命周期各階段融合了安全要素:安全基本原則、安全需求、安全設(shè)計(jì)與架構(gòu)評審、威脅建模、安全編碼、安全測試、安全評審評估等安全活動與方法,是面向軟件開發(fā)生命周期的一類基本的軟件安全開發(fā)模型。軟件安全開發(fā)模型、安全開發(fā)建模方法與應(yīng)用是信息安全技術(shù)領(lǐng)域的研究熱點(diǎn),代表性的有微軟的安全開發(fā)生命周期模型(MicrosoftSDL)、McGraw的軟件安全接觸點(diǎn)模型(BuildingSecurityIn,BSI)、美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)的安全開發(fā)生命周期模型等。2.4微軟安全開發(fā)生命周期模型2.4.1安全生命周期模型(SDL)微軟的安全開發(fā)生命周期(MicrosoftSDL)模型(/sdl)是用于改進(jìn)軟件安全和隱私保護(hù)的過程。SDL模型將軟件開發(fā)生命周期劃分為需求分析、軟件設(shè)計(jì)、代碼實(shí)現(xiàn)、審查、產(chǎn)品發(fā)布五個階段,它包括了必需的安全活動:安全培訓(xùn)、安全需求、安全設(shè)計(jì)、安全實(shí)施、安全驗(yàn)證和發(fā)布與響應(yīng)。這與2.3節(jié)面向軟件開發(fā)生命周期的軟件安全開發(fā)模型中的安全基本原則、安全需求、安全設(shè)計(jì)與架構(gòu)評審、威脅建模、安全編碼、安全測試、安全評審評估等安全活動與內(nèi)容基本一致。MicrosoftSDL模型不僅包括遵從通常軟件開發(fā)過程的必需行動,還十分靈活,允許添加其他策略和方法,從而創(chuàng)建組織所特有的軟件開發(fā)方法體系。提供的過程、培訓(xùn)和工具的組合具有明顯的優(yōu)勢,如可增強(qiáng)可預(yù)測性、技術(shù)能力及軟件安全性,這些優(yōu)勢可降低組織及軟件用戶的風(fēng)險(xiǎn)。MicrosoftSDL模型對開發(fā)過程進(jìn)行了擴(kuò)充,在開發(fā)過程的各個階段加入一系列安全活動,并形成相應(yīng)的交付物和報(bào)告進(jìn)行安全審查。這些安全活動和報(bào)告包括:1)需求分析階段,對安全功能的要求和可信行為進(jìn)行確切定義,定義安全目標(biāo)、安全需求特性和保障措施、檢驗(yàn)準(zhǔn)則;2)軟件設(shè)計(jì)階段,對安全風(fēng)險(xiǎn)識別中的安全架構(gòu)、威脅建模,風(fēng)險(xiǎn)分析,關(guān)鍵組件和攻擊面進(jìn)行識別,確定設(shè)計(jì)技術(shù)指南等;3)代碼實(shí)現(xiàn)階段,建立安全編碼原則與標(biāo)準(zhǔn),使用靜態(tài)分析、代碼掃描工具和代碼審核工具進(jìn)行代碼測試,以及以安全為核心的測試(如Fuzz測試);4)審查階段,進(jìn)行代碼審核、安全測試;5)產(chǎn)品發(fā)布階段,首先進(jìn)行最終安全復(fù)審(FSR),系統(tǒng)部署后為反饋的新漏洞設(shè)置響應(yīng)機(jī)制,避免在后續(xù)開發(fā)過程中再次出現(xiàn)。此外,SDL模型強(qiáng)調(diào)在系統(tǒng)安全開發(fā)項(xiàng)目啟動階段引入安全顧問的角色,安全顧問統(tǒng)籌和指導(dǎo)系統(tǒng)安全開發(fā)全過程,直到最終安全復(fù)審(FSR)結(jié)束。微軟通過利用安全衡量指標(biāo),以及微軟核心安全團(tuán)隊(duì)的安全專業(yè)知識對軟件開發(fā)人員進(jìn)行強(qiáng)制性的安全培訓(xùn)。從微軟的報(bào)告發(fā)現(xiàn),利用SDL開發(fā)產(chǎn)品的安全性能令人鼓舞。2.4.2SDL優(yōu)化模型軟件安全開發(fā)是成功還是失敗,通常取決于組織規(guī)模、資源(時間、人才和預(yù)算)以及高層支持等因素。將安全開發(fā)概念整合到現(xiàn)有開發(fā)過程時,如果方式不當(dāng),可能會造成不利的局面而且成本高昂。因此,需要正確地理解安全開發(fā)實(shí)踐的要素,選用合適的開發(fā)模型,根據(jù)開發(fā)團(tuán)隊(duì)的成熟度水平確定實(shí)施優(yōu)先級,控制無形因素的影響。為此,Microsoft創(chuàng)建了具有功能和成熟度水平的SDL優(yōu)化模型,如圖2-5所示。圖圖2-5具有功能和成熟度水平的SDL優(yōu)化模型SDL優(yōu)化模型圍繞五個功能領(lǐng)域構(gòu)建,這些領(lǐng)域大致與軟件開發(fā)生命周期模型的各個階段相對應(yīng)。包括:培訓(xùn)、政策和組織功能、要求和設(shè)計(jì)、實(shí)施、驗(yàn)證、發(fā)布和響應(yīng)。針對上述領(lǐng)域中的實(shí)踐和功能,SDL優(yōu)化模型定義了基本、標(biāo)準(zhǔn)化、高級和動態(tài)四個成熟度水平。SDL優(yōu)化模型從基本成熟度水平(幾乎或完全沒有任何過程、培訓(xùn)和工具)開始,發(fā)展到動態(tài)成熟度水平(特點(diǎn)是整個組織完全遵循SDL)。完全遵循SDL包括:高效的過程、訓(xùn)練有素的人員、專用工具以及組織內(nèi)部和外部各方的強(qiáng)烈責(zé)任感。與其他軟件成熟度模型相比,MicrosoftSDL優(yōu)化模型嚴(yán)格側(cè)重于開發(fā)過程改進(jìn)。它提供可操作的說明性指南,說明如何從較低水平的過程成熟度發(fā)展為較高水平的過程成熟度。2.4.3SDL安全人員角色對于實(shí)施MicrosoftSDL控制的軟件安全開發(fā)項(xiàng)目,為組織設(shè)定明確的預(yù)期值是非常重要的。實(shí)踐經(jīng)驗(yàn)表明,具備以下一個或多個特征的應(yīng)用程序的開發(fā)應(yīng)實(shí)施SDL控制:1)在業(yè)務(wù)或企業(yè)環(huán)境中部署;2)處理個人可識別信息(PII)或其他敏感信息;3)定期通過Internet或其他網(wǎng)絡(luò)進(jìn)行通信;4)計(jì)算技術(shù)無處不在,威脅環(huán)境不斷變化,因此,可能更方便的方式是確定不需要實(shí)施安全;5)控制(如SDL安全控制)的應(yīng)用程序開發(fā)項(xiàng)目。如果確定對某個軟件開發(fā)項(xiàng)目實(shí)施SDL控制,為符合MicrosoftSDL過程的要求,開發(fā)團(tuán)隊(duì)必須成功完成必需的安全活動。這些必需活動已由安全和隱私專家確認(rèn)有效,并且會作為嚴(yán)格的年度評估過程的一部分,不斷進(jìn)行有效性評析。為確定軟件開發(fā)項(xiàng)目中存在的安全和隱私問題并進(jìn)行分類和緩解,軟件開發(fā)項(xiàng)目中開發(fā)團(tuán)隊(duì)需要有安全人員角色構(gòu)成的組織結(jié)構(gòu)。這些角色包括:1)評析者/顧問角色。這些角色的任務(wù)是對項(xiàng)目安全和隱私進(jìn)行監(jiān)督,有權(quán)接受或拒絕項(xiàng)目團(tuán)隊(duì)的安全和隱私計(jì)劃。2)安全顧問/隱私顧問。這些角色由項(xiàng)目團(tuán)隊(duì)外部的主題專家(SME)擔(dān)任。該角色可以由組織中專門進(jìn)行此類評析的獨(dú)立集中小組中的合格成員擔(dān)任,也可以由組織外部的專家擔(dān)任。最好是集中的內(nèi)部顧問小組;內(nèi)部顧問小組具備組織環(huán)境和過程知識,這是外部專家無法做到的。為此任務(wù)選擇的人員必須擔(dān)任兩個子角色:(1)審計(jì)官。此角色必須監(jiān)控軟件開發(fā)過程的每個階段,并證明每個安全要求的成功實(shí)現(xiàn)。審計(jì)官必須能夠自主證明過程是否符合安全和隱私方面的要求,而不受項(xiàng)目團(tuán)隊(duì)的干擾。(2)專家。為顧問角色選擇的人員必須在安全方面擁有可靠的相關(guān)專業(yè)知識。3)顧問角色組合。如果可以確認(rèn)某人具有合適的技能和經(jīng)驗(yàn),則安全顧問的角色可以與隱私顧問的角色合二為一。4)團(tuán)隊(duì)負(fù)責(zé)人。團(tuán)隊(duì)負(fù)責(zé)人角色應(yīng)由項(xiàng)目團(tuán)隊(duì)的主題專家擔(dān)任。這些角色負(fù)責(zé)協(xié)商、接受和跟蹤最低安全和隱私要求,并在軟件開發(fā)項(xiàng)目過程中與顧問和決策者保持通暢的溝通渠道。5)安全負(fù)責(zé)人/隱私負(fù)責(zé)人。此角色(一人或多人)不僅負(fù)責(zé)確保軟件發(fā)布解決了所有安全問題,還負(fù)責(zé)協(xié)調(diào)和跟蹤項(xiàng)目的安全問題。此角色還負(fù)責(zé)向安全顧問和項(xiàng)目團(tuán)隊(duì)的其他相關(guān)方(例如,開發(fā)和測試負(fù)責(zé)人)報(bào)告情況。6)角色組合。與安全和隱私顧問角色一樣,如果可以確認(rèn)某人具有合適的技能和經(jīng)驗(yàn),則可以由一人承擔(dān)安全負(fù)責(zé)人和隱私負(fù)責(zé)人的角色,并履行其職責(zé)。2.4.4SDL模型安全活動MicrosoftSDL模型規(guī)定了一組必須的安全活動,為了實(shí)現(xiàn)所需安全和隱私目標(biāo),項(xiàng)目團(tuán)隊(duì)或安全顧問可以自行決定添加可選的安全活動。圖2-6(a)、2-6(b)表示了SDL模型過程詳細(xì)關(guān)系圖。該圖以直觀的方式說明一個假設(shè)項(xiàng)目中使用的安全活動(從培訓(xùn)員工到應(yīng)用程序發(fā)布)。圖中包括了必需和可選的任務(wù)。圖2-6(a)SDL模型過程詳細(xì)關(guān)系圖圖2-6(b)SDL模型過程詳細(xì)關(guān)系圖(續(xù))值得注意的一個基本概念是,模型注重每個階段產(chǎn)生輸出的質(zhì)量和完整性。SDL優(yōu)化模型的高級和動態(tài)水平開發(fā)運(yùn)營組織,應(yīng)具備一定程度的安全過程復(fù)雜性。盡管如此,這并不影響威脅模型的產(chǎn)生方式。例如,可以通過與開發(fā)團(tuán)隊(duì)進(jìn)行白板會議產(chǎn)生威脅模型;在文檔中以敘述形式描述威脅模型;也可以使用專用工具(如SDL威脅建模工具)生成威脅模型。高效的工具和過程自動化會使SDL實(shí)現(xiàn)過程受益,其實(shí)際價(jià)值在于可以獲得全面而準(zhǔn)確的結(jié)果。針對SDL模型的簡化描述如圖2-7所示,它包括了必需的安全活動:安全培訓(xùn)、安全需求、安全設(shè)計(jì)、實(shí)施安全、驗(yàn)證安全和發(fā)布與響應(yīng)。圖2-7MicrosoftSDL模型(簡化圖)在下面的各小節(jié)中,具體描述了安全生命周期模型(SDL)在開發(fā)過程的各個階段的一系列安全活動。2.4.5培訓(xùn)階段培訓(xùn)階段,軟件開發(fā)團(tuán)隊(duì)的所有成員都必須接受適當(dāng)?shù)呐嘤?xùn),了解安全基礎(chǔ)知識以及安全和隱私方面的最新發(fā)展趨勢。直接參與軟件程序開發(fā)的技術(shù)角色人員(開發(fā)人員、測試人員和程序經(jīng)理)每年至少必須參加一門特有的安全培訓(xùn)課程?;拒浖踩嘤?xùn)應(yīng)涵蓋的基礎(chǔ)概念包括:(1)安全設(shè)計(jì)培訓(xùn)包括以下主題:減小攻擊面、深度防御、最小權(quán)限原則、安全默認(rèn)設(shè)置;(2)威脅建模培訓(xùn)包括以下主題:威脅建模概述、威脅模型的設(shè)計(jì)意義、基于威脅模型的編碼約束;(3)安全編碼培訓(xùn)包括以下主題:緩沖區(qū)溢出(對于使用C和C++的應(yīng)用程序)、整數(shù)算法錯誤(對于使用C和C++的應(yīng)用程序)、跨站點(diǎn)腳本(對于托管代碼和Web應(yīng)用程序)、SQL注入(對于托管代碼和Web應(yīng)用程序);(4)弱加密安全測試培訓(xùn)包括以下主題:安全測試與功能測試之間的區(qū)別、風(fēng)險(xiǎn)評估、安全測試方法;(5)隱私保護(hù)培訓(xùn)包括以下主題:隱私敏感數(shù)據(jù)的類型、隱私設(shè)計(jì)最佳實(shí)踐、風(fēng)險(xiǎn)評估、隱私開發(fā)最佳實(shí)踐、隱私測試最佳實(shí)踐;(6)高級概念方面的培訓(xùn)包括但不限于以下方面:高級安全設(shè)計(jì)和體系結(jié)構(gòu)、可信用戶界面設(shè)計(jì)、安全漏洞細(xì)節(jié)、實(shí)施自定義威脅緩解。2.4.6需求階段需求階段,“預(yù)先”考慮安全和隱私是開發(fā)安全系統(tǒng)過程的基礎(chǔ)環(huán)節(jié)。在初始計(jì)劃中,為軟件項(xiàng)目定義信任度要求是最佳的時間。盡早定義安全要求有助于開發(fā)團(tuán)隊(duì)確定關(guān)鍵里程碑和交付成果,并使集成安全和隱私的過程盡量不影響計(jì)劃和安排。在項(xiàng)目初期對安全和隱私要求的分析,涉及在計(jì)劃運(yùn)行環(huán)境中運(yùn)行的軟件程序確定最低安全要求,并確立和部署安全漏洞或者工作項(xiàng)以跟蹤系統(tǒng)開發(fā)。1.SDL質(zhì)量門/缺陷(Bug)欄質(zhì)量門和缺陷欄用于確立安全和隱私質(zhì)量的最低可接受級別。在項(xiàng)目開始時定義這些標(biāo)準(zhǔn)可加強(qiáng)對安全問題相關(guān)風(fēng)險(xiǎn)的理解,并有助于團(tuán)隊(duì)在開發(fā)過程中發(fā)現(xiàn)和修復(fù)安全缺陷。項(xiàng)目團(tuán)隊(duì)必須協(xié)商確定每個開發(fā)階段的質(zhì)量門(例如,必須在嵌入代碼之前會審并修復(fù)所有編譯器警告),隨后將質(zhì)量門交由安全顧問審批。安全顧問可以根據(jù)需要添加特定于項(xiàng)目的說明以及更加嚴(yán)格的安全要求。缺陷欄是應(yīng)用于整個軟件開發(fā)項(xiàng)目的質(zhì)量門,它用于定義安全漏洞的嚴(yán)重性閾值。例如,應(yīng)用程序在發(fā)布時不得包含具有“關(guān)鍵”或“重要”評級的已知漏洞。缺陷欄一經(jīng)設(shè)定,便絕不能放松。動態(tài)缺陷欄是一種不斷變化的目標(biāo),可能不便于開發(fā)組織的理解。2.安全和隱私風(fēng)險(xiǎn)評估安全風(fēng)險(xiǎn)評估(SRA)和隱私風(fēng)險(xiǎn)評估(PRA)是必需的過程,用于確定軟件中需要深入評析的功能環(huán)節(jié)。這些評估必須包括以下信息:1)安全項(xiàng)目的哪些部分在發(fā)布前需要威脅模型;2)安全項(xiàng)目的哪些部分在發(fā)布前需要進(jìn)行安全設(shè)計(jì)評析;3)安全項(xiàng)目的哪些部分(如果有)需要由不屬于項(xiàng)目團(tuán)隊(duì)且雙方認(rèn)可的小組進(jìn)行滲透測試;4)安全是否存在安全顧問認(rèn)為有必要增加的測試或分析要求,以緩解安全風(fēng)險(xiǎn);5)安全模糊測試要求的具體范圍是什么;6)基于以下準(zhǔn)則回答隱私對評級的影響:=1\*GB2⑴P1高隱私風(fēng)險(xiǎn)。功能、產(chǎn)品或服務(wù)將存儲或傳輸PII,更改設(shè)置或文件類型關(guān)聯(lián),或是安裝軟件。=2\*GB2⑵P2中等隱私風(fēng)險(xiǎn)。功能、產(chǎn)品或服務(wù)中影響隱私的唯一行為是用戶啟動的一次性匿名數(shù)據(jù)傳輸(例如,軟件在用戶單擊鏈接后轉(zhuǎn)到外部網(wǎng)站)。=3\*GB2⑶P3低隱私風(fēng)險(xiǎn)。功能、產(chǎn)品或服務(wù)中不存在影響隱私的行為。不會傳輸匿名或個人數(shù)據(jù),不在計(jì)算機(jī)上存儲PII,不代替用戶更改設(shè)置,并且不安裝軟件。2.4.7設(shè)計(jì)階段設(shè)計(jì)階段,至關(guān)重要的是應(yīng)仔細(xì)考慮安全和隱私問題。如果在項(xiàng)目生命周期的開始階段執(zhí)行緩解措施,則緩解安全和隱私問題的成本會低得多。項(xiàng)目團(tuán)隊(duì)?wèi)?yīng)避免到項(xiàng)目開發(fā)將近結(jié)束時再“插入”安全和隱私功能及緩解措施。此外,項(xiàng)目團(tuán)隊(duì)還必須理解“安全的功能”與“安全功能”之間的區(qū)別。實(shí)現(xiàn)的安全功能實(shí)際上很可能是不安全的?!鞍踩墓δ堋倍x為在安全方面進(jìn)行了完善設(shè)計(jì)的功能,比如在處理之前對所有數(shù)據(jù)進(jìn)行嚴(yán)格驗(yàn)證或是通過加密方式可靠地實(shí)現(xiàn)加密服務(wù)庫?!鞍踩δ堋泵枋鼍哂邪踩绊懙某绦蚬δ埽鏚erberos身份驗(yàn)證或防火墻。創(chuàng)建安全和隱私設(shè)計(jì)規(guī)范設(shè)計(jì)要求活動包含一些必需行動。包括創(chuàng)建安全和隱私設(shè)計(jì)規(guī)范、規(guī)范評析以及最低加密設(shè)計(jì)要求規(guī)范。設(shè)計(jì)規(guī)范應(yīng)描述用戶會直接接觸的安全或隱私功能,如需要用戶身份驗(yàn)證才能訪問特定數(shù)據(jù)或在使用高風(fēng)險(xiǎn)隱私功能前需要用戶同意的那些功能。此外,所有設(shè)計(jì)規(guī)范都應(yīng)描述如何安全地實(shí)現(xiàn)給定特性或功能所提供的全部功能。針對應(yīng)用程序的功能規(guī)范驗(yàn)證設(shè)計(jì)規(guī)范。功能規(guī)范應(yīng):準(zhǔn)確完整地描述特性或功能的預(yù)期用途;描述如何以安全的方式部署特性或功能。減小攻擊面在安全設(shè)計(jì)中,減小攻擊面與威脅建模緊密相關(guān),不過它解決安全問題的角度稍有不同。減小攻擊面通過減少攻擊者利用潛在弱點(diǎn)或漏洞的機(jī)會來降低風(fēng)險(xiǎn)。減小攻擊面包括關(guān)閉或限制對系統(tǒng)服務(wù)的訪問、應(yīng)用最小權(quán)限原則以及盡可能進(jìn)行分層防御。威脅建模威脅建模用于存在重大安全風(fēng)險(xiǎn)的環(huán)境之中。威脅建模使開發(fā)團(tuán)隊(duì)可以在其計(jì)劃的運(yùn)行環(huán)境的背景下,以結(jié)構(gòu)化方式考慮、記錄并討論設(shè)計(jì)的安全影響。通過威脅建模還可以考慮組件或應(yīng)用程序級別的安全問題。威脅建模是一項(xiàng)團(tuán)隊(duì)活動(涉及項(xiàng)目經(jīng)理、開發(fā)人員和測試人員),并且是軟件開發(fā)設(shè)計(jì)階段中執(zhí)行的主要安全分析任務(wù)。首選的威脅建模方法是使用基于STRIDE威脅等級分類法的SDL威脅建模工具。2.4.8實(shí)施階段使用批準(zhǔn)的工具所有開發(fā)團(tuán)隊(duì)都應(yīng)定義并發(fā)布獲準(zhǔn)工具及其關(guān)聯(lián)安全檢查的列表,如編譯器或鏈接器選項(xiàng)和警告。此列表應(yīng)由項(xiàng)目團(tuán)隊(duì)的安全顧問進(jìn)行批準(zhǔn)。一般而言,開發(fā)團(tuán)隊(duì)?wèi)?yīng)盡量使用最新版本的獲準(zhǔn)工具,以利用新的安全分析功能和保護(hù)措施。棄用不安全的函數(shù)許多常用函數(shù)和應(yīng)用編程接口(API),在當(dāng)前威脅環(huán)境下并不安全。項(xiàng)目團(tuán)隊(duì)?wèi)?yīng)分析與軟件開發(fā)項(xiàng)目結(jié)合使用的所有函數(shù)和API,并禁用確定為不安全的函數(shù)和API。確定禁用列表之后,項(xiàng)目團(tuán)隊(duì)?wèi)?yīng)使用頭文件(如banned.h和strsafe.h)、較新的編譯器或代碼掃描工具來檢查代碼(在適當(dāng)情況下還包括舊代碼)中是否存在禁用函數(shù),并使用更安全的備選函數(shù)替代這些禁用函數(shù)。靜態(tài)分析項(xiàng)目團(tuán)隊(duì)?wèi)?yīng)對源代碼執(zhí)行靜態(tài)分析。源代碼靜態(tài)分析為安全代碼評析提供了伸縮性,可以幫助確保對安全代碼策略的遵守。靜態(tài)代碼分析本身通常不足以替代人工代碼評析。安全團(tuán)隊(duì)和安全顧問應(yīng)了解靜態(tài)分析工具的優(yōu)點(diǎn)和缺點(diǎn),并準(zhǔn)備好根據(jù)需要為靜態(tài)分析工具輔以其他工具或人工評析。一般而言,開發(fā)團(tuán)隊(duì)?wèi)?yīng)確定執(zhí)行靜態(tài)分析的最佳頻率,從而在工作效率與足夠的安全覆蓋率之間取得平衡。2.4.9驗(yàn)證階段1.動態(tài)程序分析為確保程序功能按照設(shè)計(jì)方式工作,有必要對運(yùn)行時的軟件程序進(jìn)行驗(yàn)證。此驗(yàn)證任務(wù)應(yīng)指定一些工具,用以監(jiān)控應(yīng)用程序行為是否存在內(nèi)存損壞、用戶權(quán)限問題以及其他重要安全問題。SDL過程使用運(yùn)行時工具(如AppVerifier)以及其他方法(如模糊測試)來實(shí)現(xiàn)所需級別的安全測試覆蓋率。2.模糊測試模糊測試是一種專門形式的動態(tài)分析,它通過故意向應(yīng)用程序引入不良格式或隨機(jī)數(shù)據(jù)誘發(fā)程序故障。模糊測試策略的制定以應(yīng)用程序的預(yù)期用途、應(yīng)用程序的功能和設(shè)計(jì)規(guī)范為基礎(chǔ)。安全顧問可能要求進(jìn)行額外的模糊測試或擴(kuò)大模糊測試的范圍和增加持續(xù)時間。3.威脅模型和攻擊面評析應(yīng)用程序經(jīng)常會嚴(yán)重偏離在軟件開發(fā)項(xiàng)目要求和設(shè)計(jì)階段所制定的功能和設(shè)計(jì)規(guī)范上。因此,在給定應(yīng)用程序完成編碼后重新評析其威脅模型和攻擊面度量是非常重要的。此評析可確保對系統(tǒng)設(shè)計(jì)或?qū)崿F(xiàn)方面所做的全部更改,并確保因這些更改而形成的所有新攻擊平臺得以評析和緩解。2.4.10發(fā)布和響應(yīng)階段事件響應(yīng)計(jì)劃受SDL要求約束的每個軟件發(fā)布都必須包含事件響應(yīng)計(jì)劃。即使在發(fā)布時不包含任何已知漏洞的程序也可能面臨日后新出現(xiàn)的威脅。事件響應(yīng)計(jì)劃包括:單獨(dú)指定的可持續(xù)工程(SE)團(tuán)隊(duì)。如果團(tuán)隊(duì)太小以至于無法擁有SE資源,則應(yīng)制定緊急響應(yīng)計(jì)劃(ERP),在該計(jì)劃中確定相應(yīng)的工程、市場營銷、通信和管理人員充當(dāng)發(fā)生安全緊急事件時的首要聯(lián)系點(diǎn)。與決策機(jī)構(gòu)的電話聯(lián)系(7天24小時隨時可用)。針對從組織中其他小組繼承的代碼的安全維護(hù)計(jì)劃。針對獲得許可的第三方代碼的安全維護(hù)計(jì)劃,包括文件名、版本、源代碼、第三方聯(lián)系信息以及要更改的合同許可(如果適用)。最終安全評析最終安全評析(FSR)是在發(fā)布之前仔細(xì)檢查對軟件應(yīng)用程序執(zhí)行的所有安全活動。FSR由安全顧問在普通開發(fā)人員以及安全和隱私團(tuán)隊(duì)負(fù)責(zé)人的協(xié)助下執(zhí)行。FSR不是“滲透和修補(bǔ)”活動,也不是用于執(zhí)行以前忽略或忘記的安全活動的時機(jī)。FSR通常要根據(jù)以前確定的質(zhì)量門或缺陷欄檢查威脅模型、異常請求、工具輸出和性能。通過FSR將得出以下三種不同結(jié)果:通過FSR。在FSR過程中確定的所有安全和隱私問題都已得到修復(fù)或緩解。通過FSR但有異常。在FSR過程中確定的安全和隱私問題都已得到修復(fù)或緩解,并且/或者異常都已得到圓滿解決。無法解決的問題(例如,由以往的“設(shè)計(jì)水平”問題導(dǎo)致的漏洞)將記錄下來,在下次發(fā)布時更正。需上報(bào)問題的FSR。如果團(tuán)隊(duì)未滿足所有SDL要求,并且安全顧問和產(chǎn)品團(tuán)隊(duì)無法達(dá)成一致接受,則安全顧問不能批準(zhǔn)項(xiàng)目,項(xiàng)目不能發(fā)布。團(tuán)隊(duì)必須在發(fā)布之前解決所有可以解決的SDL要求問題,或是上報(bào)高級管理層進(jìn)行抉擇。發(fā)布/存檔發(fā)布軟件的生產(chǎn)版本(RTM)還是Web版本(RTW)取決于SDL過程完成時的條件。指派負(fù)責(zé)發(fā)布事宜的安全顧問必須證明(使用FSR和其他數(shù)據(jù))項(xiàng)目團(tuán)隊(duì)已滿足安全要求。同樣,對于至少有一個組件具有相應(yīng)隱私影響評級的所有產(chǎn)品,項(xiàng)目的隱私顧問必須先證明項(xiàng)目團(tuán)隊(duì)滿足隱私要求,然后才能交付軟件。此外,必須對所有相關(guān)信息和數(shù)據(jù)進(jìn)行存檔,以便可以對軟件進(jìn)行發(fā)布后維護(hù)。這些信息和數(shù)據(jù)包括所有規(guī)范、源代碼、二進(jìn)制文件、專用符號、威脅模型、文檔、緊急響應(yīng)計(jì)劃、任何第三方軟件的許可證和服務(wù)條款,以及執(zhí)行發(fā)布后維護(hù)任務(wù)所需的任何其他數(shù)據(jù)。2.4.11可選的安全活動SDL中可選的安全活動,通常在軟件應(yīng)用程序可能用于重要環(huán)境或方案時執(zhí)行。這些活動通常由安全顧問在附加商定要求集中指定,以確保對某些軟件組件進(jìn)行更高級別的安全分析。1.人工代碼審核人工代碼審核是SDL中的可選任務(wù),通常由應(yīng)用程序安全團(tuán)隊(duì)中具備高技能的人員或由安全顧問執(zhí)行。盡管分析工具可以進(jìn)行很多查找和標(biāo)記漏洞的工作,但這些工具并不完美。因此,人工代碼審核通常側(cè)重于應(yīng)用程序的“關(guān)鍵”組件。這種審核最常用在處理或存儲敏感信息(如個人身份信息(PII))的組件中。另外,此活動也用于檢查其他關(guān)鍵功能,如加密實(shí)現(xiàn)。2.滲透測試滲透測試是對軟件系統(tǒng)進(jìn)行白盒安全分析,由高技能安全專業(yè)人員通過模擬黑客操作執(zhí)行。滲透測試的目的是發(fā)現(xiàn)由于編碼錯誤、系統(tǒng)配置錯誤或其他運(yùn)行部署弱點(diǎn)導(dǎo)致的潛在漏洞。滲透測試通常與自動及人工代碼評析一起執(zhí)行,以提供比平常更高級別的分析。3.相似應(yīng)用程序的漏洞分析

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論