当前位置:文档之家› 北邮软件安全期末复习整理

北邮软件安全期末复习整理

软件安全2013.61.1概述1.1.1信息安全的六性***①保密性(C, confidentiality ):信息不泄漏给非授权的用户、实体或者过程的特性,。

②完整性(I,integrity):数据未经授权不能进行改变的特性,即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性。

③可用性(A, availability ):可被授权实体访问并按需求使用的特性,即当需要时应能存取所需的信息。

④真实性:内容的真实性。

⑤可核查性:对信息的传播及内容具有控制能力,访问控制即属于可控性。

⑥可靠性:系统可靠性。

信息安全根源:复杂性、开放性(系统、标准、业务)信息安全特性:攻防特性、相对性、配角特性、动态性1.1.2软件安全威胁分类( Gary Mcgraw )①输入验证与表示:输入信任→特殊字符、编码和数字表示②API误用:调用者没有理解约定的目的③安全特征:主要指认证,访问控制,机密性,密码,权限管理等方面的内容④时间与状态:死锁、会话固定、竞争条件、不安全临时文件⑤错误处理:没有完全处理错误⑥代码质量⑦封装⑧环境OWASP的WEB安全风险分类:认证、授权、客户端攻击、命令执行、信息泄露、逻辑攻击1.1.3软件安全加固模型***1.2 缓冲区溢出原理1.2.1 缓冲区溢出原理***缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上。

由于缓冲区溢出,相邻的内存地址空间被覆盖,造成软件出错或崩溃。

如果没有采取限制措施,可以使用精心设计的输入数据使缓冲区溢出,从而导致安全问题。

1.2.2 缓冲区溢出预防静态保护:不执行代码,通过静态分析来发现代码中可能存在的漏洞.静态的保护技术包括编译时加入限制条件,返回地址保护,二进制改写技术,基于源码的代码审计等.动态保护:通过执行代码分析程序的特性,测试是否存在漏洞,或者是保护主机上运行的程序来防止来自外部的缓冲区溢出攻击.1.2.3 系统栈的工作原理***内存的栈区实际上指的就是系统栈。

系统栈由系统自动维护,它用于实现高级语言中函数的调用。

对于类似C语言这样的高级语言,系统栈的PUSH/POP等堆栈平衡细节是透明的。

每一个函数独占自己的栈帧空间。

当前正在运行的函数的栈帧总是在栈顶。

Win32系统提供两个特殊的寄存器用于标识位于系统栈顶端的栈帧。

(1)ESP:栈指针寄存器(extendedstackpointer),其内存放着一个指针,该指针永远指向系统栈最上面的一个栈帧的栈顶。

(2)EBP:基址指针寄存器(extendedbasepointer),其内存放着一个指针,该指针永远指向系统栈最上面的一个栈帧的底部。

在函数栈帧中,一般包含以下几类重要信息。

(1)局部变量:为函数局部变量开辟的内存空间。

(2)栈帧状态值:保存前栈帧的顶部和底部(实际上只保存前栈帧的底部,前栈帧的顶部可以通过堆栈平衡计算得到),用于在本帧被弹出后恢复出上一个栈帧。

(3)函数返回地址:保存当前函数调用前的“断点”信息,也就是函数调用前的指令位置,以便在函数返回时能够恢复到函数被调用前的代码区中继续执行指令。

函数调用大致包括以下几个步骤。

(1)参数入栈:将参数从右向左一次压入系统栈中。

(2)返回地址入栈:将当前代码区调用指令的下一跳指令地址压入栈中,供函数返回时继续执行。

(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。

(4)栈帧调整:保存当前栈帧的状态值,以备后面恢复本栈帧时使用(EBP入栈);将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部);给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈帧);1.2.4 基于邻接变量修改的缓冲区溢出的原理略1.3 缓冲区溢出利用1.3.1 什么是shellcodeshellcode:缓冲区溢出攻击中植入进程的代码。

1.3.2 如何定位shellcode①栈帧移位与jmpesp②获取“跳板”的地址③使用“跳板”定位的exploit1.3.3 缓冲区的组织①缓冲区的组成:填充物、淹没返回地址的数据、shellcode②抬高栈顶保护shellcode③函数返回地址移位1.3.4 shellcode编码首先,所有的字符串函数都会对NULL字节进行限制。

其次,有些函数还会要求shellcode必须为可见字符的ASCII或Unicode的值。

最后,在进行网络攻击时,基于特征的系统往往会对常见的shellcode进行拦截1.4 漏洞挖掘方法1.4.1 什么是漏洞挖掘技术1.4.2 简单的fuzzing过程Fuzz的主要目的是”崩溃crash”,”中断break”,”销毁destroy”。

Fuzz技术的思想就是利用“暴力”来实现对目标程序的自动化测试,然后监视检查其最后的结果,如果符合某种情况就认为程序可能存在某种漏洞或者问题。

1.4.3 文件类型漏洞挖掘攻击者往往会在约定的数据格式进行稍许修改,观察软件在解析这种“畸形文件”时是否会发生错误,缓冲区是否会溢出等。

(1)以一个正常的文件模板作为基础,按照一定规则产生一批畸形文件。

(2)将畸形文件逐一送入软件进行解析,并监视软件是否会抛出异常。

(3)记录软件产生的错误信息,如寄存器状态、栈状态等。

(4)用日志或其他UI形式向测试人员展示异常信息,以进一步鉴定这些错误是否能被利用。

