版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、使用靜態(tài)分析技術(shù)找到“真正”的代碼質(zhì)量缺陷與安全漏洞HeartBleed Bug軟件研發(fā)測試經(jīng)濟學絕大部分缺陷在修復成本較低時被引入。大部分缺陷在成本較高時被發(fā)現(xiàn)和修復。代碼靜態(tài)分析技術(shù)代碼靜態(tài)分析 定義:在不執(zhí)行計算機程序的條件下,對源代碼進行分析,找出代碼缺陷 執(zhí)行方式:一般配合靜態(tài)程序分析工具進行 采用技術(shù):數(shù)據(jù)流分析、機器學習、語義精簡. 可檢測類型:死鎖,空指針,資源泄露,緩沖區(qū)溢出,安全漏洞,競態(tài)條件. 優(yōu)點: 能夠檢測所有的代碼級別的可執(zhí)行路徑組合,快速,準確 直接面向源碼,分析多種問題 在研發(fā)階段開始找到并修復多種問題,節(jié)省大量時間/人力成本 注意:靜態(tài)分析不是萬能的,測試是持
2、續(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)存問題由斯坦福大學教授Dawson Engler提出,在深度理
3、解代碼與程序語義的基礎(chǔ)上檢測缺陷旨在查找“真正的代碼缺陷” 實現(xiàn)原理:使用可擴展的metal語言定義正確性Checker將程序的源碼使用狀態(tài)機進行抽象描述(State Machine Abstraction)。使用xgcc系統(tǒng)匹配Checker與抽象狀態(tài)機狀態(tài),找到問題所在的點。 可準確檢測實際的Bug(內(nèi)存和指針問題、資源泄露、緩沖區(qū)溢出,數(shù)組越界,心臟出血漏洞.)能夠檢測高達億行級別的代碼庫,避免“狀態(tài)爆炸”使用模型檢驗與符號執(zhí)行技術(shù),誤報率降低至15%以下 算法已步入實際應用面向企業(yè)的Coverity 軟件面向開源代碼的Coverity SCAN改進型的靜態(tài)分析方案 基于Meta Com
4、pilation的靜態(tài)分析:源碼分析-數(shù)據(jù)流分析 源碼分析可以探知開發(fā)者的想法: “x=1” 需要在調(diào)用“do_something” 后繼續(xù)執(zhí)行。 提出警告:if循環(huá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基本的工作流 獲取所有編譯過程 每當 “javac(
5、或其他相關(guān)API)” 被調(diào)用后,編譯獲取系統(tǒng)記錄所有的編譯器選項,操作,源代碼與調(diào)用的庫文件 面向源代碼和庫文件可進行全面編譯后分析 找到的缺陷將被展示給研發(fā)人員修復如何分析缺陷?1過程間分析(Intra-procedural analyses)將考慮每一個合理的可執(zhí)行路徑 快速修剪不可行路徑是一件很麻煩的事情! 數(shù)學方案獲取一系列的函數(shù)定義 資源分配 調(diào)用.過程間分析 Bytecode 分析將創(chuàng)建函數(shù)定義如何分析缺陷?1 數(shù)據(jù)流分析將跟蹤 所有應用中的不可信數(shù)據(jù) “source” “sink” 二者之間必須進行驗證 某些使用智能靜態(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其實只是難題之一消除誤報非常難將復雜的缺陷解釋出來很難只找潛在的一次性缺陷是很難的1難題!Control Flow Graph如何簡化搜索?A (Source)BC(Escaper)DE (Sink)TaintedData?數(shù)據(jù)流分析Advanced data flowTaintedData 動態(tài)“fuzzing
7、” 基于上下文分析C overity OWASP top 10: JSP&ASPOWASP 10 - 2013A1:注入A2:失效認證與會話管理A3:跨站腳本攻擊(XSS)A4:不安全的直接對象引用A5:安全配置錯誤A6:敏感信息泄露A7:功能級訪問控制缺失A8:跨站請求偽造A9:使用含有已知漏洞的組件A10:未驗證的重定向和轉(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 使用錯誤 無效迭代器使用 不可修改的集合錯誤 已釋放資源調(diào)用性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步邏輯錯誤 不可達代碼 未使用變量 常量表達式 非本地資源不當使用 整數(shù)溢出 不當分號Java 缺陷Web 應用安全缺陷(OWASP Top 10) 跨站腳本攻擊 SQL 注入 命令行注入 路徑遍歷資源泄露 數(shù)據(jù)庫連接資源泄露 資源泄露 Socket & Stream 泄露并發(fā)數(shù)據(jù)訪問異常 變量非原子更新 雙重檢查鎖定 數(shù)據(jù)競態(tài)條件 Volatile非原子更新 Servlet 屬性無效鎖定
9、 單例模式競態(tài)條件程序假死 線程死鎖 死鎖代碼可維護性缺陷 調(diào)用已過期方法 顯式垃圾收集 非靜態(tài)方法中設置靜態(tài)變量 復制/粘貼錯誤 不可達代碼可疑代碼 參數(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()不當使用資源泄露 數(shù)據(jù)庫連接資源泄露 資源泄露 Socket & Stream 泄露AP
10、I 使用錯誤 已釋放資源調(diào)用并發(fā)數(shù)據(jù)訪問異常 變量非原子更新 數(shù)據(jù)競態(tài)條件性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步程序假死 線程死鎖 死循環(huán)可疑代碼 復制/粘貼錯誤 參數(shù)次序錯誤 格式錯誤類層次結(jié)構(gòu)不一致 調(diào)用 base.close() 或 base.dispose()失敗 父函數(shù)調(diào)用丟失控制流缺陷 可疑的額外分號 不一致比較 不兼容的類型比較空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針算術(shù)錯誤 錯誤移位操作 不正確的表達式 表達式計算過程中溢出C# 缺陷 Powered by Eric Lippert檢測實例-SQL InjectionC
11、opy-paste error 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.err
12、Mgr);r.locals.type = AttributeDict.DictTYpe.LOCAL;r.locals.ast = returns; Checker描述(metal 語言) 檢測代碼:C語言靜態(tài)分析 符號執(zhí)行 不執(zhí)行程序,用符號值表示程序變量的值,模擬程序執(zhí)行 可以分析代碼的所有/部分語義信息 避免狀態(tài)爆炸 模型檢驗XGCC系統(tǒng)內(nèi)存崩潰 內(nèi)存訪問溢出 字符串長度計算錯誤 緩沖區(qū)溢出 寫指針溢出 負數(shù)組索引寫入 內(nèi)存錯誤分配 錯誤的內(nèi)存釋放非法內(nèi)存訪問 不正確的delete操作 溢出指針讀取 越界讀取 返回指針至本地變量 負數(shù)組索引讀取 已釋放指針讀/寫 不兼容的指針轉(zhuǎn)換控制流缺陷
13、 邏輯/結(jié)構(gòu)死代碼 Switch語句中break遺失 非本地資源不當使用C/C+ 缺陷-Part 1資源泄露 內(nèi)存泄露 Microsoft COM 內(nèi)存泄露 Object資源泄露 不當delete未初始化變量 返回語句丟失 未初始化的指針/標量/數(shù)組 讀寫 類或結(jié)構(gòu)體中未初始化的數(shù)據(jù)成員并發(fā)缺陷 死鎖 競態(tài)條件(Race conditions) 阻塞調(diào)用誤用算術(shù)錯誤 負變量不當使用 異常符號擴展 整數(shù)溢出 除零異常26死循環(huán)雙重鎖或解鎖丟失負循環(huán)邊界值線程死鎖持鎖過程中調(diào)用sleep()空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針不安全的數(shù)據(jù)處理 不可信
14、的循環(huán)數(shù)據(jù)源 使用非可信數(shù)據(jù)源讀寫數(shù)組/指針 使用非可信數(shù)據(jù)源格式化字符串性能缺陷 值傳遞大參數(shù) 使用大堆棧安全措施違反緩沖區(qū)溢出固定長度緩沖區(qū)寫入 非安全函數(shù)調(diào)用 非安全臨時文件使用 檢查/使用時間不一致 用戶空間指針不當使用API錯誤使用 非安全chroot調(diào)用 錯誤的迭代器使用 printf() 參數(shù)不匹配C/C+ 缺陷-Part 2程序假死錯誤處理缺陷 未驗證的返回值 未獲取異常 負變量不當使用代碼維護性缺陷 多返回語句 無效變量異常代碼 復制/粘貼錯誤 格式錯誤27 HeartBleed安全檢查 定義Tainted Data檢測實例-HeartBleed BugCoverityJen
15、kins檢測對比30類型未處理的缺陷(Null引用)資源泄露并發(fā)問題重要的缺陷代碼規(guī)范,最佳實踐等Bug 總數(shù)FindBugs7121029598627Shared Defects513927128Coverity7986221879196CoverityFreeradius缺陷檢測對比3122188類型內(nèi)存問題資源泄露控制流缺陷,并發(fā)訪問等問題重要的缺陷代碼規(guī)范,最佳實踐等Total BugsClang5330385997Shared Defects001123119Coverity7986831039121“瀑布式開發(fā)流程”需求挖掘設計實施驗證支持開發(fā)測試發(fā)布經(jīng)典的瀑布式開發(fā)流程: 代碼開
16、發(fā)與測試之間存在延遲 QA經(jīng)常由其他部門負責,在編碼階段完成后才能開始 安全保護基本是在“事發(fā)之后”才由單獨的安全部門提供“敏捷開發(fā)流程”需求挖掘設計實施驗證支持開發(fā)測試發(fā)布理想的敏捷開發(fā)流程: 將整個實施和驗證流程縮短成2-4周的“沖刺”(sprints) 開發(fā)好的功能只有在經(jīng)過全面驗證之后才被“接受” 為取得成功,QA及安全測試都必須是深入的自動化測試 Requirements definition 提交 Business Process Modeling修復檢測IDE源代碼管理夜間構(gòu)建缺陷跟蹤缺陷缺陷缺陷軟件生命周期集成敏捷開發(fā)相關(guān)人員任務自動分配提交提交提交 Develop featu
17、res Review defects Prioritize actions Make fixes Track progress修復檢測34自動代碼檢測 CVE-2005-0467 示例:C/C+char *p = snewn(len + 1, char);memcpy(p, s, len);plen = ;return p; 這片代碼來自PuTTY PuTTY是面向Win32和Unix平臺以及xterm終端仿真程序而免費實施的Telnet與SSHstatic char *foo(char 安 漏洞 2005年在PuTTY中發(fā)現(xiàn)*s,全 int len)char *p = malloc(len
18、+ 1) * sizeof(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 *pk
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版承包工地食堂餐廚垃圾處理合同模板3篇
- 2024蔬菜加工產(chǎn)品銷售合作協(xié)議3篇
- 2024年股權(quán)轉(zhuǎn)讓合同標的及屬性詳細描述
- 2024年版物業(yè)托管服務協(xié)議版B版
- 二零二五版離婚協(xié)議書起草與審核合同2篇
- 2024版房屋贈與合同協(xié)議書大全
- 天津中德應用技術(shù)大學《教育技術(shù)與傳播》2023-2024學年第一學期期末試卷
- 二零二五版家政服務+家庭健康促進合同3篇
- 太原幼兒師范高等專科學?!段麽t(yī)外科學醫(yī)學免疫學與病原生物學》2023-2024學年第一學期期末試卷
- 二零二五年特殊用途變壓器安裝與性能測試合同2篇
- 對口升學《計算機應用基礎(chǔ)》復習資料總匯(含答案)
- 《浸沒式液冷冷卻液選型要求》
- 迪士尼樂園總體規(guī)劃
- 2024年江蘇省蘇州市中考數(shù)學試卷含答案
- 2024年世界職業(yè)院校技能大賽高職組“市政管線(道)數(shù)字化施工組”賽項考試題庫
- 介紹蝴蝶蘭課件
- 大學計算機基礎(chǔ)(第2版) 課件 第1章 計算機概述
- 數(shù)字化年終述職報告
- 2024年職工普法教育宣講培訓課件
- 安保服務評分標準
- T-SDLPA 0001-2024 研究型病房建設和配置標準
評論
0/150
提交評論