本公開(kāi)涉及網(wǎng)絡(luò)安全領(lǐng)域,具體地,涉及一種引擎保護(hù)方法和裝置。
背景技術(shù):
目前大部分瀏覽器引擎以及Java、Perl、Ruby、Flash等都使用了JIT編譯(Just-In-Time Compilation)技術(shù)來(lái)提高代碼執(zhí)行效率。JIT編譯技術(shù)在為可執(zhí)行對(duì)象分配內(nèi)存時(shí)會(huì)直接分配可預(yù)期的、具有可讀寫可執(zhí)行(Read、Write、Exeute,RWX)權(quán)限的內(nèi)存地址,這樣違背了數(shù)據(jù)執(zhí)行保護(hù)以及隨機(jī)地址分配的保護(hù)措施,使得可執(zhí)行對(duì)象執(zhí)行時(shí)其引擎很容易受到緩沖區(qū)溢出、堆噴射等惡意攻擊。因此,少數(shù)使用JIT編譯技術(shù)的引擎采取了實(shí)時(shí)修改內(nèi)存地址權(quán)限的方法對(duì)其進(jìn)行保護(hù),將分配給可執(zhí)行對(duì)象的內(nèi)存地址的寫權(quán)限與可執(zhí)行權(quán)限分開(kāi)。但是這樣又會(huì)使其處理周期過(guò)長(zhǎng),造成使用JIT編譯技術(shù)的引擎效率降低。
技術(shù)實(shí)現(xiàn)要素:
本公開(kāi)的目的是提供一種引擎保護(hù)方法,該方法能夠在一定程度上避免引擎在可執(zhí)行對(duì)象執(zhí)行時(shí)被非法惡意攻擊。
為了實(shí)現(xiàn)上述目的,本公開(kāi)提供一種引擎保護(hù)方法,該方法包括:
按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址;
按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫。
可選的,所述按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址包括:
根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
可選的,所述按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址包括:
獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限;
當(dāng)所述申請(qǐng)內(nèi)存地址為空且所述申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址;
根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址;
當(dāng)所確定的內(nèi)存地址屬于系統(tǒng)內(nèi)存地址時(shí),返回所述對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址的步驟;
當(dāng)所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象。
可選的,在所述獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限之后,所述按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址還包括:
判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方;
當(dāng)所述申請(qǐng)內(nèi)存大小不是2的冪次方時(shí),將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方。
可選的,所述按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū)包括:
將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi);
將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小。
本公開(kāi)還提供一種引擎保護(hù)裝置,該裝置包括:
內(nèi)存地址分配模塊,用于按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址;
保護(hù)區(qū)設(shè)置模塊,用于按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫。
可選的,所述內(nèi)存地址分配模塊包括:
內(nèi)存地址默認(rèn)分配子模塊,用于根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
可選的,所述內(nèi)存地址分配模塊包括:
獲取子模塊,用于獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限;
內(nèi)存地址隨機(jī)化子模塊,用于當(dāng)所述申請(qǐng)內(nèi)存地址為空且所述申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址;
內(nèi)存地址確定子模塊,用于根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址;
內(nèi)存地址判斷子模塊,用于判斷所述內(nèi)存地址確定子模塊所確定的內(nèi)存地址是否屬于系統(tǒng)內(nèi)存地址,并當(dāng)所確定的內(nèi)存地址屬于系統(tǒng)內(nèi)存地址時(shí),通知所述內(nèi)存地址隨機(jī)化子模塊重新對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址;
內(nèi)存地址分配子模塊,用于當(dāng)所述內(nèi)存地址判斷子模塊判斷所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象。
可選的,在所述獲取子模塊獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限之后,所述內(nèi)存地址分配模塊還包括:
申請(qǐng)內(nèi)存大小判斷子模塊,用于判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方;
申請(qǐng)內(nèi)存大小增加子模塊,用于當(dāng)所述申請(qǐng)內(nèi)存大小不是2的冪次方時(shí),將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方。
可選的,所述保護(hù)區(qū)設(shè)置模塊包括:
保護(hù)區(qū)設(shè)置子模塊,用于將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi);
內(nèi)存地址偏移子模塊,用于將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小。
通過(guò)上述技術(shù)方案,先按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址,然后按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫,這樣就能夠在一定程度上保護(hù)所述內(nèi)存地址,且避免其引擎在可執(zhí)行對(duì)象執(zhí)行時(shí)被非法惡意攻擊。
本公開(kāi)的其他特征和優(yōu)點(diǎn)將在隨后的具體實(shí)施方式部分予以詳細(xì)說(shuō)明。
附圖說(shuō)明
附圖是用來(lái)提供對(duì)本公開(kāi)的進(jìn)一步理解,并且構(gòu)成說(shuō)明書的一部分,與下面的具體實(shí)施方式一起用于解釋本公開(kāi),但并不構(gòu)成對(duì)本公開(kāi)的限制。在附圖中:
圖1是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)方法的流程圖。
圖2是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖。
圖3是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖。
圖4是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖。
圖5是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖。
圖6是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)裝置的示意框圖。
圖7是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置中的內(nèi)存地址分配模塊的示意框圖。
圖8是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置中的內(nèi)存地址分配模塊的示意框圖。
圖9是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置中的內(nèi)存地址分配模塊的示意框圖。
圖10是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)裝置中的保護(hù)區(qū)設(shè)置模塊的示意框圖。
附圖標(biāo)記說(shuō)明
100引擎保護(hù)裝置 10內(nèi)存地址分配模塊
20保護(hù)區(qū)設(shè)置模塊 101內(nèi)存地址默認(rèn)分配子模塊
102獲取子模塊 103內(nèi)存地址隨機(jī)化子模塊
104內(nèi)存地址確定子模塊 105內(nèi)存地址判斷子模塊
106內(nèi)存地址分配子模塊 107申請(qǐng)內(nèi)存大小判斷子模塊
108申請(qǐng)內(nèi)存大小增加子模塊 201保護(hù)區(qū)設(shè)置子模塊
202內(nèi)存地址偏移子模塊
具體實(shí)施方式
以下結(jié)合附圖對(duì)本公開(kāi)的具體實(shí)施方式進(jìn)行詳細(xì)說(shuō)明。應(yīng)當(dāng)理解的是,此處所描述的具體實(shí)施方式僅用于說(shuō)明和解釋本公開(kāi),并不用于限制本公開(kāi)。
圖1是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)方法的流程圖,如圖1所示,該方法包括步驟S101和步驟S102。
在步驟S101中,按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址。
在步驟S102中,按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫。
所述保護(hù)區(qū)的設(shè)置目的是為了保護(hù)所述內(nèi)存地址,其保護(hù)的方法即將所述保護(hù)區(qū)的權(quán)限設(shè)置為不可寫。
通過(guò)上述技術(shù)方案,當(dāng)需要給可執(zhí)行對(duì)象分配內(nèi)存時(shí),先按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址,然后按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫,這樣就能夠在一定程度上保護(hù)所分配的內(nèi)存地址,且避免其引擎在可執(zhí)行對(duì)象執(zhí)行時(shí)被非法惡意攻擊。
圖2是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖,如圖2所示,該方法包括圖1中的步驟S102,還包括步驟S201。
在步驟S201中,根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
上述步驟即為圖1中步驟S101中所述的第一預(yù)設(shè)規(guī)則的其中一種。
所述默認(rèn)內(nèi)存地址分配規(guī)則即按照現(xiàn)有技術(shù)中使用JIT編譯技術(shù)的引擎為可執(zhí)行對(duì)象分配內(nèi)存地址的規(guī)則,本公開(kāi)對(duì)所述默認(rèn)內(nèi)存地址分配規(guī)則不作限定。
通過(guò)上述技術(shù)方案,先根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址,然后按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫,這樣提供了一種通過(guò)為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū)進(jìn)而來(lái)保護(hù)引擎不受非法惡意攻擊的方法。
圖3是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖,圖3所示的方法是圖1中步驟S101中所述的第一預(yù)設(shè)規(guī)則中的另外一種。如圖3所示,該方法包括步驟S301至步驟S307。
在步驟S301中,獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限。
可執(zhí)行對(duì)象申請(qǐng)內(nèi)存時(shí),會(huì)通過(guò)自己的內(nèi)存申請(qǐng)函數(shù)來(lái)進(jìn)行申請(qǐng),所述內(nèi)存申請(qǐng)函數(shù)中主要包括申請(qǐng)的內(nèi)存大小,申請(qǐng)內(nèi)存的首地址,以及所要申請(qǐng)的內(nèi)存頁(yè)的權(quán)限等參數(shù)信息。
在步驟S302中,判斷所述申請(qǐng)內(nèi)存地址是否為空且所述申請(qǐng)內(nèi)存權(quán)限是否為可讀寫可執(zhí)行權(quán)限,如果是,則轉(zhuǎn)至步驟S303,如果不是,則轉(zhuǎn)至步驟S304。
判斷所述申請(qǐng)內(nèi)存地址是否為空且所述申請(qǐng)內(nèi)存權(quán)限是否為可讀寫可執(zhí)行權(quán)限即為判斷所述可執(zhí)行對(duì)象申請(qǐng)的內(nèi)存是否為有被非法惡意攻擊的危險(xiǎn)的內(nèi)存。
在步驟S303中,在申請(qǐng)內(nèi)存地址為空且申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址,然后轉(zhuǎn)至步驟S305。
步驟S303的主要目的是只在申請(qǐng)內(nèi)存地址為空且申請(qǐng)內(nèi)存權(quán)限為RWX權(quán)限時(shí)對(duì)申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化,這樣就不會(huì)過(guò)多的占用系統(tǒng)時(shí)間,不會(huì)影響引擎(例如,使用JIT編譯技術(shù)的引擎)的運(yùn)行效率。
其中,所述對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理可以通過(guò)利用George Marsaglia's MWC算法來(lái)進(jìn)行隨機(jī)化處理。George Marsaglia's MWC算法是一種利用異或與移位運(yùn)算來(lái)產(chǎn)生高偽隨機(jī)度的偽隨機(jī)數(shù)生成算法,易于軟件實(shí)現(xiàn),而且在硬件上運(yùn)行速度非???,因此對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理的過(guò)程幾乎不會(huì)影響到引擎的運(yùn)行效率。
在步驟S304中,根據(jù)所述申請(qǐng)內(nèi)存大小、所述申請(qǐng)內(nèi)存地址和所述申請(qǐng)內(nèi)存權(quán)限給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
當(dāng)判斷所述申請(qǐng)內(nèi)存地址不為空時(shí),說(shuō)明可執(zhí)行對(duì)象的申請(qǐng)內(nèi)存地址是具體的地址,針對(duì)這種申請(qǐng)內(nèi)存地址,選擇不對(duì)其進(jìn)行隨機(jī)化處理,而直接根據(jù)所述申請(qǐng)內(nèi)存大小、所述申請(qǐng)內(nèi)存地址和所述申請(qǐng)內(nèi)存權(quán)限給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
當(dāng)申請(qǐng)內(nèi)存地址為空,但所述申請(qǐng)內(nèi)存權(quán)限不為可讀寫可執(zhí)行權(quán)限時(shí),即所述可執(zhí)行對(duì)象申請(qǐng)的內(nèi)存地址不是RWX權(quán)限的內(nèi)存地址時(shí),也選擇不對(duì)其進(jìn)行隨機(jī)化處理,而直接根據(jù)所述申請(qǐng)內(nèi)存大小、所述申請(qǐng)內(nèi)存地址和所述申請(qǐng)內(nèi)存權(quán)限給所述可執(zhí)行對(duì)象分配內(nèi)存地址。因?yàn)楫?dāng)所述可執(zhí)行對(duì)象的申請(qǐng)內(nèi)存權(quán)限不是RWX權(quán)限時(shí),所述引擎收到非法惡意攻擊的危險(xiǎn)程度相對(duì)并不高,在這種情況下就無(wú)需占用過(guò)多的系統(tǒng)時(shí)間對(duì)引擎進(jìn)行保護(hù)。
在步驟S305中,根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址。
所述確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址的過(guò)程常用的方法是調(diào)用一個(gè)系統(tǒng)內(nèi)存分配函數(shù)來(lái)完成。在windows系統(tǒng)下,所述系統(tǒng)內(nèi)存分配函數(shù)可以是VitualAlloc函數(shù),當(dāng)然也可以是其他系統(tǒng)內(nèi)存分配函數(shù),例如直接調(diào)用Windows堆函數(shù)或者CRT堆函數(shù)等。對(duì)于不同的系統(tǒng),調(diào)用的內(nèi)存分配函數(shù)可以不一樣。
在步驟S306中,判斷所確定的內(nèi)存地址是否屬于系統(tǒng)內(nèi)存地址,如果否,則轉(zhuǎn)至步驟S307,如果是,則轉(zhuǎn)至步驟S303。
在確定了要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址之后,需要對(duì)所確定的內(nèi)存地址進(jìn)行是否屬于系統(tǒng)內(nèi)存地址的判斷,這一步屬于常規(guī)判斷。如果屬于系統(tǒng)內(nèi)存地址,因?yàn)橄到y(tǒng)內(nèi)存地址不可用,則返回步驟S303對(duì)所確定的內(nèi)存地址進(jìn)行再一次的隨機(jī)化處理,直到判斷所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),即此時(shí)所確定的內(nèi)存地址屬于用戶可用地址空間,這時(shí),再轉(zhuǎn)至步驟S307。
在步驟S307中,將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象。
在判斷所確定的內(nèi)存地址屬于用戶可用地址空間后,就將所確定的內(nèi)存地址通過(guò)賦值的過(guò)程真正分配給可執(zhí)行對(duì)象。
通過(guò)上述的技術(shù)方案,首先獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限,當(dāng)所述申請(qǐng)內(nèi)存地址為空且所述申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址,然后根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址,當(dāng)所確定的內(nèi)存地址屬于系統(tǒng)內(nèi)存地址時(shí),返回所述對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址的步驟,而當(dāng)所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),就將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象,這樣,如果攻擊者想要在分配給可執(zhí)行對(duì)象的內(nèi)存地址上執(zhí)行惡意代碼,由于采取了以上的隨機(jī)化處理,給可執(zhí)行對(duì)象分配的內(nèi)存地址是隨機(jī)的,攻擊者很難獲取可執(zhí)行對(duì)象的準(zhǔn)確內(nèi)存地址,這樣,就能在一定程度上防止所述引擎被非法惡意攻擊。
以下是針對(duì)圖3中的隨機(jī)化處理方法的有效性評(píng)估。
從表1中可以看出,沒(méi)有使用本公開(kāi)中的隨機(jī)化處理方法時(shí),使用JIT編譯技術(shù)的引擎給可執(zhí)行對(duì)象分配的是連續(xù)的相差0x10000字節(jié)的內(nèi)存地址,因此攻擊者能夠猜測(cè)出可執(zhí)行對(duì)象在內(nèi)存中的準(zhǔn)確位置。然而,使用本公開(kāi)的隨機(jī)化處理方法之后,所述引擎給可執(zhí)行對(duì)象分配的地址是完全隨機(jī)的,攻擊者很難獲取可執(zhí)行對(duì)象在內(nèi)存中的準(zhǔn)確位置。
表1
圖4是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖,是圖1中步驟S101中所述的第一預(yù)設(shè)規(guī)則中的又一種。如圖4所示,該方法在圖3的步驟S301之后,還包括步驟S401和步驟S402,以及接下來(lái)的步驟S302至步驟S307。
在步驟S401中,判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方,如果否,則轉(zhuǎn)至步驟S402,如果是,則轉(zhuǎn)至步驟S302。
判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方的原因,一是通常情況下給可執(zhí)行對(duì)象分配內(nèi)存時(shí),所述內(nèi)存大小都是以2的冪的形式對(duì)齊的;二是2的冪的大小的內(nèi)存空間適合硬件操作,有利用提高運(yùn)行效率。
在步驟S402中,將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方。
如果判斷所述申請(qǐng)內(nèi)存大小不是2的冪次方,則主動(dòng)將所述申請(qǐng)內(nèi)存大小增加至最接近原申請(qǐng)內(nèi)存大小的2的冪次方,然后在進(jìn)行內(nèi)存分配工作。
通過(guò)上述的技術(shù)方案,在所述獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限之后,先判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方,當(dāng)所述申請(qǐng)內(nèi)存大小不是2的冪次方時(shí),將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方,然后再進(jìn)行后續(xù)的內(nèi)存分配,這樣,有利于提高引擎的運(yùn)行效率。
圖5是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)方法的流程圖,如圖5所示,該方法包括步驟S501和步驟S502。
步驟S501,將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi)。
所述保護(hù)區(qū)的大小相對(duì)于所述所分配的內(nèi)存地址大小很小,例如,所述保護(hù)區(qū)的大小可以是8k。
將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi)時(shí),保護(hù)區(qū)的內(nèi)存地址與所分配的內(nèi)存地址會(huì)出現(xiàn)重合,此時(shí)執(zhí)行步驟S502。
步驟S502,將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小。
在設(shè)置好保護(hù)區(qū)的地址之后,為避免內(nèi)存重合,將所分配的內(nèi)存地址向后偏移所述保護(hù)區(qū)的大小,保證保護(hù)區(qū)的內(nèi)存地址與所分配的內(nèi)存的保護(hù)地址是連續(xù)且不重合的。
通過(guò)上述的技術(shù)方案,先將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi),然后將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小,這樣就為可執(zhí)行對(duì)象的內(nèi)存地址空間設(shè)置了一個(gè)能夠起到保護(hù)作用的保護(hù)區(qū),由于這個(gè)保護(hù)區(qū)的地址與可執(zhí)行對(duì)象的內(nèi)存地址空間是連續(xù)的,且所述保護(hù)區(qū)的權(quán)限是不可寫,因此,當(dāng)所述引擎受到非法惡意攻擊例如緩沖區(qū)溢出等攻擊時(shí),就能夠及時(shí)的反應(yīng)報(bào)警,以使所述引擎終止程序的運(yùn)行,從而起到保護(hù)所述引擎的功能。
本公開(kāi)的發(fā)明人以JavaScript引擎V8、Tamarin以及Safari’s為例,編寫了一系列的測(cè)試用例,用來(lái)測(cè)試使用本公開(kāi)內(nèi)容后引擎對(duì)于非法惡意攻擊的防范效果。表中的JIT引擎即使用JIT編譯技術(shù)的引擎。如表2所示,測(cè)試中的三個(gè)引擎對(duì)于測(cè)試用攻擊樣例的攻擊,防范效果都是有效的。
表2
本公開(kāi)的發(fā)明人還將本公開(kāi)內(nèi)容與使用JIT編譯技術(shù)的引擎常用的安全防范措施進(jìn)行了調(diào)研比較,結(jié)果如表3所示,從表3中可以看出,目前大多數(shù)使用JIT編譯技術(shù)的引擎都沒(méi)有使用本公開(kāi)中的發(fā)明內(nèi)容。
表3
其中,所述內(nèi)存權(quán)限限定的方法,即在背景技術(shù)中提到的,少數(shù)使用JIT編譯技術(shù)的引擎采取的實(shí)時(shí)修改內(nèi)存地址權(quán)限的方法,將分配給可執(zhí)行對(duì)象的內(nèi)存地址的寫權(quán)限與可執(zhí)行權(quán)限分開(kāi),在最初為可執(zhí)行對(duì)象分配內(nèi)存地址時(shí)分配的是具有RWX權(quán)限的內(nèi)存地址,并將權(quán)限修改為RW,在可執(zhí)行對(duì)象即將執(zhí)行時(shí),將其內(nèi)存地址的權(quán)限修改為RX,執(zhí)行結(jié)束后再將其內(nèi)存地址的權(quán)限修改為RW,這樣處理非常消耗處理器周期,會(huì)降低引擎效率。
另外,引擎JagerMonkey是實(shí)現(xiàn)了內(nèi)存權(quán)限限定功能的,但是在默認(rèn)情況下此功能未被開(kāi)啟,因此默認(rèn)其不具有此功能。
本公開(kāi)的發(fā)明人還針對(duì)不同的使用JIT編譯技術(shù)的引擎進(jìn)行了10000次的內(nèi)存分配操作,表4顯示了在使用和不使用本公開(kāi)內(nèi)容的情況下的所用時(shí)間以及系統(tǒng)開(kāi)銷,如表4所示,使用本公開(kāi)內(nèi)容的引擎的系統(tǒng)開(kāi)銷在10%以內(nèi),這是在可以接受的范圍內(nèi)的;且所用時(shí)間的差距也在可以接收的范圍內(nèi)。
表4
圖6是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)裝置100的示意框圖。如圖6所示,該裝置包括:
內(nèi)存地址分配模塊10,用于按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址;
保護(hù)區(qū)設(shè)置模塊20,用于按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫。
通過(guò)上述技術(shù)方案,當(dāng)可執(zhí)行對(duì)象申請(qǐng)內(nèi)存時(shí),內(nèi)存地址分配模塊10先按照第一預(yù)設(shè)規(guī)則給可執(zhí)行對(duì)象分配內(nèi)存地址,然后保護(hù)區(qū)設(shè)置模塊20按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫,這樣就能夠在一定程度上保護(hù)所述內(nèi)存地址,且避免其引擎在可執(zhí)行對(duì)象執(zhí)行時(shí)被非法惡意攻擊。
圖7是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置100中的內(nèi)存地址分配模塊10的示意框圖。如圖7所示,所述內(nèi)存地址分配模塊10包括:
內(nèi)存地址默認(rèn)分配子模塊101,用于根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址。
通過(guò)上述技術(shù)方案,內(nèi)存地址默認(rèn)分配子模塊101先根據(jù)默認(rèn)內(nèi)存地址分配規(guī)則給所述可執(zhí)行對(duì)象分配內(nèi)存地址,然后保護(hù)區(qū)設(shè)置模塊20再按照第二預(yù)設(shè)規(guī)則為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū),其中所述保護(hù)區(qū)的權(quán)限為不可寫,這樣提供了一種通過(guò)為所分配的內(nèi)存地址設(shè)置保護(hù)區(qū)進(jìn)而來(lái)保護(hù)引擎不受非法惡意攻擊的方法。
圖8是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置100中的內(nèi)存地址分配模塊10的示意框圖。如圖8所示,所述內(nèi)存地址分配模塊10包括:
獲取子模塊102,用于獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限;
內(nèi)存地址隨機(jī)化子模塊103,用于當(dāng)所述申請(qǐng)內(nèi)存地址為空且所述申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址;
內(nèi)存地址確定子模塊104,用于根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址;
內(nèi)存地址判斷子模塊105,用于判斷所述內(nèi)存地址確定子模塊所確定的內(nèi)存地址是否屬于系統(tǒng)內(nèi)存地址,并當(dāng)所確定的內(nèi)存地址屬于系統(tǒng)內(nèi)存地址時(shí),通知所述內(nèi)存地址隨機(jī)化子模塊重新對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址;
內(nèi)存地址分配子模塊106,用于當(dāng)所述內(nèi)存地址判斷子模塊105判斷所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象。
通過(guò)上述的技術(shù)方案,首先獲取子模塊102獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限,內(nèi)存地址隨機(jī)化子模塊103在當(dāng)所述申請(qǐng)內(nèi)存地址為空且所述申請(qǐng)內(nèi)存權(quán)限為可讀寫可執(zhí)行權(quán)限時(shí),對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址,然后內(nèi)存地址確定子模塊104根據(jù)所述隨機(jī)化內(nèi)存地址、所述申請(qǐng)內(nèi)存大小和所述申請(qǐng)內(nèi)存權(quán)限確定要分配給所述可執(zhí)行對(duì)象的內(nèi)存地址,內(nèi)存地址判斷子模塊105在當(dāng)所確定的內(nèi)存地址屬于系統(tǒng)內(nèi)存地址時(shí),返回所述對(duì)所述申請(qǐng)內(nèi)存地址進(jìn)行隨機(jī)化處理以得到隨機(jī)化內(nèi)存地址的步驟,而內(nèi)存地址分配子模塊106在當(dāng)所確定的內(nèi)存地址不屬于系統(tǒng)內(nèi)存地址時(shí),將所確定的內(nèi)存地址分配給所述可執(zhí)行對(duì)象,這樣,如果攻擊者想要在分配給可執(zhí)行對(duì)象的內(nèi)存地址上執(zhí)行惡意代碼,由于采取了以上的隨機(jī)化處理,給可執(zhí)行對(duì)象分配的內(nèi)存地址是隨機(jī)的,攻擊者很難獲取可執(zhí)行對(duì)象的準(zhǔn)確內(nèi)存地址,這樣,就能在一定程度上防止所述引擎被非法惡意攻擊。
圖9是根據(jù)本公開(kāi)又一種實(shí)施方式的引擎保護(hù)裝置100中的內(nèi)存地址分配模塊10的示意框圖。如圖9所示,在獲取子模塊102獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限之后,所述內(nèi)存地址分配模塊10還包括:
申請(qǐng)內(nèi)存大小判斷子模塊107,用于判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方;
申請(qǐng)內(nèi)存大小增加子模塊108,用于當(dāng)所述申請(qǐng)內(nèi)存大小不是2的冪次方時(shí),將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方。
通過(guò)上述的技術(shù)方案,在獲取子模塊102獲取為所述可執(zhí)行對(duì)象申請(qǐng)內(nèi)存的內(nèi)存申請(qǐng)函數(shù)中的申請(qǐng)內(nèi)存大小、申請(qǐng)內(nèi)存地址和申請(qǐng)內(nèi)存權(quán)限之后,申請(qǐng)內(nèi)存大小判斷子模塊107判斷所述申請(qǐng)內(nèi)存大小是否是2的冪次方,申請(qǐng)內(nèi)存大小增加子模塊108在當(dāng)所述申請(qǐng)內(nèi)存大小不是2的冪次方時(shí),將所述申請(qǐng)內(nèi)存大小增加至大于所述申請(qǐng)內(nèi)存大小的最小的2的冪次方,然后再進(jìn)行后續(xù)的內(nèi)存分配,這樣,有利于提高引擎的運(yùn)行效率。
圖10是根據(jù)本公開(kāi)一種實(shí)施方式的引擎保護(hù)裝置100中的保護(hù)區(qū)設(shè)置模塊20的示意框圖。如圖10所示,所述保護(hù)區(qū)設(shè)置模塊20包括:
保護(hù)區(qū)設(shè)置子模塊201,用于將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi);
內(nèi)存地址偏移子模塊202,用于將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小。
通過(guò)上述的技術(shù)方案,保護(hù)區(qū)設(shè)置子模塊201先將所述保護(hù)區(qū)設(shè)置在從所分配的內(nèi)存地址的首地址開(kāi)始的預(yù)設(shè)大小的內(nèi)存空間內(nèi),然后內(nèi)存地址偏移子模塊202將所分配的內(nèi)存地址向后偏移,其中偏移的大小為所述預(yù)設(shè)大小,這樣就為可執(zhí)行對(duì)象的內(nèi)存地址空間設(shè)置了一個(gè)能夠起到保護(hù)作用的保護(hù)區(qū),由于這個(gè)保護(hù)區(qū)的地址與可執(zhí)行對(duì)象的內(nèi)存地址空間是連續(xù)的,且所述保護(hù)區(qū)的權(quán)限是不可寫,因此,當(dāng)所述引擎受到非法惡意攻擊例如緩沖區(qū)溢出等攻擊時(shí),就能夠及時(shí)的反應(yīng)報(bào)警,以使所述引擎終止程序的運(yùn)行,從而起到保護(hù)所述引擎的功能。
以上結(jié)合附圖詳細(xì)描述了本公開(kāi)的優(yōu)選實(shí)施方式,但是,本公開(kāi)并不限于上述實(shí)施方式中的具體細(xì)節(jié),在本公開(kāi)的技術(shù)構(gòu)思范圍內(nèi),可以對(duì)本公開(kāi)的技術(shù)方案進(jìn)行多種簡(jiǎn)單變型,這些簡(jiǎn)單變型均屬于本公開(kāi)的保護(hù)范圍。
另外需要說(shuō)明的是,在上述具體實(shí)施方式中所描述的各個(gè)具體技術(shù)特征,在不矛盾的情況下,可以通過(guò)任何合適的方式進(jìn)行組合。為了避免不必要的重復(fù),本公開(kāi)對(duì)各種可能的組合方式不再另行說(shuō)明。
此外,本公開(kāi)的各種不同的實(shí)施方式之間也可以進(jìn)行任意組合,只要其不違背本公開(kāi)的思想,其同樣應(yīng)當(dāng)視為本公開(kāi)所公開(kāi)的內(nèi)容。