使用靜態(tài)技術(shù)找到真正的代碼質(zhì)量缺陷與安全漏洞_第1頁
使用靜態(tài)技術(shù)找到真正的代碼質(zhì)量缺陷與安全漏洞_第2頁
使用靜態(tài)技術(shù)找到真正的代碼質(zhì)量缺陷與安全漏洞_第3頁
使用靜態(tài)技術(shù)找到真正的代碼質(zhì)量缺陷與安全漏洞_第4頁
使用靜態(tài)技術(shù)找到真正的代碼質(zhì)量缺陷與安全漏洞_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

使用靜態(tài)分析技術(shù)找到“真正”的代碼質(zhì)量缺陷與安全漏洞HeartBleed

Bug軟件研發(fā)測試經(jīng)濟(jì)學(xué)絕大部分缺陷在修復(fù)成本較低時被引入。大部分缺陷在成本較高時被發(fā)現(xiàn)和修復(fù)。代碼靜態(tài)分析技術(shù)代碼靜態(tài)分析?

定義:在不執(zhí)行計算機(jī)程序的條件下,對源代碼進(jìn)行分析,找出代碼缺陷?

執(zhí)行方式:一般配合靜態(tài)程序分析工具進(jìn)行?

采用技術(shù):數(shù)據(jù)流分析、機(jī)器學(xué)習(xí)、語義精簡...?

可檢測類型:死鎖,空指針,資源泄露,緩沖區(qū)溢出,安全漏洞,競態(tài)條件...?

優(yōu)點:?

能夠檢測所有的代碼級別的可執(zhí)行路徑組合,快速,準(zhǔn)確?

直接面向源碼,分析多種問題

?

在研發(fā)階段開始找到并修復(fù)多種問題,節(jié)省大量時間/人力成本?

注意:靜態(tài)分析不是萬能的,測試是持續(xù)的過程,非一勞永逸?

編譯器警告:

保證類型安全–

最初級的靜態(tài)分析,檢測規(guī)則簡單?

中間語言分析:

檢測字節(jié)碼(

Byte

Code

)的缺陷,將其重新映射到真實代碼中–

在轉(zhuǎn)換與映射過程中易造成精度丟失?

高誤報率:目前靜態(tài)分析產(chǎn)品的誤報率普遍在30%以上。?

缺陷種類較少,找到的問題級別不高:多數(shù)為代碼規(guī)范或低級缺陷,非實際Bug–

如命名規(guī)范、類定義規(guī)范,最佳實踐.....?

易用性較低:基本上都是一次性的使用工具,無法與SDLC集成–

SCM集成:如SVN,CVS,Perforce,Git–

Bug

Tracking:如Bugzilla,Jira現(xiàn)存問題??由斯坦福大學(xué)教授Dawson

Engler提出,在深度理解代碼與程序語義的基礎(chǔ)上檢測缺陷旨在查找“真正的代碼缺陷”?

實現(xiàn)原理:???使用可擴(kuò)展的metal語言定義正確性Checker將程序的源碼使用狀態(tài)機(jī)進(jìn)行抽象描述(State

Machine

Abstraction)。使用xgcc系統(tǒng)匹配Checker與抽象狀態(tài)機(jī)狀態(tài),找到問題所在的點。?

可準(zhǔn)確檢測實際的Bug(內(nèi)存和指針問題、資源泄露、緩沖區(qū)溢出,數(shù)組越界,

心臟出血漏洞...)??能夠檢測高達(dá)億行級別的代碼庫,避免“狀態(tài)爆炸”使用模型檢驗與符號執(zhí)行技術(shù),誤報率降低至15%以下?

算法已步入實際應(yīng)用??面向企業(yè)的Coverity

軟件面向開源代碼的Coverity

SCAN改進(jìn)型的靜態(tài)分析方案

?

基于Meta

Compilation的靜態(tài)分析:源碼分析-數(shù)據(jù)流分析?

源碼分析可以探知開發(fā)者的想法:

“x=1”

需要在調(diào)用

“do_something”

后繼續(xù)執(zhí)行。?

提出警告:if循環(huán)沒有包含所有語句如何進(jìn)行Java代碼靜態(tài)分析?Java語言被編譯成JVM

bytecode

-

