[摘 要] 軟件的安全問(wèn)題是安全的軟件產(chǎn)品在軟件生命周期的各個(gè)環(huán)節(jié)都必須解決的技術(shù)問(wèn)題。本文詳細(xì)分析了軟件開(kāi)發(fā)的設(shè)計(jì)、編寫(xiě)代碼、安全性測(cè)試和維護(hù)等各個(gè)階段存在的安全問(wèn)題,并提出了相應(yīng)的解決方案。
[關(guān)鍵詞] 威脅建模 安全性測(cè)試 漏洞響應(yīng)
一、軟件設(shè)計(jì)階段威脅建模
安全從設(shè)計(jì)開(kāi)始。軟件在設(shè)計(jì)階段達(dá)到的安全性能將是軟件整個(gè)生命周期的基礎(chǔ),如果在設(shè)計(jì)階段出了安全問(wèn)題,那將成為致命的缺陷,所以設(shè)計(jì)要盡可能完善。在軟件設(shè)計(jì)階段應(yīng)該明確安全方面有哪些目標(biāo)需要達(dá)到、軟件可能遇到的攻擊和安全隱患等。威脅建模是在軟件設(shè)計(jì)階段加入安全因素的好辦法。威脅建模除了和設(shè)計(jì)階段的其他建模工作類(lèi)似的地方外,更加關(guān)心安全問(wèn)題,如在模型中應(yīng)當(dāng)指明安全邊界、指明哪些數(shù)據(jù)是可信的、哪些輸入接口應(yīng)當(dāng)被假設(shè)為攻擊目標(biāo)、列舉所有潛在的攻擊方式等。常見(jiàn)的威脅建模一般會(huì)包括以下幾方面內(nèi)容:
1.Description:對(duì)系統(tǒng)的簡(jiǎn)短描述。一般要求突出數(shù)據(jù)流穿越安全邊界、身份驗(yàn)證發(fā)生在哪里,哪些操作應(yīng)當(dāng)被假設(shè)為攻擊等。
2.DFD:數(shù)據(jù)流圖描述。它關(guān)注的是數(shù)據(jù)的走向,一般需要表明系統(tǒng)安全邊界和所有出入安全邊界的數(shù)據(jù),系統(tǒng)安全邊界以外的所有輸入都將被假設(shè)為潛在的攻擊性輸入,在其穿越安全邊界進(jìn)入系統(tǒng)之前應(yīng)當(dāng)經(jīng)過(guò)嚴(yán)格的格式檢查或身份驗(yàn)證。
3.Check and Balances:一般是一組表,需要列舉出系統(tǒng)所有的輸入點(diǎn),并標(biāo)明這些接口的數(shù)據(jù)來(lái)源是否可信等。
4.Threats:這部分應(yīng)該列舉出系統(tǒng)可能遇到的所有潛在安全風(fēng)險(xiǎn)和攻擊方式。
二、安全代碼的編寫(xiě)
在軟件的代碼編寫(xiě)階段,同樣有許多安全問(wèn)題需要注意,因?yàn)橐驗(yàn)槌绦騿T往往會(huì)在不經(jīng)意間使用一些不安全的函數(shù)。見(jiàn)下面一段代碼:
function demo(char *a)
{
char b[100];
…
strncpy(b,a,strlen(a));
…
}
在這一段代碼中,當(dāng)傳入的字符串a(chǎn)的長(zhǎng)度大于100字節(jié)的時(shí)候,將發(fā)生溢出。
再如下面一段修改demo函數(shù)的代碼:
function demo (char *a) {
char *b;
…
int len=strlen(a);
b=malloc(len+1);
strncpy(b,a,stlen(a));
…
}
仔細(xì)考慮一下里面的安全問(wèn)題,其實(shí)這并不能絕對(duì)確保程序里傳入的字符a不是一個(gè)NULL指針,另外還需要考慮在哪里free堆空間,否則將會(huì)造成內(nèi)存泄露。
可見(jiàn),做到真正安全的使用這些字符串操作函數(shù)并不是一件非常簡(jiǎn)單的事情。Visual Studio 2005在編譯時(shí)可以自動(dòng)警告堆strcpy、strcat等不安全函數(shù)的調(diào)用,我們可以使用VS2005提供的一套新的安全字符串操作函數(shù),如strcpy_s()、strncpy_s()、stncat_s()等。
軟件的代碼編寫(xiě)階段的安全除了要求程序員提高編程質(zhì)量之外,使用GS安全編譯選項(xiàng)也能大大提高軟件的安全水平。
三、軟件的安全性測(cè)試
測(cè)試作為軟件發(fā)布前重要的一步工作,肩負(fù)著軟件可用性和安全性等諸多任務(wù),所以也決定著軟件的質(zhì)量。而安全性測(cè)試和普通的功能性測(cè)試主要目的不同,前者是“確保軟件不會(huì)去完成沒(méi)有預(yù)先設(shè)計(jì)的功能”,而前者只是“確保軟件能夠完成預(yù)先設(shè)計(jì)的功能”。安全性測(cè)試是安全的軟件生命周期中一個(gè)重要的環(huán)節(jié)。進(jìn)行安全測(cè)試需要精湛的攻擊技術(shù)、敏銳的黑客思維和豐富的開(kāi)發(fā)經(jīng)驗(yàn)。一次安全性測(cè)試實(shí)際上就是一輪多角度、全方位的攻擊,其目的就是要搶在攻擊者之前盡可能多的找到軟件中的“所有”漏洞,以減少軟件遭到攻擊的可能性。
安全性測(cè)試非常靈活,需要像黑客一樣思考,有時(shí)甚至需要一點(diǎn)靈感,因此沒(méi)有固定的步驟可以遵循。測(cè)試方案中通常使用使用畸形的文件結(jié)構(gòu)、發(fā)送畸形的數(shù)據(jù)包、用戶輸入的驗(yàn)證、驗(yàn)證資源之間的依賴(lài)關(guān)系、偽造程序輸入和輸出時(shí)使用的文件、古怪的路徑表達(dá)方式、異常處理、訪問(wèn)控制與信息泄露和對(duì)程序反匯編等方法。
四、漏洞響應(yīng)和產(chǎn)品的維護(hù)
即使在設(shè)計(jì)、代碼編寫(xiě)和測(cè)試過(guò)程中加入了安全因素,最終的軟件產(chǎn)品仍可能存在漏洞。當(dāng)漏洞被發(fā)現(xiàn)后,迅速確認(rèn)、響應(yīng)、修復(fù)漏洞是非常重要的。所以,軟件的維護(hù)和跟蹤要及時(shí)持續(xù)。大型的軟件公司都會(huì)有自己的安全響應(yīng)隊(duì)伍專(zhuān)職處理安全事件,在發(fā)現(xiàn)漏洞后的第一時(shí)間采取措施,以保護(hù)客戶的利益不被侵害。
一般來(lái)說(shuō),正常的漏洞響應(yīng)可以大致分為以下4個(gè)階段:
1.發(fā)現(xiàn)漏洞通知廠商:漏洞首先被報(bào)告給安全響應(yīng)中心,經(jīng)過(guò)初步的鑒定,安全響應(yīng)隊(duì)伍回想漏洞上報(bào)者確認(rèn)已經(jīng)收到漏洞報(bào)告,此刻正在進(jìn)行分析。
2.確認(rèn)漏洞和風(fēng)險(xiǎn)評(píng)估:安全響應(yīng)隊(duì)伍會(huì)聯(lián)系上報(bào)者和相關(guān)產(chǎn)品的開(kāi)發(fā)部門(mén),以獲得更多的技術(shù)細(xì)節(jié),有時(shí)甚至?xí)⑸蠄?bào)者和開(kāi)發(fā)團(tuán)隊(duì)召集在一起進(jìn)行討論。當(dāng)漏洞被成功重現(xiàn)后,為漏洞定一個(gè)威脅等級(jí)。
3.修復(fù)漏洞:安全響應(yīng)隊(duì)伍和開(kāi)發(fā)隊(duì)伍協(xié)商決定解決方案,并確定響應(yīng)工作的時(shí)間表。開(kāi)發(fā)部門(mén)開(kāi)始修復(fù)漏洞,補(bǔ)丁完成后,進(jìn)行嚴(yán)格的測(cè)試。
4.發(fā)布補(bǔ)丁及安全簡(jiǎn)報(bào):對(duì)外公布安全補(bǔ)丁,通知所有用戶patch漏洞,在網(wǎng)站上發(fā)布安全簡(jiǎn)報(bào),其中會(huì)特別感謝上報(bào)漏洞和協(xié)助修復(fù)漏洞的安全研究人員。
參考文獻(xiàn):
[1]李 昕 陳智李俐:開(kāi)源軟件安全問(wèn)題與對(duì)策[J].計(jì)算機(jī)安全,2008.4
[2]宋吉廣:軟件世界[J].中國(guó)期刊全文數(shù)據(jù)庫(kù),2007.21