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

下載本文檔

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

文檔簡(jiǎn)介

1、使用靜態(tài)分析技術(shù)找到“真正”的代碼質(zhì)量缺陷與安全漏洞HeartBleed Bug軟件研發(fā)測(cè)試經(jīng)濟(jì)學(xué)絕大部分缺陷在修復(fù)成本較低時(shí)被引入。大部分缺陷在成本較高時(shí)被發(fā)現(xiàn)和修復(fù)。代碼靜態(tài)分析技術(shù)代碼靜態(tài)分析 定義:在不執(zhí)行計(jì)算機(jī)程序的條件下,對(duì)源代碼進(jìn)行分析,找出代碼缺陷 執(zhí)行方式:一般配合靜態(tài)程序分析工具進(jìn)行 采用技術(shù):數(shù)據(jù)流分析、機(jī)器學(xué)習(xí)、語(yǔ)義精簡(jiǎn). 可檢測(cè)類(lèi)型:死鎖,空指針,資源泄露,緩沖區(qū)溢出,安全漏洞,競(jìng)態(tài)條件. 優(yōu)點(diǎn): 能夠檢測(cè)所有的代碼級(jí)別的可執(zhí)行路徑組合,快速,準(zhǔn)確 直接面向源碼,分析多種問(wèn)題 在研發(fā)階段開(kāi)始找到并修復(fù)多種問(wèn)題,節(jié)省大量時(shí)間/人力成本 注意:靜態(tài)分析不是萬(wàn)能的,測(cè)試是持

2、續(xù)的過(guò)程,非一勞永逸 編譯器警告: 保證類(lèi)型安全 最初級(jí)的靜態(tài)分析,檢測(cè)規(guī)則簡(jiǎn)單 中間語(yǔ)言分析: 檢測(cè)字節(jié)碼( Byte Code )的缺陷,將其重新映射到真實(shí)代碼中 在轉(zhuǎn)換與映射過(guò)程中易造成精度丟失 高誤報(bào)率:目前靜態(tài)分析產(chǎn)品的誤報(bào)率普遍在30%以上。 缺陷種類(lèi)較少,找到的問(wèn)題級(jí)別不高:多數(shù)為代碼規(guī)范或低級(jí)缺陷,非實(shí)際Bug 如命名規(guī)范、類(lèi)定義規(guī)范,最佳實(shí)踐. 易用性較低:基本上都是一次性的使用工具,無(wú)法與SDLC集成 SCM集成:如SVN,CVS,Perforce,Git Bug Tracking:如Bugzilla,Jira現(xiàn)存問(wèn)題由斯坦福大學(xué)教授Dawson Engler提出,在深度理

3、解代碼與程序語(yǔ)義的基礎(chǔ)上檢測(cè)缺陷旨在查找“真正的代碼缺陷” 實(shí)現(xiàn)原理:使用可擴(kuò)展的metal語(yǔ)言定義正確性Checker將程序的源碼使用狀態(tài)機(jī)進(jìn)行抽象描述(State Machine Abstraction)。使用xgcc系統(tǒng)匹配Checker與抽象狀態(tài)機(jī)狀態(tài),找到問(wèn)題所在的點(diǎn)。 可準(zhǔn)確檢測(cè)實(shí)際的Bug(內(nèi)存和指針問(wèn)題、資源泄露、緩沖區(qū)溢出,數(shù)組越界,心臟出血漏洞.)能夠檢測(cè)高達(dá)億行級(jí)別的代碼庫(kù),避免“狀態(tài)爆炸”使用模型檢驗(yàn)與符號(hào)執(zhí)行技術(shù),誤報(bào)率降低至15%以下 算法已步入實(shí)際應(yīng)用面向企業(yè)的Coverity 軟件面向開(kāi)源代碼的Coverity SCAN改進(jìn)型的靜態(tài)分析方案 基于Meta Com

