使用静态分析技术找到真正”的代码质量缺陷与安全漏洞

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

使用静态分析技术找到“真正”的代码质量缺陷与安全漏洞HeartBleedBug软件研发测试经济学绝大部分缺陷在修复成本较低时被引入。大部分缺陷在成本较高时被发现和修复。代码静态分析技术代码静态分析•定义:在不执行计算机程序的条件下,对源代码进行分析,找出代码缺陷•执行方式:一般配合静态程序分析工具进行•采用技术:数据流分析、机器学习、语义精简...•可检测类型:死锁,空指针,资源泄露,缓冲区溢出,安全漏洞,竞态条件...•优点:•能够检测所有的代码级别的可执行路径组合,快速,准确•直接面向源码,分析多种问题•在研发阶段开始找到并修复多种问题,节省大量时间/人力成本•注意:静态分析不是万能的,测试是持续的过程,非一劳永逸•编译器警告:保证类型安全–最初级的静态分析,检测规则简单•中间语言分析:检测字节码(ByteCode)的缺陷,将其重新映射到真实代码中–在转换与映射过程中易造成精度丢失•高误报率:目前静态分析产品的误报率普遍在30%以上。•缺陷种类较少,找到的问题级别不高:多数为代码规范或低级缺陷,非实际Bug–如命名规范、类定义规范,最佳实践.....•易用性较低:基本上都是一次性的使用工具,无法与SDLC集成–SCM集成:如SVN,CVS,Perforce,Git–BugTracking:如Bugzilla,Jira现存问题••由斯坦福大学教授DawsonEngler提出,在深度理解代码与程序语义的基础上检测缺陷旨在查找“真正的代码缺陷”•实现原理:•••使用可扩展的metal语言定义正确性Checker将程序的源码使用状态机进行抽象描述(StateMachineAbstraction)。使用xgcc系统匹配Checker与抽象状态机状态,找到问题所在的点。•可准确检测实际的Bug(内存和指针问题、资源泄露、缓冲区溢出,数组越界,心脏出血漏洞...)••能够检测高达亿行级别的代码库,避免“状态爆炸”使用模型检验与符号执行技术,误报率降低至15%以下•算法已步入实际应用••面向企业的Coverity软件面向开源代码的CoveritySCAN改进型的静态分析方案•基于MetaCompilation的静态分析:源码分析-数据流分析•源码分析可以探知开发者的想法:“x=1”需要在调用“do_something”后继续执行。•提出警告:if循环没有包含所有语句如何进行Java代码静态分析?Java语言被编译成JVMbytecode-在运行时被转换成本地可执行代码的分析选项一•分析byte-code:用户编译他们的软件,然后分析编译后的可执行文件与调试信息,分析引擎联系找到的缺陷与源代码位置•某些开源工具的实现原理选项二:•获取所有的Java编译过程并执行分析•Bytecode分析工作仍旧存在,但包含更多的内容1基本的工作流•获取所有编译过程•每当“javac(或其他相关API)”被调用后,编译获取系统记录所有的编译器选项,操作,源代码与调用的库文件•面向源代码和库文件可进行全面编译后分析•找到的缺陷将被展示给研发人员修复如何分析缺陷?1•过程间分析(Intra-proceduralanalyses)将考虑每一个合理的可执行路径•快速修剪不可行路径是一件很麻烦的事情!•数学方案•获取一系列的函数定义•资源分配•调用….•过程间分析•Bytecode分析将创建函数定义如何分析缺陷?1•数据流分析将跟踪所有应用中的不可信数据•“source”•“sink”•二者之间必须进行验证•某些使用智能静态分析,例如:•checkedthisreturnvaluefornull19timesoutof20•accessedthisfieldunderalock19timesoutof20•calledbase.Foo()in19overridesofFoo()outof201找到潜在Bug其实只是难题之一•消除误报非常难•将复杂的缺陷解释出来很难•只找潜在的一次性缺陷是很难的1难题!ControlFlowGraph如何简化搜索?A(Source)BC(Escaper)DE(Sink)TaintedData?数据流分析AdvanceddataflowTaintedData•动态“fuzzing”•基于上下文分析CoverityOWASPtop10:JSP&ASPOWASP10-2013A1:注入A2:失效认证与会话管理A3:跨站脚本攻击(XSS)A4:不安全的直接对象引用A5:安全配置错误A6:敏感信息泄露A7:功能级访问控制缺失A8:跨站请求伪造A9:使用含有已知漏洞的组件A10:未验证的重定向和转发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使用错误–无效迭代器使用–不可修改的集合错误–已释放资源调用性能缺陷–低效率方法使用–在循环中连接字符串–冗余同步逻辑错误–不可达代码–未使用变量–常量表达式–非本地资源不当使用–整数溢出–不当分号Java缺陷Web应用安全缺陷(OWASPTop10)–跨站脚本攻击–SQL注入–命令行注入–路径遍历…资源泄露–数据库连接资源泄露–资源泄露–Socket&Stream泄露并发数据访问异常–变量非原子更新–双重检查锁定–数据竞态条件–Volatile非原子更新–Servlet属性无效锁定–单例模式竞态条件程序假死–线程死锁–死锁代码可维护性缺陷–调用已过期方法–显式垃圾收集–非静态方法中设置静态变量–复制/粘贴错误–不可达代码可疑代码–参数次序错误–格式错误Java缺陷类层次结构不一致–调用super.clone()或supler.finalize()失败–父函数调用丢失–构造函数中使用虚函数控制流缺陷–在Finally模块中返回–Switch语句中break丢失错误处理缺陷–未验证的返回值数据库操作–不正确的实体哈希–Load函数返回值错误验证–不完全持续周期–get()不当使用资源泄露–数据库连接资源泄露–资源泄露–Socket&Stream泄露API使用错误–已释放资源调用并发数据访问异常–变量非原子更新–数据竞态条件性能缺陷–低效率方法使用–在循环中连接字符串–冗余同步程序假死–线程死锁–死循环可疑代码–复制/粘贴错误–参数次序错误–格式错误类层次结构不一致–调用base.close()或base.dispose()失败–父函数调用丢失控制流缺陷–可疑的额外分号–不一致比较–不兼容的类型比较空指针引用–Null检查后引用空指针–直接引用返回的空指针–Null检查前引用空指针算术错误–错误移位操作–不正确的表达式–表达式计算过程中溢出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语言静态分析•符号执行•不执行程序,用符号值表示程序变量的值,模拟程序执行•可以分析代码的所有/部分语义信息•避免状态爆炸•模型检验XGCC系统内存崩溃•内存访问溢出•字符串长度计算错误•缓冲区溢出•写指针溢出•负数组索引写入•内存错误分配•错误的内存释放非法内存访问•不正确的delete操作•溢出指针读取•越界读取•返回指针至本地变量•负数组索引读取•已释放指针读/写•不兼容的指针转换控制流缺陷•逻辑/结构死代码•Switch语句中break遗失•非本地资源不当使用C/C++缺陷-Part1资源泄露•内存泄露•MicrosoftCOM内存泄露•Object资源泄露•不当delete未初始化变量•返回语句丢失•未初始化的指针/标量/数组读写•类或结构体中未初始化的数据成员并发缺陷•死锁•竞态条件(Raceconditions)•阻塞调用误用算术错误•负变量不当使用•异常符号扩展•整数溢出•除零异常26•••••死循环双重锁或解锁丢失负循环边界值线程死锁持锁过程中调用sleep()空指针引用•Null检查后引用空指针•直接引用返回的空指针•Null检查前引用空指针不安全的数据处理•不可信的循环数据源•使用非可信数据源读写数组/指针•使用非可信数据源格式化字符串性能缺陷•值传递大参数•使用大堆栈安全措施违反••缓冲区溢出固定长度缓冲区写入•非安全函数调用•非安全临时文件使用•检查/使用时间不一致•用户空间指针不当使用API错误使用•非安全chroot调用•错误的迭代器使用•printf()参数不匹配C/C++缺陷-Part2程序假死错误处理缺陷•未验证的返回值•未获取异常•负变量不当使用代码维护性缺陷•多返回语句•无效变量异常代码•复制/粘贴错误•格式错误27•HeartBleed安全检查•定义TaintedData检测实例-HeartBleedBugCoverityJenkins检测对比30类型未处理的缺陷(Null引用)资源泄露并发问题重要的缺陷代码规范,最佳实践等Bug总数FindBugs7121029598627SharedDefects513927128Coverity7986221879196CoverityFreeradius缺陷检测对比3122188类型内存问题资源泄露控制流缺陷,并发访问等问题重要的缺陷代码规范,最佳实践等TotalBugsClang5330385997SharedDefects001123119Coverity7986831039121“瀑布式开发流程”需求挖掘设计实施验证支持开发测试发布经典的瀑布式开发流程:•代码开发与测试之间存在延迟•QA经常由其他部门负责,在编码阶段完成后才能开始•安全保护基本是在“事发之后”才由单独的安全部门提供“敏捷开发流程”需求挖掘设计实施验证支持开发测试发布理想的敏捷开发流程:•将整个实施和验证流程缩短成2-4周的“冲刺”(sprints)•开发好的功能只有在经过全面验证之后才被“接受”•为取得成功,QA及安全测试都必须是深入的自动化测试•Requirementsdefinition提交•BusinessProcessModeling修复检测IDE源代码管理夜间构建缺陷跟踪缺陷缺陷缺陷软件生命周期集成敏捷开发相关人员任务自动分配提交提交提交•Developfeatures•Reviewdefects•Prioritizeactions•Makefixes•Trackprogress修复检测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中发现*s,全intlen)char*p=malloc((len+1)*sizeof(char));memcpy(p,s,len);p[len]=‘\0’;return

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功