静态代码分析与代码质量安全

HeartBleed Bug

Heartbleed漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在memcpy()调用受害用户输入内容作为长度参数之前正确进行边界检查。攻击者可以追踪OpenSSL所分配的64KB缓存、将超出必要范围的字节信息复制到缓存当中再返回缓存内容,这样一来受害者的内存内容就会以每次64KB的速度进行泄露。

 

 

代码静态分析

 

? 定义:在不执行计算机程序的条件下,对源代码进行分析,找出代码

缺陷

? 执行方式:一般配合静态程序分析工具进行

? 采用技术:数据流分析、机器学习、语义精简...

? 可检测类型:死锁,空指针,资源泄露,缓冲区溢出,安全漏洞,竞态条件...

? 优点:

? 能够检测所有的代码级别的可执行路径组合,快速,准确

? 直接面向源码,分析多种问题

? 在研发阶段开始找到并修复多种问题,节省大量时间/人力成本

? 注意:静态分析不是万能的,测试是持续的过程,非一劳永逸

存在问题

? 编译器警告: 保证类型安全
– 最初级的静态分析,检测规则简单
? 中间语言分析: 检测字节码( Byte Code )的缺陷,将其重新映射到真实代码中
– 在转换与映射过程中易造成精度丢失
? 高误报率:目前静态分析产品的误报率普遍在30%以上。
? 缺陷种类较少,找到的问题级别不高:多数为代码规范或低级缺陷,非实际Bug
– 如命名规范、类定义规范,最佳实践.....
? 易用性较低:基本上都是一次性的使用工具,无法与SDLC集成
– SCM集成:如SVN,CVS,Perforce,Git
– Bug Tracking:如Bugzilla,Jira

改进型的静态分析方案

基于Meta Compilation的静态分析:
? 由斯坦福大学教授Dawson Engler提出,在深度理解代码与程序语义的基础上检测缺陷
? 旨在查找“真正的代码缺陷”
? 实现原理:
? 使用可扩展的metal语言定义正确性Checker
? 将程序的源码使用状态机进行抽象描述(State Machine Abstraction)。
? 使用xgcc系统匹配Checker与抽象状态机状态,找到问题所在的点。
? 可准确检测实际的Bug(内存和指针问题、资源泄露、缓冲区溢出,数组越界,
心脏出血漏洞...)
? 能够检测高达亿行级别的代码库,避免“状态爆炸”
? 使用模型检验与符号执行技术,误报率降低至15%以下
? 算法已步入实际应用
? 面向企业的Coverity 软件
? 面向开源代码的Coverity SCAN

如何进行Java代码静态分析?

Java语言被编译成JVM bytecode - 在运行时被转换成本地可执行
代码的分析
选项一
? 分析 byte-code:用户编译他们的软件,然后分析编译后的可执行文件与调试信息,分析引擎联系找到的缺陷与源代码位置
? 某些开源工具的实现原理
选项二:
? 获取所有的Java编译过程并执行分析
? Bytecode分析工作仍旧存在,但包含更多的内容

基本的工作流

? 获取所有编译过程
? 每当 “javac(或其他相关API)” 被调用后,编译获取系统记录所有的编译器选项,操作,源代码与调用的库文件
? 面向源代码和库文件可进行全面编译后分析
? 找到的缺陷将被展示给研发人员修复

如何分析缺陷?

? 过程间分析(Intra-procedural analyses)将考虑每一个合理的可执行路径
? 快速修剪不可行路径是一件很麻烦的事情!
? 数学方案
? 获取一系列的函数定义
? 资源分配
? 调用….
? 过程间分析
? Bytecode 分析将创建函数定义

找到潜在Bug其实只是难题之一

? 消除误报非常难
? 将复杂的缺陷解释出来很难
? 只找潜在的一次性缺陷是很难的

Java 缺陷

Web 应用安全缺陷(OWASP Top 10)
– 跨站脚本攻击
– SQL 注入
– 命令行注入
– 路径遍历…
资源泄露
– 数据库连接资源泄露
– 资源泄露
– Socket & Stream 泄露
并发数据访问异常
– 变量非原子更新
– 双重检查锁定
– 数据竞态条件
– Volatile非原子更新
– Servlet 属性无效锁定
– 单例模式竞态条件
程序假死
– 线程死锁
– 死锁
空指针引用
– Null检查后引用空指针
– 直接引用返回的空指针
– Null检查前引用空指针
API 使用错误
– 无效迭代器使用
– 不可修改的集合错误
– 已释放资源调用
性能缺陷
– 低效率方法使用
– 在循环中连接字符串
– 冗余同步
逻辑错误
– 不可达代码
– 未使用变量
– 常量表达式
– 非本地资源不当使用
– 整数溢出
– 不当分号

