本發(fā)明涉及用于保護軟件項目的方法以及用于執(zhí)行此類方法的裝置和計算機程序。
背景技術:
眾所周知的是經(jīng)常針對軟件項目發(fā)起攻擊。攻擊者可能希望獲得包含在軟件項目內(nèi)的秘密信息(諸如密碼密鑰),目的是濫用該秘密信息(例如通過將密碼密鑰分發(fā)給其他人/系統(tǒng),使得那些人/系統(tǒng)可以以未授權(quán)方式使用該密碼密鑰)。同樣地,攻擊者可能希望修改軟件項目的執(zhí)行流程。例如,軟件項目可具有決策點,其檢查軟件項目的用戶是否具有某些許可或訪問權(quán)限——如果用戶具有那些許可或訪問權(quán)限,則軟件項目可準予對某些功能或數(shù)據(jù)的用戶訪問,否則拒絕此類訪問。攻擊者可能希望嘗試在此決策點處修改軟件項目的執(zhí)行,使得即使用戶不具有許可或訪問權(quán)限,軟件項目仍準予對該某些功能或數(shù)據(jù)的用戶訪問。
存在可以應用于初始軟件項目以便生成受保護軟件項目、旨在使得攻擊者不可能(或者至少十分困難)成功地完成其攻擊的眾多眾所周知的軟件保護技術。
本發(fā)明尋求提供一種用于保護軟件項目的替換方法,其相比于現(xiàn)有技術的那些而言提供各種優(yōu)勢。
技術實現(xiàn)要素:
根據(jù)本發(fā)明的第一方面,提供了一種保護軟件項目的方法。所述方法包括:(a)識別在軟件項目中的指定點處保持為真的不變式;以及(b)通過在軟件項目中的指定點處插入代碼來生成受保護軟件項目。所述代碼在被處理器執(zhí)行時被布置成檢查不變式是否保持為真,并且響應于不變式不保持為真而被布置成調(diào)用安全事件程序。
根據(jù)本發(fā)明的第二方面,提供了一種被布置成執(zhí)行第一方面的方法的裝置。
根據(jù)本發(fā)明的第三方面,提供了一種計算機程序,其在被處理器執(zhí)行時引起處理器實現(xiàn)第一方面的方法。
根據(jù)本發(fā)明的第四方面,提供了一種存儲第三方面的計算機程序的計算機可讀介質(zhì)。
根據(jù)本發(fā)明的第四方面,提供了包括第一位置處的代碼的軟件項目,其中,所述代碼在被處理器執(zhí)行時被布置成檢查不變式在第一位置處是否保持為真,并且響應于不變式不保持為真而被布置成調(diào)用安全事件程序。
在所附權(quán)利要求中闡述了本發(fā)明的其它優(yōu)選特征。
附圖說明
現(xiàn)在將參考附圖以示例的方式描述本發(fā)明的實施例,在所述附圖中:
圖1示意性地圖示出計算機系統(tǒng)的示例。
圖2示意性地圖示出根據(jù)本發(fā)明的實施例的系統(tǒng)。
圖3示意性地圖示出根據(jù)本發(fā)明的實施例的保護軟件項目的方法。
圖4示意性地圖示出已使用圖3的方法來保護的受保護軟件項目的執(zhí)行。
具體實施方式
在隨后的描述中和在附圖中,描述了本發(fā)明的某些實施例。然而,將認識到的是本發(fā)明不限于所描述的實施例,并且一些實施例可以不包括下面描述的特征中的所有。然而,將顯而易見的是在可以在本文中進行各種修改和變更而不脫離如在所附權(quán)利要求中闡述的本發(fā)明的更寬泛的精神和范圍。
1-系統(tǒng)概述
圖1示意性地圖示出計算機系統(tǒng)100的示例。系統(tǒng)100包括計算機102。計算機102包括:存儲介質(zhì)104、存儲器106、處理器108、接口110、用戶輸出接口112、用戶輸入接口114和網(wǎng)絡接口116,其全部被通過一個或多個通信總線118鏈接在一起。
存儲介質(zhì)104可以是任何形式的非易失性數(shù)據(jù)存儲設備,諸如硬盤驅(qū)動、磁盤、光盤、ROM等中的一個或多個。存儲介質(zhì)104可存儲用于處理器108執(zhí)行以便使計算機102運行的操作系統(tǒng)。存儲介質(zhì)104還可存儲一個或多個計算機程序(或軟件或指令或代碼)。
存儲器106可以是適合于存儲數(shù)據(jù)和/或計算機程序(或軟件或指令或代碼)的任何隨機存取存儲器(存儲單元或易失性存儲介質(zhì))。
處理器108可以是適合于執(zhí)行一個或多個計算機程序(諸如存儲在存儲介質(zhì)104上和/或存儲器106中的那些)的任何數(shù)據(jù)處理單元,所述計算機程序中的某些可以是根據(jù)本發(fā)明的實施例的計算機程序或者在被處理器108執(zhí)行時引起處理器108實現(xiàn)根據(jù)本發(fā)明的實施例的方法并將系統(tǒng)100配置成是根據(jù)本發(fā)明的實施例的系統(tǒng)的計算機程序。處理器108可包括單個數(shù)據(jù)處理單元或者并行地或相互合作地操作的多個數(shù)據(jù)處理單元。處理器108在實現(xiàn)用于本發(fā)明的實施例的數(shù)據(jù)處理操作時可向和/或從存儲介質(zhì)104和/或存儲器106存儲數(shù)據(jù)和/或讀取數(shù)據(jù)。
接口110可以是用于提供到在計算機102外部或可從其移除的設備122的接口的任何單元。設備122可以是數(shù)據(jù)存儲設備,例如光盤、磁盤、固態(tài)存儲設備等中的一個或多個。設備122可具有處理能力——例如,該設備可以是智能卡。接口110因此可根據(jù)其從處理器108接收到的一個或多個命令從設備122訪問數(shù)據(jù)或向設備122提供數(shù)據(jù)或者與設備122對接。
用戶輸入接口114被布置成從系統(tǒng)100的用戶或操作者接收輸入。用戶可經(jīng)由被連接到用戶輸入接口114或與之通信的系統(tǒng)100的一個或多個輸入設備(諸如鼠標(或其它指針設備)126和/或鍵盤124)來提供此輸入。然而,將認識到的是用戶可經(jīng)由一個或多個附加或替換輸入設備(諸如觸摸屏)向計算機102提供輸入。計算機102可將經(jīng)由用戶輸入接口114從輸入設備接收到的輸入存儲在存儲器106中以用于處理器108隨后訪問和處理,或者可將其徑直傳遞至處理器108,使得處理器108可以相應地對用戶輸入進行響應。
用戶輸出接口112被布置成向系統(tǒng)100的用戶或操作者提供圖形/視覺和/或音頻輸出。同樣地,處理器108可被布置成命令用戶輸出接口112形成表示期望圖形輸出的圖像/視頻信號,并將此信號提供給被連接到用戶輸出接口112的系統(tǒng)100的監(jiān)視器(或屏幕或顯示單元)120。附加地或替換地,處理器108可被布置成命令用戶輸出接口112形成表示期望音頻輸出的音頻信號,并且將此信號提供給連接到用戶輸出接口112的系統(tǒng)100的一個或多個揚聲器121。
最后,網(wǎng)絡接口116提供用于使計算機102從一個或多個數(shù)據(jù)通信網(wǎng)絡下載數(shù)據(jù)和/或向其上傳數(shù)據(jù)的功能(未示出)。
將認識到的是在圖1中示出并在上文描述的系統(tǒng)100的架構(gòu)僅僅是示例性的,并且在本發(fā)明的實施例中可使用具有不同架構(gòu)(例如具有比圖1中所示的更少的組件或者具有除圖1中所示之外的附加和/或替換組件)的其它計算機系統(tǒng)100。作為示例,計算機系統(tǒng)100可以包括以下各項中的一個或多個:個人計算機;服務器計算機;移動電話;平板電腦;膝上計算機;電視機;機頂盒;游戲控制臺;其它移動設備或消費者電子設備等。
圖2示意性地圖示出根據(jù)本發(fā)明的實施例的系統(tǒng)200。系統(tǒng)200包括:軟件生成系統(tǒng)210;軟件保護系統(tǒng)250;用戶系統(tǒng)280;以及網(wǎng)絡290。
軟件生成系統(tǒng)210包括(或者執(zhí)行或使用)生成初始軟件項目220的軟件生成工具212。軟件生成工具212可以是例如軟件生成系統(tǒng)210的處理器執(zhí)行的軟件應用程序。軟件生成系統(tǒng)210可被布置成自主地生成初始軟件項目220;附加地或替換地,軟件生成系統(tǒng)210可被布置成在至少部分地編寫構(gòu)成初始軟件項目220的一部分的軟件代碼的一個或多個軟件開發(fā)者的控制下生成初始軟件項目220。用于生成或開發(fā)軟件項目的工具是眾所周知的,并且因此在本文中不會更詳細地描述。
初始軟件項目220可包括源代碼、目標代碼、可執(zhí)行代碼和二進制代碼中的一個或多個??捎靡粋€或多個編程語言對初始軟件項目220進行編程或編寫,所述編程語言可包括編譯編程語言和/或解釋或腳本編程語言。初始軟件項目220可包括一個或多個模塊或軟件組件或計算機程序,其可被呈現(xiàn)或存儲于一個或多個文件內(nèi)。事實上,初始軟件項目220可以是整個軟件應用程序、軟件庫或一個或多個軟件函數(shù)或程序的整體或一部分或者其之間的任何地方(如本領域的技術人員將認識到的)。
初始軟件項目220在被處理器執(zhí)行時被布置成執(zhí)行(或者引起處理器執(zhí)行)基于一個或多個數(shù)據(jù)項目的數(shù)據(jù)處理。每個數(shù)據(jù)項目可以分別地是任何類型的數(shù)據(jù),諸如音頻數(shù)據(jù)、視頻數(shù)據(jù)、多媒體數(shù)據(jù)、文本數(shù)據(jù)、財務數(shù)據(jù)、一個或多個密碼密鑰、數(shù)字權(quán)限管理數(shù)據(jù)、有條件訪問數(shù)據(jù)等。數(shù)據(jù)處理可包括以下各項中的一個或多個:(a)至少部分地基于一個或多個數(shù)據(jù)項目中的至少一個的決策;(b)安全相關功能;(c)訪問控制功能;(d)密碼功能;以及(e)權(quán)限管理功能。然而,將認識到的是除上述示例之外或作為其替換,數(shù)據(jù)處理可包括一個或多個其它類型的功能或操作。作為一個示例,數(shù)據(jù)處理可涉及提供對被接收和/或存儲為加密內(nèi)容的內(nèi)容(諸如音頻和/或視頻數(shù)據(jù))的用戶訪問,其中,只有當用戶具有適當?shù)脑L問許可/權(quán)限時才為用戶提供對內(nèi)容的訪問。一個或多個數(shù)據(jù)項目因此可包括:加密內(nèi)容、關于用戶和/或用戶系統(tǒng)280的細節(jié)或其標識;指定一個或多個許可和/或權(quán)限的數(shù)據(jù);以及一個或多個密碼密鑰(其可以被存儲為初始軟件項目220的一部分)。因此,期望的是保護初始軟件項目220,使得攻擊者不能以未授權(quán)方式使用初始軟件項目220以從而即使攻擊者未被授權(quán)訪問內(nèi)容也獲得對內(nèi)容的訪問,即防止攻擊者繞過由初始軟件項目220提供的有條件訪問和/或數(shù)字權(quán)限管理功能(例如,通過確定一個或多個解密密鑰或者規(guī)避涉及是否應為用戶提供對內(nèi)容的訪問的初始軟件項目220中的決策點或分支點)。將認識到的是當然存在初始軟件項目220可以執(zhí)行的其它功能和/或初始軟件項目220使用的初始軟件項目220將期望(由于類似或可能替換的原因)保護其免于攻擊者的其它信息。因此,如圖2中所示,初始軟件項目220被提供(或傳輸或傳送)至軟件保護系統(tǒng)250。
軟件保護系統(tǒng)250包括(或者執(zhí)行或使用)軟件保護工具252。軟件保護工具252可以是例如軟件保護系統(tǒng)250的處理器執(zhí)行的軟件應用程序。軟件保護工具252被布置成接收初始軟件項目220作為輸入。軟件保護工具252基于接收到的初始軟件項目220而生成受保護軟件項目260。稍后將會描述軟件保護工具252用來生成受保護軟件項目260的方法。
軟件生成系統(tǒng)210和軟件保護系統(tǒng)250可被不同的實體運行或操作。因此,如圖2中所示,軟件保護系統(tǒng)250可將受保護軟件項目260輸出到軟件生成系統(tǒng)210。用此模型,軟件保護系統(tǒng)250向軟件生成系統(tǒng)210提供保護服務。替換地,軟件生成系統(tǒng)210和軟件保護系統(tǒng)250可被同一實體運行或操作——事實上,軟件生成系統(tǒng)210和軟件保護系統(tǒng)250可構(gòu)成單個系統(tǒng)的一部分(在圖2中用虛線270示出),所述單個系統(tǒng)使用軟件生成工具212來生成初始軟件項目220并使用軟件保護工具252通過生成受保護軟件項目260來保護該初始軟件項目220。
因此,軟件生成系統(tǒng)210和/或軟件保護系統(tǒng)250可經(jīng)由網(wǎng)絡290將受保護軟件項目260輸出(或提供或傳送)到用戶系統(tǒng)280。然而,將認識到的是受保護軟件項目260的分發(fā)可由圖2中未示出的不同實體執(zhí)行。
還將認識到的是受保護軟件項目260可在已經(jīng)由軟件保護系統(tǒng)250生成受保護軟件項目260之后且在到用戶系統(tǒng)280的分發(fā)之前經(jīng)歷各種附加處理。因此,將認識到的是在以下描述中,對受保護軟件項目260的分發(fā)和使用的提及包括由對受保護軟件項目260應用附加處理而引起的軟件塊的分發(fā)或使用。例如,受保護軟件項目260可能需要被編譯和/或與其它軟件項目鏈接(例如,如果受保護軟件項目260將構(gòu)成要分發(fā)到用戶系統(tǒng)280的較大軟件應用程序的一部分)。然而,將認識到的是可不需要此類附加處理(例如,如果受保護軟件項目260是準備好用于分發(fā)的最終JavaScript塊的話)。
網(wǎng)絡290可以是適合于向用戶系統(tǒng)280傳送或傳輸受保護軟件項目260的任何種類的數(shù)據(jù)通信網(wǎng)絡。因此,網(wǎng)絡290可包括以下各項中的一個或多個:局域網(wǎng)、廣域網(wǎng)、城域網(wǎng)、互聯(lián)網(wǎng)、無線通信網(wǎng)、有線或線纜通信網(wǎng)、衛(wèi)星通信網(wǎng)、電話網(wǎng)等。軟件生成系統(tǒng)210和/或軟件保護系統(tǒng)250可被布置成經(jīng)由任何適當?shù)臄?shù)據(jù)通信協(xié)議經(jīng)由網(wǎng)絡290與用戶系統(tǒng)280通信。事實上,可經(jīng)由物理介質(zhì)(諸如被存儲在一個或多個CD或DVD上)將受保護軟件項目260提供給用戶系統(tǒng)280,使得網(wǎng)絡290于是可包括用于將物理介質(zhì)在物理上遞送給用戶系統(tǒng)280的遞送系統(tǒng)。
用戶系統(tǒng)280被布置成例如通過在用戶系統(tǒng)280的一個或多個處理器上執(zhí)行受保護軟件項目280來使用受保護軟件項目260。
用戶系統(tǒng)280可以是適合于執(zhí)行受保護軟件項目280的任何系統(tǒng)。因此,用戶系統(tǒng)280可以是以下各項中的一個或多個:個人計算機、膝上計算機、筆記本、平板計算機、移動電話、機頂盒、電視、服務器、游戲控制臺等。軟件保護系統(tǒng)250和軟件生成系統(tǒng)210可例如包括一個或多個個人計算機和/或服務器計算機。因此,用戶系統(tǒng)280、軟件保護系統(tǒng)250和軟件生成系統(tǒng)210中的每一個可包括如上文參考圖1所述的一個或多個相應系統(tǒng)100。
將認識到的是雖然圖2將系統(tǒng)200示為包括單個用戶設備280、單個軟件生成系統(tǒng)210以及單個軟件保護系統(tǒng)250,但系統(tǒng)200可包括多個用戶設備280和/或多個軟件生成系統(tǒng)210和/或多個軟件保護系統(tǒng)250。
2-軟件保護技術
如上所述,軟件保護工具252的目的是保護初始軟件項目220的功能或數(shù)據(jù)處理和/或保護初始軟件項目220所使用或處理的數(shù)據(jù)。特別地,受保護軟件項目260將提供與初始軟件項目220相同的功能或數(shù)據(jù)處理——然而,此功能或數(shù)據(jù)處理是以這樣的方式在受保護軟件項目260中實現(xiàn)的,即使得用戶系統(tǒng)280的操作者不能以非預計或未授權(quán)方式從受保護軟件項目260訪問或使用此功能或數(shù)據(jù)處理(而如果向用戶系統(tǒng)280提供了初始軟件項目220,則用戶系統(tǒng)280的操作者可能是能夠以非預計或未授權(quán)方式訪問或使用功能或數(shù)據(jù)處理的)。同樣地,受保護軟件項目260可以以受保護或已混淆方式存儲秘密信息(諸如密碼密鑰)以從而使得攻擊者更加難以(如果不是不可能的話)推斷或訪問該秘密信息(而如果向用戶系統(tǒng)280提供了初始軟件項目220,則用戶系統(tǒng)280的操作者可能是能夠從初始軟件項目220推斷或訪問該秘密信息的)。
“白盒”環(huán)境是用于軟件項目的執(zhí)行環(huán)境,其中,假設軟件項目的攻擊者具有對于對其進行操作的數(shù)據(jù)(包括中間值)、存儲器內(nèi)容和軟件項目的執(zhí)行/過程流程的完全訪問以及可見性。此外,在白盒環(huán)境中,假設攻擊者能夠例如通過使用調(diào)試器來修改對其進行操作的數(shù)據(jù)、存儲器內(nèi)容和軟件項目的執(zhí)行/過程流程——這樣,攻擊者可以對軟件項目進行實驗并嘗試操縱其操作,旨在規(guī)避最初預計的功能和/或識別秘密信息和/或出于其它目的。事實上,甚至可假設攻擊者知道由軟件項目執(zhí)行的底層算法。
安全軟件程序可被設計成抵抗白盒攻擊,并且使用大范圍的數(shù)據(jù)流程和控制流程變換來混淆由軟件項目實現(xiàn)的功能。該保護適用于靜態(tài)攻擊和運行時攻擊兩者。在攻擊情形中,敵方具有修改代碼和數(shù)據(jù)兩者的能力。
存在可在受保護軟件項目260內(nèi)實現(xiàn)上述軟件保護的許多方式,即,存在其中可對初始軟件項目應用上述軟件保護技術以獲得受保護軟件項目260的許多方式。特別地,為了從初始軟件項目220生成受保護軟件項目260,軟件保護工具252可修改初始軟件項目220內(nèi)的一個或多個代碼部分和/或可向初始軟件項目220中添加或引入一個或多個新代碼部分。用來進行這些修改的實際方式或者用來編寫新代碼部分的實際方式當然可以改變——畢竟,存在編寫軟件以實現(xiàn)相同功能的許多方式。
期望的是防止攻擊者修改軟件項目的執(zhí)行/控制流程,例如防止攻擊者迫使軟件項目在決策塊之后采取一個執(zhí)行路徑而不是合法的執(zhí)行路徑。替換地/附加地,期望知道軟件項目何時被攻擊者篡改了,并且如果檢測到攻擊則采取適當?shù)男袆印?/p>
3-軟件項目的形式驗證
軟件項目(諸如計算機程序)的形式驗證是用以證明軟件項目的某種形式性質(zhì)保持為真(諸如通信協(xié)議或算法(的實現(xiàn))的正確性)的已知科學領域。驗證是“形式的”,因為其基于數(shù)學上合理的技術方法。正確性(或其它性質(zhì))的證明通常是以合理的數(shù)學和邏輯系統(tǒng)中的形式證明的形式。形式證明是在軟件項目的抽象數(shù)學模型上相對于某些形式規(guī)格或性質(zhì)完成的。大多數(shù)一般形式驗證系統(tǒng)是基于霍爾邏輯(也稱為佛洛伊德-霍爾邏輯),而其它邏輯(諸如分離邏輯)被用于證明存儲器相關性質(zhì)?;魻栠壿嫷闹行奶卣魇恰盎魻柸M”,其描述了軟件項目中的一段代碼的執(zhí)行如何改變計算的狀態(tài)?;魻柸M是以下形式的:
{P} C {Q}
其中,P和Q是斷言且C是命令。斷言是置于軟件項目中以指示開發(fā)者認為謂詞在該位置處始終為真的謂詞(真-假語句)。如果斷言在運行時間評估為假,則這導致斷言失敗,其可例如引起軟件項目的執(zhí)行異常中斷。在霍爾邏輯中,P稱為前條件且Q稱為后條件:當滿足前條件P時,執(zhí)行命令C建立后條件Q。相關地,不變式是在軟件項目的執(zhí)行期間或者在其某個部分期間可以取決于其而為真的條件。其是在執(zhí)行中的已知點或位置處始終保持為真的邏輯斷言。換言之,不變式在形式上被定義為被證明在軟件項目的執(zhí)行中在至少一個特定點處保持為真的謂詞。將理解的是還可以在其它邏輯系統(tǒng)(例如分離邏輯,如上所述)中定義和使用不變式。
在“防御性編程”中,斷言意圖作為敘述不變式在軟件項目中的特定點處保持為真的文檔。斷言還在編程語言中用來幫助在開發(fā)期間捕捉錯誤假設。一旦此類斷言語句被添加到代碼,則基于驗證的系統(tǒng)自動地檢查其在運行時間是否保持為真。如果斷言并不保持為真,則驗證系統(tǒng)在運行時間生成錯誤。在C編程語言的assert.h標準庫中定義的宏assert()實現(xiàn)用于C的簡單驗證系統(tǒng)。然而,到目前為止,斷言(或類似物)未被用于保護軟件項目。
存在用以自動地識別/檢測不變式并將其公式化的許多方式/工具,但其一般地分成兩個陣營:運行時工具和編譯時工具。“抽象解釋”是用于落入編譯時工具陣營的非常尖端的分析工具的理論基礎。抽象解釋可以用來識別范圍從簡單到較復雜的不變式。抽象解釋是在考慮到特定性質(zhì)的情況下而完成的。用抽象域的選擇來表達性質(zhì)的種類。下面描述某些示例性抽象域和每個域適合于的性質(zhì)的類型。
可以使用數(shù)值抽象域來發(fā)現(xiàn)軟件項目中的程序變量的數(shù)值性質(zhì)。例如,使用符號抽象域來計算軟件項目中的各種點處的一個或多個程序變量的符號。因此,在符號抽象域中的一個示例中,前條件P可斷言特定程序變量x在命令C之前是正的,并且后條件Q可斷言上述程序變量x在命令C之后是負的。在本示例中,讓我們假設命令C將x的值(其最初是正的)設定成另一值y,其中,y是負的。因此,本示例中的霍爾三元組將是:
區(qū)間抽象域更加精確,并且被用來根據(jù)程序變量x落入其中的區(qū)間或范圍來識別不變式。因此,在區(qū)間抽象域中的一個示例中,前條件P可斷言特定程序變量x在命令C之前落入?yún)^(qū)間[2, 8]中,并且后條件Q可斷言x在命令C之后落入?yún)^(qū)間[-7, -2]中。再次地,讓我們假設命令C將x的值設定成另一值y。因此,本示例中的霍爾三元組將是:
關系抽象域甚至更加精確,因為其考慮到程序變量之間的關系。例如,線性方程抽象域?qū)⒆R別形式的不變式;多面體抽象域被用來識別形式的不變式;并且橢圓體抽象域被用來識別形式的不變式。關系數(shù)值抽象域的一些另外的示例對于整數(shù)、凸多面體、“八邊形”以及差分有界矩陣是同余關系??赏ㄟ^考慮上述抽象域(及任何其它的)的組合來識別另外的不變式。
4-一種保護軟件項目的方法
已發(fā)明性地認識到可以將斷言(或類似物)用于保護軟件項目,而不僅僅用于軟件項目的形式驗證。
因此,如在圖3中示意性地所示,本發(fā)明提供了一種保護軟件項目(諸如上述軟件項目220)的方法300。方法300包括識別在軟件項目中的指定點處保持為真的不變式的步驟S310。方法300還包括通過在軟件項目中的指定點處插入代碼來生成受保護軟件項目(諸如上述受保護軟件項目260)的步驟S320。所述代碼在被處理器執(zhí)行時被布置成檢查不變式是否保持為真,并且響應于不變式不保持為真而被布置成調(diào)用安全事件程序。
方法300可包括生成軟件項目的可選初始步驟S305。此步驟可由圖2中所示的軟件生成系統(tǒng)執(zhí)行。本方法還可包括混淆受保護軟件項目和/或應用一個或多個另外的軟件保護技術的可選步驟S325。優(yōu)選地,在不變式識別步驟S310之后執(zhí)行混淆步驟S325(并且更優(yōu)選地,還在生成受保護軟件項目的步驟S320之后執(zhí)行混淆步驟S325),使得可使用軟件項目的更加基礎(即,更干凈)的版本來執(zhí)行不變式識別和代碼插入。這使得更容易識別不變式,因為混淆代碼比原始代碼更長且更復雜/難處理。然而,將認識到的是在步驟S310和S320之前或者在步驟S310和S320之間執(zhí)行混淆也將是可能的。在某些實施例中,如上文所討論的,可由軟件保護工具252來執(zhí)行步驟S310、S320和S325。處理器可形成圖2中所示的用戶系統(tǒng)280的一部分。在圖3中,用虛線來指示可選步驟S305和S325。
如上文所討論的,不變式是在軟件項目的執(zhí)行期間或者在其某個部分期間可以取決于其而為真的條件。在上述方法300中,不變式是在軟件項目的執(zhí)行期間在指定點處可以取決于其而為真的條件。軟件項目包括一個或多個程序變量,并且這些程序變量所取的值在軟件項目的執(zhí)行過程中可改變??筛鶕?jù)指定點處的軟件項目中的至少一個程序變量的一個或多個性質(zhì)或值來定義條件和/或其可根據(jù)指定點處的軟件項目中的程序變量之間的一個或多個關系來定義。換言之,不變式識別在軟件項目的執(zhí)行期間在指定點處可以取決于其而為真的軟件項目中的一個或多個程序變量的一個或多個性質(zhì)和/或值(和/或其之間的關系)。重要的是,我們在這里參考未被攻擊時的初始軟件項目的執(zhí)行;換言之,不變式在正常操作條件下的執(zhí)行期間應在指定點處保持為真。因此,可以將不變式視為軟件項目中的一個或多個程序變量的函數(shù),并且可將該函數(shù)視為謂詞,因為其根據(jù)其變量的值/性質(zhì)而可以是真或假的。根據(jù)方法300,步驟S310識別(初始/未受攻擊)軟件項目中的指定點處保持為真的不變式。
因此,方法300向軟件項目中插入代碼以檢查不變式是否的確在運行時間在指定點處保持為真。因此,重要的是,“不變式檢查”是在運行時(即在受保護軟件項目的執(zhí)行期間)而不是在編譯時執(zhí)行的。
方法300有效地提供一種“不變式檢查”生成系統(tǒng),其使用基于形式驗證的系統(tǒng)來產(chǎn)生軟件項目所隱含的且對攻擊者而言常常模糊的潛在復雜的不變式。這些不變式檢查被添加到例如軟件項目的源代碼,并且所添加的代碼針對數(shù)據(jù)的操縱且針對軟件項目的控制流程的修改進行保護。
期望的是不變式檢查被以從而隱藏存在可策動安全事件程序的不變式檢查的事實的方式被集成/插入到軟件項目中。在這方面可使用已知的軟件混淆技術,并且還參見WO2013/142980和US6192475,并且其整個公開被通過引用結(jié)合到本文中。不變式檢查生成系統(tǒng)以這樣的方式插入添加的代碼,即,使得稍后的軟件混淆工具(例如,在步驟S325中)能夠利用不變式檢查語句來容易地生成對已變換數(shù)據(jù)且對已變換代碼進行操作的不變式檢查的已混淆版本。
圖4示意性地圖示出已根據(jù)圖3的方法300受到保護的受保護軟件項目的運行時執(zhí)行400。在步驟S410處,受保護軟件項目的執(zhí)行開始。受保護軟件項目的執(zhí)行持續(xù)直至諸如執(zhí)行到達插入代碼處的時間(如在上述圖3的步驟S320中所參考的)為止。在步驟S420處,受保護軟件項目的執(zhí)行到達插入代碼處。如先前提到的,插入代碼被布置成檢查不變式是否保持為真。因此,在步驟S430處,此不變式檢查發(fā)生。如果發(fā)現(xiàn)不變式保持為真,則受保護軟件項目的執(zhí)行在步驟S440處如常繼續(xù)。換言之,受保護軟件項目的執(zhí)行以與針對初始軟件項目將預期的相同方式繼續(xù);具體地,受保護軟件項目的執(zhí)行繼續(xù)至緊接在不變式檢查之后的代碼。如果另一方面,不變式檢查失敗(即如果發(fā)現(xiàn)不變式為假),則插入的代碼在步驟S450處調(diào)用安全事件程序。
如上文所討論的,不變式已被定義成使得其在軟件項目(例如初始軟件項目220)中的指定點處保持為真。因此,在不存在對受保護軟件項目(例如,受保護軟件項目260)的攻擊或任何篡改的情況下,不變式應在受保護軟件項目的執(zhí)行期間在指定點處也保持為真(即,步驟S430處的檢查應導致“真”的發(fā)現(xiàn),從而導致步驟S440處的受保護軟件項目的繼續(xù)執(zhí)行)。然而,如果存在對受保護軟件項目的攻擊(或篡改或破壞),則受保護軟件項目或正被受保護軟件項目處理或使用的數(shù)據(jù)可能已被修改,使得不變式在運行時在指定點處不再保持為真。因此,雖然不變式應(即意圖)在受保護軟件項目中在運行時保持為真,但可能的是不變式將由于對受保護軟件項目的攻擊而不保持為真。在這種情況下,已根據(jù)方法300受到保護的受保護軟件項目的執(zhí)行能夠在運行時借助于失敗的不變式檢查(參見圖4中的步驟S430和S450)而間接地識別到存在攻擊。響應于運行時的失敗的不變式檢查,代碼被布置成調(diào)用(或策動或?qū)嵭谢驁?zhí)行)如在圖4的步驟S450處所示的安全事件程序。
方法300是特別有用的,因為攻擊者不太可能意識到不變式存在于受保護軟件項目中,特別是如果不變式是基于程序變量的性質(zhì)和/或值的相對復雜的組合的話。很明顯,如果攻擊者不知道存在不變式,則他們將不知道以不變式在指定點處仍保持為真的這樣的方式修改受保護軟件項目。因此,通過執(zhí)行步驟S430的不變式檢查,在不變式檢查已借助于方法300被插入到軟件項目中的情況下,意圖不可檢測的攻擊變得可檢測。
將認識到的是方法300可不涉及到保護整個軟件項目。在這種情況下,方法300還可包括選擇要保護的軟件項目的一部分。該部分可包括一個或多個單獨的代碼塊。在本實施例中,指定點(即在該處不變式保持為真的點)位于軟件項目的選定部分中。例如,很可能軟件項目中的某些代碼部分比其它部分更符合攻擊的條件(即,對攻擊者更加有吸引力)。特別地,攻擊者很可能以潛在地使得攻擊者能夠獲得包含在軟件項目內(nèi)的秘密信息(諸如密碼密鑰)的(一個或多個)代碼部分或者在執(zhí)行特定操作之前執(zhí)行秘密信息的驗證的代碼部分為目標。因此,方法300可首先涉及到選擇關于這些高度敏感性操作的那些代碼部分。
當在步驟S450處被調(diào)用時,安全事件程序可被布置成引起處理器按需采取預定行動。換言之,可酌情配置安全事件程序,使得發(fā)生期望的作為結(jié)果的行動。安全事件程序可由軟件保護系統(tǒng)250配置。例如,軟件保護工具252可向軟件項目添加代碼以便執(zhí)行安全事件程序。在失敗的不變式檢查之后發(fā)生的預定行動可根據(jù)情況而不同,使得方法300非常靈活。例如,如果發(fā)現(xiàn)高度關鍵(非常重要)的不變式在運行時在相關指定點處并未保持為真,則相應地鄭重的預定行動可能是適當?shù)?。例如,當安全事件程序被調(diào)用時,其可被布置成引起處理器中斷受保護軟件項目的執(zhí)行和/或在安全事件程序的調(diào)用之后的預定時間段內(nèi)防止受保護軟件項目的執(zhí)行和/或防止受保護軟件項目的未來執(zhí)行。替換地,如果發(fā)現(xiàn)不那么關鍵的不變式在運行時在相關指定點處并未保持為真,則相應地不那么鄭重的預定行動可能是適當?shù)?。例如,當安全事件程序被調(diào)用時,其可被布置成引起處理器確保由受保護軟件項目輸出的數(shù)據(jù)被破壞和/或提供關于安全事件程序的調(diào)用的通知。被破壞的輸出數(shù)據(jù)可使得受保護軟件項目不可用??上蜍浖椖康奶峁┓剑ɡ鐖D2的軟件生成系統(tǒng)210)和/或受保護軟件項目的提供方(例如圖2的軟件保護系統(tǒng)250)和/或另一感興趣實體提供該通知。該通知可包括識別執(zhí)行受保護軟件項目的實體的數(shù)據(jù)(例如,關于圖2的用戶系統(tǒng)280的數(shù)據(jù)或關于處理器的某些其它數(shù)據(jù))。該通知優(yōu)選地包括識別導致了失敗檢查的不變式的數(shù)據(jù)。
在某些實施例中,不變式可僅在軟件項目中的指定點處保持為真。替換地,不變式可附加地在除軟件項目中的指定點之外的附加點處保持為真。例如,不變式可在軟件項目的一部分的執(zhí)行期間保持為真,其中,該部分包括軟件項目中的一個或多個特定代碼塊。在這種情況下,可將指定點定義為一個或多個特定代碼塊中的任何點。換言之,如果不變式在一個或多個特定代碼塊的執(zhí)行期間保持為真,則可在軟件項目中的一個或多個特定代碼塊中的任何點處插入在步驟S320處要插入到軟件項目中的代碼,從而提供受保護軟件項目。如果期望的話,事實上可在一個或多個特定代碼塊中的多個點處插入上述代碼,從而提供多個軟件保護不變式檢查點。在某些情況下,不變式可在整個軟件項目的執(zhí)行期間(即縱貫軟件項目的執(zhí)行)保持為真。在這種情況下,可將指定點定義為軟件項目中的任何點。再次地,如果期望的話,可在軟件項目中的多個點處插入上述代碼,從而提供多個軟件保護不變式檢查。
在某些實施例中,在軟件項目中的指定點處插入代碼可至少部分地自動地執(zhí)行。例如,可由圖2的軟件保護工具252自動地執(zhí)行該插入。替換地/附加地,該插入可至少部分地手動地或用人類交互來執(zhí)行。
同樣地,在某些實施例中,識別不變式的步驟S310可至少部分地自動地執(zhí)行。例如,該識別可由圖2的軟件保護工具252自動地執(zhí)行。例如,識別不變式的步驟可包括使用靜態(tài)程序分析工具。示例性靜態(tài)程序分析工具包括Astrée、CPAchecker、éCLAIR、Fluctuat、Polyspace、Coverity Prevent、Klocwork Insight、Parasoft Jtest、Parasoft C/C++test、Red Lizard的Goanna以及Frama-C值分析。替換地/附加地,該識別可至少部分地手動地或用人類交互來執(zhí)行。
在某些實施例中,識別不變式的步驟S310包括識別多個不變式,其中的每一個在軟件項目中的各指定點處保持為真,并且然后從所述多個不變式中選擇不變式為所述不變式。當然,將認識到的是可從所述多個不變式中選擇超過一個不變式,并且可關于所選定的不變式中的每一個應用方法300。下面給出了關于方法300對超過一個不變式的適用性的進一步的細節(jié)。
在某些實施例中,可將不變式視為第一不變式,可將指定點視為第一指定點,并且可將插入代碼視為第一代碼,使得第一不變式在軟件項目中的第一指定點處保持為真,并且使得在軟件項目中的第一指定點處插入第一代碼,從而生成受保護軟件項目。在這種情況下,方法300還可包括識別在軟件項目中的第二指定點處保持為真的第二不變式。第二不變式可與第一不變式相同或者可不與其相同,并且第二指定點可與軟件項目中的第一指定點相同或者可不與其相同。然而,為了避免冗余,如果第一和第二指定點是相同的,則第一和第二不變式不應是相同的,并且反之亦然。生成受保護軟件項目的步驟S320還可包括在軟件項目中的第二指定點處插入第二代碼。第二代碼在被處理器執(zhí)行時被布置成檢查第二不變式是否保持為真,并且響應于第二不變式不保持為真而被布置成調(diào)用第二安全事件程序。第二安全事件程序可與第一安全事件程序相同或不同。
讓我們考慮其中在軟件項目中(例如使用諸如Frama-C值分析之類的靜態(tài)程序分析工具)識別多個不變式I1, I2,…, In的特定示例。在這種情況下,可選擇已識別不變式的子集作為受保護軟件項目的一部分用于檢查:讓我們假設選擇三個不變式的子集,亦即I1、I7和I22(當然,將認識到的是可以同樣地選擇不變式的不同子集,或者替換地可以選擇不變式中的所有)。假設不變式I1僅在軟件項目中的指定點P1處保持為真。假設不變式I7僅在軟件項目中的不同點P7處保持為真。假設不變式I22在軟件項目中的多個點處保持為真,即點P1、P7和P22。在本示例中,可以通過向軟件項目中插入包括以下各項中的一個或多個的代碼來生成受保護軟件項目:
1. 在軟件項目中的點P1處插入的用以執(zhí)行針對不變式I1的不變式檢查的代碼
2. 在軟件項目中的點P7處插入的用以執(zhí)行針對不變式I7的不變式檢查的代碼
3. 在軟件項目中的點P1處插入的用以執(zhí)行針對不變式I22的不變式檢查的代碼
4. 在軟件項目中的點P7處插入的用以執(zhí)行針對不變式I22的不變式檢查的代碼
5. 在軟件項目中的點P22處插入的用以執(zhí)行針對不變式I22的不變式檢查的代碼
可以將上面所列的每個代碼部分循序地插入到軟件項目中從而漸進地生成受保護軟件項目。替換地,可以將上面所列的每個代碼部分同時地插入到軟件項目中從而一次性地生成受保護軟件項目。
上面所列的代碼部分中的至少一個可包括被插入到軟件項目中的明示代碼。例如,可以如下將IF-THEN語句插入到軟件項目中:
替換地/附加地,上面所列的代碼部分中的至少一個可包括與C編程語言中的assert()宏類似的相應的宏。然而,所插入的代碼部分所調(diào)用的功能與assert()宏的不同,因為所插入的代碼部分被布置成在適當?shù)那闆r下調(diào)用安全事件程序。替換地/附加地,上面所列的代碼部分中的至少一個可調(diào)用執(zhí)行相應的不變式檢查的函數(shù)。很明顯,宏和/或函數(shù)還將需要可用于軟件項目(例如在其中定義),如果使用的話。
還設想被布置成執(zhí)行方法300的裝置。如上所述,此類裝置可以是圖2的軟件保護系統(tǒng)250。還設想在被處理器執(zhí)行時引起處理器實現(xiàn)方法300的計算機程序。另外,還設想存儲此類計算機程序的計算機可讀介質(zhì)。
5-示例
可以以被插入到不變式在其處保持為真的(一個或多個)指定點處的布爾條件的形式指定不變式檢查。例如:
其中,x和y是程序變量,并且“INVARIANT_CHECK”是對執(zhí)行不變式檢查并在必要時調(diào)用安全事件程序的宏或函數(shù)的調(diào)用。在本示例中,不變式是2x+3y>=13。上文給出的示例性不變式檢查利用在上述小節(jié)3中提到的多面體抽象域。不變式檢查可以被單獨地且在開發(fā)后并且在形式驗證工具已在軟件項目上運行并產(chǎn)生了不變式之后插入,可能是由安全保證人員,其可與創(chuàng)建了初始軟件項目220的軟件開發(fā)者不同。
考慮C類型編程語言中的以下函數(shù)“main”:
根據(jù)方法300,有必要在步驟S310中識別不變式。如上文所討論的,這可使用諸如Frama-C值分析之類的靜態(tài)程序分析工具來進行。下面是由Frama-C工具對在“main”函數(shù)的第8行中的語句之前的上面所列的函數(shù)“main”進行的值分析的結(jié)果的一部分:
函數(shù):main
語句:8(xor. c 中的第8 行)
變量串具有類型“char [11]”。
其是全局變量。
其被參考且不獲取其地址。
在語句之前:
同樣地,在“main”函數(shù)的第8行中的語句之后,F(xiàn)rama-C工具提供以下值分析:
作為示例,可使用string[2]在第8行中的語句的執(zhí)行之前或之后將不變式公式化。因此,下面我們示出了通過對上文所示的原始“main”函數(shù)執(zhí)行方法300而產(chǎn)生的受保護軟件項目的示例:
上文新添加的語句是在圖3的步驟S320中參考的插入代碼。在運行時,新添加的語句調(diào)用執(zhí)行不變式檢查的宏或函數(shù),并且如果不滿足關于string[2]的條件則調(diào)用安全事件程序。
將理解的是上述代碼是示例性的,并且本發(fā)明的方法300并不是C/C++編程語言所特定的。事實上,方法300甚至不是傳統(tǒng)命令式語言所特定的。不變式存在于在以諸如聲明式語言(例如DRM策略語言)之類的任何語言編寫的程序中。如果對于特定編程語言而言(尚)不存在分析工具,則在方法300的步驟S310中以逐個情況為基礎(至少部分地手動地)計算不變式是可能的。
6-修改
將認識到的是所述的方法已被示為按照特定順序?qū)崿F(xiàn)的單獨步驟。然而,技術人員將認識到這些步驟可被組合或者按照不同的順序?qū)崿F(xiàn),同時仍達到期望的結(jié)果。
將認識到的是可使用各種不同的信息處理系統(tǒng)來實現(xiàn)本發(fā)明的實施例。特別地,雖然附圖及其討論提供了示例性計算系統(tǒng)和方法,但是這些僅僅是為了在討論本發(fā)明的各種方面時提供有用參考而提出的。可在任何適當?shù)臄?shù)據(jù)處理設備上實現(xiàn)本發(fā)明的實施例,所述數(shù)據(jù)處理設備諸如個人計算機、膝上型計算機、個人數(shù)字助理、移動電話、機頂盒、電視、服務器計算機等。當然,已出于討論的目的簡化了系統(tǒng)和方法的描述,并且其僅僅是可被用于本發(fā)明的實施例的許多不同類型的系統(tǒng)和方法中的一個。將認識到的是邏輯塊之間的邊界僅僅是說明性的,并且替換實施例可將邏輯塊或元素合并,或者可對各種邏輯塊或元素施加功能的替換分解。
將認識到的是可將上述功能實現(xiàn)為作為硬件和/或軟件的一個或多個對應模塊。例如,可將上述功能實現(xiàn)為一個或多個軟件組件以便由系統(tǒng)的處理器執(zhí)行。替換地,可將上述功能實現(xiàn)為硬件,諸如在一個或多個現(xiàn)場可編程門陣列(FPGA)和/或一個或多個專用集成電路(ASIC)和/或一個或多個數(shù)字信號處理器(DSP)和/或其它硬件布置上。如上所述的方法步驟每個可由對應的相應模塊實現(xiàn);多個方法步驟可一起由單個模塊實現(xiàn)。
將認識到的是只要由計算機程序?qū)崿F(xiàn)本發(fā)明的實施例的范圍,則承載計算機程序的存儲介質(zhì)和傳輸介質(zhì)構(gòu)成本發(fā)明的方面。計算機程序可具有一個或多個程序指令或程序代碼,其在被計算機執(zhí)行時實現(xiàn)本發(fā)明的實施例。如本文所使用的術語“程序”可以是針對在計算機系統(tǒng)上執(zhí)行而設計的指令序列,并且可包括子例程、函數(shù)、程序、模塊、對象方法、對象實現(xiàn)、可執(zhí)行應用程序、小應用程序、小服務程序、源代碼、目標代碼、共享庫、動態(tài)鏈接庫和/或針對在計算機系統(tǒng)上執(zhí)行而設計的其它指令序列。存儲介質(zhì)可以是磁盤(諸如硬驅(qū)或軟盤)、光盤(諸如CD-ROM、DVD-ROM或BluRay盤)或存儲器(諸如ROM、RAM、EEPROM、EPROM、閃存或便攜式/可移除存儲器設備)等。傳輸介質(zhì)可以是通信信號、數(shù)據(jù)廣播、兩個或更多計算機之間的通信鏈路等。