• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于權(quán)限驗(yàn)證圖的Web應(yīng)用訪問控制漏洞檢測(cè)

      2018-06-26 10:19:34夏志堅(jiān)彭國(guó)軍胡鴻富
      關(guān)鍵詞:漏洞頁(yè)面節(jié)點(diǎn)

      夏志堅(jiān),彭國(guó)軍,胡鴻富

      武漢大學(xué) 計(jì)算機(jī)學(xué)院,武漢 430072

      1 引言

      近年來(lái),互聯(lián)網(wǎng)飛速發(fā)展,社交、購(gòu)物、金融等不同行業(yè)都開始互聯(lián)網(wǎng)化。Web應(yīng)用不斷出現(xiàn),而這些應(yīng)用存儲(chǔ)了大量的用戶隱私數(shù)據(jù),為了保障隱私數(shù)據(jù)的安全性,必須采用嚴(yán)格的權(quán)限控制[1]。相比于傳統(tǒng)應(yīng)用的權(quán)限控制,由于http協(xié)議的無(wú)狀態(tài)特性,每次請(qǐng)求隱私數(shù)據(jù)都必須進(jìn)行權(quán)限驗(yàn)證,因此用戶的每次請(qǐng)求都需要驗(yàn)證權(quán)限,因而需要更加完善的權(quán)限驗(yàn)證機(jī)制[2]。受限于開發(fā)者的水平和程序邏輯的復(fù)雜性,權(quán)限驗(yàn)證遺漏或不完全仍然普遍存在于Web應(yīng)用中,導(dǎo)致權(quán)限控制漏洞影響范圍十分廣泛。根據(jù)OWASP(Open Web Application Security)組織公布的數(shù)據(jù),權(quán)限控制漏洞已經(jīng)成為前10大Web應(yīng)用安全漏洞之一[3],權(quán)限控制漏洞已然成為Web應(yīng)用所面臨的主要安全威脅之一。權(quán)限控制漏洞依賴于應(yīng)用本身,不同的應(yīng)用的權(quán)限控制往往在邏輯上有很大不同,而權(quán)限控制漏洞主要分為以下3種情況:

      (1)強(qiáng)制訪問:應(yīng)用中訪問某頁(yè)面前包含權(quán)限驗(yàn)證,但未授權(quán)用戶可以通過(guò)直接訪問頁(yè)面URL繞過(guò)權(quán)限驗(yàn)證。

      (2)權(quán)限驗(yàn)證不當(dāng)或缺失:頁(yè)面中包含具有特定權(quán)限的用戶才能訪問的資源,在資源訪問路徑上權(quán)限控制不當(dāng)或缺少權(quán)限控制。

      (3)權(quán)限驗(yàn)證處理邏輯不當(dāng):權(quán)限驗(yàn)證失敗后,未正確終止當(dāng)前訪問,未授權(quán)用戶仍能訪問敏感資源。

      學(xué)術(shù)界針對(duì)權(quán)限控制漏洞的檢測(cè)做了很多研究,目前主要的檢測(cè)方法包括靜態(tài)檢測(cè)、動(dòng)態(tài)檢測(cè)以及動(dòng)靜結(jié)合檢測(cè)[4-9],然而目前在效率和準(zhǔn)確性上還并不能令人滿意。美國(guó)加利福尼亞大學(xué)的孫芳琪等人采用自動(dòng)推斷隱式權(quán)限控制假設(shè)的技術(shù),構(gòu)建基于角色的站點(diǎn)圖,提取權(quán)限頁(yè)面,推測(cè)權(quán)限頁(yè)面是否能被強(qiáng)制訪問,能夠準(zhǔn)確檢測(cè)權(quán)限控制漏洞[10],但只能檢測(cè)強(qiáng)制訪問類權(quán)限控制漏洞,檢測(cè)范圍較窄。在此基礎(chǔ)上,文獻(xiàn)[11]設(shè)計(jì)了一種基于應(yīng)用保護(hù)狀態(tài)的漏洞模型檢測(cè)機(jī),通過(guò)識(shí)別權(quán)限頁(yè)面保護(hù)狀態(tài),快速地檢測(cè)權(quán)限控制漏洞,能夠檢測(cè)強(qiáng)制訪問和部分權(quán)限驗(yàn)證不當(dāng)或缺失多種權(quán)限控制漏洞,而對(duì)權(quán)限驗(yàn)證后處理邏輯不當(dāng)漏洞則無(wú)法檢測(cè)。文獻(xiàn)[12]靜態(tài)分析獲取權(quán)限驗(yàn)證的關(guān)鍵邏輯,在權(quán)限驗(yàn)證未通過(guò)的代碼中插入監(jiān)視代碼,然后在動(dòng)態(tài)運(yùn)行時(shí)檢測(cè)是否有權(quán)限控制漏洞攻擊行為發(fā)生,可以檢測(cè)多種類型權(quán)限控制漏洞,但檢測(cè)方法依賴于測(cè)試集,并且需要較高的系統(tǒng)開銷。

      程序可以通過(guò)控制流圖抽象表示,選取控制流圖中的權(quán)限驗(yàn)證節(jié)點(diǎn)和資源節(jié)點(diǎn)可以組成權(quán)限驗(yàn)證圖,權(quán)限驗(yàn)證圖中,每個(gè)資源對(duì)應(yīng)多條權(quán)限驗(yàn)證路徑,比較每條權(quán)限驗(yàn)證路徑的驗(yàn)證權(quán)限與資源訪問權(quán)限,從而檢測(cè)資源是否具有權(quán)限控制漏洞。上述3種權(quán)限控制漏洞均可等價(jià)為“存在一條或多條權(quán)限驗(yàn)證路徑的驗(yàn)證權(quán)限低于相應(yīng)資源的訪問權(quán)限”,因此本文的算法可以覆蓋上述3種權(quán)限控制漏洞。本文提出了一種新的權(quán)限控制漏洞檢測(cè)算法,實(shí)現(xiàn)了檢測(cè)工具,并針對(duì)7個(gè)流行Web系統(tǒng)進(jìn)行了安全檢測(cè),發(fā)現(xiàn)了8個(gè)已知和未知漏洞。

      2 權(quán)限驗(yàn)證圖與權(quán)限控制漏洞

      權(quán)限驗(yàn)證圖是由起始節(jié)點(diǎn)、終止節(jié)點(diǎn)、資源節(jié)點(diǎn)和權(quán)限驗(yàn)證節(jié)點(diǎn)組成的無(wú)環(huán)有向圖,為了抽象定義權(quán)限驗(yàn)證圖,有如下定義:

      定義1(角色)一個(gè)角色擁有一種權(quán)限或者多種權(quán)限,R為權(quán)限集。在大多數(shù)系統(tǒng)中,權(quán)限的分配通過(guò)賦予某種角色來(lái)實(shí)現(xiàn),資源具備某種訪問權(quán)限即為資源能被具有某種權(quán)限的角色訪問。

      定義2(資源節(jié)點(diǎn))資源節(jié)點(diǎn)是對(duì)資源進(jìn)行操作的代碼模塊,現(xiàn)代Web應(yīng)用數(shù)據(jù)主要存儲(chǔ)在數(shù)據(jù)庫(kù)中[13],因此資源節(jié)點(diǎn)主要為數(shù)據(jù)庫(kù)操作,但也能方便地?cái)U(kuò)展到文件等操作,資源節(jié)點(diǎn)集合為S。資源節(jié)點(diǎn)的權(quán)限通過(guò)權(quán)限表與角色相關(guān)聯(lián),例如從數(shù)據(jù)庫(kù)中刪除用戶user1,對(duì)應(yīng)的角色為“admin”。

      定義3(起始節(jié)點(diǎn)和終止節(jié)點(diǎn))起始節(jié)點(diǎn)為頁(yè)面起始節(jié)點(diǎn),終止節(jié)點(diǎn)為頁(yè)面跳轉(zhuǎn)或終止執(zhí)行函數(shù),起始節(jié)點(diǎn)集合為ST,終止節(jié)點(diǎn)集合為TE。起始節(jié)點(diǎn)和終止節(jié)點(diǎn)驗(yàn)證權(quán)限為NULL。

      定義4(權(quán)限驗(yàn)證節(jié)點(diǎn))權(quán)限驗(yàn)證節(jié)點(diǎn)是驗(yàn)證訪問用戶是否具有某種權(quán)限或擁有某個(gè)角色的代碼模塊,權(quán)限驗(yàn)證節(jié)點(diǎn)集合為A。權(quán)限驗(yàn)證節(jié)點(diǎn)的權(quán)限與它所驗(yàn)證的角色相關(guān),例如if($_COOKIE[“user”]==“admin”)的權(quán)限即為它檢查的角色“admin”的權(quán)限。

      權(quán)限驗(yàn)證圖表示為G=(V,E),其中V為節(jié)點(diǎn)集,V={v|v∈(ST?A?S?TE)}。假設(shè)節(jié)點(diǎn)a,b∈V,a權(quán)限驗(yàn)證通過(guò)后可達(dá)b,則稱a有一條T邊到b,記作a→T=b,若a權(quán)限驗(yàn)證未通過(guò)仍然可達(dá)b,則稱a有一條F邊到b,記作a→F=b,若a直接到b,則a→T=a→F=b。E={|v1,v2∈V,v1→T=v2?v1→F=v2}。權(quán)限驗(yàn)證路徑為起始節(jié)點(diǎn)經(jīng)過(guò)若干非終止節(jié)點(diǎn)到達(dá)資源節(jié)點(diǎn)的一條路徑,權(quán)限驗(yàn)證路徑為節(jié)點(diǎn)有序序列,資源節(jié)點(diǎn)s的權(quán)限驗(yàn)證路徑集為:

      任意資源節(jié)點(diǎn)存在一條或者多條權(quán)限驗(yàn)證路徑,權(quán)限驗(yàn)證路徑上的T邊的源節(jié)點(diǎn)稱為有效權(quán)限驗(yàn)證節(jié)點(diǎn),而所有有效權(quán)限驗(yàn)證節(jié)點(diǎn)的權(quán)限并集則為權(quán)限驗(yàn)證路徑的驗(yàn)證權(quán)限。如果用U表示權(quán)限集,資源節(jié)點(diǎn)s∈S的權(quán)限驗(yàn)證路徑r∈routes的驗(yàn)證權(quán)限可表示為:

      定義5(權(quán)限控制漏洞)如果資源節(jié)點(diǎn)s∈S存在一條驗(yàn)證權(quán)限為ur?U的權(quán)限驗(yàn)證路徑r且s對(duì)應(yīng)的訪問權(quán)限為us?U ,若us?ur,則資源s的訪問權(quán)限高于驗(yàn)證權(quán)限,此時(shí)擁有權(quán)限低于資源訪問權(quán)限的角色可以通過(guò)路徑r訪問資源節(jié)點(diǎn)s,則此時(shí)存在針對(duì)資源節(jié)點(diǎn)s的權(quán)限控制漏洞。

      3 基于權(quán)限驗(yàn)證圖的權(quán)限控制漏洞檢測(cè)算法

      控制流圖(CFG)為有向圖G=(N,E,entry,exit),N為節(jié)點(diǎn)集,每個(gè)節(jié)點(diǎn)代表一個(gè)基本塊。邊集E={|n1,n2∈N 且n1語(yǔ)法可達(dá)n2},entry和exit為程序入口和出口節(jié)點(diǎn)。CFG有唯一的入口點(diǎn)和出口點(diǎn),通過(guò)CFG清晰地表示了程序的控制邏輯[14-15]。

      通過(guò)節(jié)點(diǎn)識(shí)別從CFG中分離出定義2~4中的節(jié)點(diǎn),這些節(jié)點(diǎn)與程序的權(quán)限驗(yàn)證邏輯相關(guān),依據(jù)節(jié)點(diǎn)間的驗(yàn)證邏輯關(guān)系,生成通過(guò)T邊和F邊連接的權(quán)限驗(yàn)證圖。因此,權(quán)限驗(yàn)證圖可以表示頁(yè)面的權(quán)限驗(yàn)證邏輯。由定義4、5可知,權(quán)限驗(yàn)證圖中每個(gè)資源節(jié)點(diǎn)對(duì)應(yīng)至少一條權(quán)限路徑,比較資源節(jié)點(diǎn)對(duì)應(yīng)的權(quán)限路徑驗(yàn)證權(quán)限與資源節(jié)點(diǎn)訪問權(quán)限,即可檢測(cè)權(quán)限控制漏洞。因此本文算法分為以下兩步:

      表1 簡(jiǎn)單權(quán)限控制實(shí)例

      (1)解析php源碼,生成CFG,遞歸遍歷CFG,識(shí)別節(jié)點(diǎn),并生成權(quán)限驗(yàn)證圖。

      (2)深度優(yōu)先搜索權(quán)限驗(yàn)證圖,獲取每個(gè)資源節(jié)點(diǎn)對(duì)應(yīng)的所有權(quán)限路徑,計(jì)算權(quán)限路徑驗(yàn)證權(quán)限,并與資源節(jié)點(diǎn)訪問權(quán)限比較,判定是否存在權(quán)限控制漏洞。

      3.1 節(jié)點(diǎn)識(shí)別

      權(quán)限驗(yàn)證節(jié)點(diǎn)分為頁(yè)面內(nèi)權(quán)限驗(yàn)證節(jié)點(diǎn)和頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn),頁(yè)面內(nèi)權(quán)限驗(yàn)證節(jié)點(diǎn)由分支語(yǔ)句(if-then-else或者switch)和包含權(quán)限變量的條件表達(dá)式組成,權(quán)限變量預(yù)先配置;頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn)包括封裝權(quán)限驗(yàn)證節(jié)點(diǎn)的函數(shù)和頁(yè)面。表1中“delete.php”包含3個(gè)權(quán)限驗(yàn)證節(jié)點(diǎn),行4的“else if(!checkAdmin($_COOKIE[‘username’])))”和行3的“if(!$logined)”為頁(yè)面權(quán)限驗(yàn)證節(jié)點(diǎn),行1的“include(‘a(chǎn)ccess.php’)”為頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn),在“access.php”中包含了頁(yè)面內(nèi)權(quán)限驗(yàn)證模塊。

      頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn)均可等價(jià)為if(cond),其中cond=expr1 op1 expr2 op2 expr3…,而expri為不包含邏輯運(yùn)算符&&和||的簡(jiǎn)單條件表達(dá)式,權(quán)限變量格式為{變量名,參數(shù),驗(yàn)證通過(guò)取值,權(quán)限}(變量不為函數(shù)時(shí),參數(shù)取值為NULL),例如列表1中“{$_COOKIE[‘isLogined’],NULL,1,‘isLogined’}”,表示 cookie 中變量isLogined值為1時(shí),權(quán)限高于“user的角色可通過(guò)驗(yàn)證。頁(yè)面內(nèi)權(quán)限驗(yàn)證節(jié)點(diǎn)算法:

      算法1頁(yè)面內(nèi)權(quán)限驗(yàn)證節(jié)點(diǎn)識(shí)別算法

      輸入:條件表達(dá)式cond,權(quán)限變量集合authVar。

      輸出:節(jié)點(diǎn)驗(yàn)證權(quán)限w,條件表達(dá)式值val。

      1.DisAuthNode(cond,authVar)

      2. w=NULL,op=&&,val=True,op=&&,val=True

      3. while cond

      4.expr=GetFirstExpr(cond)//取第一個(gè)簡(jiǎn)單表達(dá)式

      5. for var in expr

      6. if var in authVar or DataFlaw(var) in authVar

      7.tmp=GetVar(authVar,var)

      8. replace(expr,var,tmp)//用 tmp 值替換expr中的var

      9. if expr

      10. op=||,w=tmp&&w

      11. val=val op expr,delete expr from cond

      12. if cond==NULL

      13. break

      14. op=op1,delete op1 from cond

      15.return[w,var]

      算法1中,第3~14行遍歷條件表達(dá)式cond中的所有簡(jiǎn)單條件表達(dá)式。首先取第一個(gè)簡(jiǎn)單條件表達(dá)式expr,然后針對(duì)expr中的所有變量進(jìn)行后向數(shù)據(jù)流分析,判斷變量是否為權(quán)限變量。如果是,則用權(quán)限變量值替換expr中變量,計(jì)算expr值。將expr值與條件表達(dá)式值val進(jìn)行運(yùn)算,然后刪除當(dāng)前expr,接著替換運(yùn)算符op,并刪除op,重復(fù)直到cond為NULL。最終返回節(jié)點(diǎn)驗(yàn)證權(quán)限和條件表達(dá)式值。

      頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn)是函數(shù)或頁(yè)面封裝了頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn),因此只需要對(duì)函數(shù)調(diào)用或include等包含的頁(yè)面,重復(fù)上述步驟即可。頁(yè)面間權(quán)限驗(yàn)證節(jié)點(diǎn)驗(yàn)證權(quán)限為其包含的頁(yè)面內(nèi)權(quán)限節(jié)點(diǎn)權(quán)限。

      本文中的資源節(jié)點(diǎn)主要為數(shù)據(jù)庫(kù)操作,包括刪除、更新、插入、查詢某一張表,針對(duì)不同表的不同操作對(duì)應(yīng)的角色也不同,因此可以用三元組(操作,表,角色)表示一個(gè)資源節(jié)點(diǎn)。預(yù)先配置時(shí),可以根據(jù)系統(tǒng)的權(quán)限表生成資源權(quán)限表,每一項(xiàng)包含一個(gè)三元組。識(shí)別資源節(jié)點(diǎn)時(shí),首先識(shí)別數(shù)據(jù)庫(kù)操作函數(shù),然后從函數(shù)參數(shù)中匹配操作和表,如果匹配到,則將這個(gè)代碼模塊視為資源節(jié)點(diǎn)。

      每個(gè)頁(yè)面均有唯一的起始節(jié)點(diǎn),而終止節(jié)點(diǎn)則包括頁(yè)面結(jié)束,return語(yǔ)句,exit和die等終止執(zhí)行函數(shù),以及頁(yè)面跳轉(zhuǎn)語(yǔ)句。頁(yè)面跳轉(zhuǎn)語(yǔ)句包含多種形式,表2給出了頁(yè)面跳轉(zhuǎn)實(shí)例。文獻(xiàn)[10]提出了一個(gè)鏈接提取的綜合性方法,本文只需要識(shí)別跳轉(zhuǎn)語(yǔ)句,因此首先匹配API函數(shù),例如“Header、echo、print”,然后在函數(shù)參數(shù)中匹配是否包含本地或遠(yuǎn)程地址。當(dāng)匹配到Header函數(shù)時(shí),下一個(gè)節(jié)點(diǎn)必須為終止執(zhí)行函數(shù),否則不識(shí)別為終止節(jié)點(diǎn)。

      表2 PHP頁(yè)面跳轉(zhuǎn)方法實(shí)例

      3.2 生成權(quán)限驗(yàn)證圖

      生成權(quán)限驗(yàn)證圖只需要遍歷CFG圖,識(shí)別節(jié)點(diǎn)類型,將節(jié)點(diǎn)加入權(quán)限驗(yàn)證圖,然后遞歸得到節(jié)點(diǎn)的T邊和F邊指向的權(quán)限驗(yàn)證節(jié)點(diǎn),其中資源節(jié)點(diǎn)的T邊和F邊指向同一節(jié)點(diǎn),終止節(jié)點(diǎn)的T邊和F邊指向NULL。算法如下:

      算法2權(quán)限驗(yàn)證圖生成算法

      輸入:CFG,權(quán)限變量checkNodes,資源集s。

      輸出:權(quán)限驗(yàn)證圖Graph。

      1.GraphBuilder(CFG,checkNodes,s)

      2. node=curr=CFG->start

      3. if curr==exit||!curr||curr為終止節(jié)點(diǎn)

      4. node->T=node->F=NULL

      5. else if curr是權(quán)限驗(yàn)證節(jié)點(diǎn)

      6. node->T=GraphBuilder(curr->True,checkNodes,s)

      7.node->F=GraphBuilder(curr->False,checkNodes,s)

      8. else if curr是資源節(jié)點(diǎn)

      9. node->T=node->F=GraphBuilder(curr->child,checkNodes,s)

      10. else

      11. node=GraphBuilder(curr->child,checkNodes,s)

      12.return(Graph=node)

      算法2為遞歸算法,取CFG中首節(jié)點(diǎn),判斷節(jié)點(diǎn)類型,如果節(jié)點(diǎn)為終止節(jié)點(diǎn)、exit或者NULL,則將節(jié)點(diǎn)node的T邊和F邊均指向NULL。curr→True、curr→False表示當(dāng)前節(jié)點(diǎn)跳轉(zhuǎn)條件為真或假的子節(jié)點(diǎn),curr→child表示當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)(無(wú)跳轉(zhuǎn))。節(jié)點(diǎn)為權(quán)限驗(yàn)證節(jié)點(diǎn)、資源節(jié)點(diǎn)時(shí),分別將node的T邊和F邊指向不同的節(jié)點(diǎn)。節(jié)點(diǎn)如果為其他類型節(jié)點(diǎn),則忽略當(dāng)前節(jié)點(diǎn),直接遞歸當(dāng)前節(jié)點(diǎn)子節(jié)點(diǎn)。圖1是通過(guò)上述算法生成的一個(gè)權(quán)限驗(yàn)證圖,從圖中可以清晰地獲取從起始節(jié)點(diǎn)到資源節(jié)點(diǎn)的所有路徑。

      圖1 權(quán)限驗(yàn)證圖

      3.3 漏洞檢測(cè)

      根據(jù)定義5,通過(guò)深度優(yōu)先遍歷權(quán)限驗(yàn)證圖,獲取起始節(jié)點(diǎn)到目標(biāo)資源節(jié)點(diǎn)的所有權(quán)限驗(yàn)證路徑的權(quán)值,每獲取一條權(quán)限驗(yàn)證路徑的權(quán)值后,比較權(quán)值與資源訪問節(jié)點(diǎn)權(quán)值,從而判斷漏洞是否存在,具體算法如下:

      算法3漏洞檢測(cè)算法

      輸入:權(quán)限驗(yàn)證圖G,目標(biāo)資源節(jié)點(diǎn)s。

      輸出:漏洞vul。

      1.DetectVul(G,s)

      2. stack.push(G->start) //入棧

      3. G->start->visited=1

      4. do

      5. node=GetChild(stack.top) //獲取節(jié)點(diǎn)的非空未被訪問子節(jié)點(diǎn)

      6. if node==s

      7. var=stack.traverse()//k為棧底節(jié)點(diǎn),k+1為下一個(gè)節(jié)點(diǎn),如果k->F!=k+1,tmp=tmp||k,重復(fù)直到k為NULL,返回tmp

      8. if var

      9. report vul,return

      10. else if node!=NULL

      11. stack.push(node)

      12. node->visited=1

      13. continue

      14. stack.pop()//棧頂節(jié)點(diǎn)被訪問,出棧

      15.while!stack.isEmpty()

      在算法3中,建立了一個(gè)節(jié)點(diǎn)棧stack,首先將權(quán)限驗(yàn)證圖G的首節(jié)點(diǎn)入棧,并設(shè)置為已訪問,然后第4~15行為對(duì)G的深度優(yōu)先搜索。當(dāng)搜索到目標(biāo)資源節(jié)點(diǎn)s時(shí),此時(shí)棧中所有節(jié)點(diǎn)即為s的一條權(quán)限路徑,從棧底遍歷整個(gè)棧,根據(jù)定義4,計(jì)算權(quán)限路徑驗(yàn)證權(quán)限var,比較var與資源節(jié)點(diǎn)s.var,如果有漏洞則報(bào)告漏洞。如果節(jié)點(diǎn)不為s且不為NULL,則將節(jié)點(diǎn)入棧,然后直接跳轉(zhuǎn)到循環(huán)開始,否則當(dāng)前節(jié)點(diǎn)出棧,棧為NULL時(shí),循環(huán)遍歷結(jié)束。通過(guò)該算法,圖1中start到s的權(quán)限驗(yàn)證路徑總共有兩條,即{start,1,2,3,s}和{start,1,2,4,s}。因?yàn)?→T=3→F=s,所以計(jì)算權(quán)值時(shí),節(jié)點(diǎn)3不是有效權(quán)限節(jié)點(diǎn),因此,它們的有效權(quán)限驗(yàn)證節(jié)點(diǎn)集合為{1,2}、{1,4},假設(shè)權(quán)限驗(yàn)證節(jié)點(diǎn)1和4的權(quán)限均小于資源節(jié)點(diǎn)s的權(quán)限,則存在一條權(quán)限驗(yàn)證路徑{start,1,2,4,s}的權(quán)值小于資源節(jié)點(diǎn)s的權(quán)限,因此資源節(jié)點(diǎn)s存在權(quán)限控制漏洞,報(bào)告漏洞信息。遍歷所有的資源節(jié)點(diǎn)后,就可以完成對(duì)頁(yè)面的漏洞檢測(cè)。通過(guò)構(gòu)建權(quán)限驗(yàn)證圖的方法,可以簡(jiǎn)化程序邏輯,將無(wú)規(guī)則的權(quán)限驗(yàn)證邏輯轉(zhuǎn)換為清晰的權(quán)限驗(yàn)證路徑,從而較大地提高權(quán)限控制漏洞分析效率和準(zhǔn)確度。

      4 實(shí)驗(yàn)與結(jié)果分析

      4.1 漏洞檢測(cè)工具

      為了驗(yàn)證算法有效性,本文實(shí)現(xiàn)了權(quán)限控制漏洞檢測(cè)工具:AccVulHunter。PHP-Parser是由PHP編寫的一個(gè)語(yǔ)法分析器,直接生成抽象語(yǔ)法樹(AST),功能簡(jiǎn)單,易于擴(kuò)展,因此,將PHP-Parser作為語(yǔ)法分析器。整個(gè)工具包括全局信息收集、CFG生成部分、權(quán)限驗(yàn)證圖構(gòu)建、權(quán)限控制漏洞檢測(cè)和漏洞報(bào)告等5個(gè)部分。整個(gè)工具的系統(tǒng)結(jié)構(gòu)如圖2。

      AccVulHunter針對(duì)權(quán)限控制漏洞的檢測(cè)主要步驟為:

      步驟1將頁(yè)面分為功能頁(yè)面和定義頁(yè)面,初始化程序主要參數(shù)。

      步驟2對(duì)功能頁(yè)面進(jìn)行分析,生成AST抽象語(yǔ)法樹,然后遍歷AST,收集全局信息,并構(gòu)建CFG控制流圖。

      步驟3遍歷CFG圖,識(shí)別權(quán)限驗(yàn)證節(jié)點(diǎn)和資源訪問節(jié)點(diǎn),根據(jù)權(quán)限驗(yàn)證圖構(gòu)建算法構(gòu)建頁(yè)面權(quán)限驗(yàn)證圖。

      步驟4判斷頁(yè)面所有資源訪問是否存在權(quán)限控制漏洞,如果存在通過(guò)xml報(bào)告漏洞位置信息和對(duì)應(yīng)資源信息。

      圖2 AccVulHunter工具系統(tǒng)結(jié)構(gòu)圖

      4.2 實(shí)驗(yàn)與結(jié)果分析

      為了測(cè)試漏洞檢測(cè)算法的有效性,本文選取了4個(gè)Web開源應(yīng)用mantisbt-master、SlimCMS、redaxscript和DDCMS以及在文獻(xiàn)[6-7]中測(cè)試的3個(gè)Web應(yīng)用SCARF、PHP Calendars、PHPOLL。

      實(shí)驗(yàn)的結(jié)果如表3所示,總共報(bào)告漏洞12個(gè),經(jīng)過(guò)人工確認(rèn)漏洞數(shù)為8個(gè),確認(rèn)漏洞中未知漏洞2個(gè),已知漏洞6個(gè)。AccVulHunter在SCARF、PHPCalendars中各檢測(cè)到了1個(gè)已知權(quán)限控制漏洞,分別為CVE-2006-5909和CVE-2010-0380。SCARF的“generaloptions.php”中缺少權(quán)限驗(yàn)證節(jié)點(diǎn)“require_admin()”,導(dǎo)致任意角色可以編輯應(yīng)用配置,而PHPCalendars的instll.php中可以編輯系統(tǒng)配置,然而并未驗(yàn)證用戶權(quán)限,因此存在權(quán)限控制漏洞。文獻(xiàn)[10]中的工具在PHPPOLL中檢測(cè)到了3個(gè)新的漏洞,在“modifica_configurazione.php”、“modifica_votanti.php”、“modifica_band.php”中檢測(cè)到了權(quán)限控制漏洞,而本文工具檢測(cè)出了“modifica_votanti.php”中缺乏權(quán)限驗(yàn)證,導(dǎo)致用戶可以修改其他用戶信息,另外兩個(gè)漏洞由于版本更新已修補(bǔ)。這3個(gè)漏洞屬于均為強(qiáng)制訪問權(quán)限控制漏洞。

      SlimCMS中的“redirect.php”中包含插入新管理員的資源節(jié)點(diǎn),但在頁(yè)面中被未發(fā)現(xiàn)權(quán)限驗(yàn)證節(jié)點(diǎn),因此檢測(cè)出了一個(gè)權(quán)限驗(yàn)證缺失的漏洞(CVE-2008-5708)。Redaxscript中檢測(cè)到了1個(gè)權(quán)限控制漏洞,在“admin_center.php”中,不同權(quán)限用戶屬于不同組,在生成新用戶中,雖然驗(yàn)證了用戶是否有權(quán)注冊(cè)為“admin”,但是沒有驗(yàn)證用戶注冊(cè)的組,因此可以通過(guò)將用戶組改為管理組,使得普通用戶具有管理員權(quán)限,這個(gè)漏洞屬于權(quán)限驗(yàn)證不當(dāng)?shù)穆┒础?/p>

      AccVulHunter還在DDCMS和SlimCMS中檢測(cè)到了兩個(gè)未知漏洞,在DDCMS中,通過(guò)權(quán)限變量“$admin”驗(yàn)證管理員,在頁(yè)面“wap_admin_cg.php”中,雖然通過(guò)權(quán)限節(jié)點(diǎn)“if($admin!=1)”進(jìn)行了權(quán)限驗(yàn)證,但是當(dāng)權(quán)限驗(yàn)證失敗時(shí),調(diào)用header函數(shù)跳轉(zhuǎn),AccVulHunter在header函數(shù)后未匹配到exit或die函數(shù),因此并未視為終止節(jié)點(diǎn),因此仍能訪問到后續(xù)節(jié)點(diǎn),因此存在一個(gè)權(quán)限驗(yàn)證處理邏輯不當(dāng)?shù)穆┒?。在SlimCMS中,系統(tǒng)通過(guò)查詢管理員用戶名和用戶提交用戶名是否一致,判斷用戶權(quán)限,而在“install.php”中可以重新設(shè)置管理員用戶名和密碼,但是在文件中并未對(duì)創(chuàng)建者身份進(jìn)行驗(yàn)證(數(shù)據(jù)庫(kù)用戶名密碼直接調(diào)用配置文件,未進(jìn)行驗(yàn)證)。如果攻擊者重新訪問該頁(yè)面,則可以創(chuàng)建新的管理員用戶名和密碼,從而提升權(quán)限,因此存在一個(gè)強(qiáng)制訪問權(quán)限控制漏洞。

      本文工具采用了基于權(quán)限驗(yàn)證圖的檢測(cè)算法。該算法定義了將權(quán)限控制漏洞的檢測(cè)轉(zhuǎn)為資源節(jié)點(diǎn)對(duì)應(yīng)的權(quán)限路徑驗(yàn)證權(quán)限與資源節(jié)點(diǎn)訪問權(quán)限的比較的檢測(cè)模型,而前述4種權(quán)限控制漏洞中均存在一條權(quán)限低于資源節(jié)點(diǎn)權(quán)限的權(quán)限路徑,因此本文的檢測(cè)模型可以覆蓋這四種權(quán)限控制漏洞。文獻(xiàn)[10]中算法只判斷頁(yè)面是否包含防護(hù),并使用強(qiáng)制訪問進(jìn)行確認(rèn),因此只能覆蓋強(qiáng)制訪問權(quán)限控制漏洞。而文獻(xiàn)[11]中,忽略了權(quán)限驗(yàn)證失敗后的處理邏輯檢查,導(dǎo)致無(wú)法檢測(cè)權(quán)限驗(yàn)證處理邏輯不當(dāng)?shù)臋?quán)限控制漏洞。表4是本文工具與文獻(xiàn)[10-11]中工具的漏洞發(fā)現(xiàn)類型比較,從表中可以看出文獻(xiàn)[10]中工具只能檢測(cè)強(qiáng)制訪問權(quán)限控制漏洞,文獻(xiàn)[11]的ACMA可以檢測(cè)除權(quán)限驗(yàn)證處理邏輯不當(dāng)以外的權(quán)限控制漏洞,而AccVulHunter可以檢測(cè)全部4種權(quán)限控制漏洞。因此通過(guò)實(shí)驗(yàn)對(duì)比,可以證明本文算法具有更好的漏洞檢測(cè)廣度。

      表3 AccVulHunter掃描結(jié)果

      表4 漏洞發(fā)現(xiàn)類型比較

      AccVulHunter掃描Web系統(tǒng)的時(shí)間與系統(tǒng)的文件數(shù)和資源節(jié)點(diǎn)數(shù)以及權(quán)限節(jié)點(diǎn)數(shù)正相關(guān),由于權(quán)限驗(yàn)證節(jié)點(diǎn)識(shí)別涉及到更多的數(shù)據(jù)流分析和過(guò)程間分析,相對(duì)于另外兩者,掃描時(shí)間相對(duì)較長(zhǎng),未來(lái)通過(guò)優(yōu)化節(jié)點(diǎn)識(shí)別,仍然可以提高算法分析速度。

      綜合實(shí)驗(yàn)結(jié)果看,本文的權(quán)限控制漏洞檢測(cè)算法可以快速、有效地發(fā)現(xiàn)權(quán)限控制漏洞,相對(duì)于已有方法,能夠檢測(cè)更多的權(quán)限控制漏洞,具有更高的實(shí)用性。另外由于相對(duì)更大的代碼分析量,AccVulHunter在時(shí)間消耗上較大,但相對(duì)于人工審查,仍然能較大提高分析速率。

      5 結(jié)束語(yǔ)

      本文提出了一種基于權(quán)限驗(yàn)證圖的訪問控制漏洞檢測(cè)算法,通過(guò)靜態(tài)識(shí)別權(quán)限驗(yàn)證節(jié)點(diǎn),建立權(quán)限驗(yàn)證圖,生成權(quán)限驗(yàn)證路徑,快速有效地檢測(cè)權(quán)限控制漏洞,相對(duì)于已有方法,擴(kuò)大了權(quán)限控制漏洞檢測(cè)范圍并提升了檢測(cè)準(zhǔn)確性。設(shè)計(jì)了漏洞檢測(cè)工具AccVulhunter,針對(duì)7個(gè)Web內(nèi)容管理系統(tǒng)進(jìn)行了漏洞檢測(cè)實(shí)驗(yàn),證明了漏洞檢測(cè)算法的有效性,下一步將優(yōu)化數(shù)據(jù)流分析和節(jié)點(diǎn)識(shí)別算法,進(jìn)一步加快工具掃描速度。

      [1]劉金曉,馬素霞,齊林海.Web應(yīng)用系統(tǒng)中權(quán)限控制的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2008,29(10):2550-2553.

      [2]Kolovski V,Hendler J,Parsia B.Analyzing web access control policies[C]//International Conference on World Wide Web(WWW 2007),Banff,Alberta,Canada,May 2007:677-686.

      [3]OWASP.Owasp top 10-2013 the ten most critical Web application security risks.[EB/OL].[2013-06-12].https://www.owasp.org/index.php/Top10#OWASP_Top_10_for_2013.

      [4]Jovanovic N,Kruegel C,Kirda E.Precise alias analysis for static detection of web application vulnerabilities[C]//The Workshop on Programming Languages&Analysis for Security,2006:27-36.

      [5]Su Z,Wassermann G.The essence of command injection attacksin web applications[J].ACM Sigplan Notices,2006,41(1):372-382.

      [6]Dalton M,Kozyrakis C,Zeldovich N.Nemesis:Preventing authentication & accesscontrolvulnerabilitiesin Web applications[C]//Proceedings Usenix Security Symposium,Montreal,Canada,2009:267-282.

      [7]Stergiopoulos G,Katsaros P,Gritzalis D.Automated detection of logical errors in programs[C]//International Conference on Risks and Security of Internet and Systems,2014:35-51.

      [8]Gauthier F,Letarte D,Lavoie T,et al.Extraction and comprehension of moodle’s access control model:A case study[C]//Conference on Privacy,Security and Trust(PST 2011),Montreal,Québec,Canada,2011:44-51.

      [9]Letarte D,Merlo E.Extraction of inter-procedural simple role privilege models from PHP code[C]//Working Conference on Reverse Engineering,2009(Wcre’09),2009:187-191.

      [10]Sun F,Xu L,Su Z.Static detection of access control vulnerabilities in Web applications[J].Shanxi Architecture,2011,2:6392-6396.

      [11]Gauthier F,Merlo E.Fast detection of access control vulnerabilities in PHP Applications[J].Reverse Engineering,2012:247-256.

      [12]Zhu J,Chu B,Lipford H.Detecting privilege escalation attacks through instrumenting Web application source code[C]//Proceedings of the 21st ACM on Symposium on Access Control Models and Technologies,2016:73-80.

      [13]Liu T,Lin Y,Wen X,et al.BindingDB:A Web-accessible database of experimentally determined protein-ligand binding affinities[J].Nucleic Acids Research,2007,35(S1):198-201.

      [14]Hills M.Streamlining control flow graph construction with DCFlow[C]//International Conference on Software Language Engineering.[S.l.]:Springer International Publishing,2014:322-341.

      [15]Nandi A,Mandal A,Atreja S,et al.Anomaly detection using program control flow graph mining from execution logs[C]//Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining,2016:215-224.

      猜你喜歡
      漏洞頁(yè)面節(jié)點(diǎn)
      大狗熊在睡覺
      漏洞
      刷新生活的頁(yè)面
      CM節(jié)點(diǎn)控制在船舶上的應(yīng)用
      Analysis of the characteristics of electronic equipment usage distance for common users
      基于AutoCAD的門窗節(jié)點(diǎn)圖快速構(gòu)建
      三明:“兩票制”堵住加價(jià)漏洞
      漏洞在哪兒
      高鐵急救應(yīng)補(bǔ)齊三漏洞
      抓住人才培養(yǎng)的關(guān)鍵節(jié)點(diǎn)
      绥阳县| 邵武市| 伊宁县| 惠安县| 贡嘎县| 北碚区| 南丰县| 朝阳区| 新安县| 留坝县| 神农架林区| 石台县| 三门县| 怀柔区| 盘锦市| 洞口县| 清徐县| 东乡县| 延川县| 夏津县| 巫山县| 北海市| 高平市| 象州县| 波密县| 宜春市| 玉树县| 仙游县| 和平县| 龙里县| 泸定县| 宣化县| 郧西县| 辉县市| 罗甸县| 龙口市| 叙永县| 木兰县| 温宿县| 建始县| 稷山县|