源代码安全检测在软件质量管理中的应用
2013年8月
2
议程
源代码安全检测的现状1111
源代码安全检测原理2222
在软件质量管理中的一般应用3333
奇虎360源代码安全检测实践4444
源代码安全检测软件
质量管理中的应用
3
源代码安全检测的现状1111
源代码安全检测原理2222
在软件质量管理中的一般应用3333
奇虎360源代码安全检测实践4444
源代码安全检测软件
质量管理中的应用
4
源代码安全检测的现状
互联网具有外向型的
特征,网络应用成为发生
安全攻击以及数据外泄的
主要途径之一
IT研究与顾问咨询公司
Gartner统计数据显示,
75%的黑客攻击发生在
应用层
企业在提到应用安全时,
多数采取一些策略性措
施以及点技术,而没有
使用一种整体的规范性
方法
NIST的统计也显示
92%的漏洞属于应
用层而非网络层
5
源代码安全检测的现状
当今互联网存在众多
开源社区,软件种类
繁多且可以自由获取
自由软件和公用模块
的应用缺乏监管
当开发人员“拿来主义”
,选择使用这些开源
代码时,可能存在大
量安全问题
自由开发的软件的
缺陷问题暂没有进
行源代码检测的要求
6
开源软件中存在的安全漏洞-- LibTIFF
� 以LibTIFF为例
• Libtiff 是一个用来读写标签图像文件格式(简写
为TIFF)的开源库
• 在2012-2013年至今,根据中国国家漏洞库记载
,就出现过10个安全漏洞
7
开源软件中存在的安全漏洞-- LibTIFF
CNNVD-201308-145 Silicon Graphics LibTIFF 内存损坏漏洞和多个缓冲区溢出
漏洞
CNNVD-201305-077 LibTIFF 基于栈的缓冲区溢出漏洞
CNNVD-201305-076 LibTIFF ‘t2_process_jpeg_strip()’函数基于堆的缓冲区溢出
漏洞
CNNVD-201211-544 LibTIFF ‘DOTRANGE’标签处理远程缓冲区溢出漏洞
CNNVD-201211-074 LibTIFF ‘ppm2tiff’缓冲区溢出漏洞
CNNVD-201209-558 LibTIFF TIFF图形基于堆的缓冲溢出漏洞
CNNVD-201207-394 LibTIFF ‘tiff2pdf’缓冲区溢出漏洞
CNNVD-201207-026 libTIFF TIFF图像缓冲区溢出漏洞
CNNVD-201206-359 LibTIFF ‘tiff2pdf’整数溢出漏洞
CNNVD-201204-024 LibTIFF ‘gtTileSeparate()’ 整数溢出漏洞
8
如何应对日益严峻的安全问题
� 安全防护应该贯穿整个软件开发生命周期,而不再
只是集中在测试阶段
� 源代码安全检测作为编码阶段的重要安全测试手段
,应得到足够的重视
� 企业将源代码检测作为软件质量保证的一部分
• 80%的世界财富500强企业,知名软件年公司已
经或正在部署软件源代码安全检测系统
9
如何应对日益严峻的安全问题
� 加强开源代码检测,提高开源代码安全性
• 为了减少开源软件存在的源代码缺陷,2006 年初美国国
土安全部与企业合作,设立了一个长期的开源软件安全
测试计划,对包括Linux在内的1750多万行开源代码进行
缺陷测试
� 深入进行源代码安全研究
• 国际开放Web软件安全计划(OWASP)、美国MTRE的常
见缺陷列表(CWE)等组织和机构也在开展源代码安全研
究
10
源代码安全检测
� 源代码缺陷检测
• 找出源代码中存在的安全问题
� 源代码合规性检测
• 检查开发人员编写的源代码是否符合编码规范
� 不同层面、多角度对源代码进行检测
11
源代码安全检测的现状1111
源代码安全检测原理2222
在软件质量管理中的一般应用3333
奇虎360源代码安全检测实践4444
源代码安全检测软件
质量管理中的应用
12
源代码安全检测
� 源代码安全检测属于白盒测试范畴
白盒测试 黑盒测试
优点 1. 开始时间早,编码阶段即可实
施
2. 定位漏洞产生的代码位置,有
利于漏洞修复
3. 覆盖范围广
4. 执行速度快,测试效率高
5. 无需源代码
1. 可以验证漏洞及其可利用性
2. 不要源代码
缺点 1. 可能漏报一些运行时出现的漏
洞
2. 由于覆盖更多的路径,导致不
可执行路径中存在误报
3. 依赖于预先定义的模式
1. 依赖测试人员经验
2. 由于测试用例局限性导致不
完整的测试覆盖
13
与其他测试方法比较
� 源代码安全检测与功能测试、性能测试比较
源代码安全检测 功能测试 性能测试
测试类型 白盒测试 黑盒测试 黑盒测试
测试对象 源代码 功能模块 功能模块
实施阶段 开发阶段 测试阶段 测试阶段
测试方法
及目的
在不运行源代码
的情况下,检测
源代码中存在的
安全问题,提供
安全问题的定位、
修复意见等供开
发人员改正
采用黑盒测试策略
设计测试用例,判
断系统是否符合功
能需求
通过某种特定的方式对被测
试系统按照一定的测试策略
进行施压,获取该系统的响
应时间、运行效率、资源利
用情况等各项性能指标,来
评价系统是否满足用户性能
需求的过程
14
源代码安全检测原理
� 源代码安全检测主要采用的技术为——静态
分析技术
• 词法分析和语法分析
• 控制流分析
• 数据流分析
� 污染传播分析
� 别名分析
• 符号执行
• 过程间分析
15
静态分析技术比较
静态分析技术 技术特点 不足之处
词法分析 能够区分发生缺陷的词汇,适合进
行危险API的查找
由于没有考虑目标代码的语
义,会产生较多的误报
语法分析 进行数据流分析、符号执行的基
础,也可以在此阶段进行危险API
的查找
分析较为简单
数据流分析 在程序控制流图的基础上对每个基
本块或语句进行分析,得到相应的
程序状态
程序并发性支持较弱
符号执行 用符号值表示程序变量的值,然后
模拟程序进行执行
存在状态空间爆炸问题,时间
和空间消耗比较大
16
源代码安全检测的现状1111
源代码安全检测原理2222
在软件质量管理中的一般应用3333
奇虎360源代码安全检测实践4444
源代码安全检测软件
质量管理中的应用
17
在软件质量管理中引入源代码安全检测
� 存在的阻碍
� 源代码安全检测的步骤
� 融入软件质量管理的一般流程
18
存在的阻碍
越在开发后期实施
源代码安全检测,
消耗的时间会越多,
尤其是修复成本
上市时间的
压力
将源代码安全检测
作为日常代码开发
的一部分,就像解
决编译器
error/warning一样
对待出现的安全问
题
额外的开
发任务
减少人工代码审查,
使用与开发环境和
工作流程融合的工
具
融合工具
19
源代码安全检测一般步骤
确立目标 运行检测工具 审计检测结果
确定此次源
代码安全检
测的关注重
点(如:缺
陷类型等)
以及进行优
先级排序
配置源代码
安全检测工
具(如:配
置检测参数、
指定检测规
则等),产
生工具原始
运行结果
对工具产生
的原始结果
进行人工分
析,确认安
全问题
源代码安全检测一般步骤
修复安全问题
分发审计结
果,由相应
开发人员进
行修复
20
融入软件质量管理的一般流程
发布
测试
编码
设计
需求分析
源代码安全
编码规范培训
执行源代码安全
检测
执行源代码安全
检测
21
源代码安全编码规范
� 内容
• 企业内部编码规范
• 国际相关组织制定的通用规范
� CERT C/C++ 、Java、Perl安全编码标准
� MISRA C/C++:欧洲汽车工业行业标准
� : C++/Objective-C/JavaScript/Python代码规范
22
源代码安全编码规范
� 应用
• 开展源代码安全编码规范培训
• 实施自动化源代码合规性检测
� 目的
• 为开发人员编写安全的代码提供指导
• 提供轻量级工具检测,准确性高
• 提高代码质量
23
运行源代码安全检测工具
� 编码阶段
• 代码编写期间
� 测试阶段
• 系统集成期间
24
� 代码编写期间
• 研究表明,修复一个安全问题所带来的开销随着
时间的推移而不断增长
• 可以尽快对新代码进行检查
• 可以将工具与开发人员的开发环境结合,在编译
代码的同时,进行代码分析
• 将产生的代码安全问题发现并在第一时间进行处
理
• 大大节省了缺陷管理成本
25
� 系统集成期间
• 在系统集成时,对软件系统进行分析
• 发现软件系统级别的安全问题
• 生成质量分析报告,交付相应开发人员进行修复
26
� 问题:
• 由谁来运行和使用源代码安全检测工具?
• 如何处理工具产生的结果?
27
由谁来运行和使用源代码安全检测工具?
开发人员 安全审计人员 两者结合
优点 最熟悉代码,并可
以将这种优势与工
具提供的安全问题
相结合
1. 通常具有良好的
风险管理经验
2. 丰富的安全知识
1. 开发人员只关注高
可信结果
2. 安全团队提供安全
指导
3. 减少了双方的任务
4. 增进安全团队与开
发团队的合作
缺点 1. 缺少安全知识
2. 在开发时间以
外,需要占用
更多的时间
1. 对代码的熟悉度
没有开发人员高
2. 需要花时间和精
力用于设置环境
对企业开发流程和团
队的配合的要求较高
28
如何处理工具产生的结果?
� 方法一
安全审计人员 开发团队 安全团队
原始结果
制定修改列表 审计修改列表
优先级排序
开发团队
修复安全问题
制定安全阈值
对修复结果进行约束
29
� 方法二:
• 建立一份需求列表
� 语言及平台支持
� IDE以及脚本配置整合需求
� 漏洞覆盖范围
� 分析准确度
� 风险评估
� 修复成本
• 根据需求列表,将部分结果发送给相应代码的开
发人员
30
� 方法三:
• 通常大部分严重的安全问题会集中在少量的类型
中
• 重点关注这些严重的安全问题
31
源代码安全检测的现状1111
源代码安全检测原理2222
在软件质量管理中的一般应用3333
奇虎360源代码安全检测实践4444
源代码安全检测软件
质量管理中的应用
32
奇虎360源代码安全检测实践
� 制定企业内部源代码安全编码规范
� 在软件质量管理中加入源代码安全检测
• 源代码缺陷检测
• 源代码合规性检测
� 源代码安全编码培训
� 源代码安全检测工具
� 在360论坛中建立源代码安全区
33
制定企业内部编码规范
� 制订C++、Java等语言安全编码规范
� 建立知识库平台
• 缺陷基础数据库
• 缺陷样本库
• 参考信息库
• 危险函数库
34
在软件质量管理中加入源代码安全检测—原则
� 尽量不改变开发企业日常开发流程,不额外过多的
增加企业改造负担
� 插件式的嵌入开发流程
� 提供相关模块化工具或接口支撑源代码安全检测
� 从设计、开发、测试三个阶段全方位融入开发流程
35
源代码安全检测框架
36
多用户、多任务、多
语言检测
任务统一管理
Visual Studio、
Eclipse、
Web客户端
多维度分析
任务实时监控
统一源代码缺陷知识库
本地代码、
源代码管理服务器
可运行源代码缺陷检
测工具、源代码合规
性检测工具
特点
37
使用人员
� 参与检测的人员
• 开发人员
• 安全审计人员
• 质量管理人员
38
具体实施
� 开发人员在个人开发环境中使用源代码安全检测工
具
� 制定必须解决的安全问题列表,当代码中出现列表
中的安全问题时,不允许进行代码提交
� 在代码提交之前,消除个人代码中存在的重要安全
缺陷
� 优势:节省了缺陷管理成本和修复时间
39
具体实施
� 系统集成时,使用源代码安全检测工具对软件系统
进行分析,发现系统级别的安全缺陷
� 在进行QA和集成测试前,消除系统级别安全缺陷
� 优势:使得QA和集成测试更多的关注用户需求问题
40
具体实施
� 质量管理人员可以对检测结果进行统计分析
� 追踪安全问题分布及趋势
� 根据分析结果,制定新的质量及安全策略
41
源代码安全编码培训
� 培训课程
• C/C++安全编码指导
• Java安全编码指导
� 面向对象
• 软件开发工程师
• 测试和质量工程师(安全审计人员)
42
� 培训内容
• 安全编码的发展及重要性
• 常见安全漏洞介绍
• 安全编码实例剖析
� 问题机理分析
� 正确及错误代码示例
� 可能造成的风险
� 如何修复问题代码
43
源代码安全检测工具
� 源代码质量管理平台
• 源代码缺陷检测工具
� C/C++语言源代码缺陷检测工具
� Java语言源代码缺陷检测工具
• 源代码合规性检测工具
� C/C++语言合规性检测工具
� Java语言合规性检测工具
44
源代码安全讨论区
� 源代码安全讨论区
• 致力于推广源代码检测和编码安全方面的知识
� 包含四个板块
• 专家讲堂
• 经验分享
• 行业动态
� 论坛地址
•
谢谢!