版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、使用靜態(tài)分析技術找到“真正”的代碼質量缺陷與安全漏洞HeartBleed Bug軟件研發(fā)測試經濟學絕大部分缺陷在修復成本較低時被引入。大部分缺陷在成本較高時被發(fā)現和修復。代碼靜態(tài)分析技術代碼靜態(tài)分析 定義:在不執(zhí)行計算機程序的條件下,對源代碼進行分析,找出代碼缺陷 執(zhí)行方式:一般配合靜態(tài)程序分析工具進行 采用技術:數據流分析、機器學習、語義精簡. 可檢測類型:死鎖,空指針,資源泄露,緩沖區(qū)溢出,安全漏洞,競態(tài)條件. 優(yōu)點: 能夠檢測所有的代碼級別的可執(zhí)行路徑組合,快速,準確 直接面向源碼,分析多種問題 在研發(fā)階段開始找到并修復多種問題,節(jié)省大量時間/人力成本 注意:靜態(tài)分析不是萬能的,測試是持
2、續(xù)的過程,非一勞永逸 編譯器警告: 保證類型安全 最初級的靜態(tài)分析,檢測規(guī)則簡單 中間語言分析: 檢測字節(jié)碼( Byte Code )的缺陷,將其重新映射到真實代碼中 在轉換與映射過程中易造成精度丟失 高誤報率:目前靜態(tài)分析產品的誤報率普遍在30%以上。 缺陷種類較少,找到的問題級別不高:多數為代碼規(guī)范或低級缺陷,非實際Bug 如命名規(guī)范、類定義規(guī)范,最佳實踐. 易用性較低:基本上都是一次性的使用工具,無法與SDLC集成 SCM集成:如SVN,CVS,Perforce,Git Bug Tracking:如Bugzilla,Jira現存問題由斯坦福大學教授Dawson Engler提出,在深度理
3、解代碼與程序語義的基礎上檢測缺陷旨在查找“真正的代碼缺陷” 實現原理:使用可擴展的metal語言定義正確性Checker將程序的源碼使用狀態(tài)機進行抽象描述(State Machine Abstraction)。使用xgcc系統匹配Checker與抽象狀態(tài)機狀態(tài),找到問題所在的點。 可準確檢測實際的Bug(內存和指針問題、資源泄露、緩沖區(qū)溢出,數組越界,心臟出血漏洞.)能夠檢測高達億行級別的代碼庫,避免“狀態(tài)爆炸”使用模型檢驗與符號執(zhí)行技術,誤報率降低至15%以下 算法已步入實際應用面向企業(yè)的Coverity 軟件面向開源代碼的Coverity SCAN改進型的靜態(tài)分析方案 基于Meta Com
4、pilation的靜態(tài)分析:源碼分析-數據流分析 源碼分析可以探知開發(fā)者的想法: “x=1” 需要在調用“do_something” 后繼續(xù)執(zhí)行。 提出警告:if循環(huán)沒有包含所有語句如何進行Java代碼靜態(tài)分析?Java語言被編譯成JVM bytecode - 在運行時被轉換成本地可執(zhí)行代碼的分析選項一 分析 byte-code:用戶編譯他們的軟件,然后分析編譯后的可執(zhí)行文件與調試信息,分析引擎聯系找到的缺陷與源代碼位置 某些開源工具的實現原理選項二: 獲取所有的Java編譯過程并執(zhí)行分析 Bytecode分析工作仍舊存在,但包含更多的內容1基本的工作流 獲取所有編譯過程 每當 “javac(
5、或其他相關API)” 被調用后,編譯獲取系統記錄所有的編譯器選項,操作,源代碼與調用的庫文件 面向源代碼和庫文件可進行全面編譯后分析 找到的缺陷將被展示給研發(fā)人員修復如何分析缺陷?1過程間分析(Intra-procedural analyses)將考慮每一個合理的可執(zhí)行路徑 快速修剪不可行路徑是一件很麻煩的事情! 數學方案獲取一系列的函數定義 資源分配 調用.過程間分析 Bytecode 分析將創(chuàng)建函數定義如何分析缺陷?1 數據流分析將跟蹤 所有應用中的不可信數據 “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?數據流分析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:未驗證的重定向和轉發(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 使用錯誤 無效迭代器使用 不可修改的集合錯誤 已釋放資源調用性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步邏輯錯誤 不可達代碼 未使用變量 常量表達式 非本地資源不當使用 整數溢出 不當分號Java 缺陷Web 應用安全缺陷(OWASP Top 10) 跨站腳本攻擊 SQL 注入 命令行注入 路徑遍歷資源泄露 數據庫連接資源泄露 資源泄露 Socket & Stream 泄露并發(fā)數據訪問異常 變量非原子更新 雙重檢查鎖定 數據競態(tài)條件 Volatile非原子更新 Servlet 屬性無效鎖定 單例模式競態(tài)條
9、件程序假死 線程死鎖 死鎖代碼可維護性缺陷 調用已過期方法 顯式垃圾收集 非靜態(tài)方法中設置靜態(tài)變量 復制/粘貼錯誤 不可達代碼可疑代碼 參數次序錯誤 格式錯誤Java 缺陷類層次結構不一致 調用 super.clone() 或 supler.finalize()失敗 父函數調用丟失 構造函數中使用虛函數控制流缺陷 在Finally模塊中返回 Switch語句中break丟失錯誤處理缺陷 未驗證的返回值數據庫操作 不正確的實體哈希 Load函數返回值錯誤驗證 不完全持續(xù)周期 get()不當使用資源泄露 數據庫連接資源泄露 資源泄露 Socket & Stream 泄露API 使用錯誤 已釋放資源
10、調用并發(fā)數據訪問異常 變量非原子更新 數據競態(tài)條件性能缺陷 低效率方法使用 在循環(huán)中連接字符串 冗余同步程序假死 線程死鎖 死循環(huán)可疑代碼 復制/粘貼錯誤 參數次序錯誤 格式錯誤類層次結構不一致 調用 base.close() 或 base.dispose()失敗 父函數調用丟失控制流缺陷 可疑的額外分號 不一致比較 不兼容的類型比較空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針算術錯誤 錯誤移位操作 不正確的表達式 表達式計算過程中溢出C# 缺陷 Powered by Eric Lippert檢測實例-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 語言) 檢測代碼:C語言靜態(tài)分析 符號執(zhí)行 不執(zhí)行程序,用符號值表示程序變量的值,模擬程序執(zhí)行 可以分析代碼的所有/部分語義信息 避免狀態(tài)爆炸 模型檢驗XGCC系統內存崩潰 內存訪問溢出 字符串長度計算錯誤 緩沖區(qū)溢出 寫指針溢出 負數組索引寫入 內存錯誤分配 錯誤的內存釋放非法內存訪問 不正確的delete操作 溢出指針讀取 越界讀取 返回指針至本地變量 負數組索引讀取 已釋放指針讀/寫 不兼容的指針轉換控制流缺陷 邏輯/結構死代碼 Sw
13、itch語句中break遺失 非本地資源不當使用C/C+ 缺陷-Part 1資源泄露 內存泄露 Microsoft COM 內存泄露 Object資源泄露 不當delete未初始化變量 返回語句丟失 未初始化的指針/標量/數組 讀寫 類或結構體中未初始化的數據成員并發(fā)缺陷 死鎖 競態(tài)條件(Race conditions) 阻塞調用誤用算術錯誤 負變量不當使用 異常符號擴展 整數溢出 除零異常26死循環(huán)雙重鎖或解鎖丟失負循環(huán)邊界值線程死鎖持鎖過程中調用sleep()空指針引用 Null檢查后引用空指針 直接引用返回的空指針 Null檢查前引用空指針不安全的數據處理 不可信的循環(huán)數據源 使用非可信
14、數據源讀寫數組/指針 使用非可信數據源格式化字符串性能缺陷 值傳遞大參數 使用大堆棧安全措施違反緩沖區(qū)溢出固定長度緩沖區(qū)寫入 非安全函數調用 非安全臨時文件使用 檢查/使用時間不一致 用戶空間指針不當使用API錯誤使用 非安全chroot調用 錯誤的迭代器使用 printf() 參數不匹配C/C+ 缺陷-Part 2程序假死錯誤處理缺陷 未驗證的返回值 未獲取異常 負變量不當使用代碼維護性缺陷 多返回語句 無效變量異常代碼 復制/粘貼錯誤 格式錯誤27 HeartBleed安全檢查 定義Tainted Data檢測實例-HeartBleed BugCoverityJenkins檢測對比30類型
15、未處理的缺陷(Null引用)資源泄露并發(fā)問題重要的缺陷代碼規(guī)范,最佳實踐等Bug 總數FindBugs7121029598627Shared Defects513927128Coverity7986221879196CoverityFreeradius缺陷檢測對比3122188類型內存問題資源泄露控制流缺陷,并發(fā)訪問等問題重要的缺陷代碼規(guī)范,最佳實踐等Total BugsClang5330385997Shared Defects001123119Coverity7986831039121“瀑布式開發(fā)流程”需求挖掘設計實施驗證支持開發(fā)測試發(fā)布經典的瀑布式開發(fā)流程: 代碼開發(fā)與測試之間存在延遲 Q
16、A經常由其他部門負責,在編碼階段完成后才能開始 安全保護基本是在“事發(fā)之后”才由單獨的安全部門提供“敏捷開發(fā)流程”需求挖掘設計實施驗證支持開發(fā)測試發(fā)布理想的敏捷開發(fā)流程: 將整個實施和驗證流程縮短成2-4周的“沖刺”(sprints) 開發(fā)好的功能只有在經過全面驗證之后才被“接受” 為取得成功,QA及安全測試都必須是深入的自動化測試 Requirements definition 提交 Business Process Modeling修復檢測IDE源代碼管理夜間構建缺陷跟蹤缺陷缺陷缺陷軟件生命周期集成敏捷開發(fā)相關人員任務自動分配提交提交提交 Develop features Review d
17、efects 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ā)現*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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 銀行貸款展期還款合同
- 購銷合同范本設計范本
- 聘用合同補充協議的簽訂與監(jiān)管要求
- 賓館設施完善保證
- 信息系統建設項目實施合同
- 廣告牌吊裝作業(yè)
- 個人信用借款合同格式樣本
- 房屋買賣合同范本模板樣本示例
- 售后服務協議簽訂糾紛解決
- 全方位集成服務合同模板
- 有效的雙向溝通管理制度
- 圍棋協會2022年工作計劃范文
- 07講信息系統建設和設計軟件工程
- 廁所蹲位統計表10
- OptiXOSN8800產品系統硬件系統、單板介紹
- 附件1黑龍江省事業(yè)單位聘用合同制管理辦法doc
- 蔬菜大棚溫度控制器設計(共20頁)
- LS-MASTER-K-指令手冊
- 烏茲別克語字母表
- 《數據結構》課程標準
- 畢業(yè)設計(論文)基于單片機AT89C51的數字搶答器設計
評論
0/150
提交評論