软件安全测试基础_讲义
2009年卡巴斯基 统计的20种常见 漏洞
软件安全包含的内容
软件安全的内容
内存安全 线程/进程安全 异常处理安全 输入安全 数据库安全 国际化安全 远程调用和组件安全 WEB安全 避免拒绝服务攻击
内存安全
头号公敌——缓冲区溢出
大部分缓冲区溢出漏洞允许攻击者控制计算机内存空间, 并植入、运行任意代码
关注软件安全的原因
软件的应用范围越来越广,所起的作用越来越重要 黑客攻击越来越容易
关注软件安全的原因
漏洞利用速度越来越快
关注软件安全的原因
病毒的种类和感染的机会越来越多
关注软件安全的原因
对应用层的攻击远高于非网络层或系统层
关注软件安全的原因
2009年,卡巴斯基全功能安全软件的入侵检测系统(IDS) 拦截了超过2亿1989万9678次的网络攻击
堆栈区1 堆栈区2
堆栈框架 父EBP 父EIP 参数 指令 RET
堆栈指针EBP 指令指针EIP
正常
dcba hgfe EBP EIP ……
溢出
dcba hgfe lkji ponm ……
内存安全
整数溢出 数组下标越界 字符串格式化
线程/进程安全
线程同步安全 线程协作安全 线程死锁安全
基本概念
漏洞(vulnerability)
RFC 2828:系统设计、实现或操作和管理中存在的缺陷 或弱点,能被利用而违背系统的安全策略
漏洞挖掘 漏洞分析 漏洞利用
0day漏洞 Shell Code
软件安全需求
软件自身安全
软件自身完整性 软件自身可信性
软件存储安全 软件通信安全 软件运行安全
strcpy() MultiByteToWideChar()
后果:
程序运行失败,程序出现异常 操作系统异常 成为黑客攻击的目标
堆栈溢出
off by one溢出
堆溢出
进程内存区域
动态存储区(堆栈) 静态存储区 程度代码区
并不是所有缓冲区溢出都是可利用的
内存安全
缓冲区溢出——堆栈溢出
输入安全
“一切输入都是有害的” 用户输入安全 数字输入安全 字符串输入安全 环境变量输入安全 文件名安全 数据库输入安全
在数据没有得到验证之前 不要相信它们!
数据通过不可信任环境 和可信任环境的边界时, 必须要经过验证。
国际化安全
国际化(I18N) 本地化(L10N) 全球化(G11N) 字符集转换
数据的加密保护
代码注入
SQL注入
Request
Internet
Response
代码注入
DLL注入
Windows消息钩子 远程线程注入 注册表修改
软件安全问题产生原因
我不能想象导致这船沉没的任何情况,现代造船技术 已经消除了这种可能性。
——泰坦尼克号船长,E.I.Smith
软件安全方面的观念和知识不足 经济上的回报少甚至没有 软件设计没有考虑安全特性 编码错误 测试不到位
软件安全问题解决之道
让每个人都参与进来
灌输软件安全观念 了解软件安全的重要性 “搞破坏” 与行业安全问题保持同步 持续的安全教育
主动的安全开发过程
设计阶段
Hale Waihona Puke 测试阶段 开发阶段发布/维护阶段
概念:
1、安全教育
威胁建模
2、专职安全人员
设计完毕: 安全小组审查
编码完毕:
1、审查旧的缺陷 2、安全编码准则
DCOM安全 Active X组件安全
拒绝服务攻击
拒绝服务DoS
应用程序失败攻击 资源不足攻击
CPU不足攻击 内存不足攻击 资源不足攻击 网络带宽攻击
攻击原理
基于漏洞的攻击(逻辑攻击) 基于流量的攻击(洪水攻击)
分布式拒绝服务攻击(DDoS)
数据的加密保护
加密=安全? 糟糕的密码保存处理 加密算法中使用不良的随机数
互斥条件 请求与保持条件 不剥夺条件 循环等待条件
线程控制安全 进程安全
异常/错误处理中的安全
“出现错误就应该崩溃” 目的:保证系统的正常和安全运行 异常捕获的安全 异常处理的安全
本地处理 向客户端抛出
其它异常处理 On error resume
On error goto
关注软件安全的原因
可信计算(Trustworthy Computing)的需要 墨菲定律(Murphy's Law)
所有的程序都有缺陷
安全的产品是高质量的产品
≠完美的软件
安全的软件 可靠的软件
媒体(或竞争对手)将在安全问题上大做文章 人们将避开那些实际工作状况与其广告不符的产品 不要成为牺牲品 修补安全漏洞的代价是高昂的
SQL注入
不适当的访问控制(ACL)设置
Access Control List 应用程序抵御攻击的最后屏障 Administrators(完全控制)+Everyone(读取) 特权提升
远程调用安全
远程调用(RPC)安全
恶意调用RPC服务器中的过程 客户端和服务器之间传递的信息被窃听,数据被篡改
MultiByteToWideChar() WideCharToMultiByte()
面向对象中的安全
对象内存分配与释放 对象线程安全 对象序列化安全 静态成员安全
Web安全
URL操作攻击 页面状态值安全
URL传值 表单传值 Cookie方法 Session方法
Web跨站脚本(XSS)攻击
安全运动
响应过程
当我们面对添加新特性和解决安全问题的选择时,我们需要选择安全。
——比尔.盖茨 《Trustworthy Computing》备忘录
主动的安全开发过程
安全特性不等于安全的特性 安全专业技术+领域专业技术 更多的眼睛不代表更安全 设计阶段
定义产品的安全目标 安全是产品的一种特性 要有足够的时间考虑安全问题 安全的设计源于威胁模型 终结不安全的特性 设置BUG门槛 安全小组审查
Nothing is impossible
——软件安全测试基础
蔡利平
2011年5月
基本概念
什么是安全
ISO:为数据处理系统建立和采用的技术和管理的安全保 护,保护计算机硬件、软件不因偶然或恶意的原因遭 到破坏、更改和泄漏
物理安全 逻辑安全
信息的机密性 信息的完整性 信息的可用性
安全的产品