4、pilation的靜態(tài)分析:源碼分析-數(shù)據(jù)流分析 源碼分析可以探知開(kāi)發(fā)者的想法: “x=1” 需要在調(diào)用“do_something” 后繼續(xù)執(zhí)行。 提出警告:if循環(huán)沒(méi)有包含所有語(yǔ)句如何進(jìn)行Java代碼靜態(tài)分析?Java語(yǔ)言被編譯成JVM bytecode - 在運(yùn)行時(shí)被轉(zhuǎn)換成本地可執(zhí)行代碼的分析選項(xiàng)一 分析 byte-code:用戶編譯他們的軟件,然后分析編譯后的可執(zhí)行文件與調(diào)試信息,分析引擎聯(lián)系找到的缺陷與源代碼位置 某些開(kāi)源工具的實(shí)現(xiàn)原理選項(xiàng)二: 獲取所有的Java編譯過(guò)程并執(zhí)行分析 Bytecode分析工作仍舊存在,但包含更多的內(nèi)容1基本的工作流 獲取所有編譯過(guò)程 每當(dāng) “javac(

5、或其他相關(guān)API)” 被調(diào)用后,編譯獲取系統(tǒng)記錄所有的編譯器選項(xiàng),操作,源代碼與調(diào)用的庫(kù)文件 面向源代碼和庫(kù)文件可進(jìn)行全面編譯后分析 找到的缺陷將被展示給研發(fā)人員修復(fù)如何分析缺陷?1過(guò)程間分析(Intra-procedural analyses)將考慮每一個(gè)合理的可執(zhí)行路徑 快速修剪不可行路徑是一件很麻煩的事情! 數(shù)學(xué)方案獲取一系列的函數(shù)定義 資源分配 調(diào)用.過(guò)程間分析 Bytecode 分析將創(chuàng)建函數(shù)定義如何分析缺陷?1 數(shù)據(jù)流分析將跟蹤 所有應(yīng)用中的不可信數(shù)據(jù) “source” “sink” 二者之間必須進(jìn)行驗(yàn)證 某些使用智能靜態(tài)分析,例如: checked this return val

6、ue for null 19 times out of 20 accessed this field under a lock 19 times out of 20 called base.Foo() in 19 overrides of Foo() out of 201找到潛在Bug其實(shí)只是難題之一消除誤報(bào)非常難將復(fù)雜的缺陷解釋出來(lái)很難只找潛在的一次性缺陷是很難的1難題!Control Flow Graph如何簡(jiǎn)化搜索?A (Source)BC(Escaper)DE (Sink)TaintedData?數(shù)據(jù)流分析Advanced data flowTaintedData 動(dòng)態(tài)“fuzzing

7、” 基于上下文分析C overity OWASP top 10: JSP&ASPOWASP 10 - 2013A1:注入A2:失效認(rèn)證與會(huì)話管理A3:跨站腳本攻擊(XSS)A4:不安全的直接對(duì)象引用A5:安全配置錯(cuò)誤A6:敏感信息泄露A7:功能級(jí)訪問(wèn)控制缺失A8:跨站請(qǐng)求偽造A9:使用含有已知漏洞的組件A10:未驗(yàn)證的重定向和轉(zhuǎn)發(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空指針引用

8、Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針API 使用錯(cuò)誤 無(wú)效迭代器使用 不可修改的集合錯(cuò)誤 已釋放資源調(diào)用性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步邏輯錯(cuò)誤 不可達(dá)代碼 未使用變量 常量表達(dá)式 非本地資源不當(dāng)使用 整數(shù)溢出 不當(dāng)分號(hào)Java 缺陷Web 應(yīng)用安全缺陷(OWASP Top 10) 跨站腳本攻擊 SQL 注入 命令行注入 路徑遍歷資源泄露 數(shù)據(jù)庫(kù)連接資源泄露 資源泄露 Socket & Stream 泄露并發(fā)數(shù)據(jù)訪問(wèn)異常 變量非原子更新 雙重檢查鎖定 數(shù)據(jù)競(jìng)態(tài)條件 Volatile非原子更新 Servlet 屬性無(wú)效鎖定 單例模式競(jìng)態(tài)條

9、件程序假死 線程死鎖 死鎖代碼可維護(hù)性缺陷 調(diào)用已過(guò)期方法 顯式垃圾收集 非靜態(tài)方法中設(shè)置靜態(tài)變量 復(fù)制/粘貼錯(cuò)誤 不可達(dá)代碼可疑代碼 參數(shù)次序錯(cuò)誤 格式錯(cuò)誤Java 缺陷類(lèi)層次結(jié)構(gòu)不一致 調(diào)用 super.clone() 或 supler.finalize()失敗 父函數(shù)調(diào)用丟失 構(gòu)造函數(shù)中使用虛函數(shù)控制流缺陷 在Finally模塊中返回 Switch語(yǔ)句中break丟失錯(cuò)誤處理缺陷 未驗(yàn)證的返回值數(shù)據(jù)庫(kù)操作 不正確的實(shí)體哈希 Load函數(shù)返回值錯(cuò)誤驗(yàn)證 不完全持續(xù)周期 get()不當(dāng)使用資源泄露 數(shù)據(jù)庫(kù)連接資源泄露 資源泄露 Socket & Stream 泄露API 使用錯(cuò)誤 已釋放資源

10、調(diào)用并發(fā)數(shù)據(jù)訪問(wèn)異常 變量非原子更新 數(shù)據(jù)競(jìng)態(tài)條件性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步程序假死 線程死鎖 死循環(huán)可疑代碼 復(fù)制/粘貼錯(cuò)誤 參數(shù)次序錯(cuò)誤 格式錯(cuò)誤類(lèi)層次結(jié)構(gòu)不一致 調(diào)用 base.close() 或 base.dispose()失敗 父函數(shù)調(diào)用丟失控制流缺陷 可疑的額外分號(hào) 不一致比較 不兼容的類(lèi)型比較空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針?biāo)阈g(shù)錯(cuò)誤 錯(cuò)誤移位操作 不正確的表達(dá)式 表達(dá)式計(jì)算過(guò)程中溢出C# 缺陷 Powered by Eric Lippert檢測(cè)實(shí)例-SQL InjectionCopy-paste er