类层次结构不一致
– 调用 super.clone() 或 supler.finalize()失败
– 父函数调用丢失
– 构造函数中使用虚函数
控制流缺陷
– 在Finally模块中返回
– Switch语句中break丢失
错误处理缺陷
– 未验证的返回值
数据库操作
– 不正确的实体哈希
– Load函数返回值错误验证
– 不完全持续周期
– get()不当使用
代码可维护性缺陷
– 调用已过期方法
– 显式垃圾收集
– 非静态方法中设置静态变量
– 复制/粘贴错误
– 不可达代码
可疑代码
– 参数次序错误
– 格式错误

C# 缺陷 Powered by Eric Lippert

资源泄露
– 数据库连接资源泄露
– 资源泄露
– Socket & Stream 泄露
API 使用错误
– 已释放资源调用
并发数据访问异常
– 变量非原子更新
– 数据竞态条件
性能缺陷
– 低效率方法使用
– 在循环中连接字符串
– 冗余同步
程序假死
– 线程死锁
– 死循环
可疑代码
– 复制/粘贴错误
– 参数次序错误
– 格式错误
类层次结构不一致
– 调用 base.close() 或 base.dispose()失败
– 父函数调用丢失
控制流缺陷
– 可疑的额外分号
– 不一致比较
– 不兼容的类型比较
空指针引用
– Null检查后引用空指针
– 直接引用返回的空指针
– Null检查前引用空指针
算术错误
– 错误移位操作
– 不正确的表达式
– 表达式计算过程中溢出

C/C++ 缺陷

资源泄露
? 内存泄露
? Microsoft COM 内存泄露
? Object资源泄露
? 不当delete
未初始化变量
? 返回语句丢失
? 未初始化的指针/标量/数组 读写
? 类或结构体中未初始化的数据成员
并发缺陷
? 死锁
? 竞态条件(Race conditions)
? 阻塞调用误用
算术错误
? 负变量不当使用
? 异常符号扩展
? 整数溢出
? 除零异常
内存崩溃
? 内存访问溢出
? 字符串长度计算错误
? 缓冲区溢出
? 写指针溢出
? 负数组索引写入
? 内存错误分配
? 错误的内存释放
非法内存访问
? 不正确的delete操作
? 溢出指针读取
? 越界读取
? 返回指针至本地变量
? 负数组索引读取
? 已释放指针读/写
? 不兼容的指针转换
控制流缺陷
? 逻辑/结构死代码
? Switch语句中break遗失
? 非本地资源不当使用

程序假死
? 死循环
? 双重锁或解锁丢失
? 负循环边界值
? 线程死锁
? 持锁过程中调用sleep()
空指针引用
? Null检查后引用空指针
? 直接引用返回的空指针
? Null检查前引用空指针
错误处理缺陷
? 未验证的返回值
? 未获取异常
? 负变量不当使用
代码维护性缺陷
? 多返回语句
? 无效变量
异常代码
? 复制/粘贴错误
? 格式错误
不安全的数据处理
? 不可信的循环数据源
? 使用非可信数据源读写数组/指针
? 使用非可信数据源格式化字符串
性能缺陷
? 值传递大参数
? 使用大堆栈
安全措施违反
? 缓冲区溢出
? 固定长度缓冲区写入
? 非安全函数调用
? 非安全临时文件使用
? 检查/使用时间不一致
? 用户空间指针不当使用
API错误使用
? 非安全chroot调用
? 错误的迭代器使用
? printf() 参数不匹配

检测实例-HeartBleed Bug

Jenkins检测对比

Freeradius缺陷检测对比

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

希望对您公司企业信息化IT架构与研发管理体系等有帮助。 其它您可能感兴趣的文章:
移动应用App测试与质量管理一
全面的软件测试
著名ERP厂商的SSO单点登录解决方案介绍一
软件项目风险管理介绍
企业项目化管理介绍
智能企业与信息化之一
由企业家基本素质想到的
敏捷软件质量保证的方法与实践
构建高效的研发与自动化运维
IT运维监控解决方案介绍
IT持续集成之质量管理
人才公司环境与企业文化
企业绩效管理系统之平衡记分卡
企业文化、团队文化与知识共享
高效能的团队建设
餐饮连锁公司IT信息化解决方案一