Blind fuzz:即通常所说的“盲测”,就是在随机位置插入随机的数据以生成畸形文件。

然而现代软件往往使用非常复杂的私有数据结构。

产生测试用例的策略缺少针对性,生成大量无效测试用例,难以发现复杂解析器深层逻辑的漏洞等。

Smart Fuzz:面向逻辑(测试前首先明确要测试的目标是解析文件的程序逻辑,而不是文件本身)、面向数据类型(面向数据类型测试是指能够识别不同的数据类型,并且能够针对目标数据的类型按照不同规则来生成畸形数据)、基于样本(要求在测试前构造一个能够包含几乎所有数据结构的文件来作为样本)。

1.4.4 FTP漏洞挖掘它的基本原理就是通过对FTP协议中的命令及命令参数进行脏数据替换,构造畸形的FTP命令并发送给被测试FTP服务程序。

2.1 线程/进程安全2.1.1 线程、进程机制***进程:程序在计算机上的一次执行活动。

运行一个程序,相当于启动了一个进程。

进程是操作系统进行资源分配的单位,通俗地讲,是一个正在执行的程序。

进程的安全主要体现在线程安全,同时涉及进程的应用级别、其对系统的威胁性等。

线程:进程中的一个实体,是被系统独立调度和分派的基本单位,它可与同属一个进程的其它线程共享进程所拥有的全部资源。

一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。

线程的安全性主要来源于其运行的并发性和对资源的共享性。

线程有创建、可运行、运行中、阻塞、死亡五种状态。

2.1.2 线程同步安全所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。

2.1.3 线程协作安全多个线程合作完成一件事情的几个步骤,此时线程之间实现了协作。

由于线程随时都有可能抢占CPU,可能在前面一个步骤没有完成时,后面的步骤线程就已经运行,该安全隐患造成系统得不到正确结果。

解决:在运行一个线程时,命令其他线程等待该线程运行完毕,才能抢占CPU进行运行。

2.1.4 线程死锁问题***死锁:是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象。

条件:互斥、请求等待、不抢占、循环等待解决:可以撤消陷于死锁的全部线程。

可以逐个撤消陷于死锁的进程,直到死锁不存在。

从陷于死锁的线程中逐个强迫放弃所占用的资源,直至死锁消失。

2.1.5 线程控制安全线程控制主要是对线程生命周期的一些操作,如暂停、继续、消亡等。

线程生命周期中的安全问题主要体现在:线程暂停或者终止时,可能对某些资源的锁并没有释放,它所保持的任何资源都会保持锁定状态;线程暂停之后,我们无法预计它什么时候会继续(一般和用户操作有关),如果对某个资源的锁长期被保持,其他线程在任何时候都无法再次访问该资源,极有可能造成死锁。

解决:1:当需要暂停时,干脆让线程的run()方法结束运行以释放资源(实际上就是让该线程永久结束);继续时,新开辟一个线程继续工作。

怎样让run()方法结束呢?一般可用一个标志告诉线程什么时候通过退出自己的run()方法来中止自己的执行。

2:将线程暂停或继续,不使用suspend()和resume(),可在Thread类中置入一个标志,指出线程应该活动还是挂起。

若标志指出线程应该挂起,便用wait()命其进入等待状态。

若标志指出线程应当恢复,则用一个notify()重新启动线程。

3:不推荐使用stop()来终止阻塞的线程,而应换用由Thread提供的interrupt()方法,以便中止并退出堵塞的代码2.1.6 隐蔽信道问题、客体重用问题2.2 输入输出安全2.2.1 典型的输入安全问题及预防***①数字输入安全:确定数字格式、负数验证、判断数值溢出②字符串输入安全:正则表达式、明确匹配数据的开始和结束、在输入中拒绝特殊字符③环境变量输入安全:环境变量在同一个交互环境下只有一个实例。

不同的交互环境有不同的实例,互不干扰。

其功能是用于影响该环境下进程的行为。

环境变量的内容、存储格式给攻击者以机会。

解决:限制环境变量的使用权限、可适当破坏环境变量在shell之间的共享、用户定义的环境变量,需要进行严格的检查。

④文件名安全:不让用户自己来输入文件名、限制文件名字符种类、不允许命名可能和物理设备冲突的文件名。

2.2.2 数据库输入安全①恶意输入:攻击者通过对数据库的恶意输入,可以将信息注入正在运行的流程,获取敏感数据,甚至危害进程的运行状态。

攻击者通过这种技术,可以完成以下攻击活动:改变一条SQL语句的具体条件、添加并且运行额外的SQL的语句、秘密调用函数和存储过程。

②账户和口令:解决问题的方法主要有:不到万不得已,不使用管理员账户;使用最小特权账户,不给以额外的权限;不允许使用空口令连接数据库,防止管理员疏忽而创建了空口令;数据库连接字符串存放在配置文件中,最好可以加密,而不是代码中以明文显示;发生错误时,仅给客户端通知信息,不给具体原因,防止攻击者利用这些通知信息进行数据库猜测。

2.2.3 什么是国际化安全国际化的主要目的,是调整软件,使之能适用于不同的语言及地区。

三个部分:资源文件、读取工具、应用程序。

目标程序所支持的字符集和源数据属于的字符集可能不一致。

此种情况下,可能造成系统显示出错。

1:当目标程序所支持的字符集和源数据属于的字符集完全不兼容时,数据无法显示(或者以乱码形式显示)。

2: 当目标程序所支持的字符集是源数据属于的字符集的子集时,信息会部分丢失。

相关主题