[精选]使用静态分析技术找到真正”的代码质量缺陷与安全漏洞30644.pptx
使用静态分析技术找到“真正”的代码质量缺陷与安全漏洞HeartBleed Bug软件研发测试经济学绝大部分缺陷在修复成本较低时被引入。大部分缺陷在成本较高时被发现和修复。代码静态分析技术代码静态分析 定义:在不执行计算机程序的条件下,对源代码进行分析,找出代码缺陷 执行方式:一般配合静态程序分析工具进行 采用技术:数据流分析、机器学习、语义精简.可检测类型:死锁,空指针,资源泄露,缓冲区溢出,安全漏洞,竞态条件.优点:能够检测所有的代码级别的可执行路径组合,快速,准确 直接面向源码,分析多种问题 在研发阶段开始找到并修复多种问题,节省大量时间/人力成本 注意:静态分析不是万能的,测试是持续的过程,非一劳永逸 编译器警告:保证类型安全 最初级的静态分析,检测规则简单 中间语言分析:检测字节码(Byte Code)的缺陷,将其重新映射到真实代码中 在转换与映射过程中易造成精度丢失 高误报率:目前静态分析产品的误报率普遍在30%以上。缺陷种类较少,找到的问题级别不高:多数为代码规范或低级缺陷,非实际Bug 如命名规范、类定义规范,最佳实践.易用性较低:基本上都是一次性的使用工具,无法与SDLC集成 SCM集成:如SVN,CVS,Perforce,Git Bug Tracking:如Bugzilla,Jira现存问题由斯坦福大学教授Dawson Engler提出,在深度理解代码与程序语义的基础上检测缺陷旨在查找“真正的代码缺陷”实现原理:使用可扩展的metal语言定义正确性Checker将程序的源码使用状态机进行抽象描述(State Machine Abstraction)。使用xgcc系统匹配Checker与抽象状态机状态,找到问题所在的点。可准确检测实际的Bug(内存和指针问题、资源泄露、缓冲区溢出,数组越界,心脏出血漏洞.)能够检测高达亿行级别的代码库,避免“状态爆炸”使用模型检验与符号执行技术,误报率降低至15%以下 算法已步入实际应用面向企业的Coverity 软件面向开源代码的Coverity SCAN改进型的静态分析方案 基于Meta Compilation的静态分析:源码分析-数据流分析 源码分析可以探知开发者的想法:“x=1”需要在调用“do_something”后继续执行。提出警告:if循环没有包含所有语句如何进行Java代码静态分析?Java语言被编译成JVM bytecode-在运行时被转换成本地可执行代码的分析选项一 分析 byte-code:用户编译他们的软件,然后分析编译后的可执行文件与调试信息,分析引擎联系找到的缺陷与源代码位置 某些开源工具的实现原理选项二:获取所有的Java编译过程并执行分析 Bytecode分析工作仍旧存在,但包含更多的内容1基本的工作流 获取所有编译过程 每当“javac(或其他相关API)”被调用后,编译获取系统记录所有的编译器选项,操作,源代码与调用的库文件 面向源代码和库文件可进行全面编译后分析 找到的缺陷将被展示给研发人员修复如何分析缺陷?1过程间分析(Intra-procedural analyses)将考虑每一个合理的可执行路径 快速修剪不可行路径是一件很麻烦的事情!数学方案获取一系列的函数定义 资源分配 调用.过程间分析 Bytecode 分析将创建函数定义如何分析缺陷?1 数据流分析将跟踪 所有应用中的不可信数据 “source”“sink”二者之间必须进行验证 某些使用智能静态分析,例如:checked this return value 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 动态“fuzzing”基于上下文分析C overity OWASP top 10:JSP&ASPOWASP 10-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 应用安全缺陷(OWASP Top 10)跨站脚本攻击 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#缺陷 Powered by Eric Lippert检测实例-SQL InjectionCopy-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.errMgr);r.locals.type =AttributeDict.DictTYpe.LOCAL;r.locals.ast =returns;Checker描述(metal 语言)检测代码:C语言静态分析 符号执行 不执行程序,用符号值表示程序变量的值,模拟程序执行 可以分析代码的所有/部分语义信息 避免状态爆炸 模型检验XGCC系统内存崩溃 内存访问溢出 字符串长度计算错误 缓冲区溢出 写指针溢出 负数组索引写入 内存错误分配 错误的内存释放非法内存访问 不正确的delete操作 溢出指针读取 越界读取 返回指针至本地变量 负数组索引读取 已释放指针读/写 不兼容的指针转换控制流缺陷 逻辑/结构死代码 Switch语句中break遗失 非本地资源不当使用C/C+缺陷-Part 1资源泄露 内存泄露 Microsoft COM 内存泄露 Object资源泄露 不当delete未初始化变量 返回语句丢失 未初始化的指针/标量/数组 读写 类或结构体中未初始化的数据成员并发缺陷 死锁 竞态条件(Race conditions)阻塞调用误用算术错误 负变量不当使用 异常符号扩展 整数溢出 除零异常26死循环双重锁或解锁丢失负循环边界值线程死锁持锁过程中调用sleep()空指针引用 Null检查后引用空指针 直接引用返回的空指针 Null检查前引用空指针不安全的数据处理 不可信的循环数据源 使用非可信数据源读写数组/指针 使用非可信数据源格式化字符串性能缺陷 值传递大参数 使用大堆栈安全措施违反缓冲区溢出固定长度缓冲区写入 非安全函数调用 非安全临时文件使用 检查/使用时间不一致 用户空间指针不当使用API错误使用 非安全chroot调用 错误的迭代器使用 printf()参数不匹配C/C+缺陷-Part 2程序假死错误处理缺陷 未验证的返回值 未获取异常 负变量不当使用代码维护性缺陷 多返回语句 无效变量异常代码 复制/粘贴错误 格式错误27 HeartBleed安全检查 定义Tainted Data检测实例-HeartBleed BugCoverityJenkins检测对比30类型未处理的缺陷(Null引用)资源泄露并发问题重要的缺陷代码规范,最佳实践等Bug 总数FindBugs7121029598627Shared Defects513927128Coverity7986221879196CoverityFreeradius缺陷检测对比3122188类型内存问题资源泄露控制流缺陷,并发访问等问题重要的缺陷代码规范,最佳实践等Total BugsClang5330385997Shared Defects001123119Coverity7986831039121“瀑布式开发流程”需求挖掘设计实施验证支持开发测试发布经典的瀑布式开发流程:代码开发与测试之间存在延迟 QA经常由其他部门负责,在编码阶段完成后才能开始 安全保护基本是在“事发之后”才由单独的安全部门提供“敏捷开发流程”需求挖掘设计实施验证支持开发测试发布理想的敏捷开发流程:将整个实施和验证流程缩短成2-4周的“冲刺”(sprints)开发好的功能只有在经过全面验证之后才被“接受”为取得成功,QA及安全测试都必须是深入的自动化测试 Requirements definition 提交 Business Process Modeling修复检测IDE源代码管理夜间构建缺陷跟踪缺陷缺陷缺陷软件生命周期集成敏捷开发相关人员任务自动分配提交提交提交 Develop features 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中发现*s,全 int len)char *p =malloc(len +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 *pkt,char *p,int *length)*p =NULL;if (pkt-length -pkt-savedpos data +pkt-savedpos);pkt-savedpos +=4;/*this check will be passed if length length -pkt-savedpos data +pkt-savedpos;*req)pkt-savedpos +=*length;.return p;分类、行动部署及任务分配如何处理?安全及其他问题的统一视图对缺陷进行清晰描述清晰描述显示缺陷的控制流面向宏和进程间缺陷的联防(inline)选项9、静夜四无邻,荒居旧业贫。3月-233月-23Friday,March 17,202310、雨中黄叶树,灯下白头人。02:16:0502:16:0502:163/17/2023 2:16:05 AM11、以我独沈久,愧君相见频。3月-2302:16:0502:16Mar-2317-Mar-2312、故人江海别,几度隔山川。02:16:0502:16:0502:16Friday,March 17,202313、乍见翻疑梦,相悲各问年。3月-233月-2302:16:0502:16:05March 17,202314、他乡生白发,旧国见青山。17 三月 20232:16:05 上午02:16:053月-2315、比不了得就不比,得不到的就不要。三月 232:16 上午3月-2302:16March 17,202316、行动出成果,工作出财富。2023/3/17 2:16:0502:16:0517 March 202317、做前,能够环视四周;做时,你只能或者最好沿着以脚为起点的射线向前。2:16:05 上午2:16 上午02:16:053月-239、没有失败,只有暂时停止成功!。3月-233月-23Friday,March 17,202310、很多事情努力了未必有结果,但是不努力却什么改变也没有。02:16:0502:16:0502:163/17/2023 2:16:05 AM11、成功就是日复一日那一点点小小努力的积累。3月-2302:16:0502:16Mar-2317-Mar-2312、世间成事,不求其绝对圆满,留一份不足,可得无限完美。02:16:0502:16:0502:16Friday,March 17,202313、不知香积寺,数里入云峰。3月-233月-2302:16:0502:16:05March 17,202314、意志坚强的人能把世界放在手中像泥块一样任意揉捏。17 三月 20232:16:05 上午02:16:053月-2315、楚塞三湘接,荆门九派通。三月 232:16 上午3月-2302:16March 17,202316、少年十五二十时,步行夺得胡马骑。2023/3/17 2:16:0502:16:0517 March 202317、空山新雨后,天气晚来秋。2:16:05 上午2:16 上午02:16:053月-239、杨柳散和风,青山澹吾虑。3月-233月-23Friday,March 17,202310、阅读一切好书如同和过去最杰出的人谈话。02:16:0502:16:0502:163/17/2023 2:16:05 AM11、越是没有本领的就越加自命不凡。3月-2302:16:0502:16Mar-2317-Mar-2312、越是无能的人,越喜欢挑剔别人的错儿。02:16:0502:16:0502:16Friday,March 17,202313、知人者智,自知者明。胜人者有力,自胜者强。3月-233月-2302:16:0502:16:05March 17,202314、意志坚强的人能把世界放在手中像泥块一样任意揉捏。17 三月 20232:16:05 上午02:16:053月-2315、最具挑战性的挑战莫过于提升自我。三月 232:16 上午3月-2302:16March 17,202316、业余生活要有意义,不要越轨。2023/3/17 2:16:0502:16:0517 March 202317、一个人即使已登上顶峰,也仍要自强不息。2:16:05 上午2:16 上午02:16:053月-23MOMODA POWERPOINTLorem ipsum dolor sit amet,consectetur adipiscing elit.Fusce id urna blandit,eleifend nulla ac,fringilla purus.Nulla iaculis tempor felis ut cursus.感感 谢谢 您您 的的 下下 载载 观观 看看专家告诉