如有想了解更多软件研发 , 系统 IT集成 , 企业信息化,项目管理,企业管理 等资讯,请关注我的微信订阅号:

 

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog

时间: 2024-10-25 04:55:49

静态代码分析与代码质量安全的相关文章

java代码分析及分析工具

java代码分析及分析工具 一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复杂不言而喻.从09年开始一直沿用到现在,中间代码经过了多少人的手,留下了多少的坑,已经记不清楚了,谁也说不清了. 代码的维护成本越来越高.代码已经急需做调整和改善.最近项目组专门设立了一个小组,利用业余时间做代码分析的工作,目标对核心代码进行分析并进行设计重构. 代码分析

恶意代码分析实战

恶意代码分析实战(最权威的恶意代码分析指南,理论实践分析并重,业内人手一册的宝典) [美]Michael Sikorski(迈克尔.斯科尔斯基), Andrew Honig(安德鲁.哈尼克)著   <恶意代码分析实战>是一本内容全面的恶意代码分析技术指南,其内容兼顾理论,重在实践,从不同方面为读者讲解恶意代码分析的实用技术方法. <恶意代码分析实战>分为21章,覆盖恶意代码行为.恶意代码静态分析方法.恶意代码动态分析方法.恶意代码对抗与反对抗方法等,并包含了 shellcode分析

20145331 《信息安全系统设计基础》第5周学习实践部分总结及代码分析

第三章实践内容及代码分析: 一.过程截图: 反汇编:objdump -d wsc.o 一.建立wsc1.c的c文件,并转成汇编代码: wsc.c: wsc.o:(查看用od xxx) 二.输入命令,得到二进制格式代码,并输入od wsc.o进行查看: 三.反汇编:objdump -d wsc.o,得到反汇编代码: 四.反汇编代码分析: 1.反汇编代码和一般汇编代码相比操作指令后面没有后缀. 2.代码分析:代码逻辑是g函数调用f函数,main函数调用g函数,以第一个为例,通过代码对栈帧进行分析:

【C/C++学院】0907-象棋五子棋代码分析/寻找算法以及排序算法

象棋五子棋代码分析 编译代码报错: 错误 1 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. See http://go.microsoft.com/fwlink/p/?LinkId=286820 for mo

Thrift 代码分析

Thrift的基本结束 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过IDL(Interface Definition Language,接口定义语言)来定义RPC(Remote Procedure Call,远程过程调用)的接口和数据类型,然后通过thrift编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Coc

软件工程——数独 代码分析报告1

一.    运行代码分析 运行代码分析结果如下: 1>------ 已启动全部重新生成: 项目: suduku_without_gui, 配置: Release Win32 ------ 1>header.cpp 1>interpretor.cpp 1>SudokuChecker.cpp 1>SudokuMaker.cpp 1>SudokuPrinter.cpp 1>SudokuReader.cpp 1>E:\github\software_engineer

pmd静态代码分析

在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可能的bug--空的try/catch/finally/switch块.– 无用代码(Dead code):无用的本地变量,方法参数和私有方法.– 空的if/while语句.– 过度复杂的表达式--不必要的if语句,本来可以用while循环但是却用了for循环.– 可优化的代码:浪费性能的String

SylixOS 调试方法详解——静态代码分析

1. SylixOS调试方法介绍 SylixOS 实现了一个功能强大的调试 stub,可在设备或模拟器上在线调试应用程序,RealEvo-IDE 也提供配套的调试插件.目前 RealEvo-IDE 既支持自动推送调试.也支持传统的手动启动 gdbserver 的调试方式.在官方公布的使用手册中没有详细写出在日常开发中非常实用的几种调试方式,我们通过新建几个App工程来做相应的演示,主要有代码静态分析.代码覆盖率检查.性能分析以及一个实战案列的演示,本文主要介绍代码静态分析调试. 2. Sylix

Java静态代码分析工具Infer

Java静态代码分析工具Infer 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Infer介绍 Infer是Facebook最新开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题.目前Facebook使用此工具分析Facebook的App,包括Android.iOS.Facebook Messenger和Instagram等. Facebook称该工具帮助其每个月检查出应用潜在的数百个Bug,例如一些空指针访问.资源