郭迪驍 周安民 劉亮 張磊
摘要:源代碼作者身份識(shí)別有助于解決惡意代碼攻擊溯源、代碼剽竊、軟件侵權(quán)等問題,本文提出一種新的基于圖匹配網(wǎng)絡(luò)和抽象語法樹的源代碼作者身份識(shí)別方法.首先,通過刪除注釋、統(tǒng)一換行符、制表符預(yù)處理源代碼,消除不同集成開發(fā)環(huán)境和代碼布局的影響;然后,基于數(shù)據(jù)增強(qiáng)抽象語法樹將源代碼轉(zhuǎn)換為樹結(jié)構(gòu),添加不同類型的邊構(gòu)建代碼特征圖,不僅關(guān)注語法和句法特征,還提取了代碼中數(shù)據(jù)流和控制流特征;接著使用特征圖訓(xùn)練圖匹配神經(jīng)網(wǎng)絡(luò),生成源代碼的圖嵌入特征向量;最后,使用孿生神經(jīng)網(wǎng)絡(luò)對(duì)輸出的兩個(gè)圖嵌入特征向量進(jìn)行計(jì)算,識(shí)別源代碼作者身份.實(shí)驗(yàn)結(jié)果表明,本文的方法在包含1000位程序員的Google Code Jam數(shù)據(jù)集上達(dá)到了95.60%的準(zhǔn)確率,與現(xiàn)有的源代碼作者身份識(shí)別方法相比,提高了準(zhǔn)確率和擴(kuò)展性.
關(guān)鍵詞:代碼樣式;去匿名化;抽象語法樹;圖神經(jīng)網(wǎng)絡(luò);孿生神經(jīng)網(wǎng)絡(luò)
收稿日期: 2022-07-08
基金項(xiàng)目: 四川省科技計(jì)劃項(xiàng)目(2021YFG0159&2022YFG0171);四川大學(xué)專職博士后研發(fā)基金(2021SCU12136)
作者簡(jiǎn)介: 郭迪驍(1998-),男,重慶永川人,碩士研究生,研究方向?yàn)閻阂獯a分析.
通訊作者: 張磊. E-mail: zhanglei2018@scu.edu.cn
Code authorship attribution based on
abstract syntax tree and graph neural network
GUO Di-Xiao,ZHOU An-Min,LIU Liang,ZHANG Lei
(School of Cyber Science and Engineering, Sichuan University, Chengdu 610065, China)
Source code author identification aids to solve problems such as malicious code attack traceability, code plagiarism, software infringement, etc. In this paper, the authors proposed a novel code de-anonymization model, which is based on the Graph Matching Network and Abstract Syntax Tree. First, the source code is preprocessed by removing comments, unifying newlines and tabs to eliminate the influence of different IDEs and code layouts features. Then, the source code is converted into a tree structure based on the data-augmented abstract syntax tree, the different types of edges are added to build the code feature graph, which not only focus on syntactic features, but also extract the data flow and control flow information. The feature graph is then used to train the graph matching neural network to generate the graph embedding feature vector of the source code; Finally, the output graph embedding feature vectors are calculated by the Siamese network to identify the source code author attribution. The experimental results show that our method finally achieved 95.60% accuracy on the Google Code Jam dataset containing 1000 programmers. Compared with the existing de-anonymization model, it has improved accuracy and extensibility.
Code stylometry; De-anonymization; Abstract syntax tree; Graph neural network; Siamese network
1 引 言
源代碼作者身份識(shí)別是根據(jù)程序員獨(dú)特的編程風(fēng)格識(shí)別程序員身份的過程.源代碼作者身份識(shí)別在軟件取證和安全分析領(lǐng)域有很大作用,尤其是對(duì)于惡意代碼作者追蹤溯源;例如,可以從反編譯的二進(jìn)制文件中提取程序員的特征.此外,源代碼的作者身份識(shí)別有助于剽竊檢測(cè)[1]、作者爭(zhēng)議[2]、版權(quán)侵權(quán)[3]和代碼完整性調(diào)查[4].源代碼作者身份識(shí)別有兩個(gè)主要步驟:特征提取和身份分類識(shí)別.特征提取是提取代表作者獨(dú)特屬性的軟件指標(biāo)或特征.分類識(shí)別則是將這些特征輸入算法以構(gòu)建能夠區(qū)分作者身份的模型.
現(xiàn)有的源代碼作者特征提取方法主要是基于人工定義特征提取和利用深度學(xué)習(xí)自動(dòng)提取[5].Krsul等[6]是第一個(gè)引入程序員編程風(fēng)格特征的人,他們定義了60個(gè)特征,并把他們分為三類:編程布局特征(例如空格和括號(hào))、編程風(fēng)格特征(例如平均變量長(zhǎng)度和變量名稱)和編程結(jié)構(gòu)特征(例如數(shù)據(jù)結(jié)構(gòu)的使用和每個(gè)函數(shù)的代碼行數(shù)).Frantzeskou等人[7]介紹了使用字節(jié)級(jí)N-gram特性進(jìn)行源代碼作者身份歸屬的方法,他們的工作受到N-gram在文本作者身份識(shí)別中成功使用的啟發(fā),對(duì)于每個(gè)作者,他們把可用的訓(xùn)練源代碼樣本接起來形成一個(gè)大文件提取該文件中使用最頻繁的N-gram的集合作為程序員的身份特征,使用N-gram使該方法可以實(shí)現(xiàn)跨編程語言.Lange等[8]第一個(gè)考慮結(jié)合基于文本的特征和基于軟件的特征來識(shí)別源代碼作者身份,他們使用特征直方圖分布來尋找實(shí)現(xiàn)最佳識(shí)別準(zhǔn)確率的特征組合.Caliskan-Islam等人[9]引入抽象語法樹的概念并且重新定義了語法特征,他們提取抽象語法樹節(jié)點(diǎn)二元組,語法樹的深度等特征,并且提出特征評(píng)估和特征選擇過程.Wang等人[10]為解決提取特征維度過大的問題提出代碼動(dòng)態(tài)特征,主要是提取代碼運(yùn)行時(shí)功能函數(shù)的內(nèi)存消耗,時(shí)間消耗和函數(shù)調(diào)用.人工定義特征提取需要手工定義特征集,這需要較強(qiáng)的編程知識(shí),生成的代碼作者特征大多為稀疏向量表示,需要進(jìn)一步的特征評(píng)估和特征選擇,并且這種方法很難處理大規(guī)模的程序員集合.
利用深度學(xué)習(xí)自動(dòng)提取特征無需先驗(yàn)知識(shí),可以解決特征數(shù)過多的問題而且適用于大規(guī)模的程序員集合.Bogomolov等人[11]在抽象語法樹的基礎(chǔ)上提出路徑上下文(三元組,由兩個(gè)葉子節(jié)點(diǎn)之間的路徑和對(duì)應(yīng)于開始和結(jié)束葉子的標(biāo)記組成),并將路徑特征分別和隨機(jī)森林和Code2Vec模型結(jié)合.Alsulami等人[12]利用LSTM和BiLSTM,實(shí)現(xiàn)自動(dòng)從源碼中提取相關(guān)特征,他們的模型使用深度優(yōu)先搜索算法遍歷AST,將AST簡(jiǎn)化為向量表示,然后傳遞到深度學(xué)習(xí)模型.Abuhamad等人[13]利用詞嵌入和TF-IDF處理源代碼,使用基于CNN的深度學(xué)習(xí)過程來提取用于作者身份識(shí)別的特征.從而實(shí)現(xiàn)大規(guī)模的代碼作者身份識(shí)別.
與上述工作不同,本文提出一種基于抽象語法樹和圖匹配網(wǎng)絡(luò)的源代碼作者身份識(shí)別方法,針對(duì)輸入的源代碼,首先進(jìn)行預(yù)處理,消除不同集成開發(fā)環(huán)境和代碼布局的影響;然后通過本文提出的數(shù)據(jù)增強(qiáng)抽象語法樹將源代碼轉(zhuǎn)換為樹結(jié)構(gòu),通過添加不同類型的邊構(gòu)建代碼特征圖;使用特征圖樣本訓(xùn)練圖匹配神經(jīng)網(wǎng)絡(luò),生成代碼的圖嵌入特征向量,最后使用孿生神經(jīng)網(wǎng)絡(luò)對(duì)圖嵌入特征向量進(jìn)行計(jì)算,識(shí)別兩份源代碼是否屬于同一作者.本文的主要工作和貢獻(xiàn)包括以下幾方面:(1)提出一種基于圖神經(jīng)網(wǎng)絡(luò)的去匿名化模型,結(jié)合抽象語法樹和圖匹配網(wǎng)絡(luò)對(duì)源代碼作者特征進(jìn)行提取,使用孿生神經(jīng)網(wǎng)絡(luò)對(duì)匿名源代碼作者身份進(jìn)行識(shí)別.(2)提出一種基于數(shù)據(jù)增強(qiáng)抽象語法樹的構(gòu)建程序特征圖的方法.該方法不僅提取源代碼的句法和語義特征,而且提取數(shù)據(jù)流和控制流特征.本文構(gòu)建特征圖的方法可以輕松擴(kuò)展到其他編程語言.(3)本文使用了三種圖神經(jīng)網(wǎng)絡(luò),通過對(duì)Google Code Jam數(shù)據(jù)集和GitHub數(shù)據(jù)集的實(shí)驗(yàn)和評(píng)估,表明本文的方法在識(shí)別準(zhǔn)確率和穩(wěn)定性上優(yōu)于當(dāng)前的其他方法.
2 研究方法
2.1 方法概述
本文提出一種新的匿名代碼作者身份識(shí)別方法,基于抽象語法樹和圖匹配神經(jīng)網(wǎng)絡(luò)來提取程序員的編程特征,最后使用孿生神經(jīng)網(wǎng)絡(luò)作為判別器識(shí)別代碼作者身份,本文提出的總體框架圖如圖1所示,包含三個(gè)部分:源代碼特征圖生成模塊,圖匹配神經(jīng)網(wǎng)絡(luò)生成器和孿生神經(jīng)網(wǎng)絡(luò)判別器[14].
(1)源代碼特征圖生成模塊:預(yù)處理源代碼消除不同集成開發(fā)環(huán)境的影響,基于提出的數(shù)據(jù)增強(qiáng)抽象語法樹將源代碼轉(zhuǎn)換為樹結(jié)構(gòu),并通過添加不同類型的邊構(gòu)建代碼特征圖.
(2)圖匹配神經(jīng)網(wǎng)絡(luò)生成器:使用特征圖樣本訓(xùn)練圖匹配神經(jīng)網(wǎng)絡(luò),圖匹配網(wǎng)絡(luò)通過對(duì)輸入的圖樣本對(duì)進(jìn)行學(xué)習(xí)和更新,使用圖池化生成源代碼的低維圖嵌入特征向量.
(3)孿生神經(jīng)網(wǎng)絡(luò)判別器:使用孿生神經(jīng)網(wǎng)絡(luò)對(duì)圖匹配網(wǎng)絡(luò)輸出的兩個(gè)圖嵌入特征向量進(jìn)行計(jì)算和判斷,識(shí)別兩份代碼是否屬于同一作者.
2.2 數(shù)據(jù)增強(qiáng)抽象語法樹
抽象語法樹(Abstract Syntax Tree,AST)是表示編程語言抽象語法結(jié)構(gòu)的樹,AST不太容易受到開發(fā)工具的影響.另外,由于AST是樹狀結(jié)構(gòu),很容易轉(zhuǎn)換為圖這種數(shù)據(jù)結(jié)構(gòu),結(jié)合圖神經(jīng)網(wǎng)絡(luò)可以很好地學(xué)習(xí)和提取源代碼這種非歐幾里得數(shù)據(jù)的特征.
傳統(tǒng)的AST生成模塊針對(duì)源代碼中的變量、常量等只會(huì)生成對(duì)應(yīng)的類信息,比如在Python的AST模塊中,針對(duì)變量a只會(huì)返回變量類ast.name,變量名a只會(huì)作為name類的id值,針對(duì)常量只會(huì)返回ast.constant類,而常量的值存儲(chǔ)在類的value中,但是在代碼作者身份識(shí)別中,變量、函數(shù)名等命名方式是很重要的程序員身份特征,需要進(jìn)行提取,為此本方法設(shè)計(jì)了一種新的AST生成方式稱為數(shù)據(jù)增強(qiáng)抽象語法樹(data-augmented AST),通過遍歷AST節(jié)點(diǎn)類型的value和id值,將源代碼中的變量和常量也提取出來,作為對(duì)應(yīng)類的子節(jié)點(diǎn),充分提取程序員的編程特征.圖2和圖3分別顯示了一段簡(jiǎn)單的Python源代碼以及使用本文方法生成的抽象語法樹結(jié)構(gòu),可以看到變量a,b和常量等數(shù)據(jù)都作為節(jié)點(diǎn)表示了出來.
另外,對(duì)于樣本中的源代碼,本方法進(jìn)行了預(yù)處理操作,包括刪除源代碼中的注釋和源代碼調(diào)用的內(nèi)部函數(shù),統(tǒng)一代碼中的換行符、制表符和空格等,預(yù)處理操作相當(dāng)于不提取源代碼的布局特征(包括空格長(zhǎng)度,制表符長(zhǎng)度,空行占比等),經(jīng)過本文實(shí)驗(yàn)驗(yàn)證,上述的布局特征對(duì)于程序員指紋身份識(shí)別的準(zhǔn)確率幾乎沒有影響,但是會(huì)增加特征數(shù)量和模型訓(xùn)練時(shí)間,消除這些布局特征可以消除不同集成開發(fā)環(huán)境的影響,還可以減少特征數(shù),防止過擬合.
2.3 基于抽象語法樹構(gòu)建圖
AST僅僅包含源代碼的句法特征,為了完整地提取程序員的編程特征,本方法設(shè)計(jì)一種基于AST的構(gòu)建特征圖的方法,特征圖的主干是源代碼的AST,圖的節(jié)點(diǎn)v是AST節(jié)點(diǎn)或其關(guān)聯(lián)的屬性節(jié)點(diǎn),本文根據(jù)代碼的信息流在特征圖中定義了以下幾種不同類型的邊.
Child-Parent: 連接非葉子節(jié)點(diǎn)和它的子節(jié)點(diǎn),可以加快模型訓(xùn)練過程中的信息傳遞.
Token: 連接終端節(jié)點(diǎn)和另一個(gè)終端節(jié)點(diǎn),這個(gè)邊包含AST樹的深度信息.
Nextuse: 連接變量節(jié)點(diǎn)和它下一次出現(xiàn)的節(jié)點(diǎn),這個(gè)邊可以提取AST中的數(shù)據(jù)流信息,增加圖的特征信息熵.
為彌補(bǔ)AST只包含語法特征的缺點(diǎn),除了上述的幾種類型的邊外,本方法還增加了幾種類型的邊去表示代碼的控制流信息和不同程序員的循環(huán)編碼習(xí)慣,為了實(shí)現(xiàn)編程語言的可擴(kuò)展性,本文主要考慮主流編程語言中常見的幾種控制流,包括順序執(zhí)行,While循環(huán),F(xiàn)or循環(huán)和If語句,具體細(xì)節(jié)如下.
If邊:在AST中,一個(gè)If類型的節(jié)點(diǎn)有兩個(gè)或三個(gè)子節(jié)點(diǎn),第一個(gè)屬性表示If的條件,第二個(gè)表示當(dāng)條件成立的執(zhí)行體,第三個(gè)表示條件不成立或Else的執(zhí)行體.為此,本文添加了兩種邊,分別連接條件語句和條件成立和不成立的循環(huán)體.
While邊:在AST中,While類型的節(jié)點(diǎn)有兩個(gè)子節(jié)點(diǎn),一個(gè)條件節(jié)點(diǎn),一個(gè)循環(huán)體節(jié)點(diǎn),本文添加一個(gè)While條件到循環(huán)主體的邊,一個(gè)循環(huán)體到循環(huán)條件的邊模擬循環(huán)執(zhí)行過程.
For邊:For節(jié)點(diǎn)具有兩個(gè)子節(jié)點(diǎn),F(xiàn)or條件節(jié)點(diǎn)和For循環(huán)主體節(jié)點(diǎn).與While節(jié)點(diǎn)類似,本文在For節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)之間添加兩種類型的邊,分別連接條件節(jié)點(diǎn)和循環(huán)主題節(jié)點(diǎn)以及循環(huán)主體節(jié)點(diǎn)和條件節(jié)點(diǎn).
順序執(zhí)行邊:在Python中,語句的順序執(zhí)行存在于諸如方法主體或循環(huán)主體之類的代碼塊中.與前面提到的控制流節(jié)點(diǎn)不同,順序執(zhí)行的代碼節(jié)點(diǎn)可以具有任意數(shù)量的子代.因此本文在每個(gè)語句子樹的根與其下一個(gè)同級(jí)之間添加順序執(zhí)行邊,表示代碼的順序執(zhí)行關(guān)系.四種控制流邊如圖4所示.
2.4 圖匹配神經(jīng)網(wǎng)絡(luò)
傳統(tǒng)的圖神經(jīng)網(wǎng)絡(luò)一般處理的都是圖節(jié)點(diǎn)的分類[15],而圖匹配網(wǎng)絡(luò)是在圖的級(jí)別上對(duì)不同的圖進(jìn)行處理.本文使用Li等[16]提出的兩種圖相似學(xué)習(xí)模型:一種是基于標(biāo)準(zhǔn)GNN的圖嵌入模型,另一種是同時(shí)對(duì)兩個(gè)圖進(jìn)行聯(lián)合學(xué)習(xí)的圖匹配網(wǎng)絡(luò)模型來檢測(cè)圖神經(jīng)網(wǎng)絡(luò)在代碼身份識(shí)別中的可行性.圖嵌入模型包括三個(gè)部分:編碼器,傳播層和聚合層.編碼器將節(jié)點(diǎn)和邊特征映射到初始節(jié)點(diǎn)和邊向量[17],傳播層將一組節(jié)點(diǎn)映射到新的節(jié)點(diǎn)表示,聚合器將節(jié)點(diǎn)集作為輸入,計(jì)算圖級(jí)別的嵌入向量.本文選擇GCN和GGNN兩種圖嵌入模型.圖匹配神經(jīng)網(wǎng)絡(luò)(Graph Matching Networks,GMN)在編碼器和聚合層都和圖嵌入模型類似,最主要的區(qū)別在傳播層.GMN可以在圖信息傳播中共同學(xué)習(xí)一對(duì)圖的對(duì)應(yīng)節(jié)點(diǎn)信息,即跨圖更新特征向量. 圖5說明了圖嵌入模型和圖匹配網(wǎng)絡(luò)模型之間的區(qū)別.
2.5 孿生神經(jīng)網(wǎng)絡(luò)判別器
本文構(gòu)建基于深度神經(jīng)網(wǎng)絡(luò)架構(gòu)的身份判別器.分類任務(wù)中使用的傳統(tǒng)DNN假定類的數(shù)量是固定的(本應(yīng)用中即假定程序員數(shù)量是固定的),這極大地阻礙它擴(kuò)展到識(shí)別新的程序員.本文使用孿生神經(jīng)網(wǎng)絡(luò)架構(gòu)[18]構(gòu)建身份判別器,它將兩個(gè)特征向量(例如,匿名代碼的特征和已知程序員的特征)作為輸入,經(jīng)過基礎(chǔ)子網(wǎng)絡(luò)生成新的一對(duì)特征向量,然后使用判別器計(jì)算兩個(gè)向量的余弦距離得到一個(gè)相似度得分,通過比較該分值是否大于預(yù)設(shè)的閾值Threshold,判斷匿名代碼是否由該已知程序員編寫.由于這種架構(gòu)與數(shù)據(jù)集中的類數(shù)量不相關(guān),因此可以很容易地將其擴(kuò)展到新的程序員,孿生神經(jīng)網(wǎng)絡(luò)判別器的結(jié)構(gòu)如圖6所示,它由三個(gè)主要部分組成,兩個(gè)基礎(chǔ)網(wǎng)絡(luò)和一個(gè)匹配器.兩個(gè)相同的基礎(chǔ)網(wǎng)絡(luò)負(fù)責(zé)從輸入特征向量中抽象出高層特征向量,匹配器負(fù)責(zé)計(jì)算兩個(gè)高層特征向量的相似度得分. 本方法中兩個(gè)基礎(chǔ)子網(wǎng)絡(luò)是具有四層隱藏層的DNN模型,匹配器由subtract層、全連接層和softmax層組成.
3 實(shí)驗(yàn)結(jié)果和分析
3.1 實(shí)驗(yàn)環(huán)境與數(shù)據(jù)
本文使用常用的Google Code Jam競(jìng)賽存檔中的Python源代碼作為評(píng)估的基準(zhǔn)數(shù)據(jù)集.GCJ比賽內(nèi)容包含一系列的算法問題,參賽者必須在指定時(shí)間內(nèi)解決,參賽者允許使用任意自選的編程語言和開發(fā)環(huán)境來解答問題.因?yàn)镚CJ這項(xiàng)比賽的參賽者幾乎包含了所有國(guó)家和地區(qū)的不同教育水平的編程者,能夠很好地模擬真實(shí)場(chǎng)景.本文爬取2008-2020年Google Code Jam已歸檔的所有數(shù)據(jù)集,篩選不是Python以及提交未通過的代碼.最后根據(jù)程序員數(shù)量和每個(gè)程序員對(duì)應(yīng)的代碼數(shù)將數(shù)據(jù)集分為不同的子集,如表1所示.具體來說,D50表示共有50位程序員并且每個(gè)程序員對(duì)應(yīng)的代碼數(shù)大于30.隨著程序員數(shù)量的增長(zhǎng),平均每個(gè)程序員擁有的代碼數(shù)量也在減少,代碼的作者身份識(shí)別也變得更困難.
本文用Pytorch和其擴(kuò)展庫PyTorch Geometric實(shí)現(xiàn)GCN、GMN和GGNN模型,批訓(xùn)練大小設(shè)置為64,訓(xùn)練輪數(shù)設(shè)置為30.圖匹配網(wǎng)絡(luò)層數(shù)設(shè)為4層,圖池化嵌入向量維度為400,學(xué)習(xí)率為0.001,使用Adam優(yōu)化器[19].對(duì)于孿生神經(jīng)網(wǎng)絡(luò)判別器,基礎(chǔ)網(wǎng)絡(luò)為具有4層隱藏層的DNN深度神經(jīng)網(wǎng)絡(luò),每層的神經(jīng)元為400,300,200和100,Dropout Rate設(shè)為0.2,激活函數(shù)使用Relu.本文分別使用AST、Javalang和Pycparser生成 Python、Java和C的數(shù)據(jù)增強(qiáng)抽象語法樹.
3.2 實(shí)驗(yàn)結(jié)果
本文使用準(zhǔn)確率作為評(píng)估指標(biāo),定義為正確分類的代碼樣本占總代碼樣本的比例,只使用準(zhǔn)確率而不是其他評(píng)估指標(biāo)(例如精度和召回率)是因?yàn)閿?shù)據(jù)集中平衡了每個(gè)類的代碼樣本數(shù)量.將本文提出設(shè)計(jì)的方法與其他的源代碼身份識(shí)別方法[9,10,20]進(jìn)行比較,具體的實(shí)驗(yàn)結(jié)果如表2所示.
可以看到,本文的方法在準(zhǔn)確率上優(yōu)于現(xiàn)有的其他技術(shù),例如,在100數(shù)量級(jí)的程序員身份識(shí)別中,本文的方法能夠達(dá)到97.50%的準(zhǔn)確率,比Caliskan-Islam、Hozhabrierdi和Ningfei Wang分別高出19.84%,12%和0.66%.另外,本方法適用于大規(guī)模程序員身份識(shí)別,在D1000樣本集中也有突出的表現(xiàn),在現(xiàn)有模型中識(shí)別準(zhǔn)確率最高,達(dá)到了95.60%的準(zhǔn)確率.本文提取的特征結(jié)合AST句法特征、語法特征和控制流特征,使用圖神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)和生成特征向量,通過圖神經(jīng)網(wǎng)絡(luò)和注意力機(jī)制解決特征數(shù)過多的問題,防止過擬合,提高了身份識(shí)別的效率和準(zhǔn)確率.
本文的方法很容易擴(kuò)展到其他編程語言,為了驗(yàn)證本方法的可擴(kuò)展性,我們又分別爬取Google Code Jam在2008-2020年的所有Java和C代碼,按照相同的處理步驟對(duì)樣本進(jìn)行清洗,構(gòu)建了包含Python,Java和C三種語言的數(shù)據(jù)集,每種編程語言都分為50,100,500和1000四種不同規(guī)模的數(shù)據(jù)集,每個(gè)數(shù)據(jù)集中每個(gè)作者的樣本數(shù)都要多于8份源代碼.本文統(tǒng)計(jì)了不同編程語言每份代碼樣本的平均代碼行數(shù),具體信息如表3所示.
本文分別使用GCN、GGNN和GMN[21]三種圖匹配神經(jīng)網(wǎng)絡(luò)對(duì)三種編程語言不同數(shù)據(jù)集進(jìn)行實(shí)驗(yàn).圖7報(bào)告了在源代碼作者身份識(shí)別過程中不同圖匹配神經(jīng)網(wǎng)絡(luò)(GCN、GGNN和GMN)在不同語言和數(shù)據(jù)集的識(shí)別效果.在圖7a中,本文的方法對(duì)50名Python程序員的作者身份識(shí)別實(shí)現(xiàn)了98.2%的準(zhǔn)確率.隨著將實(shí)驗(yàn)擴(kuò)展到更多程序員,
準(zhǔn)確率仍然很高,1000名程序員的準(zhǔn)確率達(dá)到95.6%.給定相同的實(shí)驗(yàn)配置,Java編程語言獲得了類似的結(jié)果,如圖7b所示,當(dāng)程序員人數(shù)為50名程序員時(shí),作者身份識(shí)別準(zhǔn)確率達(dá)到98.16%,在將實(shí)驗(yàn)擴(kuò)展到更多程序員后,本文對(duì)500名程序員實(shí)現(xiàn)了91.30%的準(zhǔn)確率,對(duì)1000名程序員實(shí)現(xiàn)了90.6%的準(zhǔn)確率.最后,對(duì)于C程序員,圖7c顯示,50名程序員的作者身份識(shí)別準(zhǔn)確率達(dá)到98.37%,100名程序員的準(zhǔn)確率達(dá)到95.56%,總共500名程序員的準(zhǔn)確率達(dá)到93.2%,1000名程序員的準(zhǔn)確率達(dá)到90.2%.這些結(jié)果表明,圖匹配神經(jīng)網(wǎng)絡(luò)能夠?qū)W習(xí)代碼作者特征的深度表示,另外無論使用何種編程語言,都能夠?qū)崿F(xiàn)大規(guī)模的作者身份識(shí)別.從圖7中還可以明顯地看到使用GMN網(wǎng)絡(luò)的準(zhǔn)確率始終比GGNN和GCN高,而且程序員規(guī)模越大越明顯,這是因?yàn)镚MN在傳播過程中會(huì)聯(lián)合學(xué)習(xí)兩張圖之間的信息,使用注意力機(jī)制來更新圖節(jié)點(diǎn)和圖邊的權(quán)重,通過增加時(shí)間和內(nèi)存開銷增強(qiáng)特征學(xué)習(xí)能力.
本文探究了基于數(shù)據(jù)增強(qiáng)抽象語法樹構(gòu)建特征圖時(shí)不同邊對(duì)作者身份識(shí)別的影響.實(shí)驗(yàn)選取的數(shù)據(jù)集是Python編程語言的GCJ數(shù)據(jù)集,分別為包含50,100,500和1000位程序員四種不同規(guī)模.特征圖構(gòu)建方法分別采用只使用AST基本邊,AST基本邊添加數(shù)據(jù)流邊,AST基本邊添加數(shù)據(jù)流和控制流邊(即包含所有類型的邊),實(shí)驗(yàn)的結(jié)果如圖8所示.
從圖8中可以看到,只使用AST基本邊構(gòu)建特征圖的方法(astonly)在Python數(shù)據(jù)集的識(shí)別準(zhǔn)確率最低,在1000位程序員數(shù)據(jù)級(jí)中只有84.2%的準(zhǔn)確率,在AST基礎(chǔ)邊上添加數(shù)據(jù)流邊(dataflow)的識(shí)別準(zhǔn)確率在1000位程序員數(shù)據(jù)級(jí)中可以達(dá)到88.5%的準(zhǔn)確率,包含了所有類型的邊的構(gòu)建特征圖的方法(alledge)準(zhǔn)確率最高,在1000位程序員數(shù)據(jù)級(jí)中可以到達(dá)95.6%的準(zhǔn)確率.這是因?yàn)殡S著包含的特征邊類型的增加,彌補(bǔ)了數(shù)據(jù)增強(qiáng)AST只包含語法特征的缺點(diǎn),增加了程序員特征提取的數(shù)量.
除了GCJ數(shù)據(jù)集,本文還選取GitHub數(shù)據(jù)集測(cè)試本方法的識(shí)別準(zhǔn)確率.收集的GitHub數(shù)據(jù)集包含GitHub-Java和GitHub-C,GitHub-Java由40位作者的2827個(gè)Java程序文件組成,每個(gè)程序文件平均有76行代碼.GitHub-C數(shù)據(jù)集通過爬取在2020年11月到12月之間做出貢獻(xiàn)的作者的C程序,本文通過刪除注釋來預(yù)處理這些C文件,然后消除了由于功能有限而少于30行代碼的文件,生成的數(shù)據(jù)集包含67個(gè)作者的2072個(gè)C文件,每個(gè)文件平均有88行代碼.使用GMN網(wǎng)絡(luò)進(jìn)行實(shí)驗(yàn)的結(jié)果如圖9所示.
圖9顯示了GitHub數(shù)據(jù)集中60名C程序員使用本方法進(jìn)行識(shí)別時(shí)的96%準(zhǔn)確率和40名Java程序員使用本方法進(jìn)行識(shí)別時(shí)96.3%的準(zhǔn)確率.這個(gè)結(jié)果表明本文的方法在處理真實(shí)世界的數(shù)據(jù)集時(shí)仍然有效.與GCJ數(shù)據(jù)集相比,結(jié)果顯示出一些識(shí)別準(zhǔn)確率的下降.這種下降是因?yàn)镚itHub存儲(chǔ)庫的貢獻(xiàn)者可以從其他來源復(fù)制代碼段甚至代碼文件;這種基本事實(shí)問題會(huì)影響作者身份識(shí)別過程的結(jié)果,這也說明本文使用的數(shù)據(jù)集的真實(shí)性.
最后,本文探究了代碼混淆對(duì)本方法的影響.本文使用的Stunnix混淆工具是一種流行的C/C++混淆器,它在保留其功能和結(jié)構(gòu)的同時(shí)進(jìn)行復(fù)雜的字符串替換.本實(shí)驗(yàn)針對(duì)100位作者的C數(shù)據(jù)集,其中源代碼文件使用Stunnix工具進(jìn)行混淆,然后進(jìn)行模型的學(xué)習(xí)判斷,實(shí)驗(yàn)結(jié)果如表4所示.
本文的方法能夠在100個(gè)作者的整個(gè)Stunnix混淆數(shù)據(jù)集上達(dá)到94.96%的準(zhǔn)確率,實(shí)驗(yàn)結(jié)果表明本文的方法是健壯的并且可以抵抗一定的現(xiàn)成的混淆器.
4 結(jié) 論
本文提出一種基于抽象語法樹和圖神經(jīng)網(wǎng)絡(luò)的程序員指紋身份識(shí)別方法.首先,將圖匹配神經(jīng)網(wǎng)絡(luò)引入到源代碼身份識(shí)別中,為了將代碼轉(zhuǎn)換為圖結(jié)構(gòu),本文提出數(shù)據(jù)增強(qiáng)AST并設(shè)計(jì)一種基于AST的構(gòu)建代碼特征圖的方式,它充分利用程序的控制流信息和數(shù)據(jù)流信息,通過添加不同種類的邊生成程序員的身份特征指紋;然后,通過圖匹配網(wǎng)絡(luò)學(xué)習(xí)和提取程序員的低維特征向量;最后,使用孿生神經(jīng)網(wǎng)絡(luò)對(duì)源代碼作者身份進(jìn)行識(shí)別.本文在Google Code Jam和GitHub數(shù)據(jù)集上評(píng)估了本文的方法,實(shí)驗(yàn)結(jié)果表明本文的方法在準(zhǔn)確率、編程語言擴(kuò)展性和大規(guī)模的程序員集合方面都勝過以往的方法,提高了源代碼作者身份識(shí)別的準(zhǔn)確率和魯棒性.
本文的評(píng)估方法中,默認(rèn)代碼都是由一位程序員作者編寫而成的,但是在實(shí)際的編碼環(huán)境中,編程代碼要復(fù)雜很多,通常由許多任務(wù)和多個(gè)程序員作者共同完成,本文設(shè)計(jì)的模型沒有考慮源代碼由多個(gè)程序員共同編寫的情況.這是我們未來可以繼續(xù)研究的方向.
參考文獻(xiàn):
[1]Burrows S, Tahaghoghi S M M, Zobel J. Efficient plagiarism detection for large code repositories [J]. Software Pract Exper, 2007, 37: 151.
[2]Wilcox L J. Authorship: the coin of the realm, the source of complaints [J]. JAMA, 1998, 280: 216.
[3]Frantzeskou G, Stamatatos E, Gritzalis S, et al. Identifying authorship by byte-level n-grams: The source code author profile (scap)method [J]. Int J Digit Evidence, 2007, 6: 1.
[4]Malin C H, Casey E, Aquilina J M. Malware forensics: investigating and analyzing maliciouscode [M]. [S.l.]: Syngress, 2008.
[5]Kalgutkar V, Kaur R, Gonzalez H, et al. Code authorship attribution: methods and challenges[J]. ACM Comput? Surv, 2019, 52: 1.
[6]Krsul I, Spafford E H. Authorship analysis: identifying the author of a program [J]. Comput Secur, 1997, 16: 233.
[7]Frantzeskou G, Stamatatos E, Gritzalis S, et al. Effective identification of source code authors using byte-level information [C]//Proceedings of the 28th International Conference on Software Engineering. Shanghai: IEEE Computer Society, 2006.
[8]Lange R C, Mancoridis S. Using code metric histograms and genetic algorithms to perform author identification for software forensics [C]//Proceedings of the 9th Annual Conference on Genetic and Evolutionary Computation. London:ACM, 2007: 2082.
[9]Caliskan-Islam A, Harang R, Liu A, et al. De-anonymizing programmers via code stylo-metry[C]// Proceedings of the 24th USENIX Security Symposium. Washington: Usenix Association, 2015: 255.
[10]Wang N, Ji S, Wang T. Integration of static and dynamic code stylometry analysis for programmer de-anonymization[C]//Proceedings of the 11th ACM Workshop on Artificial Intelligence and Security. Toronto: Springer Verlag, 2018: 74.
[11]Bogomolov E, Kovalenko V, Rebryk Y, et al. Authorship attribution of source code: A language-agnostic approach and applicability in software engineering[C]//Proceedings of the 29th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering. [S.l.]: ELECTR NETWORK Association for Computing Machinery, Inc, 2021.
[12]Alsulami B, Dauber E, Harang R, et al. Source code authorship attribution using long short-term memory based networks [C]//European Symposium on Research in Computer Security. Oslo: Springer, Cham, 2017: 65.
[13]Abuhamad M, Rhim J, AbuHmed T, et al. Code authorship identification using convolutional neural networks[J]. Future Gener Comp Sy, 2019, 95: 104.
[14]Guo D, Zhou A, Liu L, et al. A method of source code authorship attribution based on graph neural network [C]//Proceedings of 2021 Chinese Intelligent Automation Conference. Zhanjiang: Springer, 2022.
[15]Gori M, Monfardini G, Scarselli F. A new model for learning in graph domains[C]//Proceedings. 2005 IEEE International Joint Conference on Neural Networks. New York: IEEE, 2005.
[16]Li Y, Gu C, Dullien T, et al. Graph matching networks for learning the similarity of graph structured objects[C]//International Conference on Machine Learning. Long Beach:International Machine Learning Society, 2019.
[17]Cho K, Van Merri?nboer B, Bahdanau D, et al. On the properties of neural machine translation: encoder-decoder approaches[C]// Proceedings of SSST 2014 - 8th Workshop on Syntax, Semantics and Structure in Statistical Translation, Doha, Qatar: ACL, 2014: 103.
[18]Chopra S, Hadsell R, Yann L C. Learning a similarity metric discriminatively, with application to face verification[C]// Proceedings of the 2005 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR'05). San Diego: IEEE, 2005: 539.
[19]Kingma D P, Ba J. Adam: a method for stochastic optimization [C]// Proceedings of the 3rd International Conference on Learning Representations. San Diego, United states: ICLR, 2015.
[20]Hozhabrierdi P, Hitos D F, Mohan C K. Python source code de-anonymization using nested bigrams[C]//IEEE International Conference on Data Mining Workshops (ICDMW).Singapore: IEEE, 2018: 23.
[21]Li Y, Tarlow D, Brockschmidt M,et al. Gated graph sequence neural networks[C]// Proceedings of the 4th International Conference on Learning Representations. San Juan, Puerto Rico:ICLR, 2016.
引用本文格式:
中 文: 郭迪驍,周安民,劉亮,等. 基于抽象語法樹和圖匹配網(wǎng)絡(luò)的代碼作者身份識(shí)別[J]. 四川大學(xué)學(xué)報(bào): 自然科學(xué)版, 2023, 60: 063001.
英 文: Guo D X,Zhou A M,Liu L,et al. Code authorship attribution based on abstract syntax tree and graph neural network [J]. J Sichuan Univ: Nat Sci Ed, 2023, 60: 063001.
四川大學(xué)學(xué)報(bào)(自然科學(xué)版)2023年6期