国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法

      文檔序號(hào):6517043閱讀:388來源:國知局
      移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法
      【專利摘要】本發(fā)明公開一種移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法,包括:首先檢查代碼的完備性,如果代碼不完備則對(duì)源代碼進(jìn)行準(zhǔn)備工作,加載隱私泄露對(duì)應(yīng)的狀態(tài)機(jī)描述文件,得到相關(guān)的狀態(tài)機(jī)信息,對(duì)源代碼進(jìn)行編譯,得到類和函數(shù)等的詳細(xì)信息,對(duì)源代碼進(jìn)行預(yù)分析,生成抽象語法樹等基本數(shù)據(jù)結(jié)構(gòu),得到函數(shù)間的調(diào)用關(guān)系。再以函數(shù)為單位進(jìn)行檢測(cè)分析,根據(jù)狀態(tài)機(jī)中關(guān)聯(lián)的方法來為各個(gè)狀態(tài)機(jī)創(chuàng)建狀態(tài)機(jī)實(shí)例,在函數(shù)對(duì)應(yīng)的控制流圖上進(jìn)行狀態(tài)機(jī)實(shí)例迭代,當(dāng)狀態(tài)機(jī)實(shí)例進(jìn)入錯(cuò)誤狀態(tài)時(shí),報(bào)告錯(cuò)誤,在檢測(cè)完成后人工對(duì)檢測(cè)到的錯(cuò)誤進(jìn)行檢查,確認(rèn)檢測(cè)結(jié)果。應(yīng)用本發(fā)明能夠有效檢測(cè)不同操作系統(tǒng)平臺(tái)的應(yīng)用程序中存在的隱私泄露代碼,有效防止用戶隱私信息泄露。
      【專利說明】移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法
      【技術(shù)領(lǐng)域】
      [0001]本發(fā)明涉及軟件測(cè)試技術(shù)和應(yīng)用程序安全檢測(cè)技術(shù),尤其涉及移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法。
      【背景技術(shù)】
      [0002]移動(dòng)設(shè)備應(yīng)用隱私泄露目前受到了很多研究機(jī)構(gòu)和學(xué)者的重視,國內(nèi)外已經(jīng)有多家機(jī)構(gòu)進(jìn)行了相關(guān)的研究。根據(jù)是否運(yùn)行被檢測(cè)應(yīng)用可以將檢測(cè)技術(shù)劃分為兩種:動(dòng)態(tài)檢測(cè)和靜態(tài)檢測(cè)。
      [0003]動(dòng)態(tài)檢測(cè)技術(shù)是在運(yùn)行應(yīng)用的過程中,檢查應(yīng)用是否對(duì)隱私泄露進(jìn)行了泄露操作。由于是在應(yīng)用運(yùn)行過程中進(jìn)行檢測(cè),所以動(dòng)態(tài)檢測(cè)對(duì)于實(shí)時(shí)性的要求比較高,因?yàn)楸仨氁趷阂鈶?yīng)用對(duì)用戶的隱私泄露前檢測(cè)出威脅。通常的動(dòng)態(tài)檢測(cè)解決方案是利用沙盒、虛擬機(jī)等來模擬執(zhí)行應(yīng)用,但是這樣會(huì)帶來很大的資源消耗。
      [0004]靜態(tài)檢測(cè)技術(shù)是在運(yùn)行應(yīng)用之前進(jìn)行的,并不運(yùn)行應(yīng)用本身,而是通過分析應(yīng)用源程序的語法、結(jié)構(gòu)、過程等來檢測(cè)應(yīng)用是否存在隱私泄露。對(duì)源程序做結(jié)構(gòu)分析、控制流圖分析、符號(hào)執(zhí)行等來查找問題。靜態(tài)檢測(cè)對(duì)資源的需求相對(duì)于動(dòng)態(tài)檢測(cè)要少,而且對(duì)于實(shí)時(shí)性的要求更低,因?yàn)樵趹?yīng)用執(zhí)行之前檢測(cè)已經(jīng)完成。
      [0005]對(duì)于常見移動(dòng)終端(如手機(jī)、平板電腦等)的操作系統(tǒng),如Android、ios、WindowsPhone系統(tǒng)等,應(yīng)用程序的隱私信息泄露主要包括兩方面:讀取隱私信息和發(fā)送隱私信息。根據(jù)隱私信息的讀取方式將隱私信息劃分為數(shù)據(jù)庫型隱私、系統(tǒng)服務(wù)型隱私兩大類,并且為兩大類分別編寫不同的檢查條件。隱私發(fā)送類型包括網(wǎng)絡(luò)連接類、短信類以及文件類,針對(duì)不同的泄露類型編寫不同的發(fā)送檢測(cè)條件。
      [0006]目前,移動(dòng)互聯(lián)網(wǎng)隱私安全問題形式嚴(yán)峻,一旦發(fā)生隱私信息泄露,輕則會(huì)給智能移動(dòng)終端使用者造成財(cái)產(chǎn)方面的損失,重則名譽(yù)、人格,甚至人身安全受到威脅,若不加以重視,任其發(fā)展的后果將十分嚴(yán)重。而現(xiàn)有常用手機(jī)安全軟件查殺隱私泄露,由于運(yùn)行平臺(tái)繁多、須定期更新或升級(jí)等各種原因,很難從源頭上防止手機(jī)隱私信息泄露。

      【發(fā)明內(nèi)容】

      [0007]有鑒于此,本發(fā)明的主要目的在于提供一種移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法,能夠從源代碼層面檢測(cè)應(yīng)用程序是否存在隱私泄露,可有效防止惡意泄露用戶隱私及傳播,并能夠快速準(zhǔn)確的發(fā)現(xiàn)應(yīng)用程序中的隱私泄露隱患,提高檢測(cè)效率和檢測(cè)精度。
      [0008]為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
      一種移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法,包括如下步驟:
      步驟A、取得源代碼輸入,根據(jù)操作系統(tǒng)的應(yīng)用特征,對(duì)源代碼進(jìn)行完備性檢查;
      步驟B、根據(jù)步驟A中檢查的結(jié)果,若代碼完備則執(zhí)行步驟D,否則執(zhí)行步驟C ;
      步驟C、對(duì)源代碼進(jìn)行預(yù)處理工作,使得源代碼能夠正確的通過編譯;
      步驟D、加載要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件,得到對(duì)應(yīng)的隱私泄露的狀態(tài)機(jī);
      步驟E、編譯源代碼對(duì)源代碼進(jìn)行預(yù)分析,得到每個(gè)類的抽象語法樹,并且在抽象語法樹的基礎(chǔ)上生成符號(hào)表,控制流圖,定義使用鏈和函數(shù)調(diào)用關(guān)系等數(shù)據(jù)結(jié)構(gòu),為后續(xù)的分析做好準(zhǔn)備工作;
      步驟F、根據(jù)函數(shù)調(diào)用關(guān)系確定文件的調(diào)用關(guān)系,進(jìn)而確定文件的分析順序,在文件內(nèi)部確定文件內(nèi)的函數(shù)調(diào)用關(guān)系,以函數(shù)為單位生成函數(shù)摘要;
      步驟G、以函數(shù)為單位進(jìn)行隱私泄露的檢測(cè)工作,根據(jù)加載的狀態(tài)機(jī)在函數(shù)中創(chuàng)建狀態(tài)機(jī)實(shí)例,在函數(shù)的控制流圖上進(jìn)行狀態(tài)機(jī)實(shí)例的迭代,在每個(gè)控制流節(jié)點(diǎn)上計(jì)算該節(jié)點(diǎn)對(duì)狀態(tài)機(jī)實(shí)例的影響,檢查狀態(tài)機(jī)實(shí)例的狀態(tài)轉(zhuǎn)換條件,如果符合條件就進(jìn)行狀態(tài)轉(zhuǎn)換;如果轉(zhuǎn)移到錯(cuò)誤狀態(tài)就報(bào)錯(cuò);
      步驟H、檢查是否所有函數(shù)已經(jīng)檢查完畢,如果沒有則繼續(xù)執(zhí)行步驟G,如果全部檢測(cè)完畢就結(jié)束控制流迭代,繼續(xù)步驟I ;
      步驟1、將檢測(cè)結(jié)果寫入文件中,人工對(duì)檢測(cè)結(jié)果進(jìn)行校對(duì),檢查是否存在誤報(bào)等情況。
      [0009]其中,所述步驟A具體包括:
      通過程序入口參數(shù)獲得源代碼工程所在目錄,對(duì)源代碼進(jìn)行檢測(cè);Android應(yīng)用程序與Java普通應(yīng)用稍有不同,它引入了資源文件和AIDL接口文件的概念,在編譯的時(shí)候需要將資源文件和AIDL接口文件轉(zhuǎn)換成對(duì)應(yīng)的Java文件才能正常編譯;具體包括:
      Al、檢查工程的project, properties文件,得到應(yīng)用中所使用的Android SDK的版本信息;
      A2、檢查當(dāng)前工程的源代碼目錄,查找是否存在gen目錄,如果存在,則在gen目錄中查找是否存在R.java文件,查看資源文件是否準(zhǔn)備好;
      A3、檢查源代碼目錄中是否存在.aidl格式的文件,如果存在則在該目錄和gen目錄下查找是否存在相同路徑相同名字的.java格式文件,查看接口文件是否準(zhǔn)備好。
      [0010]所述步驟B具體包括:步驟B主要是根據(jù)步驟A判斷源代碼是否需要進(jìn)行預(yù)處理工作,若需要,則執(zhí)行步驟C ;否則執(zhí)行步驟D。
      [0011]所述步驟C包括:根據(jù)步驟A中的檢查結(jié)果對(duì)應(yīng)用程序源代碼進(jìn)行預(yù)處理工作,具體為:
      Cl、如果資源文件相關(guān)類R.java不存在,則調(diào)用aapt命令生成R.java文件,即關(guān)聯(lián)資源文件;
      C2、如果接口文件存在且沒有被轉(zhuǎn)換,則調(diào)用aidl命令生成.aidl文件對(duì)應(yīng)的.java文件,完成接口文件的準(zhǔn)備工作。
      [0012]所述步驟D中進(jìn)行狀態(tài)機(jī)描述文件的加載工作,具體包括:
      D1、掃描狀態(tài)機(jī)描述文件的存放目錄,得到需要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件(xml格式);
      D2、調(diào)用狀態(tài)機(jī)加載方法,讀取每個(gè)狀態(tài)機(jī)描述文件,生成狀態(tài)機(jī);每個(gè)狀態(tài)機(jī)對(duì)應(yīng)一個(gè)狀態(tài)機(jī)類的對(duì)象,在對(duì)象中包含狀態(tài)機(jī)包含的狀態(tài)、轉(zhuǎn)換、轉(zhuǎn)換條件的集合以及狀態(tài)機(jī)關(guān)聯(lián)的動(dòng)作類路徑,最后將所有狀態(tài)機(jī)放在待檢測(cè)狀態(tài)機(jī)集合中。
      [0013]所述步驟E中的對(duì)源代碼進(jìn)行預(yù)分析工作,得到隱私泄露檢測(cè)過程中需要用到的抽象語法樹、控制流圖等數(shù)據(jù)結(jié)構(gòu);具體包括: El、對(duì)應(yīng)用程序源代碼進(jìn)行編譯工作得到class文件;
      E2、利用JavaCC生成的JavaParser對(duì)源代碼進(jìn)行語法解析,生成源代碼對(duì)應(yīng)的抽象語法樹;
      E3、在抽象語法樹上利用訪問者模式對(duì)抽象語法樹進(jìn)行訪問,結(jié)合編譯得到的class文件,利用Java反射機(jī)制得到抽象語法樹上各個(gè)符號(hào)的函數(shù)以,生成符號(hào)表;
      E4、在抽象語法樹上對(duì)函數(shù)節(jié)點(diǎn)進(jìn)行訪問,為每個(gè)函數(shù)生成對(duì)應(yīng)的控制流圖;
      E5、訪問抽象語法樹,找到函數(shù)調(diào)用節(jié)點(diǎn),記錄函數(shù)間的調(diào)用關(guān)系。
      [0014]所述步驟F中按順序?yàn)楹瘮?shù)生成函數(shù)摘要,具體包括:
      F1、根據(jù)函數(shù)調(diào)用關(guān)系得到函數(shù)所在文件的分析順序;
      F2、在文件內(nèi)部檢查文件內(nèi)函數(shù)的調(diào)用關(guān)系,得到文件內(nèi)函數(shù)的分析順序;
      F3、加載要生成的函數(shù)摘要的類型,對(duì)于隱私信息的讀取和泄露,根據(jù)不同的類型有不同的函數(shù)摘要;
      F4、對(duì)每個(gè)函數(shù)進(jìn)行控制流圖迭代訪問,查看是否存在帶檢測(cè)類型的摘要信息,是否存在隱私信息讀取特征和發(fā)送特征;具體包括:
      F4.1、查找函數(shù)中是否存在隱私讀取,如果存在,那么記錄隱私信息在控制流圖的迭代以及賦值情況,檢查函數(shù)是否存在return語句,如果存在,檢查return的返回值中是否包含隱私信息,如果包含,則在函數(shù)摘要中記錄該信息;如果該隱私信息被賦值給了成員變量,那么將該成員變量加入到成員變量摘要中;
      F4.2、檢查函數(shù)中是否調(diào)用了可能造成隱私泄露的API ;在函數(shù)的控制流圖中記錄函數(shù)形參的迭代過程,查找控制流圖當(dāng)前節(jié)點(diǎn)是否存在可能泄露隱私的API調(diào)用,如果存在,檢查該調(diào)用的實(shí)參是否包含當(dāng)前函數(shù)形參的別名,如果包含說明該函數(shù)具備信息發(fā)送的特征,將其記錄到函數(shù)摘要中。
      [0015]所述G步驟以函數(shù)為單位進(jìn)行隱私泄露的檢測(cè),具體包括:
      G1、在當(dāng)前函數(shù)對(duì)應(yīng)的抽象語法樹上關(guān)聯(lián)狀態(tài)機(jī)實(shí)例的生成方法,在語法樹上匹配,查找符合條件的節(jié)點(diǎn),生成狀態(tài)機(jī)實(shí)例,并關(guān)聯(lián)對(duì)應(yīng)的語法樹節(jié)點(diǎn);
      G2、在函數(shù)對(duì)應(yīng)的控制流圖上對(duì)狀態(tài)機(jī)實(shí)例進(jìn)行狀態(tài)機(jī)迭代;在控制流圖的每個(gè)節(jié)點(diǎn)上匯總所有狀態(tài)機(jī)實(shí)例的當(dāng)前狀態(tài),并且計(jì)算當(dāng)前節(jié)點(diǎn)是否滿足狀態(tài)轉(zhuǎn)換的條件,如果滿足,則進(jìn)行狀態(tài)轉(zhuǎn)換,當(dāng)狀態(tài)轉(zhuǎn)換到錯(cuò)誤狀態(tài)時(shí),說明檢測(cè)到隱私泄露,記錄該節(jié)點(diǎn)以及被泄漏的變量信息。
      [0016]所述H步驟是對(duì)檢測(cè)是否結(jié)束進(jìn)行判斷具體包括:
      是否所有的函數(shù)都已經(jīng)檢測(cè)完畢,如果沒有則在下一個(gè)函數(shù)節(jié)點(diǎn)上執(zhí)行步驟G,如果所有函數(shù)都檢測(cè)完畢,那么執(zhí)行步驟I。
      [0017]所述步驟I中是對(duì)檢測(cè)結(jié)果進(jìn)行人工校對(duì),具體包括:
      將檢測(cè)結(jié)果寫入到文件中,人工檢查文件中的記錄,在應(yīng)用程序?qū)?yīng)的源代碼上核對(duì)是否是誤報(bào)。
      [0018]本發(fā)明所提供的移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法,具有以下優(yōu)點(diǎn):
      本發(fā)明提出的缺陷模型在Android等平臺(tái)應(yīng)用隱私泄露的靜態(tài)檢測(cè)中的應(yīng)用,能夠針
      對(duì)源代碼的特點(diǎn),對(duì)源代碼進(jìn)行了相關(guān)處理,并為隱私泄露創(chuàng)建對(duì)應(yīng)的狀態(tài)機(jī)模型以及函數(shù)摘要的生成方法,相對(duì)于一般的靜態(tài)處理方法(基于二進(jìn)制代碼進(jìn)行分析),本發(fā)明針對(duì)源代碼進(jìn)行分析,并且將隱私信息進(jìn)行匯總和分類,整理了可能造成隱私泄露的API調(diào)用。在源代碼的層面對(duì)隱私泄露進(jìn)行檢測(cè),將軟件測(cè)試的思想應(yīng)用到隱私泄露檢測(cè)中,更加快速準(zhǔn)確的發(fā)現(xiàn)應(yīng)用程序中的隱私泄露,提高了檢測(cè)效率和檢測(cè)精度。
      【專利附圖】

      【附圖說明】
      [0019]圖1為本發(fā)明移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法流程示意圖;
      圖2為本發(fā)明缺陷模式在Android應(yīng)用隱私泄露的靜態(tài)檢測(cè)中應(yīng)用的流程示意圖;
      圖3為本發(fā)明手機(jī)基本信息狀態(tài)機(jī)對(duì)應(yīng)的狀態(tài)轉(zhuǎn)移圖;
      圖4為本發(fā)明檢測(cè)的某工程的代碼圖;
      圖5為Android應(yīng)用程序的基本結(jié)構(gòu)圖;
      圖6為本發(fā)明示例代碼中foo函數(shù)對(duì)應(yīng)的控制流圖。
      【具體實(shí)施方式】
      [0020]下面結(jié)合附圖及本發(fā)明的實(shí)施例,以在Android平臺(tái)下進(jìn)行檢測(cè)為例(其余移動(dòng)終端操作系統(tǒng)與其類似),對(duì)本發(fā)明的移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法作進(jìn)一步詳細(xì)的說明。
      [0021]圖1為本發(fā)明移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法流程示意圖。如圖1所示,包括如下步驟:
      步驟A、取得源代碼輸入,根據(jù)操作系統(tǒng),如Android平臺(tái)的應(yīng)用特征,對(duì)源代碼進(jìn)行完備性檢查。
      [0022]這里,通過程序入口參數(shù)獲得源代碼工程所在目錄,對(duì)源代碼進(jìn)行檢測(cè)。其中,Android應(yīng)用程序與Java普通應(yīng)用在這里稍有不同,其需要引入資源文件和AIDL接口文件的概念,在編譯的時(shí)候需要將資源文件和AIDL接口文件轉(zhuǎn)換成對(duì)應(yīng)的Java文件才能正常編譯。
      [0023]步驟B、根據(jù)步驟A中檢查的結(jié)果,若代碼完備則執(zhí)行步驟D,否則執(zhí)行步驟C。這里,需根據(jù)步驟A判斷源代碼是否需要進(jìn)行預(yù)處理工作,若需要,則執(zhí)行步驟C ;否則執(zhí)行步驟D。
      [0024]步驟C、對(duì)源代碼進(jìn)行預(yù)處理工作,使得源代碼能夠正確的通過編譯。
      [0025]這里,步驟C具體包括:
      Cl、關(guān)聯(lián)資源文件,根據(jù)project, properties文件得到應(yīng)用使用的SDK版本,然后調(diào)用SDK提供的aapt命令生成R.java ;
      C2、檢查應(yīng)用中是否存在AIDL接口文件,如果存在AIDL接口文件,那么調(diào)用SDK提供的aidl工具生成AIDL接口文件對(duì)應(yīng)的Java文件。
      [0026]步驟D、加載要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件,得到對(duì)應(yīng)的隱私泄露的狀態(tài)機(jī)。
      [0027]這里,所述步驟D具體包括:
      D1、狀態(tài)機(jī)描述文件存放在程序指定目錄,讀取指定目錄的文件列表,得到需要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件;
      D2、狀態(tài)機(jī)描述文件是用xml語言編寫的,調(diào)用狀態(tài)機(jī)加載方法,讀取每個(gè)狀態(tài)機(jī)描述文件,生成狀態(tài)機(jī)以及狀態(tài)機(jī)包含的狀態(tài)、轉(zhuǎn)換以及轉(zhuǎn)換條件的集合。
      [0028]步驟E、編譯源代碼對(duì)源代碼進(jìn)行預(yù)分析,得到每個(gè)類的抽象語法樹,并且在抽象語法樹的基礎(chǔ)上生成符號(hào)表,控制流圖,定義使用鏈和函數(shù)調(diào)用關(guān)系等數(shù)據(jù)結(jié)構(gòu),為后續(xù)的分析做好準(zhǔn)備工作。
      [0029]這里,所述步驟E具體包括:
      E1、對(duì)源代碼進(jìn)行編譯,Java提供了反射機(jī)制,可以通過反射調(diào)用得到類、方法以及成員變量的特征信息;
      E2、對(duì)源代碼進(jìn)行預(yù)分析,通過JavaCC解析Java文法得到的JavaParser語法解釋器生成抽象語法樹,在抽象語法樹上通過訪問者模式生成符號(hào)表和控制流圖,并分析函數(shù)間的調(diào)用關(guān)系。
      [0030]步驟F、根據(jù)函數(shù)調(diào)用關(guān)系確定文件的調(diào)用關(guān)系,進(jìn)而確定文件的分析順序,在文件內(nèi)部確定文件內(nèi)的函數(shù)調(diào)用關(guān)系,以函數(shù)為單位生成函數(shù)摘要。
      [0031]這里,所述步驟F具體包括:
      F1、根據(jù)函數(shù)調(diào)用關(guān)系,得到函數(shù)所在文件的調(diào)用關(guān)系,進(jìn)而得到文件的分析順序;
      F2、得到文件內(nèi)部的函數(shù)列表以及函數(shù)的調(diào)用關(guān)系,根據(jù)根據(jù)函數(shù)的調(diào)用關(guān)系的逆序來進(jìn)行以函數(shù)為單位的分析,為每個(gè)函數(shù)根據(jù)不同的隱私類型生成讀取類和泄漏類函數(shù)摘要。
      [0032]步驟G、以函數(shù)為單位進(jìn)行隱私泄露的檢測(cè)工作,根據(jù)加載的狀態(tài)機(jī)在函數(shù)中創(chuàng)建狀態(tài)機(jī)實(shí)例,在函數(shù)的控制流圖上進(jìn)行狀態(tài)機(jī)實(shí)例的迭代,在每個(gè)控制流節(jié)點(diǎn)上計(jì)算該節(jié)點(diǎn)對(duì)狀態(tài)機(jī)實(shí)例的影響,檢查狀態(tài)機(jī)實(shí)例的狀態(tài)轉(zhuǎn)換條件,如果符合條件就進(jìn)行狀態(tài)轉(zhuǎn)換;如果轉(zhuǎn)移到錯(cuò)誤狀態(tài)就報(bào)錯(cuò)。
      [0033]這里,所述步驟G具體內(nèi)容如下:
      以函數(shù)為單位開始進(jìn)行隱私泄漏的檢測(cè),首先調(diào)用狀態(tài)機(jī)中關(guān)聯(lián)的狀態(tài)機(jī)實(shí)例生成方法訪問當(dāng)前函數(shù)生成狀態(tài)機(jī)實(shí)例;在函數(shù)控制流圖上進(jìn)行狀態(tài)機(jī)迭代,在每個(gè)節(jié)點(diǎn)上維護(hù)當(dāng)前節(jié)點(diǎn)的各個(gè)狀態(tài)機(jī)實(shí)例的狀態(tài)集合并計(jì)算當(dāng)前節(jié)點(diǎn)是否滿足狀態(tài)轉(zhuǎn)移條件,如果滿足則進(jìn)行狀態(tài)轉(zhuǎn)換,當(dāng)狀態(tài)跳轉(zhuǎn)到錯(cuò)誤狀態(tài)時(shí)就代表檢測(cè)到一個(gè)隱私泄漏,記錄該信息并繼續(xù)控制流迭代,直到當(dāng)前函數(shù)結(jié)束。
      [0034]步驟H、檢查是否所有函數(shù)已經(jīng)檢查完畢,如果沒有則繼續(xù)執(zhí)行步驟G,如果全部檢測(cè)完畢就結(jié)束控制流迭代,繼續(xù)步驟I。
      [0035]這里,所述步驟H包括:
      在一個(gè)函數(shù)檢查完畢之后,檢查函數(shù)列表總是還有未檢測(cè)函數(shù),如果有則繼續(xù)在下一個(gè)函數(shù)中執(zhí)行步驟G,如果沒有就代表所有的函數(shù)方法已經(jīng)檢測(cè)結(jié)束,進(jìn)行步驟I。
      [0036]步驟1、將檢測(cè)結(jié)果寫入文件中,人工對(duì)檢測(cè)結(jié)果進(jìn)行校對(duì),檢查是否存在誤報(bào)等情況。
      [0037]這里,所述步驟I具體包括:將檢測(cè)結(jié)果寫入到文件中,對(duì)一個(gè)Android應(yīng)用的自動(dòng)檢測(cè)結(jié)束,人工查看結(jié)果文件,查找文件中是否存在誤報(bào)情況。
      [0038]下面結(jié)合圖2?圖6對(duì)本發(fā)明的方法在Android系統(tǒng)的應(yīng)用進(jìn)行舉例說明。
      [0039]圖2為本發(fā)明缺陷模式在Android應(yīng)用隱私泄露的靜態(tài)檢測(cè)中應(yīng)用的流程示意圖。如圖2所示,主要包括: 步驟1:檢查工程目錄(參考圖5),找到project, properties文件,在文件中找到target屬性對(duì)應(yīng)的值就是應(yīng)用使用的Android SDK版本,查找工程中是否存在gen目錄,如果存在,繼續(xù)檢查gen目錄的子目錄中是否包含R.java文件,記錄查找結(jié)果;在工程的src目錄查找是否存在aidl接口文件,如果存在,則在aidl文件所在目錄和gen目錄查找是否存在相同路徑和名稱的java文件,記錄查找結(jié)果。
      [0040]步驟2:檢查步驟I的查找結(jié)果,如果沒有找到R.java或者aidl接口文件對(duì)應(yīng)的java文件,那么進(jìn)行步驟3.1或步驟3.2,否則進(jìn)行步驟4。
      [0041]步驟3.1:如果沒有找到R.java文件,調(diào)用aapt命令,以步驟I中得到的AndroidSDK版本為參數(shù)生成R.java文件;
      步驟3.2:如果找到aidl接口文件且未找到對(duì)應(yīng)的java文件,那么調(diào)用aidl命令生成aidl接口文件對(duì)應(yīng)的java文件。完成應(yīng)用源代碼的準(zhǔn)備工作。
      [0042]步驟4:加載狀態(tài)機(jī)描述文件,我們定義了 CIL (聯(lián)系人信息泄漏)、PIL (手機(jī)基本信息泄露)、PKIL (安裝軟件信息泄露)等幾種不同的隱私類型對(duì)應(yīng)的狀態(tài)機(jī)描述文件,在描述文件中定義了狀態(tài)機(jī)包含的狀態(tài)集合、狀態(tài)間可能的轉(zhuǎn)換、每個(gè)轉(zhuǎn)換所需要滿足的條件以及執(zhí)行相關(guān)檢測(cè)的關(guān)聯(lián)動(dòng)作(參考圖3)。然后運(yùn)行步驟5.1或步驟5.2。
      [0043]步驟5.1:對(duì)源代碼進(jìn)行編譯工作。編譯器采用Java API提供的JavaCompiler,在編譯過程中對(duì)文件編碼進(jìn)行了識(shí)別,并對(duì)不同的編碼格式進(jìn)行了編碼轉(zhuǎn)換,確保編譯過程能夠準(zhǔn)確生成class文件;
      步驟5.2:對(duì)源代碼進(jìn)行預(yù)分析,以文件為單位為源代碼生成抽象語法樹,并在抽象語法樹上通過訪問者模式進(jìn)行遍歷,生成符號(hào)表和控制流圖以及函數(shù)間的調(diào)用關(guān)系。在圖4中,函數(shù)調(diào)用關(guān)系為foo調(diào)用registerUser,registerUser調(diào)用doHTTPPost。然后運(yùn)行步驟6.1或步驟6.2。
      [0044]步驟6.1:確定文件分析順序以及函數(shù)分析順序。分析順序是調(diào)用關(guān)系的逆序。如圖4所示的函數(shù)的分析順序?yàn)閐oHTTPPost、registerUser、foo。
      [0045]步驟6.2:為每個(gè)函數(shù)生成函數(shù)摘要。在doHTTPPost函數(shù)中調(diào)用了 HttpClient的execute O函數(shù),此函數(shù)為網(wǎng)絡(luò)連接API,并且該函數(shù)將doHTTPPost的形參的封裝作為參數(shù),發(fā)送到網(wǎng)絡(luò),所以doHTTPPost函數(shù)包含網(wǎng)絡(luò)泄露的摘要信息。再分析registerUser函數(shù),在registerUser函數(shù)中調(diào)用了 doHTTPPost函數(shù),而且將registerUser的形參作為doHTTPPost的實(shí)參進(jìn)行了使用,發(fā)生了摘要傳遞,所以registerUser也包含了網(wǎng)絡(luò)泄露的摘要信息。最后分析foo函數(shù),函數(shù)沒有雖然讀取了手機(jī)的IMEI信息,但是沒有對(duì)信息進(jìn)行return,而且也沒有對(duì)函數(shù)的形參進(jìn)行泄漏,所以foo函數(shù)沒有摘要信息。
      [0046]步驟7:以函數(shù)為單位進(jìn)行分析,先分析doHTTPPost函數(shù),在doHTTPPost函數(shù)的語法樹上查找是否有滿足狀態(tài)機(jī)實(shí)例的創(chuàng)建條件的節(jié)點(diǎn),即是否有讀取隱私信息的節(jié)點(diǎn),發(fā)現(xiàn)該函數(shù)并不存在隱私讀取,所以該函數(shù)上沒有創(chuàng)建狀態(tài)機(jī)實(shí)例。沒有狀態(tài)機(jī)實(shí)例則該函數(shù)的分析結(jié)束。然后運(yùn)行步驟8。
      [0047]這里,與doHTTPPost函數(shù)的檢測(cè)相同,在registerUser函數(shù)中同樣沒有發(fā)現(xiàn)隱私讀取時(shí),繼續(xù)步驟8。
      [0048]步驟8:檢查是否還有未分析函數(shù),發(fā)現(xiàn)還有registerUser函數(shù)和foo函數(shù)未檢測(cè),在registerUser函數(shù)上運(yùn)行步驟7。[0049]這里,檢查發(fā)現(xiàn)還有foo函數(shù)未檢測(cè),則在foo函數(shù)上繼續(xù)執(zhí)行步驟7。
      [0050]步驟7.1:同前面兩個(gè)函數(shù)一樣,在foo的抽象語法樹上檢查是否存在隱私讀取節(jié)點(diǎn),發(fā)現(xiàn)在第3行的節(jié)點(diǎn)上獲得了手機(jī)基本信息服務(wù)管理類,說明可能讀取了隱私信息。為其創(chuàng)建PIL狀態(tài)機(jī)實(shí)例,并將變量manager關(guān)聯(lián)到狀態(tài)機(jī)實(shí)例上。此時(shí)PIL的狀態(tài)機(jī)實(shí)例處于Start狀態(tài);
      步驟7.2:在foo函數(shù)對(duì)應(yīng)的控制流上進(jìn)行狀態(tài)機(jī)實(shí)例的迭代,如圖6所示,在迭代開始的func_head_0節(jié)點(diǎn)上狀態(tài)機(jī)處于Start狀態(tài),在decl_l節(jié)點(diǎn)上,manager讀取了隱私,并且manager就是當(dāng)前PIL狀態(tài)機(jī)實(shí)例關(guān)聯(lián)的變量,所以符合狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換條件,狀態(tài)機(jī)實(shí)例跳轉(zhuǎn)到InfoRead狀態(tài)(參考圖3);在后續(xù)的decl_2和decl_3節(jié)點(diǎn)上沒有對(duì)manager做任何處理,所以在這兩個(gè)節(jié)點(diǎn)上只是單純的繼承了各自前驅(qū)節(jié)點(diǎn)的狀態(tài),都是InfoRead狀態(tài)。在decl_4節(jié)點(diǎn)上,調(diào)用了 registerUser函數(shù),registerUser函數(shù)是包含泄露摘要的,檢查registerUser的實(shí)參發(fā)現(xiàn)是imei,包含了隱私信息,所以在此處程序通過調(diào)用registerUser函數(shù)將手機(jī)的MEI碼信息發(fā)送到網(wǎng)絡(luò)上,造成了用戶的隱私泄露,所以狀態(tài)機(jī)跳轉(zhuǎn)到ERROR狀態(tài),并記錄該泄露信息。然后狀態(tài)機(jī)重新跳轉(zhuǎn)到InfoRead狀態(tài),繼續(xù)檢查func_out_5發(fā)現(xiàn)沒有泄露信息,當(dāng)前函數(shù)檢查完畢,狀態(tài)機(jī)實(shí)例銷毀。繼續(xù)步驟8。
      [0051]步驟9:檢查發(fā)現(xiàn)所有的函數(shù)都檢測(cè)完畢,繼續(xù)步驟10。
      [0052]步驟10:將檢測(cè)到的隱私泄露信息寫入結(jié)果文件,人工校對(duì)后發(fā)現(xiàn)確實(shí)發(fā)生了隱私泄露,程序檢測(cè)結(jié)果正確。至此對(duì)一個(gè)Android應(yīng)用的檢測(cè)到此結(jié)束。
      [0053]以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
      【權(quán)利要求】
      1.一種移動(dòng)應(yīng)用中隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,包括如下步驟: A、取得源代碼輸入,根據(jù)操作系統(tǒng)的應(yīng)用特征,對(duì)源代碼進(jìn)行完備性檢查; B、根據(jù)步驟A中檢查的結(jié)果,若代碼完備則執(zhí)行步驟D,否則執(zhí)行步驟C; C、對(duì)源代碼進(jìn)行預(yù)處理工作,使得源代碼能夠正確的通過編譯,然后執(zhí)行步驟D; D、加載要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件,得到對(duì)應(yīng)的隱私泄露的狀態(tài)機(jī); E、編譯源代碼對(duì)源代碼進(jìn)行預(yù)分析,得到每個(gè)類的抽象語法樹,并且在抽象語法樹的基礎(chǔ)上生成符號(hào)表,控制流圖,定義使用鏈和函數(shù)調(diào)用關(guān)系的數(shù)據(jù)結(jié)構(gòu),為后續(xù)的分析做好準(zhǔn)備工作; F、根據(jù)函數(shù)調(diào)用關(guān)系確定文件的調(diào)用關(guān)系,進(jìn)而確定文件的分析順序,在文件內(nèi)部確定文件內(nèi)的函數(shù)調(diào)用關(guān)系,以函數(shù)為單位生成函數(shù)摘要; G、以函數(shù)為單位進(jìn)行隱私泄露的檢測(cè)工作,根據(jù)加載的狀態(tài)機(jī)在函數(shù)中創(chuàng)建狀態(tài)機(jī)實(shí)例,在函數(shù)的控制流圖上進(jìn)行狀態(tài)機(jī)實(shí)例的迭代,在每個(gè)控制流節(jié)點(diǎn)上計(jì)算該節(jié)點(diǎn)對(duì)狀態(tài)機(jī)實(shí)例的影響,檢查狀態(tài)機(jī)實(shí)例的狀態(tài)轉(zhuǎn)換條件,如果符合條件就進(jìn)行狀態(tài)轉(zhuǎn)換;如果轉(zhuǎn)移到錯(cuò)誤狀態(tài)就報(bào)錯(cuò); H、檢查是否所有函數(shù)已經(jīng)檢查完畢,如果沒有則繼續(xù)執(zhí)行步驟G,如果全部檢測(cè)完畢就結(jié)束控制流迭代,繼續(xù)步驟I ; 1、將檢測(cè)結(jié)果寫入文件中,人工對(duì)檢測(cè)結(jié)果進(jìn)行校對(duì),檢查是否存在誤報(bào)情況。
      2.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟A具體內(nèi)容如下: 通過程序入口參數(shù)獲得源代碼工程所在目錄,對(duì)源代碼進(jìn)行檢測(cè);Android應(yīng)用程序與Java普通應(yīng)用不同,其引入了資源文件和AIDL接口文件的概念,在編譯的時(shí)候需要將資源文件和AIDL接口文件轉(zhuǎn)換成對(duì)應(yīng)的Java文件才能正常編譯。
      3.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟B具體包括:根據(jù)步驟A判斷源代碼是否需要進(jìn)行預(yù)處理工作,若需要,則執(zhí)行步驟C ;否則執(zhí)行步驟D。
      4.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述步驟C具體包括: Cl、關(guān)聯(lián)資源文件,根據(jù)project, properties文件得到應(yīng)用使用的SDK版本,然后調(diào)用SDK提供的aapt命令生成R.java ; C2、檢查應(yīng)用中是否存在AIDL接口文件,如果存在AIDL接口文件,那么調(diào)用SDK提供的aidl工具生成AIDL接口文件對(duì)應(yīng)的Java文件。
      5.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟D具體包括: Dl、狀態(tài)機(jī)描述文件存放在程序指定目錄,讀取指定目錄的文件列表,得到需要檢測(cè)的隱私信息對(duì)應(yīng)的狀態(tài)機(jī)描述文件; D2、狀態(tài)機(jī)描述文件是用xml語言編寫的,調(diào)用狀態(tài)機(jī)加載方法,讀取每個(gè)狀態(tài)機(jī)描述文件,生成狀態(tài)機(jī)以及狀態(tài)機(jī)包含的狀態(tài)、轉(zhuǎn)換以及轉(zhuǎn)換條件的集合。
      6.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟E具體包括:El、對(duì)源代碼進(jìn)行編譯,Java提供了反射機(jī)制,可以通過反射調(diào)用得到類、方法以及成員變量的特征信息; E2、對(duì)源代碼進(jìn)行預(yù)分析,通過JavaCC解析Java文法得到的JavaParser語法解釋器生成抽象語法樹,在抽象語法樹上通過訪問者模式生成符號(hào)表和控制流圖,并分析函數(shù)間的調(diào)用關(guān)系。
      7.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟F具體包括: F1、根據(jù)函數(shù)調(diào)用關(guān)系,得到函數(shù)所在文件的調(diào)用關(guān)系,進(jìn)而得到文件的分析順序; F2、得到文件內(nèi)部的函數(shù)列表以及函數(shù)的調(diào)用關(guān)系,根據(jù)根據(jù)函數(shù)的調(diào)用關(guān)系的逆序來進(jìn)行以函數(shù)為單位的分析,為每個(gè)函數(shù)根據(jù)不同的隱私類型生成讀取類和泄漏類函數(shù)摘要。
      8.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟G具體包括: 以函數(shù)為單位開始進(jìn)行隱私泄漏的檢測(cè),首先調(diào)用狀態(tài)機(jī)中關(guān)聯(lián)的狀態(tài)機(jī)實(shí)例生成方法訪問當(dāng)前函數(shù)生成狀態(tài)機(jī)實(shí)例;在函數(shù)控制流圖上進(jìn)行狀態(tài)機(jī)迭代,在每個(gè)節(jié)點(diǎn)上維護(hù)當(dāng)前節(jié)點(diǎn)的各個(gè)狀態(tài)機(jī)實(shí)例的狀態(tài)集合并計(jì)算當(dāng)前節(jié)點(diǎn)是否滿足狀態(tài)轉(zhuǎn)移條件,如果滿足則進(jìn)行狀態(tài)轉(zhuǎn)換,當(dāng)狀態(tài)跳轉(zhuǎn)到錯(cuò)誤狀態(tài)時(shí)就代表檢測(cè)到一個(gè)隱私泄漏,記錄該信息并繼續(xù)控制流迭代,直到當(dāng)前函數(shù)結(jié)束。
      9.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述的步驟H包括:· 在一個(gè)函數(shù)檢查完畢之后,檢查函數(shù)列表總是還有未檢測(cè)函數(shù),如果有則繼續(xù)在下一個(gè)函數(shù)中執(zhí)行步驟G,如果沒有就代表所有的函數(shù)方法已經(jīng)檢測(cè)結(jié)束,進(jìn)行步驟I。
      10.根據(jù)權(quán)利要求1所述隱私信息泄露的靜態(tài)檢測(cè)方法,其特征在于,所述步驟I具體包括:將檢測(cè)結(jié)果寫入到文件中,對(duì)一個(gè)Android應(yīng)用的自動(dòng)檢測(cè)結(jié)束,人工查看結(jié)果文件,查找文件中是否存在誤報(bào)情況。
      【文檔編號(hào)】G06F11/36GK103577324SQ201310524093
      【公開日】2014年2月12日 申請(qǐng)日期:2013年10月30日 優(yōu)先權(quán)日:2013年10月30日
      【發(fā)明者】王雅文, 宮云戰(zhàn), 黃俊飛, 于鵬洋, 金大海 申請(qǐng)人:北京郵電大學(xué)
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1