背景
安全性在軟件開(kāi)發(fā)過(guò)程中是一個(gè)極其重要和深刻的話題。當(dāng)安全性受到損害時(shí),會(huì)發(fā)生非常糟糕的事情。我們?cè)谲浖_(kāi)發(fā)生命周期的各個(gè)階段都必須記住這一點(diǎn)。
不同于一些其他非功能性要求,一般不能在之后才在系統(tǒng)中考慮到安全性。開(kāi)發(fā)一個(gè)相對(duì)安全的項(xiàng)目離不開(kāi)一個(gè)安全規(guī)則的指導(dǎo),一個(gè)好用的開(kāi)發(fā)工具,一套安全的編碼規(guī)范。
下面就從開(kāi)發(fā)安全規(guī)則、開(kāi)發(fā)工具的安全利用,安全編碼這三方面進(jìn)行分析。降低軟件中的漏洞,包括但不限于緩沖區(qū)溢出、邊界外的數(shù)組訪問(wèn)、未初始化的內(nèi)存使用、類型混淆等安全漏洞。
安全開(kāi)發(fā)規(guī)則
一個(gè)好的安全開(kāi)發(fā)指導(dǎo)規(guī)則,能夠在開(kāi)發(fā)軟件過(guò)程中挖掘出漏洞的。這個(gè)好的安全規(guī)則首選推薦微軟的SDL(安全開(kāi)發(fā)生命周期)。下面就梳理下這個(gè)SDL的一些相對(duì)核心的理論基礎(chǔ)。
它主要側(cè)重于軟件開(kāi)發(fā)的安全保證過(guò)程。SDL致力于減少軟件中漏洞的數(shù)量和嚴(yán)重性。
SDL的核心理念是將安全考慮集成在軟件開(kāi)發(fā)的每一個(gè)階段:需求分析、設(shè)計(jì)、編碼、測(cè)試和維護(hù)。從需求、設(shè)計(jì)到發(fā)布產(chǎn)品的每一個(gè)階段每都增加了相應(yīng)的安全活動(dòng),以減少軟件中漏洞的數(shù)量并將安全缺陷降低到最小程度。
SDL基于三個(gè)核心概率:培訓(xùn)教育、持續(xù)過(guò)程改善和責(zé)任。
SDL的一個(gè)主要目標(biāo):安全和隱私。
SDL在開(kāi)發(fā)過(guò)程的所有階段進(jìn)行安全和隱私保護(hù)
安全開(kāi)發(fā)生命周期 (SDL)由一組支持安全保證和合規(guī)性要求的實(shí)踐組成。SDL 通過(guò)減少軟件中漏洞的數(shù)量和嚴(yán)重性,同時(shí)降低開(kāi)發(fā)成本,幫助開(kāi)發(fā)人員構(gòu)建更安全的軟件。
SDL詳細(xì)步驟
SDL安全設(shè)計(jì)核心原則主要包括:攻擊面最小化、基本隱私、權(quán)限最小化、默認(rèn)安全、縱深防御、威脅建模。下面就這對(duì)這些原則展開(kāi)做個(gè)簡(jiǎn)單解析。
攻擊面最小化(Attack Surface Reduction):
指盡量減少暴露惡意用戶可能發(fā)現(xiàn)并試圖利用的攻擊面數(shù)量。軟件產(chǎn)品的受攻擊面是一個(gè)混合體,不僅包括代碼、接口、服務(wù),也包括對(duì)所有用戶提供服務(wù)的協(xié)議。尤其是那些未被驗(yàn)證或者遠(yuǎn)程的用戶都可以訪問(wèn)到的協(xié)議,安全人員在攻擊面最小化時(shí)首先要對(duì)攻擊面進(jìn)行分析,攻擊面分析就是枚舉所有訪問(wèn)入庫(kù)、接口、協(xié)議一劑可執(zhí)行代碼的過(guò)程,從更高層次來(lái)說(shuō),攻擊面分析著重于如下4點(diǎn):
1、降低默認(rèn)執(zhí)行的代碼量
2、限制可訪問(wèn)到代碼的人員范圍
3、限定可訪問(wèn)到代碼的人員身份
4、降低代碼執(zhí)行所需權(quán)限
基本隱私(Basic Privacy):
指用戶在使用軟件時(shí)無(wú)可避免個(gè)人信息被收集、使用甚至分發(fā),企業(yè)則有責(zé)任和義務(wù)建立保護(hù)個(gè)人信息的保護(hù)措施,抵御敵對(duì)攻擊行為,確保用戶基本隱私的安全性。
權(quán)限最小化(Least Privilege):
指如果一個(gè)應(yīng)用程序或網(wǎng)站被攻擊、破壞,權(quán)限最小化機(jī)制能夠有效的將潛在損害最小化。常見(jiàn)的權(quán)限最小化實(shí)踐如:
1、普通管理員/系統(tǒng)管理員等角色管理
2、文件只讀權(quán)限/文件訪問(wèn)權(quán)限等訪問(wèn)控制
3、進(jìn)程/服務(wù)以所需最小用戶權(quán)限運(yùn)行
默認(rèn)安全(Secure Defaults):
默認(rèn)安全配置在客戶熟悉安全配置選項(xiàng)之前不僅有利于更好的幫助用戶掌握安全配置經(jīng)驗(yàn),同時(shí)也可以確保應(yīng)用程序初始狀態(tài)下處于較安全狀態(tài)。
縱深防御(Defense in Depth):
縱深防御包含兩層含義:首先,要在各個(gè)不同層面、不同方面實(shí)施安全方案,避免出現(xiàn)疏漏,不同安全方案之間需要相互配合,構(gòu)成一個(gè)整體;其次,要在正確的地方做正確的事情,即:在解決根本問(wèn)題的地方實(shí)施針對(duì)性的安全方案。
威脅建模(Threat Modeling):
威脅建模是一種分析應(yīng)用程序威脅的過(guò)程和方法。這里的威脅是指惡意用戶可能會(huì)試圖利用以破壞系統(tǒng)。
工具安全
下面就以visual studio工具進(jìn)行展開(kāi),利用工具上的幾個(gè)配置進(jìn)行提高軟件安全性。使用這些工具和做法并不會(huì)使應(yīng)用程序免受攻擊,但能降低攻擊成功的可能性。
1、代碼分析功能
此編譯器選項(xiàng)將激活報(bào)告潛在安全問(wèn)題(比如緩沖區(qū)溢出、未初始化的內(nèi)存、null指針取消引用和內(nèi)存泄漏)的代碼分析。此選項(xiàng)默認(rèn)已關(guān)閉。建議開(kāi)啟這個(gè)開(kāi)關(guān)。
2、/GS(緩沖區(qū)安全檢查)
這個(gè)的安全檢查主要處理:函數(shù)調(diào)用的返回地址;函數(shù)的異常處理程序的地址;易受攻擊的函數(shù)參數(shù)。導(dǎo)致緩沖區(qū)溢出是黑客用來(lái)利用不強(qiáng)制實(shí)施緩沖區(qū)大小限制的代碼的技術(shù)。
指示編譯器將溢出檢測(cè)代碼插入到面臨被利用風(fēng)險(xiǎn)的函數(shù)中。檢測(cè)到溢出時(shí),則停止執(zhí)行。默認(rèn)情況下,此選項(xiàng)處于啟用狀態(tài)。
傳遞到函數(shù)中的易受攻擊的參數(shù)。易受攻擊的參數(shù)是指針、C++ 引用、C 結(jié)構(gòu) (C++ POD 類型) 包含指針或 GS 緩沖區(qū)。
3、/DYNAMICBASE(使用地址空間布局隨機(jī)化)
使用 Windows 的地址空間布局隨機(jī)化 (ASLR) 功能,指定是否生成可在加載時(shí)隨機(jī)重新設(shè)定基址的可執(zhí)行文件映像。
通過(guò)使用此鏈接器選項(xiàng),可以生成一個(gè)在執(zhí)行開(kāi)始時(shí)可在內(nèi)存的不同位置加載的可執(zhí)行映像。此選項(xiàng)還使內(nèi)存中的堆棧位置更加不可預(yù)測(cè)。
編碼安全
當(dāng)前軟件中都可能存在相同類別的內(nèi)存安全漏洞,也可能存在于推理且無(wú)序的執(zhí)行路徑中,包括但不限于緩沖區(qū)溢出、邊界外的數(shù)組訪問(wèn)、未初始化的內(nèi)存使用、類型混淆等漏洞。
一個(gè)套規(guī)范的安全開(kāi)發(fā)可以大大降低軟件漏洞的風(fēng)險(xiǎn),安全開(kāi)發(fā)通常需要我們?cè)诰幋a過(guò)程中做到
1、不要使用那些易受攻擊的API函數(shù);
2、要做好對(duì)輸入?yún)?shù)做校驗(yàn);
3、慎重使用強(qiáng)制類型轉(zhuǎn)換;
4、防止算術(shù)溢出和下溢;
5、異常捕獲是定時(shí)炸彈;
6、多用安全工具進(jìn)行檢查代碼;
7、文件操作過(guò)程中要做好路徑和權(quán)限管控。
1、系統(tǒng)函數(shù)
系統(tǒng)函數(shù)的使用可以大大降低代碼的開(kāi)發(fā)工作量,但使用不安全的系統(tǒng)函數(shù)那就得不償失了。
在開(kāi)過(guò)過(guò)程中許多舊CRT函數(shù)具有持續(xù)更新、更安全的版本。如果存在安全函數(shù),則較舊的、安全性更低的版本將標(biāo)記為已棄用,并且新版本具有 _s(“安全”)后綴。
安全函數(shù)不會(huì)阻止或更正安全錯(cuò)誤。相反,它們會(huì)在發(fā)生錯(cuò)誤時(shí)捕獲錯(cuò)誤。它們對(duì)錯(cuò)誤情況執(zhí)行其他檢查。如果出現(xiàn)錯(cuò)誤,則調(diào)用錯(cuò)誤處理程序。
上圖中函數(shù)strcpy 無(wú)法判斷正在復(fù)制的字符串對(duì)于目標(biāo)緩沖區(qū)而言是否太大。其安全對(duì)應(yīng)項(xiàng) strcpy_s 會(huì)將緩沖區(qū)大小作為參數(shù)。因此,可以確定是否會(huì)發(fā)生緩沖區(qū)溢出。如果你使用 strcpy_s 將 11 個(gè)字符復(fù)制到 10 個(gè)字符緩沖區(qū)中,則這是你方造成的錯(cuò)誤;strcpy_s 無(wú)法更正錯(cuò)誤。
2、SafeInt庫(kù)
SafeInt它是可以與 MSVC、GCC或 Clang 結(jié)合使用的可移植庫(kù),有助于防止在應(yīng)用程序執(zhí)行數(shù)學(xué)運(yùn)算時(shí)可能會(huì)出現(xiàn)的整數(shù)溢出而被利用。SafeInt庫(kù)包括 SafeInt 類、SafeIntException 類和幾個(gè)SafeInt 函數(shù)。
SafeInt 類可防止整數(shù)溢出和被零除攻擊??梢酝ㄟ^(guò)使用它處理不同類型的值之間的比較。它提供了兩種錯(cuò)誤處理策略。默認(rèn)策略是針對(duì)引發(fā) SafeInt 類異常的 SafeIntException 類,以報(bào)告無(wú)法完成數(shù)學(xué)運(yùn)算的原因。第二個(gè)策略針對(duì) SafeInt 類,用以停止程序的執(zhí)行。還可以定義自定義策略。
每個(gè) SafeInt 函數(shù)各保護(hù)一個(gè)數(shù)學(xué)運(yùn)算免于出現(xiàn)可被利用的錯(cuò)誤。使用兩種不同的參數(shù),而不必將它們轉(zhuǎn)換為相同類型。若要保護(hù)多個(gè)數(shù)學(xué)運(yùn)算,請(qǐng)使用 SafeInt 類。
3、信任邊界
信任邊界存在于應(yīng)用程序可能與信任度較低的上下文提供的數(shù)據(jù)進(jìn)行交互的位置,例如系統(tǒng)上的另一個(gè)進(jìn)程,或者內(nèi)核模式設(shè)備驅(qū)動(dòng)程序中的非管理用戶模式進(jìn)程。
4、類型轉(zhuǎn)換
類型強(qiáng)制轉(zhuǎn)換使用盡可能用C++的風(fēng)格static_cast<>,dynamic_cast<>,它允許允許更多編譯器檢查,并且更為顯式,相對(duì)更安全。
5、接口應(yīng)用
無(wú)論是C還是C++的編程范式,從實(shí)用的角度,最終對(duì)面向接口編程,好的代碼接口具備下述特性:
1、Self-describing,即自描述性,設(shè)計(jì)清晰簡(jiǎn)潔的API接口名稱,一眼就能知道是什么功能。
2、Clear hierarchy,即清晰的層級(jí)性,API的接口大類不能與小類相混淆。
3、Granularity sex,即粒度性,掌控好粒度性的API接口,不能太過(guò)于粗糙,盡量細(xì)分化,容易后續(xù)的擴(kuò)展。
6、外部可控函數(shù)
盡量減少使用外部可控?cái)?shù)據(jù)作為啟動(dòng)函數(shù)的參數(shù)例如:system、WinExec、ShellExecute、CreateProcess、execv、ececvp ,popen;如果外部可控作為這些函數(shù)的參數(shù),就會(huì)有導(dǎo)致被注入的風(fēng)險(xiǎn)。如果確實(shí)需要使用這些函數(shù),可以使用白名單機(jī)制驗(yàn)證其參數(shù),確保這些函數(shù)的參數(shù)不受到外來(lái)數(shù)據(jù)的命令注入影響。
7、文件操作
對(duì)文件操作的時(shí)候可以幾個(gè)降低安全風(fēng)險(xiǎn)
1、當(dāng)文件路徑來(lái)自外部數(shù)據(jù)時(shí)候,需要先將文件路徑規(guī)范化,這個(gè)沒(méi)處理攻擊者就會(huì)有機(jī)會(huì)通過(guò)惡意構(gòu)造文件路徑進(jìn)行文件的越權(quán)訪問(wèn)。
2、創(chuàng)建文件時(shí)候必須做好指定文件的訪問(wèn)權(quán)限
int open( const char * pathname, int flags);
int open( const char * pathname, int flags, mode_t mode);
盡可能使用第二個(gè)模式。
小結(jié)
以上知識(shí)的梳理更多從基礎(chǔ)理論出發(fā),并且很多詳細(xì)細(xì)節(jié)還有待在后續(xù)實(shí)踐進(jìn)行進(jìn)一步的完善。
軟件安全和二進(jìn)制漏洞是一個(gè)永恒的對(duì)抗話題,基于一套安全的開(kāi)發(fā)規(guī)范,指導(dǎo)在開(kāi)發(fā)安全生命周期內(nèi)進(jìn)行推進(jìn)軟件開(kāi)發(fā)。并且加強(qiáng)開(kāi)發(fā)中的安全意識(shí)的培養(yǎng),又助于降低減少軟件的漏洞的出現(xiàn)。
審核編輯:劉清
-
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50208 -
SDL
+關(guān)注
關(guān)注
0文章
18瀏覽量
7699 -
POD
+關(guān)注
關(guān)注
0文章
18瀏覽量
6154
原文標(biāo)題:淺談軟件安全開(kāi)發(fā)
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
信號(hào)完整性(SI)/ 電源完整性(PI)工程師的核心技能樹(shù)體系
MySQL簡(jiǎn)介與理論基礎(chǔ)
Debian和Ubuntu哪個(gè)好一些?
電機(jī)理論基礎(chǔ)
收藏的一些庫(kù)存,直流無(wú)刷技術(shù)+源碼+論文(建議打包)
電源完整性理論基礎(chǔ)
獨(dú)立服務(wù)器和云服務(wù)器哪個(gè)快一些?
不同頻率下的相對(duì)介電常數(shù)變化
AN29-關(guān)于DC-DC轉(zhuǎn)換器的一些想法

一些常見(jiàn)的動(dòng)態(tài)電路

分享一些常見(jiàn)的電路

擴(kuò)散模型的理論基礎(chǔ)

LED驅(qū)動(dòng)器應(yīng)用的一些指南和技巧

評(píng)論