1、软件安全研究第1页,共23页。何为软件安全 软件安全(Software Security)就是使软件在收到恶意攻击的情形下依然能够继续正确运行的工程化软件思想。多年以来,在计算机软件(包括来自第三方的软件,商业的和免费的软件)中已经发现了不计其数能够削弱安全性的缺陷(bug)。黑客利用编程中的细微错误或者上下文依赖关系,已经能够控制Linux,让它做任何他们想让它做的事情。第2页,共23页。最常见的软件漏洞 缓冲区溢出是一种常见的编程错误,也是一种牵扯到复杂因素的错误。开发人员经常预先分配一定量的临时内存空间,称为一个缓冲区,用以保存特殊信息。如果代码没有仔细地把要存放的数据大小同应该保存它的
2、空间大小进行对照检查,那么靠近该分配空间的内存就有被覆盖的风险。熟练的黑客输入仔细组织过的数据就能导致程序崩溃,更糟糕的话能执行代码。第3页,共23页。幸亏近年来缓冲区溢出攻击发生的显著数量提高了编程界对这个问题的认识。虽然缓冲区溢出仍然在出现,但它们经常会被很快发现和纠正,特别在开放源代码应用中更是如此。像Java和.NET这样的比较新的编程体系都包含自动检查数据大小,防止发生缓冲区溢出的机制。缓冲区溢出是称为输入有效性漏洞的更大一类软件安全缺陷下的一个子类。几乎所有的程序都接受某种类型的用户输入(例如,命令行参数或者HTML表格)。如果代码没有严格检查输入的格式和内容是否合适,就开始处理数
3、据,那么就会发生问题。作为一名系统管理员,您该如何防止这种情况发生呢?几乎无可奈何,至少在确定出缺陷(bug),并发布解决它的补丁之前是这样。紧盯补丁和安全性公告的发布,这是大多数系统管理员工作的一个重要部分。大多数Linux发行版本都带自动打补丁的工具,如Fedora上的yum、Debian和 Usutu上的apt-get。利用这些工具能让您的站点避免出现软件的安全漏洞问题。第4页,共23页。软件漏洞中编程错误 大多数IT安全事件(如补丁程序或网络攻击等)都与软件编程错误有关,在过去的三年中,非赢利调研机构MITRE和美国系统网络安全协会(SANS Institute)发现了700多处常见的
4、软件编程错误,经过安全专家的筛选,最终公布了以下25大软件编程错误:第5页,共23页。1.错误的输入验证 2.不正确的编码或转义输出 3.维持SQL查询结构(SQL注入)错误 4.维持网页结构(跨站点脚本)错误 5.维持操作系统命令结果(操作系统命令注入)错误 6.明文传送敏感信息 7.跨站点请求伪造 8.资源竞争(Race condition)9.错误信息泄露 10.限定缓冲区内操作失败 11.外部控制重要状态数据 12.外部控制文件名或路径 13.不可信搜索路径 第6页,共23页。14.控制代码生成错误(代码注入)15.下载未经完整性检查的代码 16.错误的资源关闭或发布 17.不正确的初
5、始化 18.错误计算 19.可渗透防护 20.使用被破解的加密算法 21.硬编码密码 22.对核心资源的错误权限分配 23.随机值的错误利用 24.滥用特权操作 25.客户端执行服务器端安全第7页,共23页。缓冲区溢出 通用有效的攻击方法第8页,共23页。什么是缓冲区溢出 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区 又被称为堆栈.在各个操作进程之间,指令会被临时储存在堆栈
6、当中,堆栈也会出现缓冲区溢出。第9页,共23页。溢出第10页,共23页。缓冲区溢出 如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出第11页,共23页。溢出示例#include include int main()int main()char name8;char name8;printf(printf(“Your name:Your name:”););gets(name);gets(name);printf(printf(“Hello,%s!Hello,%s!”,name);,name);return 0;return
7、0;第12页,共23页。第13页,共23页。缓冲区溢出攻击1、什么是缓冲区溢出2、缓冲区溢出攻击3、从根本上防止缓冲区溢出攻击第14页,共23页。缓冲区溢出攻击 A:在堆栈产生溢出时,我们输入的数据将可能修改EIP指针。如果精心设计这些的数据,可以让EIP指针指向我们所放置的额外数据,而这些数据将以指令的形式进入CPU运行。第15页,共23页。攻击代码 攻击代码是一段精心设计的二进制代码,以数据的形式放入程序的某个缓冲区中 由于可利用的缓冲区的实际空间有限,因此实用的攻击代码一般仅实现简单有效的功能第16页,共23页。安排攻击代码 植入法 利用程序中已有代码第17页,共23页。防止缓冲区溢出
8、非执行缓冲区 保证代码正确性 数组边界检查 指针完整性检查第18页,共23页。非执行缓冲区 缓冲区是存放数据地方,我们可以在硬件或操作系统层次上强制缓冲区的内容不得执行 该方法面临的主要是兼容性问题第19页,共23页。代码正确性 如果能够在使用用户输入的数据前,对数据的长度进行有效性检查,则缓冲区溢出也不会发生 使用该思路的方法主要为:源代码静态检查 程序运行期间的大量数据测试 这种方法不能找出所有的缓冲区溢出第20页,共23页。数组边界检查 因为缓冲区本质都是各种类型的数据,在数组操作时对数组边界进行检查可以杜绝缓冲区溢出 这种方法面临的是效率问题第21页,共23页。指针完整性检查 在引用指令指针前检查指针的改变是指针完整性检查的思路 虽然这种方法不能解决所有缓冲区溢出问题,但它有着兼容性和效率上的优势,因此已有一定的应用第22页,共23页。普通用户的防范 对于一般用户而言,应关闭一切不必要的服务,对于必须开放的服务一定要及时更新补丁。应意识到客户机模式攻击的存在,不要轻易打开陌生人的邮件及其附件,客户程序也应及时更新补丁第23页,共23页。