專利名稱:用以保護應用程序的鏈接和加載的方法
技術領域:
本公開涉及保護軟件不被篡改的方法和系統(tǒng)。具體地,本公開涉及在鏈接和加載時保護應用軟件的方法和系統(tǒng)。
背景技術:
傳統(tǒng)上,用于給定軟件模塊的安全變換直接應用于源代碼。例如,程序變換已被證明是抗對軟件的逆向工程和篡改攻擊的有效途徑。此外,這些安全變換的多樣性對不同攻擊、共謀、和其它對比威脅來說是進一步的屏障。例如,2003年7月15日發(fā)布的第6,594,761號美國專利和2005年I月11日發(fā)布的第6,842,862號美國專利描述了可用于保護軟件的數(shù)據(jù)流變換技術;并且2004年8月17日發(fā)布的第6,779,114號美國專利描述了可用于保護軟件的控制流變換技術。一旦已經(jīng)應用了安全變換,源文件首先由實現(xiàn)軟件模塊的源到源安全變換的預編譯器處理,基于用戶確定的安全決策生成包含變換的變換源文件。變換源文件然后由本地編譯器處理,生成目標代碼。所產(chǎn)生的本地目標代碼(可能被打包為靜態(tài)庫)直到涉及終端用戶為止都是不可變的,并且必須通過鏈接器處理以產(chǎn)生可執(zhí)行的二進制或動態(tài)庫。庫由鏈接器集成至程序。鏈接器的輸出(特別地,存儲器中的軟件模塊的布局)被自動生成,并且是輸入軟件模塊的確定性函數(shù),且針對運行時性能被優(yōu)化。如果想要修改存儲布局,則大部分鏈接器都需要使用復雜的元數(shù)據(jù),這通常超出了所有用戶甚至是最高級用戶的范圍。如果需要重訪軟件模塊的安全決策,或哪怕需要產(chǎn)生模塊的多樣實例,只能重復預編譯、編譯、以及鏈接/加載的步驟。不論是從所涉及的構建時還是從質(zhì)量保證觀點來看,都是很昂貴的。重建軟件模塊要求必須重新驗證所產(chǎn)生的可執(zhí)行/動態(tài)庫的性能(速度、大小等)和正確性。因此,希望提供改進的應用安全變換的方法和系統(tǒng),該改進的方法和系統(tǒng)諸如當需要改變安全決策、或需要創(chuàng)建多樣實例時不需要重建軟件模塊。
發(fā)明內(nèi)容
本公開提供了能夠以多種方式修改二進制輸出代碼的內(nèi)容的軟件鏈接器或軟件加載器,所有方式均通過多樣性在所產(chǎn)生的可執(zhí)行程序/動態(tài)庫中提供了安全性。公開了三種具體實施方式
。第一種涉及存儲映像重定位。鏈接器的結果可以是隨機化的基地址分配和可重定位的代碼的各段或部分的布局,這與由傳統(tǒng)鏈接器作出的確定性的決策相反。對于基于可預見的部分定位的攻擊來說,這一努力可能是重大的屏障。第二種實施方式涉及選擇性構造。單個代碼模塊可以多個多樣形式可用并在大容量庫中單獨提供。鏈接器將為最終的可執(zhí)行程序隨機選擇代碼實例。這一成就將阻撓不同攻擊。第三種實施方式涉及常數(shù)的晚綁定。程序變換諸如數(shù)據(jù)和控制流安全變換,具有以所選常數(shù)為特征的操作參數(shù)。這些參數(shù)被類似于重定位地址進行處理,并且在鏈接時被選擇,從而在執(zhí)行時導致變換的多樣化。這一成就還可用于抵抗不同攻擊并且還能夠通過編排的更新使可再生能力的成就成為可能。鏈接器或加載器接受選項以控制其動作范圍、以及允許創(chuàng)建可預見地多樣的輸出映像的隨機種子參數(shù)。因此,如果鏈接器通過精確相同輸入軟件模塊以及相同的隨機種子被調(diào)用兩次,則輸出映像將是相同的。為了生成不同的輸入映像,必需選擇不同的隨機種子。在第一個方面,提供了一種在構建時或加載時將安全變換應用于目標代碼的方法。該方法包括指定隨機種子作為偽隨機數(shù)生成器的輸入。隨后通過以下步驟生成可執(zhí)行模塊、或可執(zhí)行程序映像的不同實例通過應用隨機種子作為偽隨機數(shù)生成器的輸入從多個已編譯的軟件模塊中每一個的不同實例的組中對多個已編譯的軟件模塊中每一個的實例作出隨機選擇并確定已編譯的軟件模塊的所選實例的隨機布局來對多個已編譯的軟件模塊應用多樣化操作。隨后根據(jù)隨機布局將已編譯的軟件模塊的所選實例組合以生成可執(zhí)行模塊的不同實例。隨后解析可執(zhí)行模塊的不同實例內(nèi)的符號。在另一個方面中,提供了一種生成可執(zhí)行程序映像的多個多樣實例方法。對于可執(zhí)行程序映像的每個所需實例,指定隨機種子作為偽隨機數(shù)生成器的輸入。隨后通過以下步驟生成可執(zhí)行程序映像的不同實例通過應用隨機種子作為偽隨機數(shù)生成器的輸入從多個已編譯的軟件模塊中每一個的不同實例的組中對多個已編譯的軟件模塊中每一個的實例作出隨機選擇并確定已編譯的軟件模塊的所選實例的隨機布局來對多個已編譯的軟件模塊應用多樣化操作。隨后根據(jù)隨機布局將已編譯的軟件模塊的所選實例組合以生成可執(zhí)行程序映像的不同實例。隨后解析可執(zhí)行程序映像的不同實例內(nèi)的符號。隨機選擇可涉及從包含多個實例化模塊的多樣化提供的庫中作出隨機選擇。多樣化提供的庫中的每個實例化模塊均可被實例化有不同的安全特性,并且作出隨機選擇的步驟還包括嵌入多個已編譯的軟件模塊的資產(chǎn)級別以及多個已編譯的軟件模塊內(nèi)的調(diào)用位置的剖析加權;以及基于資產(chǎn)級別和所述剖析加權限制隨機選擇。確定隨機布局的步驟可包括將已編譯的軟件模塊的所選實例拆分成分離的代碼部分,并使代碼部分在存儲映像內(nèi)的定位隨機化。使代碼部分的定位隨機化的步驟可包括使來自已編譯的軟件模塊的所選實例中的不同實例的代碼部分混合、或者使來自已編譯的軟件模塊的所選實例中的不同實例的代碼部分與數(shù)據(jù)部分混合。應用多樣化操作的步驟還可包括安全變換常數(shù)的晚綁定,安全變換常數(shù)的晚綁定通過如下步驟實現(xiàn)應用隨機種子作為偽隨機數(shù)生成器的輸入以根據(jù)與應用于已編譯的軟件模塊的所選實例的安全變換有關的元數(shù)據(jù)隨機地確定安全變換常數(shù)。安全變換可以選自程序變換,尤其是數(shù)據(jù)流變換或控制流變換。在另一個方面中,提供了一種生成可執(zhí)行程序映像的多個多樣實例的方法。對于可執(zhí)行程序映像或動態(tài)庫的每個所需實例,指定隨機種子作為偽隨機數(shù)生成器的輸入以生成隨機選擇。通過對多個已編譯的軟件模塊應用由隨機選擇確定的多樣化操作并且通過解析與多個已編譯的軟件模塊關聯(lián)的符號對多個已編譯的軟件模塊進行變換。隨后生成具有由所解析的符號確定的不同配置的可執(zhí)行程序映像的實例。對多個已編譯的軟件模塊進行變換的步驟可包括解析符號以提供多個軟件模塊的隨機化的存儲映像布局,或解析符號以提供多個軟件模塊的不同實例的隨機化選擇。在又一個方面,提供了一種用于提供在構建時封裝的可執(zhí)行模塊的多個多樣不同實例的鏈接器或加載器。該鏈接器或加載器包括偽隨機數(shù)生成器,被配置為使處理器在運行時為每個可執(zhí)行模塊的每個多樣不同實例生成不同隨機選擇;以及運行時模塊,用于使處理器變換多個已編譯的軟件模塊。變換通過如下步驟實現(xiàn)通過對多個已編譯的軟件模塊應用由隨機選擇確定的多樣化操作來對多個已編譯的軟件模塊進行變換;解析與多個已編譯的軟件模塊關聯(lián)的符號;以及每當調(diào)用程序時生成具有由所解析的符號確定的不同配置的可執(zhí)行程序映像的實例。在另一個方面,提供了一種用于生成可執(zhí)行程序映像的多個多樣實例的加載器。加載器包括偽隨機數(shù)生成器,被配置為使處理器為可執(zhí)行程序映像的每個所需實例生成不同隨機選擇;以及運行時模塊,用于使所述處理器生成所述可執(zhí)行程序映像的不同實例。不同實例通過如下步驟生成通過應用隨機選擇從多個已編譯的軟件模塊中每一個的不同實例組中對多個已編譯的軟件模塊中每一個的實例作出選擇并確定已編譯的軟件模塊的所選實例的隨機布局來對多個已編譯的軟件模塊應用多樣化操作;根據(jù)隨機布局組合已編譯的軟件模塊的所選實例以生成可執(zhí)行程序映像的不同實例;以及解析可執(zhí)行程序映像的不同實例內(nèi)的符號。隨機布局可包括例如在運行時加載期間的隨機地址分配。多個已編譯軟件模塊中每一個的實例的選擇還可基于運行時條件,諸如檢測未授權入侵。對本領域普通技術人員來說,在結合附圖閱讀了本發(fā)明的具體實施方式
的下面的描述之后,本發(fā)明的其它方面和特征將變得顯而易見。
下面將通過僅示例參照附圖描述本公開的實施方式。圖I示出具有多樣性保護的產(chǎn)品二進制的構建時鏈接;圖2是為安全/性能目標優(yōu)化混合匹配選擇的流程圖;圖3示出變換常數(shù)的晚綁定;圖4示出在運行時加載期間選擇不同模塊;圖5示出在運行時加載期間的隨機地址分配;圖6示出具有可替換的、不同模塊的動態(tài)庫的構造。
具體實施例方式本公開描述了一種方法,依靠該方法,軟件模塊的安全變換可被推遲到鏈接或加載時,從而與傳統(tǒng)的源到源安全變換相比提供了若干優(yōu)點。這些推遲的安全變換可以非常輕質(zhì)的方式應用并且為所產(chǎn)生的可執(zhí)行程序的多樣性創(chuàng)造了許多機會,增強了安全性,同時使對執(zhí)行性能和正確性的影響最小化并降低了調(diào)試的復雜性。軟件鏈接器和鏈接器技術已經(jīng)存在了許多年,并且提供將一些預先編譯的軟件模塊組合成單個可執(zhí)行二進制或動態(tài)庫的能力。鏈接器的主要工作是將編譯的軟件模塊組合成單個存儲映像(memory image),從而決定各模塊在存儲器中應駐留的位置,并“安置”或重定位任何模塊間的地址引用(諸如子程序調(diào)用),使得它們在給定所選的存儲布局的情況下是正確的(見例如J. Levine, Linkers and Loaders (鏈接器和加載器),Morgan KaufmannPublishers, 2000)。多年以來,用于鏈接器技術的主要創(chuàng)新已經(jīng)被限制為改善性能、提供針對不同處理器和操作系統(tǒng)的能力、以及對高級編程語言的支持。
傳統(tǒng)的軟件鏈接器主要將本地目標代碼看作是不可變的,從而將修改限制為將輸入軟件模塊(以目標代碼的形式)組合成單個可執(zhí)行二進制或動態(tài)庫所必需的絕對最小。鏈接器或鏈接編輯器是獲得由編譯器生成的一個或多個目標并將它們組合成單個可執(zhí)行程序的程序。計算機程序通常包括若干部分或模塊;所有這些部分/模塊不需要包含在單個目標文件內(nèi),并且在這種情況下依靠符號彼此引用。通常,目標文件可包含三類符號定義符號,允許目標文件被其它模塊調(diào)用;未定義符號,調(diào)用定義有這些符號的其它模塊;以及局部符號,在目標文件內(nèi)內(nèi)部地使用以有助于重定位。當程序包括多個目標文件時,鏈接器將這些文件組合成統(tǒng)一的可執(zhí)行程序,從而在該程序執(zhí)行時解析這些符號。鏈接器可從一些目標或子程序(術語叫庫)獲取目標。某些鏈接器在輸出中不包括整個庫;它們僅包括它們的從其它目標文件或庫引用的符號。鏈接器還負責將目標布置在程序的地址空間中。這可涉及將特定基地址假定為另一個基的重定位代碼。由于編譯器幾乎不知道目標將駐留的位置,故其常常假定固定的基位置(例如,O)。重定位機器代碼可例如涉及將絕對跳轉、加載和儲存重新作為目標。編譯器的可執(zhí)行輸出在其剛好在執(zhí)行前最終被加載至存儲器內(nèi)時可能需要另一個重定位途徑。動態(tài)鏈接涉及在運行時將庫的子程序加載至應用程序,而不是在編譯時鏈接庫的子程序;這些子程序依然作為盤上的單獨文件存在。僅最小量的工作由鏈接器在編譯時完成;其僅記錄該程序需要的庫程序和庫中的程序的索引名稱或數(shù)量。鏈接的主要工作在應用程序被加載時(加載時)或在執(zhí)行時(運行時)完成。被稱為加載器的必要的鏈接功能實際上是底層操作系統(tǒng)的一部分。在合適的時間,加載器找到盤上的相關庫并將來自這些庫的相關數(shù)據(jù)添加至處理的存儲空間。因為鏈接器通常是構建過程的最后一步,故存在超越符號解析、布局確定、以及地址綁定的傳統(tǒng)工作的機會。鏈接步驟可用作組合抗一組類攻擊的多個多樣實施的手段,并提供再訪傳統(tǒng)鏈接器技術的基礎。在鏈接時引入多樣性具有輕質(zhì)的好處。不需要重新運行昂貴的編譯步驟,使得正確地生成大量多樣實例變得可行。每個實例具有可預測的性能。由于代碼基本是固定的(已經(jīng)編譯),這類多樣性不可能在執(zhí)行性能中引入大變化。這還將導致減少的測試工作,由于一個多樣實例的代碼代表所有其他多樣實例的行為一個多樣實例的全面測試可被假定為代表所有其他多樣實例的行為。本公開提供軟件鏈接器或加載器、以及相關的鏈接和加載方法,其可以多種方式生成二進制輸出代碼的內(nèi)容,所有方式都通過所產(chǎn)生的可執(zhí)行/動態(tài)庫中的多樣性提供了安全性。描述了可應用于目標代碼的三種特殊的多樣化操作。這些多樣化操作可根據(jù)設計需要以任何合適的方式單獨地或組合地應用。擴展的鏈接器工具接受選項以控制其動作的范圍,并且接受種子作為偽隨機數(shù)生成器(PRNG)的輸入,其允許創(chuàng)建可預見的多樣輸出映像。因此,如果鏈接器通過精確相同的輸入軟件模塊以及完全相同的種子調(diào)用兩次,則輸出映像將是相同的。為了生成多樣的輸出映像,選擇不同的種子。圖I示出安全驅動鏈接器100,安全驅動鏈接器100被啟用以執(zhí)行三種多樣化操作(下面詳細討論)存儲重定位102、基于多樣化實例化的庫和目標模塊106的選擇性構造104、以及變換常數(shù)108的晚綁定,所有這些都是根據(jù)輸入110(諸如PRNG的種子、以及任選的安全目標和性能約束)確定的。多樣化操作的結果是抗篡改的產(chǎn)品二進制、或輸出映像的安全增強實例112、或通過改變輸入110確定的輸出映像的多個不同實例112。根據(jù)上下文,輸出映像112被描述為可執(zhí)行程序映像、存儲映像、可執(zhí)行模塊、或動態(tài)庫。存儲映像重定位傳統(tǒng)鏈接器將基于輸入軟件模塊在命令行上的排序以及輸入軟件模塊的相關性(一個模塊引用另一個模塊)在輸出存儲映像中可預見地定位其輸入軟件模塊。此外,傳統(tǒng)鏈接器通常將確保相似類型的存儲段集合在一起,例如,將所有常量字符串數(shù)據(jù)放在一個存儲段中。這么做是為了方便(簡化重定位算法)、易于調(diào)試、并且由于緩存位置而導致所產(chǎn)生的可執(zhí)行映像的運行時性能最大化。參照圖1,首先公開的多樣化操作涉及存儲映像重定位102。鏈接器的結果可以是隨機化的基地址分配,Ox. . A,0x. . F等以及可重定位代碼的各段或部分的隨機化布局,這與由傳統(tǒng)鏈接器作出的確定性的決策相反。這一成就可以是基于可預見的部分定位的攻擊的重要屏障。基于請求和輸入110 (諸如用于PRNG的種子),鏈接器100可確保各輸出映像112具有全新的存儲映像布局(S卩,可重定位代碼的各段或部分的位置由隨機種子參數(shù)隨機確定),并且還可在整個存儲映像上摻和或混合不同類型(即數(shù)據(jù)和代碼)的存儲段。其通過向鏈接器100提供自由混合代碼和數(shù)據(jù)的能力,擴展了鏈接器的僅可以確定性方式為軟件模塊中的單獨功能的代碼重定位的傳統(tǒng)重定位功能?;旌蠑?shù)據(jù)和代碼用作對二進制映像反匯編器/分析器諸如IDA Pro 的正確操作的妨礙。理想地,可執(zhí)行輸出映像112的正確功能行為對于存儲布局的所有多樣實例來說都應該是相同的。原始執(zhí)行性能將受到緩存位置問題的影響,雖然通過存儲布局算法的合適選擇,性能變化可被保持為最小。因此,當使用存儲映像重定位時,在由擴展的鏈接器創(chuàng)建的所有多樣實例上,性能和正確性都將得到維持。選擇性構造對于傳統(tǒng)的鏈接器,各外部可見的實體(諸如函數(shù)或全局變量)必須在輸入軟件模塊組中一次性準確地提供。否則,該實體就被認為是“多重定義”,并且將出現(xiàn)錯誤。在本鏈接器100中,第二多樣化操作涉及“混合與匹配”鏈接,或基于各庫106內(nèi)的多樣化實例化的目標模塊的選擇性構造104。庫106可用多個實施模塊創(chuàng)建。例如,可創(chuàng)建程序模塊的多個版本、或實例(ModAU Mod A2、Mod BK Mod B2)。給定程序模塊的各實例執(zhí)行相同的功能行為。多個多樣實例(Mod Al、Mod A2、Mod BI、Mod Β2· · · ;0bjl、0bj2、...)可在大容量庫中單獨提供。由于所有實例均提供相同的功能,故本鏈接器100可為最終的可執(zhí)行程序隨機選擇特定的實例。這一成就可阻撓試圖通過對比獲得信息的不同攻擊。鏈接器100可支持一種模式,在該模式中將再次基于種子所確定的隨機選擇選擇給定外部可見實體(通常為函數(shù))的一組多個多樣實例之一。如果許多函數(shù)在許多多樣實例中可用(各實例具有它們自己的安全變換組),則可能的、多樣輸出映像的數(shù)量是這些函數(shù)和實例的數(shù)量的乘積。這給出了極大的范圍以創(chuàng)建大量的多樣實例,除此之外,由于各實例可涉及單獨函數(shù)的相當不同的實施,故將對一個實例進行逆向工程而獲得的知識應用于任何其它實例的能力被最小化。多個實例不僅可具有多樣的實施以阻撓不同的分析;還可被創(chuàng)建為具有不同的性能和/或安全特性(見輸入110)。例如,對于執(zhí)行密碼哈希的函數(shù),鏈接器100可選擇在非時間關鍵區(qū)域或處理中使用高度保護的、但較慢的實施。在時間關鍵區(qū)域或處理中,鏈接器可選擇在安全方面與高性能實施之間進行折衷??紤]到安全和性能目的的正確輸入,如通過設計考慮確定、結合實施的正確特性和算法分析信息,鏈接器100有機會通過混合和匹配功能性實施來平衡約束。圖2描繪了用于平衡安全與性能的優(yōu)化方法,該優(yōu)化方法按如下執(zhí)行。在步驟200中,用戶提供與應用中的高價值資產(chǎn)有關的信息。這一步驟包括增加關鍵資產(chǎn)相對于較不關鍵資產(chǎn)的級別(rating)(即,資產(chǎn)級別)。這些關鍵資產(chǎn)的示例可包括系統(tǒng)中的密鑰、節(jié)點鎖定計算、以及權利管理邏輯。在步驟202中,基于剖析將加權分配給調(diào)用位置。動態(tài)或靜態(tài)源級剖析是為函數(shù)和基礎塊級的應用程序而產(chǎn)生的。動態(tài)剖析可能是優(yōu)選的,但在沒有動態(tài)剖析的情況下,靜態(tài)剖析可由源級分析器(例如,編譯器或預編譯器)通過傳播對整個調(diào)用圖上的循環(huán)頻率的估計來產(chǎn)生。對于在應用程序中發(fā)現(xiàn)的每個函數(shù)調(diào)用位置,剖析加權可被關聯(lián)。在步驟204中,通過合適的目標和庫模塊嵌入資產(chǎn)級別和剖析加權(profile weighting)。例如,所產(chǎn)生的包含在資產(chǎn)級別和剖析加權中的信息通過編譯和庫創(chuàng)建階段被攜帶,使得它們可作為與庫中的模塊關聯(lián)的額外信息被嵌入。在步驟206中,鏈接器100使用嵌入的信息來選擇模塊,使用基于約束的解決算法來為安全/性能目標進行優(yōu)化。存在許多已知約束解決(constraint-solving)途徑。變換常數(shù)的晚綁定傳統(tǒng)軟件鏈接器基于鏈接器所獲得的最終的存儲映像布局決策標識必須安置(或重定位)的輸入本地目標代碼的位置。這些通常是對在其他軟件模塊中發(fā)現(xiàn)的外部可見符號(諸如全局變量或函數(shù))的引用。該重定位通常僅僅是實際上通過鏈接過程修改的本地目標代碼的一部分。對代碼和數(shù)據(jù)的安全變換常常涉及對特征常數(shù)的使用。例如,數(shù)據(jù)變換涉及對數(shù)學映射函數(shù)的使用,于2003年7月15日發(fā)布的第6,594,761號美國專利以及于2005年I月11日發(fā)布的第6,842,862號美國專利中描述了將數(shù)據(jù)操作和位置變換至可替換的數(shù)學空間的數(shù)學映射函數(shù),這兩個專利的全部內(nèi)容通過引用并入本文。為此,映射工具(即“代碼轉換器”)為每次映射使用一組函數(shù)族和多個特征常數(shù)。類似地,通過使用多個函數(shù)來控制流,控制流變換(如于2004年8月17日發(fā)布的第6,779,114號美國專利中所述,該專利的全部內(nèi)容通過引用并入本文)將給定程序的控制流映射為新的控制流形式。這些函數(shù)還攜帶有一組選定的常數(shù)。在這些情況的每一個中,常數(shù)被隨機(且彼此之間一致地)選擇。該組常數(shù)成為程序實例的區(qū)別因素并且是程序正確工作所必需的。這些常數(shù)的精確值是由映射工具(即,代碼轉換器)基于變換函數(shù)的特性選擇的。此外,在整個應用中可能存在許多相互關聯(lián)的安全變換常數(shù),這些常數(shù)已經(jīng)以相互一致的方式選擇,使得改變一個常數(shù)可能需要以某些一致方式改變許多其它常數(shù)。作為可應用于目標代碼的又一多樣化操作,還可執(zhí)行用于程序變換尤其是數(shù)據(jù)和控制流變換的常數(shù)的晚綁定。在這種情況下,該組常數(shù)由第二組常數(shù)(隨機選擇)替代,第二組常數(shù)必須一致地一同工作,然而卻代表程序實例的第二區(qū)別因素。這些常數(shù)可被相似地處理以重定位地址,并且在鏈接時被選擇,從而在執(zhí)行時導致變換的多樣化。這種修改進一步地防止不同攻擊,并且還能夠通過編排的更新使可再生能力的成就成為可能。鏈接器可通過與傳統(tǒng)鏈接器的重定位能力類比來修改程序變換(諸如數(shù)據(jù)和控制流變換)的特征常數(shù)組。這些特征常數(shù)組由PRNG (偽隨機數(shù)生成器)生成,PRNG由種子初始化。各組中的常數(shù)的可能的值非常大,導致所產(chǎn)生的可執(zhí)行或動態(tài)庫中的極大范圍的多
10樣性。參照圖3,示出了用于在鏈接時選擇常數(shù)的方法。鏈接器300與提供多個軟件模塊(模塊Al、模塊A2、...)的庫A通信。各軟件模塊包括常數(shù)部分302和與安全變換的特性有關的元數(shù)據(jù)304。鏈接器300首先選擇模塊(步驟310),隨后讀取與所選模塊關聯(lián)的元數(shù)據(jù)304 (步驟312)?;谠撛獢?shù)據(jù),鏈接器300選擇新的常數(shù)(步驟314),并在產(chǎn)品二進制322中用新的一組常數(shù)320替換常數(shù)部分(步驟316)。由于各組常數(shù)不影響應用程序的正確行為(假設該組常數(shù)滿足元數(shù)據(jù)中給出的數(shù)學約束),故針對該不同實例的性能/正確性的驗證是簡單的。一個一致常數(shù)組被期望與第二個一致常數(shù)組表現(xiàn)相同。這種形式的鏈接時多樣性因此代表用戶的最小開銷與抵抗不同攻擊的最大安全之間的良好折衷。其還理想地適于在現(xiàn)場應用中提供再生能力,其中應用二進制通過新的特征常數(shù)組周期性地更新,這意味著其它攻擊者沒有機會用固定的二進制映像進行分析。運行時加載加載器還可被看作是在運行時被調(diào)用的鏈接器。描述構建時、或加載時的上述所有技術、鏈接特征也可考慮在運行時被調(diào)用。在運行時執(zhí)行這些特征的優(yōu)點是插入其他安全保護技術、以及對現(xiàn)場中的條件作出反應的能力。加載器在圖4和5中示出。圖4示出從模塊的多樣實例進行選擇以加載至產(chǎn)品二進制,而圖5示出在運行時加載期間的隨機地址分配。在圖4的實施方式中,軟件模塊的多個多樣實例(Mod AUMod A2、Mod A3,Mod A4、Mod BUMod B2、Mod B3、Mod B4...)可在動態(tài)庫諸如動態(tài)庫A和動態(tài)庫B中單獨提供。這些實例可以單獨的實施因素或標準為特征。例如,某些示例可被特征化為具有高安全級別,諸如模塊Mod Al和Mod A2的“強大保護”,或它們可以它們的執(zhí)行速度為特征,諸如“快速”模塊 Mod A3、Mod A4。為了提供運行時的多樣性,加載器400需要運行時熵源402和偽隨機數(shù)生成器(PRNG)jPRNG控制多樣模塊選擇器404作出偽隨機決策,并確保運行時加載器的行為、或運行時加載器的輸出可執(zhí)行程序406在每次被調(diào)用時都是不同的。運行時加載器400可基于運行時條件從動態(tài)庫中找到的各種實施進行選擇。例如,如果入侵(breach)管理模塊發(fā)現(xiàn)攻擊正在發(fā)生(例如,進程正在被仿真和調(diào)試),則入侵管理模塊可向加載器發(fā)送信號以加載具有當前最高安全級別和保護能力的實施(即,從模塊Mod Al和Mod A2、或Mod BI和ModB2的隨機化選擇)?;谄渌鼦l件,入侵管理模塊可作出其它決策。例如,如果應用程序被重復調(diào)用,并且從未到達其關鍵執(zhí)行點,則加載器可選擇將隨機實施加載至比平常更細粒度。這將阻礙不同攻擊并使依靠可重復性和可預見性的對手氣餒。在圖5所示的實施方式中,軟件模塊的多個多樣實例(Mod AU Mod A2、Mod A3、Mod A4、Mod BI、Mod B2、Mod B3、Mod B4...;以及 Mod Cl、Mod C2、Mod C3、Mod C4)可在動態(tài)庫諸如動態(tài)庫A、動態(tài)庫B和動態(tài)庫C中再次單獨提供,并且運行時加載器500再次包括運行時熵源502和偽隨機數(shù)生成器(PRNG),PRNG控制多樣模塊選擇器504作出偽隨機決策。在該實施方式中,多樣選擇器模塊504可被實施以如上面參照存儲映像重定位和選擇性構造描述一樣工作??蛇x擇模塊的特定多樣實例,并且每個所選模塊當其在運行時被加載時可被分配有隨機地址。可執(zhí)行程序506可以其大部分功能都由動態(tài)庫模塊構成的方式組成。因為模塊在執(zhí)行的變化時間處被加載,故除了從一組多樣的選項選擇的模塊之外,模塊還在存儲器中的隨機地址處被加載。這為運行調(diào)試或仿真會話的攻擊者帶來重大阻礙。當程序正在執(zhí)行時,不僅存在不可預見的多樣模塊正被加載,而且該模塊的位置也是不可預見且不可重復的。動態(tài)庫的構造動態(tài)庫(例如Windows的.dll、Linux上的.so、Mac上的.dylib)通常由本地鏈接器創(chuàng)建并且能夠與可直接執(zhí)行的映像近距離對比。通常,動態(tài)實體中的符號中的絕大部分都在創(chuàng)建該庫之前已經(jīng)被解析。在該庫被創(chuàng)建之前已經(jīng)準備好執(zhí)行。另一方面,動態(tài)庫在其運行之前不需要被加載到執(zhí)行的程序內(nèi)。此時,加載器在庫被執(zhí)行之前有機會重定位某些符號。動態(tài)庫中的所有未解析的符號剛好在執(zhí)行之前被解析。因為該庫由鏈接器創(chuàng)建,故該庫不包含不明確定義的符號。除了少量的可重定位的符號之外,該庫基本準備好執(zhí)行。然而,多樣性還可被引入產(chǎn)品動態(tài)庫的構造,如圖6所示。動態(tài)庫創(chuàng)建機制提供多個可替換模塊(即,函數(shù)和數(shù)據(jù))AltMod AUAltMod A2、AltMod BUAltMod B2、· · · ·。各可替換模塊給出與各自模塊(Mod AUMod A2、Mod BUMod B2...;0bjl、0bj2、…)的實例的任選等同。庫的創(chuàng)建需要鏈接器600,鏈接器600將可替換模塊封裝在產(chǎn)品動態(tài)庫602中。其還攜帶指向可替換模塊的表。隨后,在運行時,適當實施的加載器可通過查詢該表在可替換的、不同模塊之中進行隨機選擇,如上面詳細說明。在先前的描述中,出于解釋的目的,陳述了大量細節(jié)以提供對實施方式的完整理解。然而,本領域技術人員應理解,這些具體的細節(jié)是不需要的。在其他實例中,為了不使理解晦澀,以框圖形式示出已知的電氣結構和電路。例如,未提供文中所述的實施方式是否被實施為軟件程序、硬件電路、固件、或其組合的具體細節(jié)。本公開的實施方式可被稱為儲存于機器可讀媒介(又稱為具有計算機可讀程序代碼的計算機可讀媒介、處理器可讀媒介、或計算機可用媒介)中的計算機程序產(chǎn)品。機器可讀媒介可以是任何合適的有形非短暫媒介,有形非短暫媒介包括磁、光或電存儲媒介,磁、光或電存儲媒介包括磁盤、只讀光盤存儲器(CD-ROM)、存儲器設備(易失或非易失的)、或類似存儲機構。機器可讀媒介可包含各種指令集、代碼序列、配置信息或其它數(shù)據(jù),其被執(zhí)行時使處理器執(zhí)行根據(jù)本公開的實施方式的方法中的步驟。本領域技術人員將理解,實施所述實施所需的其它命令和操作也可儲存在機器可讀媒介上。儲存在機器可讀媒介上的指令可由處理器或其它合適的處理設備執(zhí)行,并且可與電路系統(tǒng)交互以完成所述工作。本發(fā)明的上述實施方式僅作為示例。在不背離本發(fā)明的范圍的情況下,本領域技術人員可對具體實施方式
進行改變、修改和變更,本發(fā)明的范圍僅由所附權利要求限定。
權利要求
1.在構建時或加載時將安全變換應用于目標代碼的方法,包括指定隨機種子作為偽隨機數(shù)生成器的輸入;通過以下步驟生成可執(zhí)行模塊的不同實例通過應用所述隨機種子作為所述偽隨機數(shù)生成器的輸入從多個已編譯的軟件模塊中每一個的不同實例組中對所述多個已編譯的軟件模塊中每一個的實例作出隨機選擇并確定所述已編譯的軟件模塊的所選實例的隨機布局來對所述多個已編譯的軟件模塊應用多樣化操作;根據(jù)所述隨機布局組合所述已編譯的軟件模塊的所選實例以生成所述可執(zhí)行模塊的不同實例;以及解析所述可執(zhí)行模塊的不同實例內(nèi)的符號。
2.如權利要求I所述的方法,其中作出隨機選擇的步驟包括從包含多個實例化模塊的多樣化提供的庫中作出隨機選擇。
3.如權利要求2所述的方法,其中所述多樣化提供的庫中的每個實例化模塊均被實例化有不同的安全特性,并且作出隨機選擇的步驟還包括嵌入所述多個已編譯的軟件模塊的資產(chǎn)級別以及所述多個已編譯的軟件模塊內(nèi)的調(diào)用位置的剖析加權;基于所述資產(chǎn)級別和所述剖析加權限制所述隨機選擇。
4.如權利要求I所述的方法,其中確定隨機布局的步驟包括將所述已編譯的軟件模塊的所選實例拆分成分離的代碼部分,以及使所述代碼部分在存儲映像內(nèi)的定位隨機化。
5.如權利要求4所述的方法,其中使所述代碼部分的定位隨機化的步驟包括使來自所述已編譯的軟件模塊的所選實例中的不同實例的代碼部分混合。
6.如權利要求4所述的方法,其中使所述代碼部分的定位隨機化的步驟包括使來自所述已編譯的軟件模塊的所選實例中的不同實例的代碼部分與數(shù)據(jù)部分混合。
7.如權利要求I所述的方法,其中應用多樣化操作的步驟還包括通過以下步驟實現(xiàn)的安全變換常數(shù)的晚綁定應用所述隨機種子作為所述偽隨機數(shù)生成器的輸入以根據(jù)與應用于所述已編譯的軟件模塊的所選實例的安全變換有關的元數(shù)據(jù)隨機地確定所述安全變換常數(shù)。
8.如權利要求7所述的方法,其中所述安全變換是程序變換。
9.如權利要求8所述的方法,其中所述程序變換是數(shù)據(jù)流變換或控制流變換。
10.生成可執(zhí)行程序映像的多個多樣實例的方法,包括對于所述可執(zhí)行程序映像的每個所需實例指定隨機種子作為偽隨機數(shù)生成器的輸入;通過以下步驟生成所述可執(zhí)行程序映像的不同實例通過應用所述隨機種子作為所述偽隨機數(shù)生成器的輸入從多個已編譯的軟件模塊中每一個的不同實例組中對所述多個已編譯的軟件模塊中每一個的實例作出隨機選擇并確定所述已編譯的軟件模塊的所選實例的隨機布局來對所述多個已編譯的軟件模塊應用多樣化操作;根據(jù)所述隨機布局組合所述已編譯的軟件模塊的所選實例以生成所述可執(zhí)行程序映像的不同實例;以及解析所述可執(zhí)行程序映像的不同實例內(nèi)的符號。
11.如權利要求10所述的方法,其中作出隨機選擇的步驟包括從包含多個實例化模塊的多樣化提供的庫中作出隨機選擇。
12.如權利要求11所述的方法,其中所述多樣化提供的庫中的每個實例化模塊均被實例化有不同的安全特性,并且作出隨機選擇的步驟還包括嵌入所述多個已編譯的軟件模塊的資產(chǎn)級別以及所述多個已編譯的軟件模塊內(nèi)的調(diào)用位置的剖析加權;基于所述資產(chǎn)級別和所述剖析加權限制所述隨機選擇。
13.如權利要求10所述的方法,其中確定隨機布局的步驟包括將所述已編譯的軟件模塊的所選實例拆分成分離的代碼部分,并使所述代碼部分在存儲映像內(nèi)的定位隨機化。
14.如權利要求13所述的方法,其中使所述代碼部分的定位隨機化的步驟包括使來自所述已編譯的軟件模塊的所選實例中的不同實例的代碼部分混合。
15.如權利要求13所述的方法,其中使所述代碼部分的定位隨機化的步驟包括使來自所述已編譯的軟件模塊的所選實例中的不同實例的代碼部分與數(shù)據(jù)部分混合。
16.如權利要求10所述的方法,其中應用多樣化操作的步驟還包括通過以下步驟實現(xiàn)的安全變換常數(shù)的晚綁定應用所述隨機種子作為所述偽隨機數(shù)生成器的輸入以根據(jù)與應用于所述已編譯的軟件模塊的所選實例的安全變換有關的元數(shù)據(jù)隨機地確定所述安全變換常數(shù)。
17.如權利要求16所述的方法,其中所述安全變換是程序變換。
18.如權利要求17所述的方法,其中所述程序變換是數(shù)據(jù)流變換或控制流變換。
19.生成可執(zhí)行程序映像的多個多樣實例方法,包括對于所述可執(zhí)行程序映像或動態(tài)庫的每個所需實例指定隨機種子作為偽隨機數(shù)生成器的輸入以生成隨機選擇;通過對多個已編譯的軟件模塊應用由所述隨機選擇確定的多樣化操作并且通過解析與所述多個已編譯的軟件模塊關聯(lián)的符號來對所述多個已編譯的軟件模塊進行變換,生成具有由所解析的符號確定的不同配置的可執(zhí)行程序映像的實例。
20.如權利要求19所述的方法,其中對所述多個已編譯的軟件模塊進行變換的步驟包括解析所述符號以提供所述多個軟件模塊的隨機化的存儲映像布局。
21.如權利要求19所述的方法,其中對所述多個已編譯的軟件模塊進行變換的步驟包括解析所述符號以提供所述多個軟件模塊的不同實例的隨機化選擇。
22.用于提供在構建時封裝的可執(zhí)行模塊的多個多樣不同實例的鏈接器,包括偽隨機數(shù)生成器,被配置為使處理器在運行時為每個可執(zhí)行模塊的每個多樣不同實例生成不同隨機選擇;以及運行時模塊,用于使所述處理器通過如下步驟對多個已編譯的軟件模塊進行變換通過對多個已編譯的軟件模塊應用由所述隨機選擇確定的多樣化操作來對所述多個已編譯的軟件模塊進行變換;解析與所述多個已編譯的軟件模塊關聯(lián)的符號;以及,每當調(diào)用所述程序時生成具有由所解析的符號確定的不同配置的可執(zhí)行程序映像的實例。
23.用于在運行時提供可執(zhí)行程序映像的多樣不同實例的加載器,包括偽隨機數(shù)生成器,被配置為使處理器為所述可執(zhí)行程序映像的每個多樣不同實例生成不同隨機選擇;以及鏈接模塊,用于使所述處理器通過如下步驟對多個已編譯的軟件模塊進行變換通過對多個已編譯的軟件模塊應用由所述隨機選擇確定的多樣化操作來對所述多個已編譯的軟件模塊進行變換;解析與所述多個已編譯的軟件模塊關聯(lián)的符號;以及,生成具有由所解析的符號確定的不同配置的可執(zhí)行程序映像的實例。
24.用于生成可執(zhí)行程序映像的多個多樣實例的加載器,包括偽隨機數(shù)生成器,被配置為使處理器為所述可執(zhí)行程序映像的每個多樣實例生成不同隨機選擇;以及運行時模塊,用于使所述處理器通過如下步驟生成所述可執(zhí)行程序映像的不同實例通過應用所述隨機選擇從所述多個已編譯的軟件模塊中每一個的不同實例組中對所述多個已編譯的軟件模塊中每一個的實例作出選擇并確定所述已編譯的軟件模塊的所選實例的隨機布局來對所述多個已編譯的軟件模塊應用多樣化操作;根據(jù)所述隨機布局組合所述已編譯的軟件模塊的所選實例以生成所述可執(zhí)行程序映像的不同實例;以及解析所述可執(zhí)行程序映像的不同實例內(nèi)的符號。
25.如權利要求24所述的加載器,其中所述隨機布局包括在運行時加載期間的隨機地址分配。
26.如權利要求24所述的加載器,其中所述多個已編譯的軟件模塊中每一個的實例的選擇還基于運行時條件。
27.如權利要求26所述的加載器,其中所述運行時條件包括檢測未授權入侵。
全文摘要
本發(fā)明描述了鏈接器或加載器、以及相關方法,依靠該鏈接器或加載器、以及相關方法,對目標代碼模塊應用安全變換可被推遲到鏈接或加載時,例如,通過存儲重定位、從模塊的多樣實例的選擇、以及常數(shù)的晚綁定。這提供了超越傳統(tǒng)源到源安全變換的若干好處。這些推遲的安全變換可以非常輕質(zhì)的方式應用并且為所產(chǎn)生的可執(zhí)行程序的多樣性創(chuàng)造許多機會,增強了安全性,同時使對執(zhí)行性能和正確性的影響最小化,并且降低了調(diào)試的復雜性。
文檔編號G06F21/14GK102939587SQ201080065909
公開日2013年2月20日 申請日期2010年3月31日 優(yōu)先權日2010年3月31日
發(fā)明者格蘭特·斯圖爾特·古德斯, 克利福德·立厄姆 申請人:埃德圖加拿大公司