蔡榮文
基于動(dòng)態(tài)檢測技術(shù)的軟件設(shè)計(jì)安全漏洞查找方法
蔡榮文
杭州萬向職業(yè)技術(shù)學(xué)院, 浙江 杭州 310023
計(jì)算機(jī)軟件設(shè)計(jì)需要考慮安全性,這是保證軟件系統(tǒng)長周期穩(wěn)定運(yùn)行的關(guān)鍵。動(dòng)態(tài)檢測技術(shù)是當(dāng)前應(yīng)用較廣的軟件安全漏洞檢測方式,包括安全共享庫、沙箱、內(nèi)存映射、非執(zhí)行棧、程序解釋、非執(zhí)行堆等技術(shù),這些技術(shù)方式都有不同的特點(diǎn)。通過對比分析每一項(xiàng)技術(shù)的優(yōu)缺點(diǎn),為軟件設(shè)計(jì)安全漏洞查找提供技術(shù)選擇的依據(jù)。結(jié)果表明:動(dòng)態(tài)檢測技術(shù)可以在不更改程序源代碼的情況下,對軟件的運(yùn)行環(huán)境實(shí)現(xiàn)全面的分析,提升了程序的保密性。
動(dòng)態(tài)檢測; 安全漏洞; 軟件設(shè)計(jì); 源代碼
軟件是計(jì)算機(jī)與網(wǎng)絡(luò)的重要組成部分,存在于軟件中的安全漏洞,極有可能導(dǎo)致計(jì)算機(jī)與網(wǎng)絡(luò)被非法入侵。軟件的安全漏洞通常是在設(shè)計(jì)的時(shí)候就留下的,包括軟件的具體運(yùn)行及系統(tǒng)安全策略等方面的設(shè)計(jì)缺陷,因此對軟件設(shè)計(jì)的安全漏洞及時(shí)找出其安全隱患并加以彌補(bǔ)修正,以降低軟件正式投入運(yùn)行后給計(jì)算機(jī)和網(wǎng)絡(luò)帶來的風(fēng)險(xiǎn)是當(dāng)前計(jì)算機(jī)安全領(lǐng)域一個(gè)值得研究的課題。在軟件設(shè)計(jì)與編寫的過程中,植入安全代碼是最直接的解決軟件安全問題的方式,但這種方式與人為因素的關(guān)系較大,不能保證每一位程序編寫者都能認(rèn)真對待,所以檢測軟件安全漏洞是非常關(guān)鍵的一步[1]。涉及到檢測技術(shù)的方式方法,當(dāng)前使用較多的主要有三種,一是靜態(tài)檢測技術(shù),二是動(dòng)態(tài)檢測技術(shù),三是混合檢測技術(shù)。其中動(dòng)態(tài)檢測技術(shù)是使用最廣泛的軟件安全漏洞檢測方式,原因是動(dòng)態(tài)檢測技術(shù)可以最大程度地提升軟件程序的保密性,而且檢測的范圍更全面,也非常地便于管理。
軟件漏洞主要指隱含在軟件中的弱點(diǎn)與缺點(diǎn),這些問題極有可能造成軟件運(yùn)行時(shí)對危險(xiǎn)因素的敏感度提高,嚴(yán)重時(shí)還有可能被非法分子所利用,成為攻擊系統(tǒng)的一個(gè)突破口。出現(xiàn)漏洞的主要原因,是因?yàn)樵谲浖脑O(shè)計(jì)與開發(fā)時(shí),程序編寫人員出現(xiàn)操作上的失誤而留下的,該漏洞通常分為安全性漏洞和功能性漏洞兩種,這兩者都關(guān)系到軟件的安全運(yùn)行。功能性漏洞將會(huì)影響到運(yùn)行平臺的性能,例如系統(tǒng)運(yùn)行該軟件時(shí)出現(xiàn)錯(cuò)誤結(jié)果,或者系統(tǒng)的運(yùn)行流程出現(xiàn)差錯(cuò)等;安全性漏洞不僅會(huì)影響到軟件本身的正常運(yùn)行,同時(shí)也會(huì)影響到計(jì)算機(jī)系統(tǒng)的運(yùn)行,而且會(huì)被黑客等不法分子所利用,對軟件系統(tǒng)進(jìn)行攻擊,有可能會(huì)被植入惡性的執(zhí)行代碼,對軟件系統(tǒng)發(fā)送錯(cuò)誤指令[2]。相對而言,安全性漏洞具備更高的危險(xiǎn)性。
根據(jù)漏洞的自身特點(diǎn),主要產(chǎn)生途徑有以下三條:一是程序編寫者在設(shè)計(jì)與編寫軟件的過程中疏忽大意所造成的,軟件的編寫極富邏輯性,稍微有點(diǎn)偏差就會(huì)產(chǎn)生錯(cuò)誤。二是軟件本身在運(yùn)算數(shù)據(jù)的過程中,也有可能會(huì)產(chǎn)生預(yù)料之外的錯(cuò)誤,影響到程序模塊的正常運(yùn)行。三是系統(tǒng)的運(yùn)行環(huán)境也可能會(huì)導(dǎo)致軟件出現(xiàn)錯(cuò)誤,從而產(chǎn)生安全漏洞,包括不同的系統(tǒng)版本或者不同的系統(tǒng)設(shè)置,都有可能會(huì)留下不同的安全漏洞。四是軟件的各種安全漏洞之間也會(huì)相互影響,可能以前的漏洞被糾正與彌補(bǔ)的同時(shí),新的漏洞卻會(huì)不斷出現(xiàn)??傊鉀Q軟件漏洞問題是一項(xiàng)長期的、系統(tǒng)的工作,需要持之以恒,并用正確的方法去查找解決。
計(jì)算機(jī)軟件程序在設(shè)計(jì)與運(yùn)行過程中,無論是系統(tǒng)控制還是數(shù)據(jù)傳輸,都具有一定的共性[3]。軟件運(yùn)行中的某一進(jìn)程,其內(nèi)存通??梢杂成錇椴糠?,包括數(shù)據(jù)、代碼、資源、棧、堆等,當(dāng)操作系統(tǒng)不同的時(shí)候,這些部分所占的比例也會(huì)不同。動(dòng)態(tài)檢測技術(shù)就是根據(jù)這些比例的變化,在檢測軟件漏洞的時(shí)候,不用改變程序的源代碼,主要是依靠改變軟件進(jìn)程的運(yùn)行環(huán)境來達(dá)到檢測的目的。通常使用的動(dòng)態(tài)檢測技術(shù)有:安全共享庫、沙箱、內(nèi)存映射、非執(zhí)行棧、程序解釋、非執(zhí)行堆等。
在計(jì)算機(jī)網(wǎng)絡(luò)不斷發(fā)展的過程中,共享庫成為提升軟件系統(tǒng)性能的重要手段,但是當(dāng)前有不少軟件所使用的共享庫并不安全,導(dǎo)致軟件安全漏洞頻發(fā)。尤為嚴(yán)重的是,在軟件程序編寫的語言中,C語言和C++語言里的一些函數(shù)還達(dá)不到安全的層次,例如gets、strcpy等。如果不能合適地使用這些函數(shù),將難以達(dá)到預(yù)想的效果。利用安全共享庫這一技術(shù),可以有效地避免軟件受到攻擊。安全共享庫的工作原理就是憑借動(dòng)態(tài)鏈接,在計(jì)算機(jī)運(yùn)行期間對有威脅因素的函數(shù)進(jìn)行攔截,還能對運(yùn)行中的函數(shù)進(jìn)行風(fēng)險(xiǎn)檢測。這項(xiàng)技術(shù)不僅在Windows系統(tǒng)上得到了很好的應(yīng)用,還可以在UNIX系統(tǒng)上流暢使用。安全共享庫技術(shù)還有一個(gè)特殊之處,就是能評估系統(tǒng)的內(nèi)存情況,這樣就能將數(shù)據(jù)寫在評估邊界的里面。該技術(shù)的應(yīng)用并不難,開發(fā)也較容易,而且在軟件中應(yīng)用該技術(shù)不需要對系統(tǒng)設(shè)置作任何修改。從理論層面看,安全共享庫的攔截率很高,能夠攔截所有標(biāo)準(zhǔn)庫函數(shù)的威脅,但是它也有自身的不足,就是不能對系統(tǒng)的一些變化起到保護(hù)作用,如果本地的數(shù)據(jù)段溢出攻擊,安全共享庫不能起到阻止作用。值得注意的是,安全共享庫只能阻止標(biāo)準(zhǔn)函數(shù)的攻擊,如果遭受到非標(biāo)準(zhǔn)函數(shù)的攻擊,將起不到阻止作用。安全共享庫不存在兼容問題,在標(biāo)準(zhǔn)庫下運(yùn)行的程序同樣在安全共享庫技術(shù)下也能運(yùn)行,不會(huì)出現(xiàn)任何差錯(cuò)。安全共享庫可以攔截標(biāo)準(zhǔn)函數(shù)中有威脅的函數(shù),不會(huì)影響其它標(biāo)準(zhǔn)函數(shù)的正常工作,該技術(shù)可以將標(biāo)準(zhǔn)函數(shù)中有不安全因素的函數(shù)進(jìn)行處理,為整個(gè)程序掃除了一些障礙,程序的運(yùn)行更順暢。但是要把所有程序中的函數(shù)都進(jìn)行阻止,將會(huì)讓程序的性能消耗增大15%。目前,安全共享庫的一些功能已經(jīng)移到其它的標(biāo)準(zhǔn)庫,最常見的就是glibc。如果計(jì)算機(jī)配置glibc庫,隱式安全性將得到提高。
阻止某些程序的攻擊還可以通過限制其訪問的資源來實(shí)現(xiàn)。例如C語言中存在一些系統(tǒng)函數(shù),像execv、system等,一般的小軟件是不會(huì)涉及到這些系統(tǒng)函數(shù)的,一旦發(fā)現(xiàn)這些系統(tǒng)函數(shù)存在于某個(gè)大型軟件中,就需要引起注意,很有可能導(dǎo)致軟件受到威脅[4]。如果在計(jì)算機(jī)被威脅之前采用沙箱技術(shù),不讓一些軟件訪問到這些系統(tǒng)函數(shù)調(diào)用,針對這些軟件的攻擊將被阻止。沙箱技術(shù)的應(yīng)用比較簡單,不需要調(diào)整系統(tǒng)已有的程序,但是需要加一個(gè)步驟,就是在需要安全防護(hù)的程序上定義訪問策略,一般程序的訪問策略定義都比較方便,如果程序較為復(fù)雜,則定義策略比較繁瑣。沙箱技術(shù)阻止攻擊的性能主要通過定義策略的功能來實(shí)現(xiàn),策略定義的嚴(yán)格程度和程序的保護(hù)程度呈正比,嚴(yán)格程度越高,保護(hù)程度就越高。沙箱技術(shù)存在一個(gè)弱項(xiàng),就是一些軟件受到修改用戶身份的威脅之時(shí),就不能起到阻止作用。沙箱技術(shù)的依托就是安全策略,一般來說,其不會(huì)引發(fā)兼容性問題,如果應(yīng)用的策略是一個(gè)嚴(yán)格度非常高的策略,也可能會(huì)造成程度無法正常使用,還可能造成系統(tǒng)調(diào)用函數(shù)時(shí)無法進(jìn)行正常的審查工作。沙箱技術(shù)會(huì)消耗系統(tǒng)的性能,如果系統(tǒng)函數(shù)只是偶爾調(diào)用,這個(gè)消耗是幾乎看不見的,但是系統(tǒng)函數(shù)調(diào)用次數(shù)較多,就能明顯看出性能消耗。沙箱技術(shù)的應(yīng)用范圍比較窄,僅僅限于系統(tǒng)調(diào)用。如果沙箱技術(shù)不能清楚地知道某個(gè)程序的邏輯情況,將起不到阻止威脅的作用。
內(nèi)存是一些攻擊者攻擊的主要目標(biāo),他們利用特殊的字符將內(nèi)存覆蓋,這些字符通常以NULL結(jié)尾。對于該攻擊,可以采用內(nèi)存映射來阻止。因?yàn)閮?nèi)存映射代碼本身也會(huì)出現(xiàn)帶有NULL結(jié)尾的字符,這樣就能擾亂攻擊者。將這種內(nèi)存代碼隨機(jī)映射在不同的內(nèi)存地址之上,可以有效阻止部分憑借內(nèi)存地址進(jìn)行的攻擊。有些軟件上存在的一些溢出漏洞,例如緩存區(qū)溢出漏洞,攻擊者能利用自身的技術(shù)和數(shù)據(jù)來覆蓋內(nèi)存地址,查找這些地址并不難,只要進(jìn)行計(jì)算就可以得出,這樣就能輕易達(dá)到攻擊的目的[5]。一旦采用了內(nèi)存映射,隨機(jī)映射幾個(gè)地址,會(huì)給攻擊者增加攻擊難度,因?yàn)榘惭b了代碼頁之后,攻擊者計(jì)算地址將會(huì)變得困難,需要花費(fèi)大量的時(shí)間才能計(jì)算出。內(nèi)存映射技術(shù)雖然起到了一定的攔截作用,但是應(yīng)用起來比較麻煩,要對操作系統(tǒng)進(jìn)行重新設(shè)置,使得代碼頁的映射能夠在內(nèi)存較低的區(qū)域進(jìn)行。利用內(nèi)存映射阻止攻擊有一定的局限性,當(dāng)攻擊者采用的手段不是覆蓋內(nèi)存,而是用新的代碼來進(jìn)行攻擊,內(nèi)存映射就形同于虛設(shè)了。此外,內(nèi)存映射還存在一個(gè)缺點(diǎn),由于受到內(nèi)存大小的約束,不可能將所有的內(nèi)存都映射到代碼頁,所以內(nèi)存映射只能應(yīng)用一部分。內(nèi)存映射的最好功能就是能夠攔截依靠猜測地址的攻擊,然而在實(shí)際中,這種情況較少[6]。內(nèi)存映射對性能沒有什么損耗,可以不用考慮。
有一些攻擊者經(jīng)常利用棧進(jìn)行攻擊,這是因?yàn)椴僮飨到y(tǒng)的一些數(shù)據(jù)是依靠棧來儲(chǔ)存的,如果攻擊者想辦法將自己的代碼運(yùn)行到棧中,并執(zhí)行這些代碼,就能破壞軟件和操作系統(tǒng)[7]。有關(guān)于棧攻擊的方法和策略較為成熟,因此攻擊者采用這種方法能夠很容易達(dá)到自己的目的。想要阻止這種攻擊,需要用一種程序來阻止棧攻擊代碼。如果有了這種阻止程序,即便棧中存在一些威脅代碼,但是不能運(yùn)行,就難以繼續(xù)攻擊。這種非執(zhí)行棧技術(shù)運(yùn)行起來較為麻煩,因?yàn)樾枰僮飨到y(tǒng)的配合,只有將操作系統(tǒng)進(jìn)行一定的修改之后才能應(yīng)用。此外,該技術(shù)使用中還存在一個(gè)問題,當(dāng)系統(tǒng)存在棧溢出漏洞的同時(shí),還有另外的漏洞,非執(zhí)行棧技術(shù)就不能很好地解決問題了,只能將操作系統(tǒng)的內(nèi)核做一些改變,才能讓這種技術(shù)起到阻止攻擊的作用。非執(zhí)行棧技術(shù)存在著較多的缺點(diǎn),這跟它的工作原理有關(guān),因?yàn)樵摷夹g(shù)是通過對棧的檢測來阻止攻擊,如果攻擊者巧妙避開檢測,就可以擺脫它的干擾。該技術(shù)在使用的過程中還會(huì)引發(fā)不兼容現(xiàn)象,但在性能消耗方面則可以忽略不計(jì),其原理只是多加了幾個(gè)指令,這些指令對于程序的運(yùn)行起不到任何的影響。
阻止攻擊的一個(gè)有效方法是在程序應(yīng)用的過程中進(jìn)行全程跟蹤,同時(shí)檢測程序的運(yùn)行狀態(tài),以此來保證程序的安全,這種避免攻擊的方法就是程序解釋技術(shù)。但是該技術(shù)在使用中會(huì)造成較多的性能消耗,對于這個(gè)缺憾,有人試圖采用動(dòng)態(tài)優(yōu)化來進(jìn)行解決,其中程序檢測器是一個(gè)不錯(cuò)的選擇。程序檢測器既可以起到檢測程序安全的作用,還可以避免消耗系統(tǒng)的性能。程序解釋技術(shù)應(yīng)用比較方便,因?yàn)椴恍枰獙Σ僮飨到y(tǒng)進(jìn)行重新設(shè)置,對一些程序代碼也沒有影響,只有在啟動(dòng)的時(shí)候重新做一下鏈接即可完成。利用程序解釋技術(shù)對運(yùn)行中的程序展開實(shí)時(shí)監(jiān)測,就能對試圖控制程序運(yùn)行或者修改和程序相關(guān)數(shù)據(jù)的一些攻擊進(jìn)行有效的攔截,該技術(shù)雖然可以攔截大部分的攻擊,卻存在著技術(shù)缺陷,如果攻擊者通過改變地址的方式來進(jìn)行攻擊,程序解釋技術(shù)將達(dá)不到攔截的目的[8]。采用程序解釋技術(shù)不僅能對運(yùn)行中的程序進(jìn)行安全監(jiān)測,還能對動(dòng)態(tài)生成的代碼起到保護(hù)作用,防止它們受到不良攻擊。
除了以上幾種動(dòng)態(tài)檢測技術(shù),還有一種就是非執(zhí)行堆技術(shù),但是該技術(shù)還沒有發(fā)展成熟,應(yīng)用程度也不高,主要是因?yàn)橐坏┨幚聿划?dāng)就可能引發(fā)軟件的癱瘓,導(dǎo)致系統(tǒng)不能正常運(yùn)行。堆是一個(gè)區(qū)域的名稱,一個(gè)內(nèi)存區(qū)域。簡單來說,堆是動(dòng)態(tài)的,如果有一種技術(shù),能夠讓堆正常運(yùn)行,使攻擊者的代碼不能運(yùn)行,就能達(dá)到防護(hù)的目的。考慮到該技術(shù)存在的缺陷,可以跟其它動(dòng)態(tài)檢測技術(shù)一起使用,例如結(jié)合非執(zhí)行棧技術(shù),可以在最大程度上讓攻擊者的代碼不能運(yùn)行,起不到任何的破壞。非執(zhí)行堆技術(shù)應(yīng)用起來較為方便,只是需要對操作系統(tǒng)進(jìn)行更改,盡管目前的發(fā)展還不成熟,但應(yīng)用性較好,有一定的推廣價(jià)值。整體來說,該技術(shù)的防御范圍非常廣,只要是攻擊者采用代碼進(jìn)行攻擊,都可以起到有效的攔截作用,當(dāng)攻擊者采用函數(shù)攻擊,就難以發(fā)揮作用。該技術(shù)對系統(tǒng)的性能損耗極少,只是在使用的過程中有可能產(chǎn)生兼容問題,導(dǎo)致系統(tǒng)不能正常運(yùn)行。
動(dòng)態(tài)檢測技術(shù)的發(fā)展,讓軟件設(shè)計(jì)安全漏洞的查找方法更加的全面,以前的靜態(tài)檢測目標(biāo)只是對安全漏洞進(jìn)行跟蹤檢查,如今還可以實(shí)現(xiàn)軟件系統(tǒng)運(yùn)行環(huán)境的掃描和防護(hù)。軟件設(shè)計(jì)的核心內(nèi)容是程序編寫,因此通過動(dòng)態(tài)檢測技術(shù)達(dá)到程序保護(hù)的目的,是軟件設(shè)計(jì)人員需要認(rèn)真思考的問題。在程序執(zhí)行的時(shí)候,對程序的運(yùn)行環(huán)境進(jìn)行檢測分析,包括棧、堆、內(nèi)存等,從而查找出軟件中存在的安全漏洞,這是動(dòng)態(tài)檢測技術(shù)的優(yōu)勢,可以在不更改程序源代碼的情況下全面分析運(yùn)行環(huán)境,提升了程序的保密性。在動(dòng)態(tài)檢測過程中,要考慮到是否影響到軟件系統(tǒng)的性能、其覆蓋面是否廣泛、檢測效果是否良好等因素,并通過分析對比,選擇適合本軟件的動(dòng)態(tài)檢測技術(shù)。
[1] Fouda RM. Security vulnerabilities of cyberphysical unmanned aircraft systems[J].IEEE Aerospace and Electronic Systems Magazine, 2018,33(9):4-17
[2] Ravishankar M, Rao DV, Kumar CRS. A Game Theoretic Software Test-bed for Cyber Security Analysis of Critical Infrastructure [J]. Defence science journal, 2018,68(1):54-63
[3] Sousa BL, Bigonha MAS, Ferreira KAM. An exploratory study on cooccurrence of design patterns and bad smells using software metrics[J]. Software: Practice and Experience, 2019,49(7):1079-1113
[4] Hayden CM, Smith EK, Hardisty EA,. Evaluating Dynamic Software Update Safety Using Systematic Testing[J]. IEEE Transactions on Software Engineering, 2012,38(6):1340-1354
[5] Dharmalingam JM, Eswaran M.An Agent Based Intelligent Dynamic Vulnerability Analysis Framework for Critical SQLIA Attacks: Intelligent SQLIA Vulnerability Analyzer Agent[J]. Journal of Intelligent Information Technologies, 2018,14(3):56-82
[6] Cruz DM, Eduardo HM, Navaux POA.Modeling memory access behavior for data mapping[J]. Journal of high performance computing applications, 2017,31(3):212-228
[7] Nashimoto S, Homma N, Hayashi Y,.Buffer overflow attack with multiple fault injection and a proven countermeasure[J]. Journal of cryptographic engineering, 2017,7(1):35-46
[8] Hosni M, Idri A, Abran A.Evaluating filter fuzzy analogy homogenous ensembles for software development effort estimation[J]. Journal of Software: Evolution and Process, 2018,31(2):1-10
A Method Searching for the Security Flaw in a Software Design Based on The Dynamic Detection Technology
CAI Rong-wen
310023,
Computer software design needs to consider security, which is the key to ensure the long-term stable operation of the software system. Dynamic detection technology is a widely used method of software security vulnerability detection, including security shared library, sandbox, memory mapping, non-execution stack, program interpretation, non-execution stack and so on. These technologies have different characteristics. By comparing and analyzing the advantages and disadvantages of each technology, it provides a basis for technology selection for software design security vulnerability search. The results show that the dynamic detection technology can achieve a comprehensive analysis of the running environment of the software without changing the source code, and improve the confidentiality of the program.
Dynamic detection; security vulnerabilities; software design; source code
TP3
A
1000-2324(2019)05-0873-04
10.3969/j.issn.1000-2324.2019.05.030
2018-10-05
2018-12-04
浙江省教育廳一般科研項(xiàng)目:基于“摩課書院”的課堂教學(xué)管理系統(tǒng)設(shè)計(jì)與開發(fā)(Y201738481)
蔡榮文(1974-),男,本科,副教授,主要研究方向?yàn)橛?jì)算機(jī)軟件開發(fā)與應(yīng)用. E-mail:wxxycrw@126.com