本公開一般涉及計(jì)算機(jī)系統(tǒng),具體地,涉及在這種系統(tǒng)中的軟件代碼的完整性。
背景技術(shù):
本部分是旨在向讀者介紹可能與下文所述的和/或所要求保護(hù)的本公開各個(gè)方面相關(guān)的現(xiàn)有技術(shù)的各方面。這樣的討論有助于向讀者提供背景信息以便幫助更好地理解本公開的各方面。因此,應(yīng)當(dāng)理解,這些陳述應(yīng)鑒于此被解讀,而不是作為對(duì)現(xiàn)有技術(shù)的承認(rèn)。
由于各種原因,通常希望確保處理設(shè)備執(zhí)行未被篡改的軟件。為此,可以使用不同的技術(shù)來保護(hù)軟件鏡像免受篡改攻擊。最常見的技術(shù)是計(jì)算代碼片段上的簽名或校驗(yàn)和,然后在稍后階段驗(yàn)證簽名或校驗(yàn)和。通常在無需任何秘密的情況下計(jì)算和驗(yàn)證校驗(yàn)和,而密碼簽名的生成需要私鑰,簽名的驗(yàn)證需要相應(yīng)的公鑰。
基于校驗(yàn)和的保護(hù)的示例是windows操作系統(tǒng)中使用的可移植可執(zhí)行(pe)格式的crc32。pe頭包含一個(gè)crc32字段,該字段給出相應(yīng)代碼部分的校驗(yàn)和。為了成功繞過保護(hù),攻擊者首先修改代碼部分,然后用在修改后的代碼部分上計(jì)算的新值替換原始校驗(yàn)和。這種類型的攻擊是可能的,因?yàn)楣粽卟恍枰魏蚊孛軄砀滦薷暮蟮拇a部分的校驗(yàn)和。
鑒于校驗(yàn)和的弱點(diǎn),加密簽名是優(yōu)選的解決方案。簽名的生成在代碼釋放之前執(zhí)行,并且使用私有密鑰(因此秘密)。關(guān)聯(lián)的公鑰被附加到代碼,之后在安裝代碼或運(yùn)行時(shí)用來檢查代碼的完整性。攻擊者仍然可以修改代碼,但是由于沒有私鑰無法生成代碼的正確簽名,所以攻擊失敗。
存在許多用于檢查以原生代碼(nativecode)交付和執(zhí)行的應(yīng)用的完整性的解決方案,例如由arxan(guardittm)、metafortress(metafortresstm)等提供的解決方案。原生代碼是可由處理器直接執(zhí)行的匯編指令集。指令集在安裝后不改變,這意味著程序完整性值在安裝前后保持相同(即隨時(shí)間保持不變)。在這種情況下,可以預(yù)先生成簽名,并與應(yīng)用包一起交付。
另一方面,以解釋代碼的形式分發(fā)的應(yīng)用——諸如java編寫的代碼、androiddex代碼等——包括在執(zhí)行前必須經(jīng)過解釋器的中間指令。與原生代碼不同,解釋代碼可以在安裝時(shí)間之后被修改,以用于優(yōu)化目的。代碼修改通常非常依賴于目標(biāo)平臺(tái),因此不一定是可預(yù)測(cè)的。如果代碼被修改,則在解釋代碼上生成的簽名不能用于在運(yùn)行時(shí)動(dòng)態(tài)地檢查代碼完整性和真實(shí)性。
為了將應(yīng)用軟件分發(fā)并安裝到上文提到的安卓(android)操作系統(tǒng)上,使用一種被稱為apk(安卓應(yīng)用包)的文件格式。要制作一個(gè)apk文件,首先將安卓程序編譯為中間語言,然后將其部分打包成壓縮歸檔文件(zip格式)。歸檔文件包含在單個(gè)dex(dalvik可執(zhí)行代碼)文件、各種資源(例如圖像文件)以及apk文件的清單中的整個(gè)程序代碼。歸檔文件包括兩個(gè)附加文件:cert.sf和cert.rsa。cert.sf包含所有其他歸檔文件的加密散列;cert.rsa包含用于簽名驗(yàn)證的公鑰。只有cert.sf使用rsa私鑰來簽名。cert.sf的rsa簽名能夠?qū)崿F(xiàn)在安裝期間對(duì)apk文件的全部內(nèi)容的驗(yàn)證。事實(shí)上,cert.sf文件中提到的所有文件都被間接簽名,因?yàn)閏ert.sf包含它們的散列。在安裝之前更改任何文件將導(dǎo)致錯(cuò)誤,因?yàn)檐浖?huì)檢測(cè)到文件摘要與cert.sf文件中的散列不匹配。備選地,修改cert.sf文件內(nèi)的加密散列值(如上述已經(jīng)描述的針對(duì)基于校驗(yàn)和的驗(yàn)證的攻擊中)將導(dǎo)致簽名驗(yàn)證期間的錯(cuò)誤。
dex文件頭還包含dex文件內(nèi)容的全局校驗(yàn)和。在第一次執(zhí)行應(yīng)用時(shí),安卓系統(tǒng)使用優(yōu)化器,該優(yōu)化器在執(zhí)行之前及時(shí)將dex解釋字節(jié)碼修改為優(yōu)化機(jī)器指令序列,也稱為odex(優(yōu)化dex)。優(yōu)化器還更新校驗(yàn)和。然后,將odex文件存儲(chǔ)在安卓文件系統(tǒng)中的特定存儲(chǔ)庫中,以備將來使用。odex文件然后成為應(yīng)用軟件的參考,當(dāng)它存在時(shí),不再使用原始dex文件。
在運(yùn)行時(shí),系統(tǒng)可以使用odex校驗(yàn)和來驗(yàn)證應(yīng)用的完整性。但是,在安卓操作系統(tǒng)中默認(rèn)情況下不設(shè)置此選項(xiàng),并且用于執(zhí)行odex代碼的dalvik機(jī)器并不總是檢查odex校驗(yàn)和,因?yàn)樾r?yàn)和驗(yàn)證對(duì)執(zhí)行性能和引導(dǎo)時(shí)間的影響不可忽視。
安卓5.0及更高版本引入了安卓運(yùn)行時(shí)(androidruntime)(art)來替代dalvik機(jī)器。應(yīng)用仍然部署在dex代碼中,但在安裝時(shí),使用提前編譯(aot)功能將dex代碼編譯為原生代碼。與以前的解決方案類似,dex文件上的aot編譯產(chǎn)生一個(gè)二進(jìn)制可執(zhí)行可鏈接格式(elf)文件(其取代以前解決方案中的odex)。然后,應(yīng)用的dex代碼被編譯一次,此后,每次執(zhí)行應(yīng)用時(shí)都啟動(dòng)elf代碼。在art直接運(yùn)行原生代碼(elf代碼)時(shí),它帶來更快的應(yīng)用執(zhí)行并改善總體功耗。
因此,可以看出,在安卓系統(tǒng)中,apk簽名僅在安裝時(shí)被驗(yàn)證。此外,如果用戶允許安裝來自不可信來源的應(yīng)用,即使未被中央授權(quán)機(jī)構(gòu)簽名,apk也可以安裝在安卓設(shè)備上。然后,應(yīng)用開發(fā)者使用他們自己的與任何可信授權(quán)機(jī)構(gòu)都不關(guān)聯(lián)的自簽名證書。在這種情況下,在其所有者不知情的情況下,被篡改的應(yīng)用可以被任何黑客重簽名并重新安裝在安卓設(shè)備上。
如上所述,安卓應(yīng)用使用解釋器可移植格式(dex)。這種可移植格式可以在以下不同架構(gòu)和特性的大量設(shè)備上執(zhí)行:arm,x86,mips,little/bigendian等。為了提高性能,dex代碼在安裝時(shí)或應(yīng)用第一次使用時(shí)被修改,以產(chǎn)生針對(duì)目標(biāo)設(shè)備進(jìn)行優(yōu)化的odex或elf二進(jìn)制文件。在優(yōu)化或oat編譯期間,可以代碼內(nèi)的各種內(nèi)容被修改:指令可以被其它指令替代,指令的對(duì)齊可以改變,字節(jié)順序可以交換,等等。
這時(shí),優(yōu)化和oat編譯引發(fā)了安全問題。雖然dex文件的簽名仍然可以使用cert.sf和cert.rsa來驗(yàn)證,但由于odex和elf文件已被修改,并且它們的完整性不再關(guān)聯(lián)到原始的dex簽名,所以不是這種情況。換句話說,完整性和真實(shí)性只能在安裝時(shí)進(jìn)行驗(yàn)證,而不能在運(yùn)行時(shí)進(jìn)行驗(yàn)證,因?yàn)楣粽吣軌蛐薷膐dex和elf代碼并相應(yīng)地更新頭中的校驗(yàn)和。
因此,系統(tǒng)容易受到至少兩類攻擊:遠(yuǎn)程攻擊和根攻擊。在遠(yuǎn)程攻擊中,下載的惡意應(yīng)用提升其特權(quán)并獲得系統(tǒng)許可。惡意應(yīng)用然后可以篡改存儲(chǔ)在內(nèi)部存儲(chǔ)設(shè)備的緩存存儲(chǔ)庫上的odex和elf文件。在根攻擊中,攻擊者例如通過盜取設(shè)備或者當(dāng)所有者不在場(chǎng)且未鎖定設(shè)備會(huì)話時(shí)訪問設(shè)備,來獲得安卓設(shè)備。攻擊者可以通過usb鏈接從設(shè)備的內(nèi)部存儲(chǔ)設(shè)備中找回已安裝的應(yīng)用,修改應(yīng)用,然后將修改后的應(yīng)用推送回內(nèi)部存儲(chǔ)設(shè)備上。為了使后一種攻擊成功,設(shè)備必須是“根權(quán)限”(即,控制設(shè)備的安卓系統(tǒng)要求“根權(quán)限訪問”)。
因此,安卓應(yīng)用完整性的信任可能在應(yīng)用生命周期中被破壞??梢孕湃伟沧肯到y(tǒng)上安裝的內(nèi)容,但不一定信任正在運(yùn)行的內(nèi)容。
應(yīng)當(dāng)理解,期望有一種解決方案,其克服與解釋代碼應(yīng)用的完整性和真實(shí)性相關(guān)的至少一部分問題。本公開提供了這種解決方案。
技術(shù)實(shí)現(xiàn)要素:
在第一方面,本公開涉及一種用于處理應(yīng)用的設(shè)備。所述設(shè)備包括:接口,被配置為接收應(yīng)用;存儲(chǔ)器,被配置為存儲(chǔ)應(yīng)用和經(jīng)簽名的校驗(yàn)和;以及處理單元,被配置為修改應(yīng)用以獲得修改后的應(yīng)用,向可信實(shí)體發(fā)送針對(duì)修改后的應(yīng)用生成的校驗(yàn)和,從可信實(shí)體接收與所發(fā)送的校驗(yàn)和相對(duì)應(yīng)的經(jīng)簽名的校驗(yàn)和,并將經(jīng)簽名的校驗(yàn)和存儲(chǔ)在存儲(chǔ)器中。
第一方面的各種實(shí)施例包括:
所述應(yīng)用與第一校驗(yàn)和一起被接收,并且所述處理單元還被配置為使用所述第一校驗(yàn)和來驗(yàn)證所述應(yīng)用的完整性。
所述處理單元被配置為使用所述經(jīng)簽名的校驗(yàn)和來在所述修改后的應(yīng)用的運(yùn)行時(shí)驗(yàn)證所述修改后的應(yīng)用的完整性。
應(yīng)用被實(shí)現(xiàn)為解釋代碼(dex),并且修改后的應(yīng)用被實(shí)現(xiàn)為經(jīng)優(yōu)化的解釋代碼(odex),或者修改后的應(yīng)用被編譯為原生代碼(elf)。有利地,所述處理單元被配置為用解釋代碼或經(jīng)優(yōu)化的解釋代碼的頭中的經(jīng)簽名的校驗(yàn)和替換解釋代碼的校驗(yàn)和。
所述設(shè)備是智能電話或平板電腦。
可信實(shí)體實(shí)現(xiàn)在所述設(shè)備中。有利地,所述可信實(shí)體被配置為存儲(chǔ)所述應(yīng)用的至少一個(gè)校驗(yàn)和,以驗(yàn)證修改后的應(yīng)用的校驗(yàn)和與所存儲(chǔ)的應(yīng)用的校驗(yàn)和匹配,并且使用簽名密鑰對(duì)修改后的應(yīng)用的校驗(yàn)和進(jìn)行簽名。優(yōu)選地,所述簽名密鑰是使用軟件保護(hù)技術(shù)來保護(hù)的。
所述可信實(shí)體是單獨(dú)的設(shè)備,并且所述接口還被配置為從所述處理單元接收修改后的應(yīng)用的校驗(yàn)和,并向所述可信實(shí)體發(fā)送修改后的應(yīng)用的校驗(yàn)和,以及從所述可信實(shí)體接收經(jīng)簽名的校驗(yàn)和,并向所述處理單元發(fā)送經(jīng)簽名的校驗(yàn)和。
所述處理單元被配置為將所述應(yīng)用的激活碼與修改后的應(yīng)用的校驗(yàn)和一起發(fā)送。
所述處理單元被配置為與簽名證書一起接收經(jīng)簽名的校驗(yàn)和。
在第二方面,本公開涉及一種用于處理應(yīng)用的方法。設(shè)備接收應(yīng)用,修改應(yīng)用以獲得修改后的應(yīng)用,向可信實(shí)體發(fā)送針對(duì)修改后的應(yīng)用生成的校驗(yàn)和,從可信實(shí)體接收與所發(fā)送的校驗(yàn)和相對(duì)應(yīng)的經(jīng)簽名的校驗(yàn)和,并將經(jīng)簽名的校驗(yàn)和存儲(chǔ)在存儲(chǔ)器中。
附圖說明
作為非限制性示例,現(xiàn)在將參考附圖來描述本公開的優(yōu)選特征,附圖中:
圖1示出了實(shí)現(xiàn)本公開的示例性系統(tǒng);以及
圖2示出了根據(jù)本公開的優(yōu)選實(shí)施例的方法的優(yōu)選實(shí)施例。
具體實(shí)施方式
圖1示出了實(shí)現(xiàn)本公開的示例性系統(tǒng)。該系統(tǒng)包括設(shè)備110、應(yīng)用提供方(應(yīng)用商店)120和可信實(shí)體130。設(shè)備110可以是諸如智能電話或平板電腦的運(yùn)行安卓os的任何種類的合適設(shè)備,并且它包括至少一個(gè)硬件處理單元(“處理器”)111、存儲(chǔ)器112、用于與用戶交互的用戶接口113以及用于通過諸如因特網(wǎng)之類的連接140與應(yīng)用提供方120和可信實(shí)體130進(jìn)行通信的通信接口114。本領(lǐng)域技術(shù)人員將理解,為了清楚的目的,所示出的設(shè)備非常簡潔,并且真實(shí)設(shè)備還可以包括諸如電源和持久存儲(chǔ)設(shè)備的特征。
應(yīng)用提供方120存儲(chǔ)可由設(shè)備110下載的至少一個(gè)應(yīng)用apk文件122。應(yīng)用提供方120還包括硬件處理器124,硬件處理器124被配置為生成與應(yīng)用dex文件相對(duì)應(yīng)的不同odex或elf文件的校驗(yàn)和。這些校驗(yàn)和可以通過將dex文件安裝在不同的測(cè)試或參考設(shè)備上來生成,并從所得到的odex或elf文件來計(jì)算校驗(yàn)和。應(yīng)用提供方120還被配置為將與應(yīng)用dex文件相對(duì)應(yīng)的不同odex或elf文件的校驗(yàn)和發(fā)送到可信實(shí)體130。
可信實(shí)體130可以在安卓os或獨(dú)立設(shè)備內(nèi)部實(shí)現(xiàn)??尚艑?shí)體130包括:用于存儲(chǔ)應(yīng)用的odex或elf校驗(yàn)和的存儲(chǔ)器、用于從設(shè)備110上的安卓os接收odex或elf校驗(yàn)和的接口、用于驗(yàn)證接收到的應(yīng)用的odex或elf校驗(yàn)和匹配所存儲(chǔ)的應(yīng)用的odex或elf校驗(yàn)和的處理單元、用于對(duì)odex或elf校驗(yàn)和進(jìn)行簽名的私有簽名密鑰132以及用于向設(shè)備110發(fā)送經(jīng)簽名的odex或elf校驗(yàn)和的接口。在可信實(shí)體130實(shí)現(xiàn)在安卓os內(nèi)部的情況下,私有簽名密鑰優(yōu)選地使用諸如代碼混淆和白盒加密之類的軟件保護(hù)技術(shù)來保護(hù),或者通過使用諸如密鑰倉庫或密碼引擎之類的特定硬件來保護(hù)。
圖2示出了根據(jù)優(yōu)選實(shí)施例的方法的流程圖。在步驟s202中,應(yīng)用提供方120向可信實(shí)體130發(fā)送它提供給安卓設(shè)備的應(yīng)用的多個(gè)odex或elf校驗(yàn)和。在步驟s204中,設(shè)備110下載并安裝該應(yīng)用的apk文件。如上所述的,在安裝期間,設(shè)備110優(yōu)化或oat編譯apk文件中的dex,獲得odex或elf,并向dex頭添加odex或elf代碼的校驗(yàn)和。應(yīng)該注意的是,cert.sf文件中的散列使設(shè)備110能夠驗(yàn)證dex的完整性。
當(dāng)要首次執(zhí)行應(yīng)用時(shí),源獲取模塊將odex或elf文件的內(nèi)容讀入存儲(chǔ)器112中,從dex頭中讀取odex或elf校驗(yàn)和(cs),并在步驟s206中將它發(fā)送到可信實(shí)體130。優(yōu)選地,odex或elf校驗(yàn)和在諸如安全認(rèn)證信道之類的受保護(hù)連接上發(fā)送。源獲取模塊被包含在應(yīng)用的原生庫中(可以使用除java之外的代碼,例如c/c++語言,來開發(fā)安卓應(yīng)用的一部分)。java原生接口(jni)使得在dalvik機(jī)中運(yùn)行的java代碼能夠調(diào)用與應(yīng)用一起交付的原生庫。
一旦應(yīng)用需要輸入激活碼,校驗(yàn)和可以與激活碼一起被發(fā)送到遠(yuǎn)程可信實(shí)體130。
可信實(shí)體130優(yōu)選地在步驟s208中檢查接收到的odex或elf校驗(yàn)和對(duì)應(yīng)于所存儲(chǔ)的應(yīng)用的odex或elf校驗(yàn)和之一。如果是這種情況,則在步驟s210中,可信實(shí)體130使用私有簽名密鑰對(duì)接收到的odex或elf校驗(yàn)和進(jìn)行簽名,并且在步驟s212中將經(jīng)簽名的odex或elf校驗(yàn)和返回給設(shè)備110??尚艑?shí)體130還可以將包括對(duì)應(yīng)公鑰在內(nèi)的簽名證書與經(jīng)簽名的odex或elf校驗(yàn)和一起發(fā)送。
在步驟s214中,源獲取模塊接收并存儲(chǔ)經(jīng)簽名的odex或elf校驗(yàn)和(如果可用并需要,還有簽名證書)。
然后,在步驟s216中,通過計(jì)算odex或elf的校驗(yàn)和并將其與經(jīng)簽名的odex或elf校驗(yàn)和進(jìn)行比較,具有對(duì)對(duì)應(yīng)于私有簽名密鑰的公鑰的訪問權(quán)的應(yīng)用或安卓os可以檢查odex或elf的完整性。簽名證書的完整性也可以通過使用安裝在設(shè)備上的可信根證書或通過使用最終導(dǎo)致可信根證書的證書鏈來驗(yàn)證。
在隨后執(zhí)行應(yīng)用時(shí)或在當(dāng)前執(zhí)行應(yīng)用期間的任何時(shí)間,可以以與步驟s216相同的方式,即通過計(jì)算odex或elf的校驗(yàn)和,并將其與經(jīng)簽名的odex或elf校驗(yàn)和進(jìn)行比較,來驗(yàn)證應(yīng)用的完整性。為此,有利的是,在安卓操作系統(tǒng)中設(shè)置檢查odex或elf的完整性的選項(xiàng)。
注意,該解決方案與當(dāng)前部署的安卓系統(tǒng)兼容,因?yàn)檫\(yùn)行時(shí)完整性驗(yàn)證所需的代碼是現(xiàn)有安卓os的一部分或所交付的應(yīng)用的apk軟件包的一部分。
在本說明書中,術(shù)語“校驗(yàn)和”旨在覆蓋能夠驗(yàn)證生成校驗(yàn)和的數(shù)據(jù)在生成校驗(yàn)和之后是否被修改的值。因此,校驗(yàn)和可以例如也是散列值、循環(huán)冗余校驗(yàn)(crc)值或其他種類的摘要;優(yōu)選的是,從校驗(yàn)和獲取代碼在計(jì)算上是不可行的。另外,雖然為了清楚起見已經(jīng)使用單個(gè)校驗(yàn)和,但是可以使用多個(gè)校驗(yàn)和,其中可以針對(duì)代碼的不同部分(其中不同部分可以重疊)生成校驗(yàn)和,并且針對(duì)代碼的不同部分的多個(gè)校驗(yàn)和用于生成用于進(jìn)行比較的單個(gè)全局校驗(yàn)和。簽名可以是任何合適的加密簽名,例如基于散列的消息認(rèn)證碼(hmac)或基于例如rsa、數(shù)字簽名算法(dsa)或橢圓曲線數(shù)字簽名算法(ecdsa)的簽名。
應(yīng)當(dāng)理解,本解決方案可以成功地對(duì)抗遠(yuǎn)程攻擊。
如果可信實(shí)體查明接收到的odex或elf校驗(yàn)和對(duì)應(yīng)于“合法”代碼,則也可以對(duì)抗根攻擊。這是為了驗(yàn)證接收到的odex校驗(yàn)和不是包括修改后的代碼在內(nèi)的apk的校驗(yàn)和(如果攻擊者在從應(yīng)用提供方下載后修改代碼,則可能是這種情況)。因此,優(yōu)選地,應(yīng)用提供方120向可信實(shí)體130發(fā)送可能的odex或elf校驗(yàn)和;在變型例中,可信實(shí)體130針對(duì)給定目標(biāo)設(shè)備來oat編譯或優(yōu)化應(yīng)用的dex代碼,以生成不同的odex或elf校驗(yàn)和。注意,潛在的校驗(yàn)和的數(shù)量取決于有限的一組設(shè)備硬件參數(shù)(cpu字節(jié)順序,cpu對(duì)稱多處理(smp)模式等),因此參數(shù)組合的數(shù)量是有限的。例如,針對(duì)nexus7和samsunggalaxytabp5100之間的dex優(yōu)化,只有smp模式是不同的。
盡管已在安卓環(huán)境中描述了目前的解決方案,但它可以適用于在安裝期間修改代碼且不實(shí)現(xiàn)運(yùn)行時(shí)對(duì)所安裝的應(yīng)用進(jìn)行完整性驗(yàn)證的其他操作系統(tǒng)。
因此,應(yīng)當(dāng)理解,本公開提供了可以實(shí)現(xiàn)安卓設(shè)備上的應(yīng)用的運(yùn)行時(shí)完整性的解決方案。
可以獨(dú)立地或以任何適當(dāng)?shù)慕M合提供說明書以及(在適當(dāng)?shù)那闆r下)權(quán)利要求和附圖中公開的每個(gè)特征。被描述為以硬件實(shí)現(xiàn)的特征還可以實(shí)現(xiàn)為軟件,且反之亦然。權(quán)利要求中出現(xiàn)的附圖標(biāo)記僅僅是說明性的,并且對(duì)權(quán)利要求的范圍沒有限制作用。