<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
申明。文章僅代表個(gè)人觀點(diǎn),與所在公司無(wú)任何聯(lián)系。
1.
概述
安全開(kāi)發(fā)周期,即Security Development Lifecycle (SDL),是微軟提出的從安全角度指導(dǎo)軟件開(kāi)發(fā)過(guò)程的管理模式。SDL不是一個(gè)空想的理論模型。它是微軟為了面對(duì)現(xiàn)實(shí)世界中安全挑戰(zhàn),在實(shí)踐中的一步步發(fā)展起來(lái)的軟件開(kāi)發(fā)模式。
那么,SDL到底是什么,它是如何和傳統(tǒng)的軟件開(kāi)發(fā)模式結(jié)合?在回答這些問(wèn)題之前,我們先來(lái)闡述一個(gè)基本問(wèn)題,本文的讀者,你,為什么要考慮采用SDL來(lái)指導(dǎo)軟件開(kāi)發(fā)?
2.
為什么要從安全的角度來(lái)指導(dǎo)整個(gè)軟件開(kāi)發(fā)流程?
許多讀者也許會(huì)說(shuō):對(duì),軟件安全是很重要。但是這些是微軟或其它大型軟件開(kāi)發(fā)廠商進(jìn)行軟件開(kāi)發(fā)時(shí)應(yīng)該考慮的問(wèn)題,和我好像沒(méi)什么直接關(guān)系吧。有這種想法并不奇怪。
回答:現(xiàn)在安全問(wèn)題已經(jīng)不局限于操作系統(tǒng)軟件。所有的應(yīng)用程序,都面臨著安全挑戰(zhàn)。
2.1互聯(lián)網(wǎng)環(huán)境下的安全挑戰(zhàn)
安全領(lǐng)域是計(jì)算機(jī)技術(shù)中的發(fā)展最為活躍的一個(gè)分支。每一項(xiàng)新技術(shù)的出現(xiàn),也帶來(lái)了相應(yīng)的風(fēng)險(xiǎn)。不同的時(shí)代,不同的技術(shù),就有不同的安全挑戰(zhàn)。
最近幾年來(lái),計(jì)算機(jī)的攻擊模式的變化,從沒(méi)有特定攻擊目的,向有特定的目的變化。不再是簡(jiǎn)單的要登上報(bào)紙的頭版,或者是惡作劇,而是有特定的目的,即竊取用戶的機(jī)密信息,如銀號(hào)賬號(hào),密碼等,以獲取經(jīng)濟(jì)上的利益。
目的的變化,導(dǎo)致了手段的變化。若干年前,傳統(tǒng)的攻擊手段主要是針對(duì)操作系統(tǒng)的安全漏洞,因?yàn)楣舨僮飨到y(tǒng)可以導(dǎo)致散布病毒的最廣泛的途徑。但是,“最廣泛”,已經(jīng)不是攻擊的目的。于是,攻擊的軟件系統(tǒng),已經(jīng)從操作系統(tǒng),擴(kuò)展到圖像處理,辦公處理,備份軟件,反病毒軟件,web應(yīng)用等等各類應(yīng)用程序。舉個(gè)例子,最流行的一個(gè)攻擊方式,sql injection,針對(duì)的不是操作系統(tǒng),而是典型的web應(yīng)用程序。
特別的,如果開(kāi)發(fā)的應(yīng)用程序:
·
有面向網(wǎng)絡(luò)的功能界面
·
有面向數(shù)據(jù)庫(kù)的應(yīng)用
·
有不同級(jí)別的權(quán)限控制
·
有存放重要/敏感信息
就更應(yīng)該考慮在軟件開(kāi)發(fā)流程加入安全方面的考慮。
2.2傳統(tǒng)的軟件開(kāi)發(fā)流程的局限性
傳統(tǒng)的軟件開(kāi)發(fā)流程中,如瀑布模型,中心圍繞著產(chǎn)品功能,完全沒(méi)有安全方面的考慮。因此,無(wú)法開(kāi)發(fā)出安全的軟件也就不足為奇了。微軟自身的軟件開(kāi)發(fā)流程,在SDL提出以前,就是一個(gè)很好的例子。它可以造就功能上相對(duì)完善的軟件,如Windows的早期版本,但是無(wú)法滿足在安全上的需要。
需求分析
。傳統(tǒng)的軟件開(kāi)發(fā)流程的需求分析,往往有這個(gè)一個(gè)傾向,用戶一旦使用軟件,可以直接使用的功能越多越好,所允許的用戶工作環(huán)境越靈活越好。但是,實(shí)際中,一定是可以直接使用的功能越多越好嗎?往往需要在靈活方便,和安全性能上作一定的平衡。例如,對(duì)于不經(jīng)常需要的功能,缺省配置下是不是應(yīng)該關(guān)閉?
軟件設(shè)計(jì)
。傳統(tǒng)的軟件設(shè)計(jì)過(guò)程,考慮中心是如何有效,正確的實(shí)現(xiàn)功能。往往約定來(lái)自相關(guān)模塊的數(shù)據(jù)是值得信賴的,只在最外圍的數(shù)據(jù)模塊接口處對(duì)用戶數(shù)據(jù)加以校驗(yàn)。與之帶來(lái)的后果就是,如果一個(gè)模塊出現(xiàn)安全問(wèn)題,整個(gè)軟件系統(tǒng)就處于不設(shè)防狀態(tài)。
軟件編碼和評(píng)估
。同樣,軟件編碼的實(shí)踐主要集中如如何有效,正確的實(shí)現(xiàn)功能。沒(méi)有針對(duì)安全問(wèn)題的編碼和復(fù)查指導(dǎo),如特定API函數(shù)的副作用,堆棧溢出錯(cuò)誤等等。沒(méi)有對(duì)應(yīng)的編譯工具和程序靜態(tài)分析工具以檢查通常的代碼安全錯(cuò)誤。
測(cè)試
。按照傳統(tǒng)的黑箱/白箱方式設(shè)計(jì)數(shù)據(jù),是無(wú)法模擬一個(gè)惡意的攻擊數(shù)據(jù)的。這是因?yàn)閭鹘y(tǒng)的測(cè)試數(shù)據(jù)是根據(jù)功能文檔來(lái)設(shè)計(jì)的,數(shù)據(jù)范圍限于正常數(shù)據(jù)和邊界情況,以模擬通常的用戶使用環(huán)境。
2.3傳統(tǒng)軟件知識(shí)結(jié)構(gòu)的不足
以往對(duì)于軟件開(kāi)發(fā)的教育,如軟件工程,數(shù)據(jù)結(jié)構(gòu),編譯原理,系統(tǒng)結(jié)構(gòu),程序語(yǔ)言等等,并沒(méi)有針對(duì)軟件安全方面的知識(shí)。
如果開(kāi)發(fā)人員對(duì)安全問(wèn)題沒(méi)有的足夠理解,不了解安全設(shè)計(jì)的基本原理,安全漏洞的常見(jiàn)類型,如何設(shè)計(jì)針對(duì)安全的測(cè)試數(shù)據(jù),所開(kāi)發(fā)的代碼就自然就更有可能出現(xiàn)安全漏洞。
例如,以下這段代碼[2,p147]就展示了Windows系統(tǒng)RPC調(diào)用中的安全漏洞。它就是導(dǎo)致沖擊波病毒(Blaster)爆發(fā)的根源。是不是沒(méi)想到這么簡(jiǎn)單?那么,這段代碼的問(wèn)題是什么?
HRESULT GetMachineName(WCHAR *pwszPath)
{
WCHAR wszMachineName[ N + 1 ];
...
LPWSTR pwszServeName = wszMachineName;
while (*pwszPath != L'\\')
*pwszServerName++ = *pwszPath++;
...
}
如果你已經(jīng)看出問(wèn)題,恭喜你!大多數(shù)開(kāi)發(fā)人員在沒(méi)有經(jīng)過(guò)安全培訓(xùn)前,是不知道正確答案的。代碼的問(wèn)題在于對(duì)pwszPath的字符串長(zhǎng)度沒(méi)有驗(yàn)證,從而導(dǎo)致wszMachineName堆棧變量的溢出。
這里要特別強(qiáng)調(diào)的,這里指的軟件安全的知識(shí),不是指對(duì)于安全功能的理解和使用。例如,加密解密的原理,SSL的使用等等。了解這些知識(shí)是有用的,但是僅僅掌握SSL的使用,并不能保證設(shè)計(jì)出的網(wǎng)絡(luò)軟件是安全的。
2.4實(shí)例:來(lái)自微軟自身的數(shù)據(jù)
Windows Server 2003 是微軟第一次大規(guī)模實(shí)施SDL 在操作系統(tǒng)的開(kāi)發(fā)上。雖然Windows Server 2003還不是從頭至尾都嚴(yán)格按照SDL的規(guī)范開(kāi)發(fā),但我們已經(jīng)可以從圖1展示的數(shù)據(jù)中看出,SDL在很大程度上減少了操作系統(tǒng)軟件的安全漏洞。數(shù)據(jù)來(lái)源于[1]。
圖1:Windows 2000和Windows Server 2003 安全漏洞數(shù)目對(duì)比
3.
如何將SDL應(yīng)用于傳統(tǒng)軟件開(kāi)發(fā)模式
3.1 SDL綜述
圖2:SDL開(kāi)發(fā)模式
圖2是一個(gè)簡(jiǎn)化的SDL開(kāi)發(fā)模型。SDL的核心理念,就是將軟件安全的考慮,集成在軟件開(kāi)發(fā)的每一個(gè)階段:需求分析,設(shè)計(jì),編碼,測(cè)試,和維護(hù)。
為什么說(shuō)這是一個(gè)簡(jiǎn)化的SDL?
·
傳統(tǒng)的軟件開(kāi)發(fā)模型,如瀑布模型,是一個(gè)簡(jiǎn)化的模型。在實(shí)際開(kāi)發(fā)中,需求分析,設(shè)計(jì),開(kāi)發(fā),測(cè)試,是一個(gè)反復(fù)循環(huán)的螺旋開(kāi)發(fā)模式(spiral model)。需求分析和設(shè)計(jì)文檔會(huì)經(jīng)歷若干次的修改。在每一次修改過(guò)程中,都應(yīng)考慮對(duì)軟件安全方面的影響。
·
完整的SDL模型,還包括若干更為細(xì)化的階段。如在產(chǎn)品正式發(fā)布前的Final Security Review (FSR)階段等等。有興趣的讀者可以參考[2]獲取進(jìn)一步信息。
·
這個(gè)模型中沒(méi)有包括工程人員的培訓(xùn)教育。一個(gè)再好的流程,如果沒(méi)有相應(yīng)的工程人員來(lái)實(shí)施,也會(huì)是紙上談兵。對(duì)工程人員的教育,一是觀念上的改變,加強(qiáng)安全意識(shí)。二是基本安全知識(shí)的掌握。
3.1.1 SD3+C原則
SD3+C是微軟歸納的實(shí)施SDL中的基本原則。
·
安全設(shè)計(jì)(Secure by Design)。軟件的設(shè)計(jì)和實(shí)現(xiàn)需考慮如何保護(hù)其本身(和存儲(chǔ)的信息)抵御外部攻擊。
·
安全配置(Secure by Default)。軟件的缺省配置運(yùn)行環(huán)境應(yīng)考慮如何降低安全風(fēng)險(xiǎn)。重要的一個(gè)假設(shè)是軟件自身代碼總存在安全漏洞。那么,如何減少這些安全漏洞的危害?例如,是否可以運(yùn)行于普通用戶權(quán)限,而不需要管理員權(quán)限?是否可以缺省關(guān)閉某些高風(fēng)險(xiǎn)的代碼模塊?
·
安全部署(Secure in Deployment)。 軟件需提供相應(yīng)的文檔和工具,指導(dǎo)用戶如何安全的使用。
·
交流(Communications) 。開(kāi)發(fā)人員需要對(duì)發(fā)布產(chǎn)品中的安全漏洞準(zhǔn)備響應(yīng)方案。
3.2需求分析:設(shè)定安全目標(biāo)
在需求分析階段,加入以下的安全考慮:
·
產(chǎn)品提供的安全功能
·
產(chǎn)品如何安全的與用戶(或其它軟件模塊)交互
·
特別的,安全方面的考慮對(duì)產(chǎn)品開(kāi)發(fā)計(jì)劃的影響。
·
產(chǎn)品的風(fēng)險(xiǎn)評(píng)估和威脅模型(threat modeling)
·
產(chǎn)品的缺省功能配置
3.3安全設(shè)計(jì)
在安全設(shè)計(jì)階段,特別加入以下兩方面的考慮。
·
減少攻擊界面。例如,對(duì)一個(gè)網(wǎng)絡(luò)軟件的設(shè)計(jì),它需要監(jiān)聽(tīng)那些網(wǎng)絡(luò)端口,是否可以減少監(jiān)聽(tīng)端口的數(shù)目?那些用戶可以與這些端口建立連接,是否要加強(qiáng)身份驗(yàn)證?
·
深層防御。底層模塊的設(shè)計(jì)中,假設(shè)上層模塊有可能出現(xiàn)安全漏洞。對(duì)傳遞的數(shù)據(jù)考慮進(jìn)一步校驗(yàn)。
3.4如何避免代碼中的安全問(wèn)題
每個(gè)開(kāi)發(fā)人員都需要遵循安全編碼規(guī)范。
·
使用最新的編譯器和編譯選項(xiàng)。對(duì)于微軟的最新C/C++編譯器,使用以下兩個(gè)編譯選項(xiàng):
·
/GS 選項(xiàng)。加入檢測(cè)函數(shù)堆棧緩存溢出錯(cuò)誤額外代碼。
·
/SAFESEH選項(xiàng)。加入額外的異常處理信息,以確保代碼所調(diào)用的是合法的,而不是被非法篡改過(guò)的異常處理程序。
·
禁止使用特定的危險(xiǎn)API。許多安全漏洞都是由于不當(dāng)使用危險(xiǎn)的API函數(shù)導(dǎo)致的。常見(jiàn)的危險(xiǎn)函數(shù)如strcpy, strcat, sprintf, strlen等等。這些危險(xiǎn)函數(shù)在最新的C語(yǔ)言運(yùn)行庫(kù)中已經(jīng)被標(biāo)為“deprecated”。讀者可以參考[3]獲取進(jìn)一步的信息。替換這些函數(shù)可以考慮使用StrSafe定義的函數(shù)。限于篇幅,這里就不給出具體離子了。[4]包括使用StrSafe的詳細(xì)信息。
·
使用靜態(tài)語(yǔ)言分析工具以掃描安全漏洞
·
定期進(jìn)行安全代碼復(fù)查
3.5安全測(cè)試:模擬惡意輸入
安全測(cè)試引入了Fuzz測(cè)試這個(gè)概念。它的主要目的是創(chuàng)建惡意的輸入數(shù)據(jù),以模擬軟件被惡意攻擊時(shí)的行為。Fuzz測(cè)試可包括的對(duì)象可以是文件測(cè)試,網(wǎng)絡(luò)數(shù)據(jù)測(cè)試,用戶界面輸入數(shù)據(jù)測(cè)試,等等。
我們用AVI文件來(lái)舉例一個(gè)典型的Fuzz測(cè)試。下面是AVI HEADER的定義:
typedef struct _avimainheader {
...
DWORDdwStreams;
DWORDdwSuggestedBufferSize;
DWORDdwWidth;
DWORDdwHeight;
...
} AVIMAINHEADER;
假定dwSuggestedBufferSize的通常范圍為1k – 4k,那么,在正常情況下,以下代碼不會(huì)出現(xiàn)問(wèn)題。
dwSuggestedBufferSize = pBuffer->GetDW();
m_pSuggestedBuffer = new char [ dwSuggestedBufferSize ];
但是如果我們?cè)趂uzz測(cè)試中惡意設(shè)定這個(gè)輸入變量值為0xFFFF,那么,就可能發(fā)現(xiàn)它導(dǎo)致了系統(tǒng)的內(nèi)存分配錯(cuò)誤,從而可以避免一個(gè)客戶端/服務(wù)器端的DOS(deny of service)安全漏洞。
同樣基于fuzz原理,我們根據(jù)AVI HEADER的結(jié)構(gòu)信息,設(shè)計(jì)其它的測(cè)試數(shù)據(jù),如:
-
惡意的dwStreams
-
惡意的圖像尺寸:dwWidth,dwHeight
-
無(wú)或多個(gè)AVI HEADER,等等
3.6安全響應(yīng)和維護(hù):緊急反應(yīng)
當(dāng)前任何一個(gè)軟件開(kāi)發(fā)模式(包括SDL在內(nèi)),都無(wú)法確保發(fā)布的軟件沒(méi)有安全漏洞。因此,需要事先制訂對(duì)應(yīng)的相應(yīng)模式,包括:
-
(內(nèi)部或外部發(fā)現(xiàn)的)安全漏洞以何種途徑匯報(bào)
-
如何評(píng)估安全漏洞的嚴(yán)重級(jí)別
-
開(kāi)發(fā)安全補(bǔ)丁的流程
-
測(cè)試安全補(bǔ)丁的流程
-
發(fā)布安全補(bǔ)丁的流程
-
如何在以后開(kāi)發(fā)中避免類似的安全漏洞,等等
4.
總結(jié)
實(shí)踐證明,SDL可以有效的減少軟件的安全漏洞,提高軟件的安全。但是它不是萬(wàn)能的。實(shí)施SDL開(kāi)發(fā)的軟件也不能完全避免安全漏洞。例如,Windows Vista就是嚴(yán)格按照SDL開(kāi)發(fā)的,但是它依然存在安全漏洞。只不過(guò)我們期望,它的安全漏洞的數(shù)目和嚴(yán)重程度,要比以往的操作系統(tǒng)減少許多。
安全領(lǐng)域中,沒(méi)有免費(fèi)的午餐。SDL的實(shí)施,需要時(shí)間,精力,教育,管理等多方面的支持。但是,如果不購(gòu)買(mǎi)這頓午餐的話,晚餐賬單可能會(huì)比想象的要高的多。
限于篇幅,這里只能對(duì)SDL作一個(gè)泛泛介紹。如果需要進(jìn)一步了解,可以參閱附錄中的參考文獻(xiàn)。
5.
參考文獻(xiàn)
1.
The Trustworthy Computing Security Development Lifecycle, Steve Lipner, Michael Howard
2.
The Security Development Lifecycle, Michael Howard, Steve Lipner
3.
Deprecated CRT Functions,
http://msdn2.microsoft.com/en-us/library/ms235384(VS.80).aspx
, Microsoft Corporation
4.
Using the Strsafe.h Functions, http://msdn2.microsoft.com/en-us/library/ms647466.aspx, Microsoft Corporation
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1600590