版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章代碼安全靜態(tài)分析
第4章代碼安全靜態(tài)分析
教學(xué)目標(biāo)應(yīng)掌握的知識(shí)要點(diǎn):靜態(tài)分析的概念;靜態(tài)分析技術(shù);靜態(tài)分析的過程;執(zhí)行代碼審查;安全審查;靜態(tài)分析度量標(biāo)準(zhǔn);靜態(tài)分析中的常見缺陷;緩沖區(qū)溢出。軟件漏洞重點(diǎn)代碼安全靜態(tài)分析靜態(tài)分析中的常見缺陷靜態(tài)分析的過程教學(xué)目標(biāo)應(yīng)掌握的知識(shí)要點(diǎn):2本節(jié)安排靜態(tài)分析的概念靜態(tài)分析技術(shù)代碼靜態(tài)分析工具的引入本節(jié)安排靜態(tài)分析的概念34.1靜態(tài)分析4.1靜態(tài)分析定義及特點(diǎn)程序靜態(tài)分析(ProgramStaticAnalysis)是指在不運(yùn)行代碼的方式下,通過各種分析工具對(duì)程序代碼進(jìn)行掃描并做出評(píng)估的過程。4.1.1靜態(tài)分析的概念特點(diǎn)不實(shí)際執(zhí)行程序,只是通過對(duì)代碼的靜態(tài)掃描對(duì)程序進(jìn)行分析執(zhí)行速度快、效率高定義及特點(diǎn)程序靜態(tài)分析(ProgramStaticAna5類型檢查例1shorts=1;inti=s;shortr=i;在本例中,程序的本意是想要將一個(gè)類型為int的表達(dá)式賦予給一個(gè)類型為short的變量,但是卻無法通過類型檢查??梢酝ㄟ^一個(gè)顯式的類型轉(zhuǎn)換來解決這個(gè)問題。例2String[]sa=newString[100];sa[0]="helloworld";Object[]oa=sa;oa[0]=newInteger(1);System.out.println(sa[0]);只有只讀的Object[]才能是String[]的父類型。但Java里并沒有只讀數(shù)組這么個(gè)類型,于是錯(cuò)誤發(fā)生了。
4.1.2靜態(tài)分析技術(shù)類型檢查例1shorts=1;4.1.2靜6風(fēng)格檢查風(fēng)格檢查程序所顯示的錯(cuò)誤常只是影響代碼的可讀性和可維護(hù)性,而不是程序運(yùn)行過程中會(huì)發(fā)生的某種錯(cuò)誤PMD會(huì)檢查出:catch塊中沒有內(nèi)容、if判斷塊中沒有內(nèi)容、代碼中出現(xiàn)System.out.println等警告描述。4.1.2靜態(tài)分析技術(shù)風(fēng)格檢查風(fēng)格檢查程序所顯示的錯(cuò)誤常只是影響代碼的可讀性和可維7程序理解程序理解最主要的用途在于幫助理解程序,搞懂代碼庫中的大量代碼。它是一個(gè)從計(jì)算機(jī)程序中獲取知識(shí)信息的過程,這些知識(shí)信息可以用于程序排錯(cuò)、增強(qiáng)程序、重用程序和整理文檔等工作。在很多集成開發(fā)環(huán)境(IDE)中,都包括了一些初級(jí)的程序理解功能,比如:查找本變量的聲明和使用位置。更高級(jí)一點(diǎn)的還能幫助查找類之間的關(guān)聯(lián)關(guān)系等。4.1.2靜態(tài)分析技術(shù)程序理解程序理解最主要的用途在于幫助理解程序,搞懂代碼庫中的8程序驗(yàn)證和屬性檢查程序驗(yàn)證是對(duì)源代碼進(jìn)行分析,如果源代碼符合預(yù)先專門制定的一份描述程序行為的規(guī)格說明,那么則說明該程序完好。性檢查的方法跟程序驗(yàn)證的方法從本質(zhì)上是一樣的,它們的區(qū)別在于,屬性檢查依據(jù)的只是描述部分程序行為的部分規(guī)格說明,而程序驗(yàn)證依據(jù)的是描述所有程序行為的規(guī)格說明。4.1.2靜態(tài)分析技術(shù)代碼中,在調(diào)用new分配內(nèi)存后,程序未對(duì)調(diào)用結(jié)果的正確性進(jìn)行檢測(cè)。如果cbSize為0的話,則(cbSize-1)為-1。但是Memset中第3個(gè)參數(shù)本身是無符號(hào)數(shù),因此會(huì)將-1視為正的0xffffffff,函數(shù)執(zhí)行之后程序當(dāng)然就只有崩潰了。程序驗(yàn)證和屬性檢查程序驗(yàn)證是對(duì)源代碼進(jìn)行分析,如果源代碼符合9Bug查找Bug查找是指按照預(yù)先制定的一些共同認(rèn)同的規(guī)則,來查找程序中存在的一些bug。4.1.2靜態(tài)分析技術(shù)最后一行將產(chǎn)生一個(gè)null指針異常,因?yàn)樽兞縜ctions還沒有初始化如果第1行的Map不包括一個(gè)名為“bob”的人,那么在第5行詢問person的名字時(shí)就會(huì)出現(xiàn)null指針異常。
Bug查找Bug查找是指按照預(yù)先制定的一些共同認(rèn)同的規(guī)則,來10安全審查以安全為中心的靜態(tài)分析;現(xiàn)代安全分析工具往往更像是一種屬性檢查程序和bug查找程序的混合體,許多安全屬性能被簡潔的表達(dá)為程序?qū)傩?,?duì)于一個(gè)屬性檢查程序來說,搜索潛在的緩沖區(qū)溢出漏洞可以當(dāng)做是檢查這樣的程序?qū)傩裕骸俺绦虿粫?huì)訪問被分配內(nèi)存的邊界之外的地址”。安全分析工具采納了這樣一種觀念,即開發(fā)人員往往會(huì)繼續(xù)再使用相同的不安全的方法來解決問題,這可說成是一種不安全的慣例。4.1.2靜態(tài)分析技術(shù)安全審查以安全為中心的靜態(tài)分析;4.1.2靜態(tài)分析技術(shù)11代碼安全靜態(tài)分析工具的引入對(duì)程序員來說,對(duì)安全編程所需的知識(shí)缺乏理解會(huì)導(dǎo)致其所編寫的代碼不符合安全規(guī)范而引發(fā)安全問題。另外,即使是經(jīng)驗(yàn)豐富的程序員也無法完全避免在代碼編寫的過程中出現(xiàn)或多或少的拼寫錯(cuò)誤,這類簡單錯(cuò)誤有時(shí)也可能引發(fā)安全問題。靜態(tài)分析工具能夠完整而客觀地進(jìn)行程序檢測(cè),而不管編碼人員是否了解哪些代碼是與安全“相關(guān)的”。當(dāng)一種新的攻擊出現(xiàn)時(shí),靜態(tài)分析工具可以迅速地對(duì)相關(guān)代碼進(jìn)行復(fù)查,同時(shí)分析該新型攻擊能否對(duì)代碼構(gòu)成威脅。在被發(fā)現(xiàn)之前,某些安全缺陷已在程序中存在很久了,靜態(tài)分析工具有能力針對(duì)新發(fā)現(xiàn)的缺陷類型對(duì)遺留代碼進(jìn)行檢查。盡管誤報(bào)難以避免,但從安全的角度看,漏報(bào)才是最嚴(yán)重的局限性。HPFortify4.1.2靜態(tài)分析技術(shù)代碼安全靜態(tài)分析工具的引入對(duì)程序員來說,對(duì)安全編程所需的知識(shí)124.2靜態(tài)分析的過程4.2靜態(tài)分析的過程靜態(tài)分析的過程提取源代碼根據(jù)分析需求把程序源代碼變換成易于分析處理的程序模型。在這個(gè)過程用到了編譯原理中的成熟技術(shù);將代碼按照檢查規(guī)則執(zhí)行分析;按照制定的報(bào)告模式生成分析報(bào)告。4.2靜態(tài)分析的過程靜態(tài)分析的過程提取源代碼4.2靜態(tài)分析的過程14定義靜態(tài)分析工具首先要做的,是用一個(gè)程序模型來表示待分析的代碼,即提取目標(biāo)代碼的數(shù)據(jù)結(jié)構(gòu)。在構(gòu)建該模型的過程中,靜態(tài)分析工具一般會(huì)借用大量來自編譯器領(lǐng)域的技術(shù):
詞法分析語法分析
抽象語法
語義分析
跟蹤控制流
跟蹤數(shù)據(jù)流
污染傳播
指針別名歧義4.2.1建模定義靜態(tài)分析工具首先要做的,是用一個(gè)程序模型來表示待分析的代15詞法分析是把源文件的字符流轉(zhuǎn)換成記號(hào)流,即從左到右逐個(gè)字符對(duì)構(gòu)成源程序的字符串進(jìn)行掃描,依據(jù)詞法規(guī)則,識(shí)別出一個(gè)一個(gè)的標(biāo)記(token),把源程序變?yōu)榈葍r(jià)的標(biāo)記串序列。例:inta=3+5;經(jīng)過詞法分析會(huì)輸出int,a,=,3,+,5和;這七個(gè)單詞。然后比較記號(hào)流中的標(biāo)識(shí)符和預(yù)先定義的安全性漏洞字典,如果匹配就發(fā)出警告。在靜態(tài)分析工具中,詞法分析是針對(duì)源代碼進(jìn)行的第一個(gè)操作,該操作將代碼轉(zhuǎn)換為一系列記號(hào),這個(gè)記號(hào)流的創(chuàng)建過程稱為詞法分析4.2.1建模詞法分析是把源文件的字符流轉(zhuǎn)換成記號(hào)流,即從左到右逐個(gè)字符對(duì)16語法解析語法解析器中用來匹配上述記號(hào)流的是一種與上下文環(huán)境無關(guān)的語法。該語法由一組產(chǎn)生式構(gòu)成,用語言中的一對(duì)符號(hào)來標(biāo)記。4.2.1建模語法解析語法解析器中用來匹配上述記號(hào)流的是一種與上下文環(huán)境無17抽象語法解析樹無法完成復(fù)雜的分析,因?yàn)樵诮馕龉こ讨?,?jīng)常會(huì)對(duì)語法進(jìn)行等價(jià)的轉(zhuǎn)換,這樣會(huì)給語法引入一些多余的成分,對(duì)后續(xù)階段造成不利影響,甚至?xí)垢麟A段變得混亂。因此,很多編譯器(包括GJC)經(jīng)常要獨(dú)立地構(gòu)造解析樹,為前、后端建立一個(gè)清晰的接口。這時(shí)就需要使用抽象語法樹(AST)。上例中的語法樹如下:4.2.1建模抽象語法樹的結(jié)構(gòu)不依賴于源文件的文法,也就是解析階段所采用的上下文無關(guān)語法,因此它能夠?yàn)楹髞淼姆治鎏峁┮粋€(gè)更加標(biāo)準(zhǔn)方便的版本抽象語法解析樹無法完成復(fù)雜的分析,因?yàn)樵诮馕龉こ讨?,?jīng)常會(huì)對(duì)18語義分析語義分析,即審查每個(gè)語法成分的靜態(tài)語義。4.2.1建模語義分析檢查點(diǎn)類型檢查控制流檢查一致性檢查語義分析語義分析,即審查每個(gè)語法成分的靜態(tài)語義。4.2.119跟蹤控制流許多靜態(tài)分析算法都會(huì)探究函數(shù)執(zhí)行可能采取的路徑。因此,絕大多數(shù)分析工具都會(huì)在AST或者中間表示法之上生成一個(gè)控制流圖以使算法更高效??刂屏鲌D中的節(jié)點(diǎn)是一些基本塊:指令序列總以連續(xù)方式從第一條執(zhí)行到最后一條。4.2.1建模跟蹤控制流許多靜態(tài)分析算法都會(huì)探究函數(shù)執(zhí)行可能采取的路徑。因20跟蹤數(shù)據(jù)流數(shù)據(jù)流分析一般是對(duì)某個(gè)函數(shù)的控制流圖進(jìn)行遍歷,同時(shí)記錄數(shù)據(jù)值的產(chǎn)生和使用位置。4.2.1建模跟蹤數(shù)據(jù)流數(shù)據(jù)流分析一般是對(duì)某個(gè)函數(shù)的控制流圖進(jìn)行遍歷,同時(shí)21污染傳播通過污染傳播測(cè)試能知道攻擊者可能潛在地控制程序中的哪些值,確定污染數(shù)據(jù)的來源,找出所有外部數(shù)據(jù)進(jìn)入程序的入口代碼以及它在程序中是如何移動(dòng)的。4.2.1建模代碼動(dòng)態(tài)構(gòu)建和執(zhí)行一個(gè)SQL查詢,查找與給定名稱匹配的item。查詢限定只有當(dāng)當(dāng)前用戶名與item的所有者名稱匹配時(shí),才向當(dāng)前用戶顯示item。污染傳播通過污染傳播測(cè)試能知道攻擊者可能潛在地控制程序中的哪22指針別名歧義指針別名分析是另一個(gè)問題數(shù)據(jù)流問題。別名分析的目的是要了解哪些指針可能是指向相同的內(nèi)存位置。例:只有當(dāng)指針p1和p2不指向內(nèi)存的相同位置時(shí),編譯器才會(huì)記錄下面兩個(gè)聲明:*p1=1;*p2=2;對(duì)于安全工具來說,別名分析在執(zhí)行污染傳播測(cè)試方面很重要。一個(gè)流動(dòng)的敏感的污點(diǎn)-跟蹤算法需要執(zhí)行別名分析,以了解下面代碼中從getUserInput()到processInput()的數(shù)據(jù)流:
p1=p2;*p1=getUserInput();processInput(*p2);4.2.1建模指針別名歧義指針別名分析是另一個(gè)問題數(shù)據(jù)流問題。別名分析的目23組成任何優(yōu)秀的分析策略都至少包括兩個(gè)組成部分:分析每個(gè)單獨(dú)的函數(shù)的程序內(nèi)分析(本地分析)和分析函數(shù)之間的關(guān)系的程序間分析(全局分析)。4.2.2分析算法組成任何優(yōu)秀的分析策略都至少包括兩個(gè)組成部分:分析每個(gè)單獨(dú)的24斷言4.2.2分析算法從安全特性產(chǎn)生的斷言那些與在程序中傳送時(shí)數(shù)據(jù)被賦予的信任等級(jí)相關(guān)的斷言緩沖區(qū)溢出漏洞所引發(fā)的斷言對(duì)象在程序運(yùn)行時(shí)的狀態(tài)斷言4.2.2分析算法從安全特性產(chǎn)生的斷言那些與在程序中25本地分析法本地分析法抽象解釋:是一種通用技術(shù),這種方法首先將程序中與所關(guān)注的屬性無關(guān)的信息抽取出去,而后使用選中的程序抽象執(zhí)行一種解釋。謂詞轉(zhuǎn)換器:一種用來替換模擬和解釋的方法是導(dǎo)出函數(shù)對(duì)其調(diào)用者的需求。模型檢查:對(duì)于臨時(shí)性的安全屬性,比如“內(nèi)存應(yīng)該只釋放一次”以及“應(yīng)該只有非空指針才能被解除引用”,可以很容易地將所檢查的屬性表示為一個(gè)小型的有限狀態(tài)自動(dòng)機(jī)。4.2.2分析算法本地分析法本地分析法抽象解釋:是一種通用技術(shù),這種方法首先將26全局分析全局分析的作全局分析被采用的實(shí)質(zhì)原因有兩個(gè)方面:首先,它可以保證匯編系統(tǒng)的一致性;其次,它通過提供自動(dòng)優(yōu)化,減輕了程序員的負(fù)擔(dān)。用是用來分析程序中各個(gè)函數(shù)之間的關(guān)系。4.2.2分析算法全局分析全局分析的作4.2.2分析算法27定義及分類是指安全工具應(yīng)該報(bào)告的內(nèi)容的規(guī)則集。分析算法有時(shí)可能由錯(cuò)誤的“因”獲得正確的“果”,但分析工具永遠(yuǎn)也不會(huì)報(bào)告超出規(guī)則集范圍的問題。4.2.3規(guī)則規(guī)則格式:專用的規(guī)則文件、批注用于傳播的規(guī)則源規(guī)則定義及分類是指安全工具應(yīng)該報(bào)告的內(nèi)容的規(guī)則集。分析算法有時(shí)可28審計(jì)人員如何利用報(bào)告審計(jì)人員如何利用報(bào)告將所報(bào)告的結(jié)果進(jìn)行分類并分組消除所報(bào)告的結(jié)果中非預(yù)期的部分對(duì)所報(bào)告結(jié)果的意義進(jìn)行解釋4.4.4報(bào)告結(jié)果審計(jì)人員如何利用報(bào)告審計(jì)人員如何利用報(bào)告將所報(bào)告的結(jié)果進(jìn)行分29靜態(tài)分析技術(shù)劃分建模涉及到的技術(shù)分類規(guī)則分類如何利用報(bào)告小結(jié)靜態(tài)分析技術(shù)劃分小結(jié)30靜態(tài)分析的過程控制流圖數(shù)據(jù)流圖本地分析和全局分析作業(yè)靜態(tài)分析的過程作業(yè)31第4章代碼安全靜態(tài)分析
第4章代碼安全靜態(tài)分析
教學(xué)目標(biāo)應(yīng)掌握的知識(shí)要點(diǎn):靜態(tài)分析的概念;靜態(tài)分析技術(shù);靜態(tài)分析的過程;執(zhí)行代碼審查;安全審查;靜態(tài)分析度量標(biāo)準(zhǔn);靜態(tài)分析中的常見缺陷;緩沖區(qū)溢出。軟件漏洞重點(diǎn)代碼安全靜態(tài)分析靜態(tài)分析中的常見缺陷靜態(tài)分析的過程教學(xué)目標(biāo)應(yīng)掌握的知識(shí)要點(diǎn):33本節(jié)安排靜態(tài)分析的概念靜態(tài)分析技術(shù)代碼靜態(tài)分析工具的引入本節(jié)安排靜態(tài)分析的概念344.1靜態(tài)分析4.1靜態(tài)分析定義及特點(diǎn)程序靜態(tài)分析(ProgramStaticAnalysis)是指在不運(yùn)行代碼的方式下,通過各種分析工具對(duì)程序代碼進(jìn)行掃描并做出評(píng)估的過程。4.1.1靜態(tài)分析的概念特點(diǎn)不實(shí)際執(zhí)行程序,只是通過對(duì)代碼的靜態(tài)掃描對(duì)程序進(jìn)行分析執(zhí)行速度快、效率高定義及特點(diǎn)程序靜態(tài)分析(ProgramStaticAna36類型檢查例1shorts=1;inti=s;shortr=i;在本例中,程序的本意是想要將一個(gè)類型為int的表達(dá)式賦予給一個(gè)類型為short的變量,但是卻無法通過類型檢查。可以通過一個(gè)顯式的類型轉(zhuǎn)換來解決這個(gè)問題。例2String[]sa=newString[100];sa[0]="helloworld";Object[]oa=sa;oa[0]=newInteger(1);System.out.println(sa[0]);只有只讀的Object[]才能是String[]的父類型。但Java里并沒有只讀數(shù)組這么個(gè)類型,于是錯(cuò)誤發(fā)生了。
4.1.2靜態(tài)分析技術(shù)類型檢查例1shorts=1;4.1.2靜37風(fēng)格檢查風(fēng)格檢查程序所顯示的錯(cuò)誤常只是影響代碼的可讀性和可維護(hù)性,而不是程序運(yùn)行過程中會(huì)發(fā)生的某種錯(cuò)誤PMD會(huì)檢查出:catch塊中沒有內(nèi)容、if判斷塊中沒有內(nèi)容、代碼中出現(xiàn)System.out.println等警告描述。4.1.2靜態(tài)分析技術(shù)風(fēng)格檢查風(fēng)格檢查程序所顯示的錯(cuò)誤常只是影響代碼的可讀性和可維38程序理解程序理解最主要的用途在于幫助理解程序,搞懂代碼庫中的大量代碼。它是一個(gè)從計(jì)算機(jī)程序中獲取知識(shí)信息的過程,這些知識(shí)信息可以用于程序排錯(cuò)、增強(qiáng)程序、重用程序和整理文檔等工作。在很多集成開發(fā)環(huán)境(IDE)中,都包括了一些初級(jí)的程序理解功能,比如:查找本變量的聲明和使用位置。更高級(jí)一點(diǎn)的還能幫助查找類之間的關(guān)聯(lián)關(guān)系等。4.1.2靜態(tài)分析技術(shù)程序理解程序理解最主要的用途在于幫助理解程序,搞懂代碼庫中的39程序驗(yàn)證和屬性檢查程序驗(yàn)證是對(duì)源代碼進(jìn)行分析,如果源代碼符合預(yù)先專門制定的一份描述程序行為的規(guī)格說明,那么則說明該程序完好。性檢查的方法跟程序驗(yàn)證的方法從本質(zhì)上是一樣的,它們的區(qū)別在于,屬性檢查依據(jù)的只是描述部分程序行為的部分規(guī)格說明,而程序驗(yàn)證依據(jù)的是描述所有程序行為的規(guī)格說明。4.1.2靜態(tài)分析技術(shù)代碼中,在調(diào)用new分配內(nèi)存后,程序未對(duì)調(diào)用結(jié)果的正確性進(jìn)行檢測(cè)。如果cbSize為0的話,則(cbSize-1)為-1。但是Memset中第3個(gè)參數(shù)本身是無符號(hào)數(shù),因此會(huì)將-1視為正的0xffffffff,函數(shù)執(zhí)行之后程序當(dāng)然就只有崩潰了。程序驗(yàn)證和屬性檢查程序驗(yàn)證是對(duì)源代碼進(jìn)行分析,如果源代碼符合40Bug查找Bug查找是指按照預(yù)先制定的一些共同認(rèn)同的規(guī)則,來查找程序中存在的一些bug。4.1.2靜態(tài)分析技術(shù)最后一行將產(chǎn)生一個(gè)null指針異常,因?yàn)樽兞縜ctions還沒有初始化如果第1行的Map不包括一個(gè)名為“bob”的人,那么在第5行詢問person的名字時(shí)就會(huì)出現(xiàn)null指針異常。
Bug查找Bug查找是指按照預(yù)先制定的一些共同認(rèn)同的規(guī)則,來41安全審查以安全為中心的靜態(tài)分析;現(xiàn)代安全分析工具往往更像是一種屬性檢查程序和bug查找程序的混合體,許多安全屬性能被簡潔的表達(dá)為程序?qū)傩?,?duì)于一個(gè)屬性檢查程序來說,搜索潛在的緩沖區(qū)溢出漏洞可以當(dāng)做是檢查這樣的程序?qū)傩裕骸俺绦虿粫?huì)訪問被分配內(nèi)存的邊界之外的地址”。安全分析工具采納了這樣一種觀念,即開發(fā)人員往往會(huì)繼續(xù)再使用相同的不安全的方法來解決問題,這可說成是一種不安全的慣例。4.1.2靜態(tài)分析技術(shù)安全審查以安全為中心的靜態(tài)分析;4.1.2靜態(tài)分析技術(shù)42代碼安全靜態(tài)分析工具的引入對(duì)程序員來說,對(duì)安全編程所需的知識(shí)缺乏理解會(huì)導(dǎo)致其所編寫的代碼不符合安全規(guī)范而引發(fā)安全問題。另外,即使是經(jīng)驗(yàn)豐富的程序員也無法完全避免在代碼編寫的過程中出現(xiàn)或多或少的拼寫錯(cuò)誤,這類簡單錯(cuò)誤有時(shí)也可能引發(fā)安全問題。靜態(tài)分析工具能夠完整而客觀地進(jìn)行程序檢測(cè),而不管編碼人員是否了解哪些代碼是與安全“相關(guān)的”。當(dāng)一種新的攻擊出現(xiàn)時(shí),靜態(tài)分析工具可以迅速地對(duì)相關(guān)代碼進(jìn)行復(fù)查,同時(shí)分析該新型攻擊能否對(duì)代碼構(gòu)成威脅。在被發(fā)現(xiàn)之前,某些安全缺陷已在程序中存在很久了,靜態(tài)分析工具有能力針對(duì)新發(fā)現(xiàn)的缺陷類型對(duì)遺留代碼進(jìn)行檢查。盡管誤報(bào)難以避免,但從安全的角度看,漏報(bào)才是最嚴(yán)重的局限性。HPFortify4.1.2靜態(tài)分析技術(shù)代碼安全靜態(tài)分析工具的引入對(duì)程序員來說,對(duì)安全編程所需的知識(shí)434.2靜態(tài)分析的過程4.2靜態(tài)分析的過程靜態(tài)分析的過程提取源代碼根據(jù)分析需求把程序源代碼變換成易于分析處理的程序模型。在這個(gè)過程用到了編譯原理中的成熟技術(shù);將代碼按照檢查規(guī)則執(zhí)行分析;按照制定的報(bào)告模式生成分析報(bào)告。4.2靜態(tài)分析的過程靜態(tài)分析的過程提取源代碼4.2靜態(tài)分析的過程45定義靜態(tài)分析工具首先要做的,是用一個(gè)程序模型來表示待分析的代碼,即提取目標(biāo)代碼的數(shù)據(jù)結(jié)構(gòu)。在構(gòu)建該模型的過程中,靜態(tài)分析工具一般會(huì)借用大量來自編譯器領(lǐng)域的技術(shù):
詞法分析語法分析
抽象語法
語義分析
跟蹤控制流
跟蹤數(shù)據(jù)流
污染傳播
指針別名歧義4.2.1建模定義靜態(tài)分析工具首先要做的,是用一個(gè)程序模型來表示待分析的代46詞法分析是把源文件的字符流轉(zhuǎn)換成記號(hào)流,即從左到右逐個(gè)字符對(duì)構(gòu)成源程序的字符串進(jìn)行掃描,依據(jù)詞法規(guī)則,識(shí)別出一個(gè)一個(gè)的標(biāo)記(token),把源程序變?yōu)榈葍r(jià)的標(biāo)記串序列。例:inta=3+5;經(jīng)過詞法分析會(huì)輸出int,a,=,3,+,5和;這七個(gè)單詞。然后比較記號(hào)流中的標(biāo)識(shí)符和預(yù)先定義的安全性漏洞字典,如果匹配就發(fā)出警告。在靜態(tài)分析工具中,詞法分析是針對(duì)源代碼進(jìn)行的第一個(gè)操作,該操作將代碼轉(zhuǎn)換為一系列記號(hào),這個(gè)記號(hào)流的創(chuàng)建過程稱為詞法分析4.2.1建模詞法分析是把源文件的字符流轉(zhuǎn)換成記號(hào)流,即從左到右逐個(gè)字符對(duì)47語法解析語法解析器中用來匹配上述記號(hào)流的是一種與上下文環(huán)境無關(guān)的語法。該語法由一組產(chǎn)生式構(gòu)成,用語言中的一對(duì)符號(hào)來標(biāo)記。4.2.1建模語法解析語法解析器中用來匹配上述記號(hào)流的是一種與上下文環(huán)境無48抽象語法解析樹無法完成復(fù)雜的分析,因?yàn)樵诮馕龉こ讨?,?jīng)常會(huì)對(duì)語法進(jìn)行等價(jià)的轉(zhuǎn)換,這樣會(huì)給語法引入一些多余的成分,對(duì)后續(xù)階段造成不利影響,甚至?xí)垢麟A段變得混亂。因此,很多編譯器(包括GJC)經(jīng)常要獨(dú)立地構(gòu)造解析樹,為前、后端建立一個(gè)清晰的接口。這時(shí)就需要使用抽象語法樹(AST)。上例中的語法樹如下:4.2.1建模抽象語法樹的結(jié)構(gòu)不依賴于源文件的文法,也就是解析階段所采用的上下文無關(guān)語法,因此它能夠?yàn)楹髞淼姆治鎏峁┮粋€(gè)更加標(biāo)準(zhǔn)方便的版本抽象語法解析樹無法完成復(fù)雜的分析,因?yàn)樵诮馕龉こ讨?,?jīng)常會(huì)對(duì)49語義分析語義分析,即審查每個(gè)語法成分的靜態(tài)語義。4.2.1建模語義分析檢查點(diǎn)類型檢查控制流檢查一致性檢查語義分析語義分析,即審查每個(gè)語法成分的靜態(tài)語義。4.2.150跟蹤控制流許多靜態(tài)分析算法都會(huì)探究函數(shù)執(zhí)行可能采取的路徑。因此,絕大多數(shù)分析工具都會(huì)在AST或者中間表示法之上生成一個(gè)控制流圖以使算法更高效。控制流圖中的節(jié)點(diǎn)是一些基本塊:指令序列總以連續(xù)方式從第一條執(zhí)行到最后一條。4.2.1建模跟蹤控制流許多靜態(tài)分析算法都會(huì)探究函數(shù)執(zhí)行可能采取的路徑。因51跟蹤數(shù)據(jù)流數(shù)據(jù)流分析一般是對(duì)某個(gè)函數(shù)的控制流圖進(jìn)行遍歷,同時(shí)記錄數(shù)據(jù)值的產(chǎn)生和使用位置。4.2.1建模跟蹤數(shù)據(jù)流數(shù)據(jù)流分析一般是對(duì)某個(gè)函數(shù)的控制流圖進(jìn)行遍歷,同時(shí)52污染傳播通過污染傳播測(cè)試能知道攻擊者可能潛在地控制程序中的哪些值,確定污染數(shù)據(jù)的來源,找出所有外部數(shù)據(jù)進(jìn)入程序的入口代碼以及它在程序中是如何移動(dòng)的。4.2.1建模代碼動(dòng)態(tài)構(gòu)建和執(zhí)行一個(gè)SQL查詢,查找與給定名稱匹配的item。查詢限定只有當(dāng)當(dāng)前用戶名與item的所有者名稱匹配時(shí),才向當(dāng)前用戶顯示item。污染傳播通過污染傳播測(cè)試能知道攻擊者可能潛在地控制程序中的哪53指針別名歧義指針別名分析是另一個(gè)問題數(shù)據(jù)流問題。別名分析的目的是要了解哪些指針可能是指向相同的內(nèi)存位置。例:只有當(dāng)指針p1和p2不指向內(nèi)存的相同位置時(shí),編譯器才會(huì)記錄下面兩個(gè)聲明:*p1=1;*p2=2;對(duì)于安全工具來說,別名分析在執(zhí)行污染傳播測(cè)試方面很重要。一個(gè)流動(dòng)的敏感的污點(diǎn)-跟蹤算法需要執(zhí)行別名分析,以了解下面代碼中從getUserInput()到processInput()的數(shù)據(jù)流:
p1=p2;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作計(jì)劃大全
- 客服部工作計(jì)劃
- 中國全自動(dòng)票據(jù)分切機(jī)項(xiàng)目投資可行性研究報(bào)告
- 交通臺(tái)實(shí)習(xí)報(bào)告10篇
- 應(yīng)屆生會(huì)計(jì)求職信集錦十篇
- 三年級(jí)教師述職報(bào)告6篇
- 小學(xué)教師競崗演講稿5篇
- 2022萬圣節(jié)作文(十五篇大全)
- 參觀實(shí)習(xí)工作報(bào)告匯編9篇
- 小額貸款公司各項(xiàng)管理制度
- 全國職業(yè)學(xué)校教師說課大賽一等獎(jiǎng)電工技能與實(shí)訓(xùn)《觸電急救方法說課》說課課件
- 小兒流感疾病演示課件
- 奔馳調(diào)研報(bào)告swot
- 中國教育史(第四版)全套教學(xué)課件
- 2024屆廣東省汕頭市高一數(shù)學(xué)第一學(xué)期期末達(dá)標(biāo)檢測(cè)試題含解析
- 采購設(shè)備檢驗(yàn)驗(yàn)收單
- 福建省泉州實(shí)驗(yàn)中學(xué)2024屆物理高一第一學(xué)期期末質(zhì)量檢測(cè)試題含解析
- 公司領(lǐng)導(dǎo)班子設(shè)置方案
- 專業(yè)展覽展示設(shè)計(jì)搭建公司
- 為銅制劑正名-冠菌銅? 產(chǎn)品課件-9-7
- 具有磁場(chǎng)保鮮裝置的制冷設(shè)備的制作方法
評(píng)論
0/150
提交評(píng)論