在運行時被轉(zhuǎn)換成本地可執(zhí)行代碼的分析選項一?

分析

byte-code:用戶編譯他們的軟件,然后分析編譯后的可執(zhí)行文件與調(diào)試信息,分析引擎聯(lián)系找到的缺陷與源代碼位置?

某些開源工具的實現(xiàn)原理選項二:?

獲取所有的Java編譯過程并執(zhí)行分析?

Bytecode分析工作仍舊存在,但包含更多的內(nèi)容1基本的工作流

?

獲取所有編譯過程

?

每當(dāng)

“javac(或其他相關(guān)API)”

被調(diào)用后,編譯獲取系統(tǒng)

記錄所有的編譯器選項,操作,源代碼與調(diào)用的庫文件

?

面向源代碼和庫文件可進(jìn)行全面編譯后分析

?

找到的缺陷將被展示給研發(fā)人員修復(fù)如何何分分析析缺缺陷陷??1?過程程間間分分析析((Intra-proceduralanalyses)將將考考慮每每一一個個合合理理的的可可執(zhí)執(zhí)行行路路徑徑?快速速修修剪剪不不可可行行路路徑徑是是一一件件很很麻麻煩煩的的事事情情??!?數(shù)學(xué)學(xué)方方案案?獲取取一一系系列列的的函函數(shù)數(shù)定定義義?資源源分分配配?調(diào)用用….?過程程間間分分析析?Bytecode分析析將將創(chuàng)創(chuàng)建建函函數(shù)數(shù)定定義義如何何分分析析缺缺陷陷??1?數(shù)據(jù)據(jù)流流分分析析將將跟跟蹤蹤所有有應(yīng)應(yīng)用用中中的的不不可可信信數(shù)數(shù)據(jù)據(jù)?“source””?“sink””?二者者之之間間必必須須進(jìn)進(jìn)行行驗驗證證?某些些使使用用智智能能靜靜態(tài)態(tài)分分析析,,例例如如:?checkedthisreturnvaluefornull19timesoutof20?accessedthisfieldunderalock19timesoutof20?calledbase.Foo()in19overridesofFoo()outof201找到到潛潛在在Bug其實實只只是是難難題題之之一一?消除除誤誤報報非非常常難難?將復(fù)復(fù)雜雜的的缺缺陷陷解解釋釋出出來來很很難難?只找找潛潛在在的的一一次次性性缺缺陷陷是是很很難難的的1難題題!!ControlFlowGraph如何何簡簡化化搜搜索索??A(Source)BC(Escaper)DE(Sink)TaintedData?數(shù)據(jù)據(jù)流流分分析析AdvanceddataflowTaintedData?動態(tài)態(tài)“fuzzing””?基于于上上下下文文分分析析CoverityOWASPtop10:JSP&ASPOWASP10-2013A1:注注入入A2:失效認(rèn)證與與會話管理A3:跨站腳本攻攻擊(XSS)A4:不安全的直直接對象引用用A5:安全配置錯錯誤A6:敏感信息泄泄露A7:功能級訪問問控制缺失A8:跨站請求偽偽造A9:使用含有已已知漏洞的組組件A10:未驗證的重重定向和轉(zhuǎn)發(fā)發(fā)CWE映射77,78,88,89,90,564,917259,321,384,79879,80,81,82,83,84,86,8722,23,364,7,86,650321425,862,863352NA938空指針引用–Null檢查后引用空空指針–直接引用返回回的空指針–Null檢查前引用空空指針API使用錯誤–無效迭代器使使用–不可修改的集集合錯誤–已釋放資源調(diào)調(diào)用性能缺陷–低效率方法使使用–在循環(huán)中連接接字符串–冗余同步邏輯錯誤–不可達(dá)代碼–未使用變量–常量表達(dá)式–非本地資源不不當(dāng)使用–整數(shù)溢出–不當(dāng)分號Java缺陷Web應(yīng)用安全缺陷陷(OWASPTop10)–跨站腳本攻擊擊–SQL注入–命令行注入–路徑遍歷…資源泄露–數(shù)據(jù)庫連接資資源泄露–資源泄露–Socket&Stream泄露并發(fā)數(shù)據(jù)訪問問異常–變量非原子更更新–雙重檢查鎖定定–數(shù)據(jù)競態(tài)條件件–Volatile非原子更新–Servlet屬性無效鎖定定–單例模式競態(tài)態(tài)條件程序假死–線程死鎖–死鎖代碼可維護(hù)性性缺陷–調(diào)用已過期方方法–顯式垃圾收集集–非靜態(tài)方法中中設(shè)置靜態(tài)變變量–復(fù)制/粘貼錯誤–不可達(dá)代碼可疑代碼–參數(shù)次序錯誤誤–格式錯誤Java缺陷類層次結(jié)構(gòu)不不一致–調(diào)用super.clone()或supler.finalize()失敗–父函數(shù)調(diào)用丟丟失–構(gòu)造函數(shù)中使使用虛函數(shù)控制流缺陷–在Finally模塊中返回–Switch語句中break丟失錯誤處理缺陷陷–未驗證的返回回值數(shù)據(jù)庫操作–不正確的實體體哈希–Load函數(shù)返回值錯錯誤驗證–不完全持續(xù)周周期–get()不當(dāng)使用資源泄露–數(shù)據(jù)庫連接資資源泄露–資源泄露–Socket&Stream泄露API使用錯誤–已釋放資源調(diào)調(diào)用并發(fā)數(shù)據(jù)訪問問異常–變量非原子更更新–數(shù)據(jù)競態(tài)條件件性能缺陷–低效率方法使使用–在循環(huán)中連接接字符串–冗余同步程序假死–線程死鎖–死循環(huán)可疑代碼–復(fù)制/粘貼錯誤–參數(shù)次序錯誤誤–格式錯誤類層次結(jié)構(gòu)不不一致–調(diào)用base.close()或base.dispose()失敗–父函數(shù)調(diào)用丟丟失控制流缺陷–可疑的額外分分號–不一致比較–不兼容的類型型比較空指針引用–Null檢查后后引用用空指指針–直接引引用返返回的的空指指針–Null檢查前前引用用空指指針?biāo)阈g(shù)錯錯誤–錯誤移移位操操作–不正確確的表表達(dá)式式–表達(dá)式式計算算過程程中溢溢出C#缺陷PoweredbyEricLippert檢測實實例-SQLInjectionCopy-pasteerrorinreal-worldcode2if(returns!=null){r.retvals=ScopeParser.parseTypedArgList(returns,returns.getText(),g.tool.errMgr);r.retvals.type=AttributeDict.DictType.RET;r.retvals.ast=returns;}if(locals!=null){r.locals=ScopeParser.parseTypedArgList(locals,locals.getText(),g.tool.errMgr);r.locals.type=AttributeDict.DictTYpe.LOCAL;r.locals.ast=returns;}?Checker描述(metal語言)檢測代代碼::C語言靜靜態(tài)分分析?符號執(zhí)執(zhí)行?不執(zhí)行行程序序,用用符號號值表表示程程序變變量的的值,,模擬擬程序序執(zhí)行?可以分分析代代碼的的所有有/部分語語義信信息?避免狀狀態(tài)爆爆炸?模型檢檢驗XGCC系統(tǒng)內(nèi)存崩崩潰?內(nèi)存訪訪問溢溢出?字符串串長度度計算算錯誤誤?緩沖區(qū)區(qū)溢出出?寫指針針溢出出?負(fù)數(shù)組組索引引寫入入?內(nèi)存錯錯誤分分配?錯誤的的內(nèi)存存釋放放非法內(nèi)內(nèi)存訪訪問?不正確確的delete操作?溢出指指針讀讀取?越界讀讀取?返回指指針至至本地地變量量?負(fù)數(shù)組組索引引讀取取?已釋放放指針針讀/寫?不兼容容的指指針轉(zhuǎn)轉(zhuǎn)換控制流流缺陷陷?邏輯/結(jié)構(gòu)死死代碼碼?Switch語句中中break遺失?非本地地資源源不當(dāng)當(dāng)使用用C/C++缺陷-Part1資源泄泄露?內(nèi)存泄泄露?MicrosoftCOM內(nèi)存泄泄露?Object資源泄泄露?不當(dāng)delete未初始始化變變量?返回語語句丟丟失?未初始始化的的指針針/標(biāo)量/數(shù)組讀寫?類或結(jié)結(jié)構(gòu)體體中未未初始始化的的數(shù)據(jù)據(jù)成員員并發(fā)缺缺陷?死鎖?競態(tài)條條件((Raceconditions)?阻塞調(diào)調(diào)用誤誤用算術(shù)錯錯誤?負(fù)變量量不當(dāng)當(dāng)使用用?異常符符號擴(kuò)擴(kuò)展?整數(shù)溢溢出?除零異異常26?????死循環(huán)環(huán)雙重鎖鎖或解解鎖丟丟失負(fù)循環(huán)環(huán)邊界界值線程死死鎖持鎖過過程中中調(diào)用用sleep()空指針針引用用?Null檢查后后引用用空指指針?直接引引用返返回的的空指指針?Null檢查前前引用用空指指針不安全全的數(shù)數(shù)據(jù)處處理?不可信信的循循環(huán)數(shù)數(shù)據(jù)源源?使用非非可信信數(shù)據(jù)據(jù)源讀讀寫數(shù)數(shù)組/指針?使用非非可信信數(shù)據(jù)據(jù)源格格式化化字符符串性能缺缺陷?值傳遞遞大參參數(shù)?使用大大堆棧棧安全措措施違違反??緩沖區(qū)區(qū)溢出出固定長長度緩緩沖區(qū)區(qū)寫入入?非安全全函數(shù)數(shù)調(diào)用用?非安全全臨時時文件件使用用?檢查/使用時時間不不一致致?用戶空空間指指針不不當(dāng)使使用API錯誤使使用?非安全全chroot調(diào)用?錯誤的的迭代代器使使用?printf()參數(shù)不不匹配配C/C++缺陷-Part2程序假假死錯誤處處理缺缺陷?未驗證證的返返回值值?未獲取取異常常?負(fù)變量量不當(dāng)當(dāng)使用用代碼維維護(hù)性性缺陷陷?多返回回語句句?無效變變量異常代代碼?復(fù)制/粘貼錯錯誤?格式錯錯誤27?HeartBleed安全檢檢查?定義TaintedData檢測實實例-HeartBleedBugCoverityJenkins檢測對對比30類型未處理理的缺缺陷((Null引用))資源泄泄露并發(fā)問問題重要的的缺陷陷代碼規(guī)規(guī)范,,最佳佳實踐踐等Bug總數(shù)FindBugs7121029598627SharedDefects513927128Coverity7986221879196CoverityFreeradius缺陷檢測測對比3122188類型內(nèi)存問題題資源泄露露控制流缺缺陷,并并發(fā)訪問問等問題重要的缺缺陷代碼規(guī)范范,最佳佳實踐等等TotalBugClang5330385997SharedDefects001123119Coverity7986831039121“瀑布式式開發(fā)流流程”需求挖掘掘設(shè)計實施驗證支持開發(fā)測試發(fā)布經(jīng)典的瀑瀑布式開開發(fā)流程程:?代碼開發(fā)發(fā)與測試試之間存存在延遲遲?QA經(jīng)常由其其他部門門負(fù)責(zé),,在編碼碼階段完完成后才才能開始始?安全保護(hù)護(hù)基本是是在“事事發(fā)之后后”才由由單獨的的安全部部門提供供“敏捷開開發(fā)流程程”需求挖掘掘設(shè)計實施驗證支持開發(fā)測試發(fā)布理想的敏敏捷開發(fā)發(fā)流程::?將整個實實施和驗驗證流程程縮短成成2-4周的“沖沖刺”(sprints)?開發(fā)好的的功能只只有在經(jīng)經(jīng)過全面面驗證之之后才被被“接受受”?為取得成成功,QA及安全測測試都必必須是深深入的自自動化測測試?Requirementsdefinition提交?BusinessProcess修復(fù)檢測IDE源代碼管管理夜間構(gòu)建建缺陷跟蹤蹤缺陷缺陷缺陷軟件生命命周期集集成敏捷開發(fā)發(fā)相關(guān)人員員任務(wù)自自動分配配提交提交提交?Developfeatures?Reviewdefects?Prioritizeactions?Makefixes?Trackprogress修復(fù)檢測34自動代碼檢測–CVE-2005-0467{示例:C/C++char*p=snewn(len+1,char);memcpy(p,s,len);p[len]='';returnp;}?這片代碼來自自PuTTY–PuTTY是是面向Win32和Unix平臺以以及xterm終端仿真真程序而免費實施施的Telnet與SSHstaticchar*foo(char安漏洞?2005年在在PuTTY中發(fā)現(xiàn)*s,全intlen)char*p=malloc((len+1)*sizeof(char));memcpy(p,s,len);p[len]=‘\0’’;returnstaticchar*mkstr(char*s,intlen)p;}{CVE-2005-0467staticchar*mkstr(char*s,intlen){char*p=snewn(len+1,char);memcpy(p,s,len);p[len]='';structsftp_request{/*sftp_pkt_getstringcallwithcontrolledlenvalue*/sftp_pkt_getstring(pktin,&hstring,&len);...handle=snew(structfxp_handle);/*heapcorruptionwilloccuriflen==-1*/handle->hstring=mkstr(hstring,len);handle->hlen=len;sftp_pkt_free(pktin);returnhandle;...}staticvoidsftp_pkt_getstring(structsftp_packet*pkt,char**p,int*length){*p=NULL;if(pkt->length-pkt->savedpos<4)return;/*lengthvalueistakenfromuser-supplieddata*/*length=GET_32BIT(pkt->data+pkt->savedpos);pkt->savedpos+=4;/*thischeckwillbepassediflength<0*/if(pkt->length-pkt->savedpos<*length)structreturn;fxp_handle*fxp_open_recv(structsftp_packet*pktin,*p=pkt->data+pkt->savedpos;*req)pkt->savedpos+=*length;}...returnp;分類、行動部部署及任務(wù)分配如何處理?安全及其他問問題的統(tǒng)一視圖對缺陷進(jìn)行清清晰描述清晰描述顯示示缺陷的控制流面向宏和進(jìn)程程間缺陷的聯(lián)防(inline)選項9、靜夜四四無鄰,,荒居舊舊業(yè)貧。。。12月-2212月-22Wednesday,December28,202210、雨中中黃葉葉樹,,燈下下白頭頭人。。。20:27:3020:27:3020:2712/28/20228:27:30PM11、以我獨沈沈久,愧君君相見頻。。。12月-2220:27:3020:27Dec-2228-Dec-2212、故人江海別別,幾度隔山山川。。20:27:3020:27:3020:27Wednesday,December28,202213、乍見翻翻疑夢,,相悲各各問年。。。12月-2212月-2220:27:3020:27:30December28,202214、他鄉(xiāng)鄉(xiāng)生白白發(fā),,舊國國見青青山。。。28十十二二月20228:27:30下下午20:27:3012月月-2215、比不了得得就不比,,得不到的的就不要。。。。十二月228:27下下午12月-2220:27December28,202216、行動出出成果,,工作出出財富。。。2022/12/2820:27:3020:27:3028December202217、做前,能夠夠環(huán)視四周;;做時,你只只能或者最好好沿著以腳為為起點的射線線向前。。8:27:30下午8:27下下午20:27:3012月-229、沒有有失敗敗,只只有暫暫時停停止成成功!!。12月月-2212月月-22Wednesday,December28,202210、很很多多事事情情努努力力了了未未必必有有結(jié)結(jié)果果,,但但是是不不努努力力卻卻什什么么改改變變也也沒沒有有。。。。20:27:3020:27:3020:2712/28/20228:27:30PM11、成功就是日日復(fù)一日那一一點點小小努努力的積累。。。12月-2220:27:3020:27Dec-2228-Dec-2212、世間成事事,不求其其絕對圓滿滿,留一份份不足,可可得無限完完美。。20:27:3020:27:3020:27Wednesday,December28,202213、不知香積寺寺,數(shù)里入云云峰。。12月-2212月-2220:27:3020:27:30December28,202214、意志志堅強(qiáng)強(qiáng)的人人能把把世界界放在在手中中像泥泥塊一一樣任任意揉揉捏。。28十十二二月20228:27:30下下午20:27:3012月月-2215、楚塞三三湘接,,荊門九九派通。。。。十二月228:27下午午12月-2220:27December28,202216、少年十十五

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論