吳偉民 林水明 余國(guó)鵬 林志毅
基于哈希不透明謂詞的JavaScript軟件水印算法
吳偉民 林水明 余國(guó)鵬 林志毅
(廣東工業(yè)大學(xué)計(jì)算機(jī)學(xué)院 廣東 廣州 510006)
針對(duì)現(xiàn)有軟件水印算法存在性能開銷大或無(wú)法抵抗各類攻擊的缺點(diǎn)和鮮有在JavaScript源碼中實(shí)現(xiàn)的現(xiàn)狀,提出一種基于哈希不透明謂詞的JavaScript軟件水印算法。該算法構(gòu)造一種新的基于除留余數(shù)法哈希映射不透明謂詞并將軟件水印信息嵌入不透明謂詞的表達(dá)式中,進(jìn)而構(gòu)造此不透明謂詞的永假基本塊嵌入程序中實(shí)現(xiàn)軟件水印。開發(fā)了一個(gè)基于此算法的JavaScript軟件水印系統(tǒng)。實(shí)驗(yàn)證明,該算法能在增加較少的系統(tǒng)開銷的前提下有效抵抗各種常見(jiàn)的靜動(dòng)態(tài)攻擊,同時(shí)還能提高水印的隱秘性和魯棒性。
不透明謂詞 除留余數(shù)法 軟件水印 JavaScript
軟件水印是軟件安全領(lǐng)域中的研究熱點(diǎn)。其原理是通過(guò)借助數(shù)字水印的相關(guān)思想,將水印嵌入到軟件中,以保護(hù)軟件的知識(shí)產(chǎn)權(quán)和取締各類非法盜版。目前研究的大部分軟件水印技術(shù)都是基于C/C++或Java等編譯型語(yǔ)言,對(duì)于諸如JavaScript(JS)等解釋型腳本語(yǔ)言的代碼安全技術(shù)研究相對(duì)較少,而JS軟件水印技術(shù)更加鮮見(jiàn)。隨著云計(jì)算技術(shù)的快速發(fā)展,以JS為代表的客戶端語(yǔ)言的使用更加廣泛,如何保護(hù)JS版權(quán)是一項(xiàng)具有現(xiàn)實(shí)意義和經(jīng)濟(jì)效益的研究課題。
目前保護(hù)JS源碼版權(quán)的主要研究有:Patrick等人使用基于堆圖的軟件胎記技術(shù)來(lái)保護(hù)JS代碼的安全性和版權(quán)[1],并通過(guò)構(gòu)建對(duì)比樹來(lái)提取軟件胎記,而缺點(diǎn)是構(gòu)建對(duì)比樹的性能消耗很大,一般限制樹的深度小于3;Swati進(jìn)行改進(jìn)提出基于凝聚聚類和頻率子圖的動(dòng)態(tài)JS軟件胎記技術(shù)[2],然而動(dòng)態(tài)軟件胎記存在只保護(hù)局部代碼和不適合交互性軟件的缺點(diǎn)。
在C/C++或Java軟件水印領(lǐng)域的研究主要包括:Myles和Gregory分別介紹了基于重新排列基本塊[3]和在軟件執(zhí)行時(shí)重新分配寄存器[4]的軟件水印算法,但此類算法的隱蔽性較差。為進(jìn)一步提高水印的隱秘性,Nagra從程序并發(fā)入手,提出基于線程關(guān)系的軟件水印算法[5],許金超等對(duì)其進(jìn)行了改進(jìn)[6]。然而,以上方法的抗干擾性較差。Collberg等人將擴(kuò)頻技術(shù)應(yīng)用于軟件水印中以提高抗干擾能力[7],但此方法是個(gè)非盲水印算法,且它嵌入的水印比特率相當(dāng)?shù)?。湯?zhàn)勇等對(duì)PPCT軟件水印編碼結(jié)構(gòu)進(jìn)行優(yōu)化并根據(jù)特定策略進(jìn)行加密,實(shí)現(xiàn)提高軟件水印的隱秘性和防篡改[8],但此方法通過(guò)加密等操作增加系統(tǒng)開銷,降低性能。同時(shí),在軟件水印中引入不透明謂詞的研究有:Arboit使用不透明謂詞建立靜態(tài)軟件水印算法[9],Myles對(duì)其進(jìn)行動(dòng)態(tài)擴(kuò)展[10],然而此算法通過(guò)模式匹配的方法提取水印,無(wú)法抵抗模式匹配攻擊;楊志剛將不透明謂詞用于防篡改軟件水印技術(shù)中能有效防止篡改[11],但在水印嵌入位置問(wèn)題上缺乏討論;高軍提出基于中國(guó)剩余定理和拉格朗日插值公式的不透明謂詞軟件水印[12],但魯棒性和隱蔽性較差。
為了進(jìn)一步提高水印性能、降低系統(tǒng)開銷和抵抗各類靜動(dòng)態(tài)攻擊,本文提出一種基于哈希映射的改進(jìn)構(gòu)造不透明謂詞的方法,并將此方法應(yīng)用于JS軟件水印中,提出一種基于不透明謂詞的軟件水印算法,同時(shí)對(duì)水印嵌入位置和水印內(nèi)容進(jìn)行討論,并結(jié)合JS的特性開發(fā)一個(gè)基于此算法的JS軟件水印系統(tǒng)。最后,將對(duì)算法性能、水印可靠性、隱秘性和抗干擾性等方面進(jìn)行驗(yàn)證與分析。
不透明謂詞就是謂詞表達(dá)式在嵌入程序之前,其真值已經(jīng)確定(通常為布爾類型),并廣泛應(yīng)用于分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的判斷條件中。目前構(gòu)造不透明謂詞的方法主要有:利用同余方程[9]和基于改進(jìn)混沌映射Logistic[13]的構(gòu)造方法,而這些方法只能構(gòu)造結(jié)果為布爾類型的不透明謂詞。據(jù)此,本文提出一種能構(gòu)造具有多種結(jié)果狀態(tài)的不透明謂詞的方法,此方法是基于哈希映射機(jī)制將輸入從一數(shù)值空間映射成另一數(shù)值空間并輸出,具體的算法過(guò)程描述如下:
Step1 確定映射機(jī)制集F={F1,F2,…,FN},其中Fi(i=1,2,…,N)必須滿足以下條件:
i) Fi(X)→Y。其中X∈{X1,X2,…,Xm},Xj=(x1,x2,…,xt)是輸入向量,當(dāng)t=1時(shí),F(xiàn)i是一元映射機(jī)制,Y∈{y1,y2,…,yn}是輸出結(jié)果,也就是不透明謂詞的狀態(tài)集合。
ii) 將結(jié)果存放回Xin,重新選擇yi,重復(fù)i)的操作直至產(chǎn)生達(dá)到上限數(shù)量的結(jié)果為止。
本文以哈希函數(shù)構(gòu)造方法除留余數(shù)法作為映射機(jī)制,實(shí)現(xiàn)構(gòu)造具有n種狀態(tài)的不透明謂詞,具體的偽代碼如圖1所示。
圖1 基于除留余數(shù)法哈希函數(shù)的不透明謂詞構(gòu)造算法
為了提高不透明謂詞抵抗逆向分析的能力,在具體實(shí)現(xiàn)中進(jìn)行如下的優(yōu)化:將輸入序列存放在全局?jǐn)?shù)組中,并通過(guò)引用的方式訪問(wèn)其中的元素[14];理論上可以使用所有滿足條件的映射機(jī)制相結(jié)合,提高不透明謂詞的復(fù)雜性;構(gòu)造新型混合輸入序列,由兩個(gè)或兩個(gè)以上的數(shù)組元素進(jìn)行代數(shù)運(yùn)算操作形成新的輸入序列。
2.1 基于JS的軟件水印
軟件水印技術(shù)已廣泛應(yīng)用于C、C++、Java等流行語(yǔ)言編寫的程序軟件當(dāng)中,然而對(duì)客戶端語(yǔ)言諸如JavaScript(JS)腳本程序的水印技術(shù)研究卻很鮮見(jiàn)。JS作為熱門的腳本語(yǔ)言,廣泛應(yīng)用于各類Web應(yīng)用開發(fā)當(dāng)中,再者JS腳本嵌入在網(wǎng)頁(yè)文件中,一般用戶都可以使用瀏覽器獲得源碼,這對(duì)網(wǎng)站信息的安全性、源代碼的保密性等都帶來(lái)更大的挑戰(zhàn)。因此,通過(guò)在JS代碼中嵌入水印來(lái)保證軟件著作權(quán)和防止盜版是一項(xiàng)具有現(xiàn)實(shí)意義和經(jīng)濟(jì)效益的研究課題。
2.2 不透明謂詞軟件水印算法
本文需要借助Antlr對(duì)JS程序源碼進(jìn)行語(yǔ)法分析并收集源碼信息,包括源碼的三類基本塊:循環(huán)基本塊(包括while、for和do…while)、分支基本塊(包括if…else和switch…case)以及順序基本塊三類,基本塊在運(yùn)行中都是順序執(zhí)行的。據(jù)此,將上文構(gòu)造的不透明謂詞應(yīng)用于JS軟件水印當(dāng)中,基于不透明謂詞的JS軟件水印算法包括水印的嵌入和水印的提取兩個(gè)過(guò)程。
2.2.1 水印的嵌入算法
水印嵌入算法的過(guò)程描述如下:
Step1 初始化水印序列M和程序基本塊數(shù)N,其中M=m1,m2,…,mt是長(zhǎng)度為t的數(shù)字水印,并且mi∈N+,0≤mi≤9。
Step2 選擇M中的一個(gè)位數(shù)mi,構(gòu)造不透明謂詞P(mi),使得P(mi)=mi。
Step3 構(gòu)造永假基本塊FalseBlock,并且有:
其中if結(jié)構(gòu)可以替換成while、do…while或for結(jié)構(gòu),IDi用于指示mi在M中的位置,code部分是永不執(zhí)行的代碼,其選擇方法主要有:
? 自定義生成:系統(tǒng)自動(dòng)生成符合語(yǔ)法要求的垃圾代碼。
? 源程序的任意函數(shù):在程序代碼中確定某一函數(shù)作為FalseBlock的代碼部分。
? 隨機(jī)選擇源程序的函數(shù):每次構(gòu)造FalseBlock的同時(shí)隨機(jī)確定某一函數(shù)做為代碼部分。此方法的優(yōu)點(diǎn)是:若代碼中多次出現(xiàn)同一代碼段容易引起攻擊者的注意,并且即使某一水印片段的函數(shù)被破解,不會(huì)影響其他水印片段。
Step4 確定水印片段mi嵌入的位置pi并將FalseBlock嵌入在基本塊pi之后,并將pi和唯一標(biāo)識(shí)符IDi保存到秘鑰副本key(p)當(dāng)中用于水印提取。其嵌入的策略主要有:
? 簡(jiǎn)單策略。直接令pi=Ni/t,這是一種基于平均分配的思路,將水印片段均勻地分布在程序源碼當(dāng)中。
? 隨機(jī)策略。包括可重復(fù)隨機(jī)策略和不可重復(fù)隨機(jī)策略:
a) 可重復(fù)隨機(jī)策略,pi=random(1~N)。
b) 不可重復(fù)隨機(jī)策略,pi=random(1~N),pi≠pj(j=1,2,…,i-1)。
Step5 不斷重復(fù)Step2-Step4直至所有水印片段嵌入完成。
其原理如圖2所示。
圖2 水印嵌入原理
2.2.2 水印的提取算法
水印提取算法的過(guò)程描述如下:
Step1 初始化已添加水印程序代碼S(M),并對(duì)其進(jìn)行源碼分析,提取出順序執(zhí)行基本語(yǔ)句塊Block1,…,Blockn。
Step2 根據(jù)嵌入算法保存的水印秘鑰副本獲嵌入位置pi。
Step3 提取基本塊Blockpi的首行if條件表達(dá)式并計(jì)算真值mi,并根據(jù)表達(dá)式中的IDi將其保存在M中的相應(yīng)位置。
Step4 不斷重復(fù)Step2-Step3直至所有嵌入位置完成計(jì)算。
水印的提取過(guò)程比較簡(jiǎn)單,關(guān)鍵是秘鑰副本必須安全保存。提取過(guò)程原理如圖3所示。
圖3 水印提取原理
3.1 實(shí)驗(yàn)結(jié)果
借組VS2010 C#語(yǔ)言集成開發(fā)環(huán)境,本文實(shí)現(xiàn)了一個(gè)基于不透明謂詞的JavaScript腳本語(yǔ)言軟件水印系統(tǒng)。系統(tǒng)包括隨機(jī)生成水印序列、構(gòu)造不透明謂詞、不透明謂詞水印的嵌入和提取等功能。使用Google公司開發(fā)的基準(zhǔn)測(cè)試套件V8 Benchmark Suit version7作為測(cè)試用例,本系統(tǒng)成功實(shí)現(xiàn)對(duì)所有測(cè)試用例進(jìn)行水印嵌入和提取,結(jié)果如圖4-圖6所示。
圖4 不透明謂詞生成結(jié)果
圖5 軟件水印嵌入結(jié)果
圖6 軟件水印提取結(jié)果
3.2 性能分析
負(fù)載性能 在程序中嵌入水印必定會(huì)增加系統(tǒng)的性能開銷,主要包括程序變大和運(yùn)行時(shí)間延遲。本文提出的基于不透明謂詞軟件水印算法通過(guò)添加永不運(yùn)行的垃圾代碼確保運(yùn)行時(shí)間片變化不大,同時(shí)由于水印大小固定,因此本算法適合軟件規(guī)模較大的情況。五個(gè)基準(zhǔn)測(cè)試嵌入水印前后的容量、運(yùn)行時(shí)間結(jié)果如表1所示。結(jié)果顯示,水印嵌入前后測(cè)試用例在容量和運(yùn)行時(shí)間的增長(zhǎng)率僅為:4.92%、8.70%。
表1 嵌入水印前后程序容量和運(yùn)行時(shí)間對(duì)比
隱蔽性 分支語(yǔ)句是JS程序經(jīng)常使用到的結(jié)構(gòu),通過(guò)將水印片段隱藏在帶不透明謂詞的分支結(jié)構(gòu)中不容易引起攻擊者的注意,同時(shí),構(gòu)造分支語(yǔ)句的永假基本塊都是原程序的部分函數(shù)代碼,使得水印代碼在編碼風(fēng)格、思維方式等方面都與程序的其他部分很相似。這樣能在一定程度上提高水印的隱秘性。
魯棒性 暴力破壞是相對(duì)于破解的另一種攻擊行為,在保留軟件功能的前提下修改程序代碼、結(jié)構(gòu)等操作獲得相關(guān)權(quán)限,此時(shí)軟件水印也有可能受到干擾。不透明謂詞軟件水印算法將水印分割成相互獨(dú)立的片段并賦予唯一標(biāo)識(shí)符,即使部分片段受到干擾,大部分信息仍能保留下來(lái)。并且水印提取算法是通過(guò)秘鑰文件中的位置表進(jìn)行水印檢索和提取,能夠有效抵制模式匹配攻擊。如果通過(guò)非法修改順序基本塊的位置來(lái)破壞水印,程序?qū)o(wú)法正確運(yùn)行。通過(guò)對(duì)程序執(zhí)行標(biāo)識(shí)符模式匹配修改和打亂程序基本塊攻擊操作,程序執(zhí)行結(jié)果和水印提取結(jié)果如表2所示。
表2 模式匹配攻擊和程序基本塊攻擊結(jié)果
3.3 安全性分析
3.3.1 靜態(tài)攻擊
靜態(tài)分析技術(shù)主要有識(shí)別循環(huán)、別名分析、控制流分析、切片技術(shù)等。由于不透明謂詞軟件水印算法是通過(guò)將水印保存在分支表達(dá)式中,因此對(duì)程序循環(huán)進(jìn)行識(shí)別不會(huì)影響水印的安全性;該算法將源數(shù)據(jù)保存在全局?jǐn)?shù)組并通過(guò)引用訪問(wèn)數(shù)據(jù),這樣能有效抵抗別名分析[14];控制流分析和切片技術(shù)主要通過(guò)改變程序流程結(jié)構(gòu)或者代碼執(zhí)行順序來(lái)破壞水印完整性,而本文提出的水印算法是將水印信息隱藏在不透明謂詞表達(dá)式中,水印信息并不依賴程序流程和執(zhí)行順序,也就是說(shuō)表達(dá)式不被修改的前提下都能通過(guò)唯一標(biāo)識(shí)符提取水印。通過(guò)對(duì)嵌入水印后程序進(jìn)行控制流變形(如圖7所示)再次進(jìn)行水印提取,所有測(cè)試結(jié)果都能成功提取正確水印。
圖7 控制流壓扁前后代碼變形情況
3.3.2 動(dòng)態(tài)攻擊
攻擊者還能通過(guò)設(shè)置斷點(diǎn)進(jìn)行調(diào)試、剖分和跟蹤,進(jìn)而分析程序執(zhí)行路徑和流程結(jié)構(gòu)等信息,對(duì)于分支結(jié)構(gòu)條件表達(dá)式,攻擊者往往只注重條件的真假,忽視其中隱藏的信息,基于不透明謂詞的軟件水印算法能夠逃避這類攻擊。然而,反匯編工具能夠優(yōu)化刪除程序不被執(zhí)行的垃圾代碼。據(jù)此,本文通過(guò)全局?jǐn)?shù)組存放數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行運(yùn)算以增強(qiáng)不透明謂詞的隱蔽性,使得跟蹤變得更加困難。同時(shí),還可以將永假基本塊改裝成不影響程序結(jié)果但又被調(diào)用執(zhí)行的代碼,這樣即使動(dòng)態(tài)攻擊也無(wú)法實(shí)現(xiàn)對(duì)軟件水印的破壞。
本文提出一種基于不透明謂詞的軟件水印算法并開發(fā)一個(gè)基于此算法的JS腳本水印系統(tǒng),通過(guò)實(shí)驗(yàn)證實(shí)了該算法能在增加較少的系統(tǒng)開銷的前提下有效抵抗各種常見(jiàn)的靜動(dòng)態(tài)攻擊,同時(shí)還能提高水印的隱秘性和魯棒性。下一步的工作是優(yōu)化和完善該算法,包括提高不透明謂詞的隱秘性和擴(kuò)展水印的內(nèi)容。
[1] Chan P P F,Hui L C K,Yiu S M.Heap graph based software theft detection[J].Information Forensics and Security,IEEE Transactions on,2013,8(1):101-110.
[2] Patel,Swati J,Tareek M Pattewar.Software birthmark based theft detection of JavaScript programs using agglomerative clustering and Frequent Subgraph Mining[C]//Embedded Systems (ICES),2014 International Conference on.IEEE,2014.
[3] Ginger Myles,Christian Collberg,Zachary Heidepriem,et al.The evaluation of two software watermarking algorithms[J].Software:Practice and Experience,2005,35(10):923-938.
[4] Wolfe G,Wong J L,Potkonjak M.Watermarking graph partitioning solutions[J].Computer-Aided Design of Integrated Circuits and Systems,IEEE Transactions on,2002,21(10):1196-1204.
[5] Nagra,Jasvir,Clark Thomborson.Threading software watermarks[C]//Berlin:Springer Heidelberg,2005.
[6] 許金超,曾國(guó)蓀.一種基于線程關(guān)系的軟件水印算法[J].電子學(xué)報(bào),2012,40(5):891-896.
[7] Christian Collberg,Tapas Ranjan Sahoo.Software watermarking in the frequency domain: implementation,analysis,and attacks[J].Comput.Secur,2005,13(5):721-755.
[8] 湯戰(zhàn)勇,房鼎益,蘇琳,等.一種基于代碼加密的防篡改軟件水印方案[J].中國(guó)科學(xué)技術(shù)大學(xué)學(xué)報(bào),2011,41(7):599-606.
[9] Arboit,Genevieve.A method for watermarking java programs via opaque predicates[C]//The Fifth International Conference on Electronic Commerce Research (ICECR-5).2002.
[10] Myles G,Collberg C.Software watermarking via opaque predicates:Implementation,analysis,and attacks[J].Electronic Commerce Research,2006,6(2):155-171.
[11] 楊志剛.基于常量編碼的防篡改軟件水印技術(shù)[D].吉林:吉林大學(xué),2009.
[12] 高軍.軟件水印算法研究[D].四川:電子科技大學(xué),2011.
[13] 蘇慶,吳偉民,李忠良,等.混沌不透明謂詞在代碼混淆中的研究與應(yīng)用[J].計(jì)算機(jī)科學(xué),2013,40(6):155-160.
[14] Udupa Sharath K,Saumya K Debray,Matias Madou.Deobfuscation:Reverse engineering obfuscated code[C]//Reverse Engineering,12th Working Conference on IEEE,2005.
A HASH OPAQUE PREDICATES-BASED SOFTWARE WATERMARKING ALGORITHM IN JAVASCRIPT
Wu Weimin Lin Shuiming Yu Guopeng Lin Zhiyi
(FacultyofComputer,GuangdongUniversityofTechnology,Guangzhou510006,Guangdong,China)
Because of the weakness of current software watermarking algorithms in high performance overhead or suffering from various attacks, and of being scarcely implemented in JavaScript source code, we proposed a new hash opaque predicate-based JavaScript software watermarking algorithm. By constructing a new kind of hash-mapping opaque predicate, which is based on the method of remainder of division operation, and embedding the watermark information of software into opaque predicate expression, the algorithm constructs the everlasting basic block of this opaque predicate and embedding it into program to implement software watermarking. We also developed a JavaScript software watermarking system which is based on this algorithm. Experiments proved that the algorithm can effectively resist various common static and dynamic attacks on the premise of less system overhead increase, as well as improve the invisibility and robustness of the watermark.
Opaque predicate Method of remainder of division operation Software watermark JavaScript
2014-12-09。廣州市科技計(jì)劃項(xiàng)目(2012Y2-00046,2013Y2-00043);廣東高校優(yōu)秀青年創(chuàng)新人才培養(yǎng)計(jì)劃項(xiàng)目(2012LYM_0054)。吳偉民,教授,主研領(lǐng)域:可視計(jì)算,系統(tǒng)工具與平臺(tái),代碼安全。林水明,碩士生。余國(guó)鵬,本科生。林志毅,講師。
TP309.7
A
10.3969/j.issn.1000-386x.2016.04.071