11、ror in real-world code2if (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.local

12、s.type = AttributeDict.DictTYpe.LOCAL;r.locals.ast = returns; Checker描述(metal 語(yǔ)言) 檢測(cè)代碼:C語(yǔ)言靜態(tài)分析 符號(hào)執(zhí)行 不執(zhí)行程序,用符號(hào)值表示程序變量的值,模擬程序執(zhí)行 可以分析代碼的所有/部分語(yǔ)義信息 避免狀態(tài)爆炸 模型檢驗(yàn)XGCC系統(tǒng)內(nèi)存崩潰 內(nèi)存訪問(wèn)溢出 字符串長(zhǎng)度計(jì)算錯(cuò)誤 緩沖區(qū)溢出 寫(xiě)指針溢出 負(fù)數(shù)組索引寫(xiě)入 內(nèi)存錯(cuò)誤分配 錯(cuò)誤的內(nèi)存釋放非法內(nèi)存訪問(wèn) 不正確的delete操作 溢出指針讀取 越界讀取 返回指針至本地變量 負(fù)數(shù)組索引讀取 已釋放指針讀/寫(xiě) 不兼容的指針轉(zhuǎn)換控制流缺陷 邏輯/結(jié)構(gòu)死代碼 Sw

13、itch語(yǔ)句中break遺失 非本地資源不當(dāng)使用C/C+ 缺陷-Part 1資源泄露 內(nèi)存泄露 Microsoft COM 內(nèi)存泄露 Object資源泄露 不當(dāng)delete未初始化變量 返回語(yǔ)句丟失 未初始化的指針/標(biāo)量/數(shù)組 讀寫(xiě) 類(lèi)或結(jié)構(gòu)體中未初始化的數(shù)據(jù)成員并發(fā)缺陷 死鎖 競(jìng)態(tài)條件(Race conditions) 阻塞調(diào)用誤用算術(shù)錯(cuò)誤 負(fù)變量不當(dāng)使用 異常符號(hào)擴(kuò)展 整數(shù)溢出 除零異常26死循環(huán)雙重鎖或解鎖丟失負(fù)循環(huán)邊界值線程死鎖持鎖過(guò)程中調(diào)用sleep()空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針不安全的數(shù)據(jù)處理 不可信的循環(huán)數(shù)據(jù)源 使用非可信

14、數(shù)據(jù)源讀寫(xiě)數(shù)組/指針 使用非可信數(shù)據(jù)源格式化字符串性能缺陷 值傳遞大參數(shù) 使用大堆棧安全措施違反緩沖區(qū)溢出固定長(zhǎng)度緩沖區(qū)寫(xiě)入 非安全函數(shù)調(diào)用 非安全臨時(shí)文件使用 檢查/使用時(shí)間不一致 用戶空間指針不當(dāng)使用API錯(cuò)誤使用 非安全chroot調(diào)用 錯(cuò)誤的迭代器使用 printf() 參數(shù)不匹配C/C+ 缺陷-Part 2程序假死錯(cuò)誤處理缺陷 未驗(yàn)證的返回值 未獲取異常 負(fù)變量不當(dāng)使用代碼維護(hù)性缺陷 多返回語(yǔ)句 無(wú)效變量異常代碼 復(fù)制/粘貼錯(cuò)誤 格式錯(cuò)誤27 HeartBleed安全檢查 定義Tainted Data檢測(cè)實(shí)例-HeartBleed BugCoverityJenkins檢測(cè)對(duì)比30類(lèi)型

15、未處理的缺陷(Null引用)資源泄露并發(fā)問(wèn)題重要的缺陷代碼規(guī)范,最佳實(shí)踐等Bug 總數(shù)FindBugs7121029598627Shared Defects513927128Coverity7986221879196CoverityFreeradius缺陷檢測(cè)對(duì)比3122188類(lèi)型內(nèi)存問(wèn)題資源泄露控制流缺陷,并發(fā)訪問(wèn)等問(wèn)題重要的缺陷代碼規(guī)范,最佳實(shí)踐等Total BugsClang5330385997Shared Defects001123119Coverity7986831039121“瀑布式開(kāi)發(fā)流程”需求挖掘設(shè)計(jì)實(shí)施驗(yàn)證支持開(kāi)發(fā)測(cè)試發(fā)布經(jīng)典的瀑布式開(kāi)發(fā)流程: 代碼開(kāi)發(fā)與測(cè)試之間存在延遲 Q

16、A經(jīng)常由其他部門(mén)負(fù)責(zé),在編碼階段完成后才能開(kāi)始 安全保護(hù)基本是在“事發(fā)之后”才由單獨(dú)的安全部門(mén)提供“敏捷開(kāi)發(fā)流程”需求挖掘設(shè)計(jì)實(shí)施驗(yàn)證支持開(kāi)發(fā)測(cè)試發(fā)布理想的敏捷開(kāi)發(fā)流程: 將整個(gè)實(shí)施和驗(yàn)證流程縮短成2-4周的“沖刺”(sprints) 開(kāi)發(fā)好的功能只有在經(jīng)過(guò)全面驗(yàn)證之后才被“接受” 為取得成功,QA及安全測(cè)試都必須是深入的自動(dòng)化測(cè)試 Requirements definition 提交 Business Process Modeling修復(fù)檢測(cè)IDE源代碼管理夜間構(gòu)建缺陷跟蹤缺陷缺陷缺陷軟件生命周期集成敏捷開(kāi)發(fā)相關(guān)人員任務(wù)自動(dòng)分配提交提交提交 Develop features Review d

17、efects Prioritize actions Make fixes Track progress修復(fù)檢測(cè)34自動(dòng)代碼檢測(cè) CVE-2005-0467 示例:C/C+char *p = snewn(len + 1, char);memcpy(p, s, len);plen = ;return p; 這片代碼來(lái)自PuTTY PuTTY是面向Win32和Unix平臺(tái)以及xterm終端仿真程序而免費(fèi)實(shí)施的Telnet與SSHstatic char *foo(char 安 漏洞 2005年在PuTTY中發(fā)現(xiàn)*s,全 int len)char *p = malloc(len + 1) * sizeo

18、f(char);memcpy(p, s, len);plen=0;return static char *mkstr(char *s, int len)p; CVE-2005-0467static char *mkstr(char *s, int len)char *p = snewn(len + 1, char);memcpy(p, s, len);plen = ;struct sftp_request/* sftp_pkt_getstring call with controlled len value */sftp_pkt_getstring(pktin, &hstring, &len);.handle = snew(struct fxp_handle);/* heap corruption will occur if len = -1 */handle-hstring = mkstr(hstring, len);handle-hlen = len;sftp_pkt_free(pktin);return handle;.static void sftp_pkt_getstring(struct sftp_packet *pkt

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論