漏洞发掘与缓冲区溢出检测技术
- 格式:pdf
- 大小:257.39 KB
- 文档页数:5
C语言中的漏洞利用与渗透测试技术C语言作为一种广泛应用于编程领域的高级编程语言,由于其灵活和高效的特点,被广泛使用于各种软件开发项目中。
然而,正是因为其广泛的应用,C语言也存在一些漏洞和安全隐患。
本文将重点探讨C 语言中的漏洞利用与渗透测试技术,以帮助读者了解并提高对C语言程序的安全性。
一、C语言中的常见漏洞在介绍漏洞利用与渗透测试技术前,我们首先需要了解C语言中的一些常见漏洞类型。
以下是几种常见的C语言漏洞:1. 缓冲区溢出:这是一种常见的安全漏洞,在C语言中由于缺乏边界检查导致。
当程序接收用户输入时,如果没有正确验证输入的长度,可能会导致缓冲区溢出,使攻击者能够执行恶意代码或破坏系统。
2. 格式化字符串漏洞:当程序使用不正确的格式化字符串函数,或者没有正确检查格式化字符串的输入时,可能会导致攻击者通过格式化字符串漏洞读取或修改内存中的数据,造成信息泄露或系统崩溃。
3. 整数溢出:在C语言中,整数的溢出可能导致程序出现未定义行为,为攻击者提供了利用的机会。
例如,当执行算术运算或数组索引时,如果没有正确检查整数边界,可能会导致溢出。
二、漏洞利用技术漏洞利用是指攻击者利用系统或应用程序中的漏洞,通过注入恶意代码或执行特定操作来获取权限或控制目标系统。
以下是一些常见的漏洞利用技术:1. Shellcode注入:攻击者可以通过利用缓冲区溢出等漏洞,将恶意代码注入到目标系统的内存中。
一旦成功注入,攻击者就可以通过控制指令来执行恶意操作。
2. Return-Oriented Programming(ROP):ROP是一种高级漏洞利用技术,通过利用程序中的已存在的代码段(Gadget)来执行恶意操作。
攻击者通过构造特定的ROP链,在不添加新代码的情况下,利用程序中的现有代码来完成攻击目标。
3. 格式化字符串攻击:攻击者可以通过构造恶意格式化字符串,利用格式化字符串漏洞来读取或修改内存中的数据。
这种技术通常用于泄露内存中的敏感信息或执行特定操作。
C语言中常见的安全漏洞及防范方法C语言作为一种广泛应用于系统开发和嵌入式设备的编程语言,虽然具有高效性和灵活性,但在安全性方面却存在一些常见的漏洞。
本文将介绍C语言中常见的安全漏洞,并提供相应的防范方法。
一、缓冲区溢出漏洞缓冲区溢出是C语言中最常见的安全漏洞之一。
当程序试图向一个已经装满数据的缓冲区写入更多的数据时,就会导致缓冲区溢出。
攻击者可以利用这个漏洞来修改程序的执行流,执行恶意代码或者获取敏感信息。
防范方法:1. 使用安全的函数:应该使用安全的函数,如`strncpy`、`snprintf`等,而不是不安全的函数`strcpy`、`sprintf`等。
安全的函数会检查数据长度,避免发生缓冲区溢出。
2. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据不会超出缓冲区的长度。
3. 使用堆栈保护技术:可以使用堆栈保护技术,如栈溢出检测、堆栈随机化等,在一定程度上提高程序对缓冲区溢出漏洞的防护能力。
二、格式化字符串漏洞格式化字符串漏洞是由于未正确使用格式化字符串函数(如`printf`、`sprintf`等)导致的安全问题。
当攻击者能够控制格式化字符串的参数时,就可能导致信息泄露或者任意代码执行。
防范方法:1. 限制格式化字符串的输入:应该限制用户输入的格式化字符串,确保输入的格式化字符串参数是合法且不含恶意代码。
2. 使用安全的格式化函数:使用安全的格式化函数,如`snprintf`等,这些函数会检查参数的有效性,避免格式化字符串漏洞的发生。
3. 程序审计:对于已经存在的代码,应进行定期的程序审计,识别和修复潜在的格式化字符串漏洞。
三、整数溢出漏洞整数溢出漏洞是由于未对输入数据进行正确的检查和验证,导致整数值超出其数据类型范围,从而引发安全问题。
攻击者可以利用这个漏洞来改变程序的行为,执行未经授权的操作。
防范方法:1. 输入验证:对于用户输入的数据,应该进行输入验证,确保输入的数据范围在合理的范围内。
漏洞检测是什么原理的应用1. 什么是漏洞检测漏洞检测是一种通过对软件、应用程序、系统或网络进行分析和扫描,以发现其中存在的安全漏洞的过程。
漏洞检测旨在识别和修复这些漏洞,以提高系统的安全性和保护用户的信息免受潜在的攻击。
2. 漏洞检测原理漏洞检测是基于以下原理进行的:2.1 漏洞分类漏洞可以分为以下几类:•输入验证漏洞:没有对用户输入进行正确的校验和验证,导致恶意用户可以输入恶意代码或数据。
•身份验证和授权漏洞:存在安全性较弱的身份验证和授权机制,导致未经授权的用户可以访问敏感信息或操作系统功能。
•配置错误漏洞:配置错误或不当的设置,使得系统容易受到攻击。
•缓冲区溢出漏洞:向缓冲区输入超过其容量的数据,导致覆盖了相邻内存的内容,攻击者可以利用这个漏洞执行恶意代码。
•SQL注入漏洞:未正确过滤或转义用户输入的SQL语句,导致攻击者可以篡改数据库查询,获取敏感数据或控制数据库。
•XSS(跨站脚本)漏洞:未对用户提交的数据进行正确的过滤和转义,导致攻击者可以在受害者的浏览器中执行恶意脚本。
2.2 漏洞检测方法漏洞检测可以采用以下几种方法:•主动扫描:使用特定的工具和技术对目标系统进行扫描,识别其中存在的漏洞。
•剖析:对目标应用程序进行代码审查,查找其中潜在的漏洞。
•模糊测试:向目标系统发送异常或非预期的输入数据,观察系统的反应和可能的错误行为。
•入侵检测系统(IDS):部署一种监视网络流量并检测潜在攻击的系统,以及响应和报告发现的漏洞。
•漏洞利用:利用已知的漏洞和攻击向量,验证目标系统的安全性并识别其中存在的漏洞。
2.3 漏洞修复在发现漏洞后,漏洞修复是必不可少的一步。
修复漏洞的方法可能包括:•补丁和更新:安装供应商提供的安全补丁和更新,以修复已知的漏洞。
•配置改进:修改系统和应用程序的配置,以提高安全性并减少攻击面。
•代码修复:对应用程序代码进行修改,修复发现的漏洞并增加安全性。
•代码审查:对应用程序代码进行全面的审查,发现并修复潜在的漏洞。
硕士学位论文COM组件栈缓冲区溢出漏洞检测技术研究学位申请人:学科专业:计算机软件与理论指导教师:答辩日期:A Dissertation Submitted to Huazhong University of Science andTechnology for the Degree of Master of EngineeringThe Research on stack buffer overflow detection of COM component Candidate : Zhang ChaoMajor : Computer Software and TheorySupervisor : Prof. Lu YanshengHuazhong University of Science and TechnologyWuhan 430074, P.R.C.January, 2007独创性声明本人声明所呈交的学位论文是我个人在导师指导下进行的研究工作及取得的研究成果。
尽我所知,除文中已经标明引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的研究做出贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到,本声明的法律结果由本人承担。
学位论文作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,即:学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权华中科技大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
保密□ ,在_____年解密后适用本授权书。
本论文属于学位论文作者签名:指导教师签名:日期:年月日日期:年月日华中科技大学硕士学位论文摘要为了解决软件复用,缩短软件开发时间,降低维护成本和实现程序动态升级,软件设计领域产生了组件化程序设计结构,并且日益成为发展趋势。
数据库安全漏洞的检测与修复技术数据库作为企业重要的数据管理工具,承载着大量敏感信息,如用户个人数据、财务数据等。
然而,由于设计缺陷、配置错误或代码漏洞等原因,数据库可能存在安全漏洞,给企业带来巨大的风险。
因此,在数据库管理过程中,对数据库安全漏洞的检测与修复尤为重要。
下面将介绍数据库安全漏洞的常见类型以及相应的检测与修复技术。
常见的数据库安全漏洞类型包括:弱口令、注入漏洞、权限控制漏洞、备份与恢复不当、缓冲区溢出等。
针对这些漏洞,有以下几种常见的检测与修复技术:1. 弱口令检测与修复:弱口令是指密码容易被猜解的情况,例如使用常见的密码、使用与用户名相同的密码等。
为了检测弱口令,可以采用密码破解工具对数据库进行密码爆破,尝试各种常见的密码组合。
修复弱口令漏洞的方法包括:要求用户设置复杂的密码,使用密码策略限制密码规则;定期强制用户更换密码;锁定多次登录失败的账户等措施。
2. 注入漏洞检测与修复:注入漏洞是指攻击者通过输入恶意代码或命令来修改数据或获取权限的漏洞。
常见的注入漏洞类型包括SQL注入和命令注入。
针对SQL注入,可以通过输入特殊字符或具有恶意意图的语句来测试系统是否存在漏洞。
修复注入漏洞的方法包括使用参数化查询、输入验证、过滤特殊字符和编码敏感数据等措施。
3. 权限控制漏洞检测与修复:权限控制漏洞是指数据库中存在的未经授权或者错误配置的权限问题,攻击者可以利用这些漏洞来获取敏感数据或篡改数据。
检测权限控制漏洞可以通过对数据库访问权限的审计和分析。
修复权限控制漏洞的方法包括限制用户访问权限、修改公共资源的默认权限、实施最小权限原则等措施。
4. 备份与恢复不当检测与修复:当数据库备份不完整、不定期备份或备份存储不安全时,会造成数据丢失或泄露的风险。
通过检查备份策略和备份数据的完整性,可以发现备份与恢复不当的漏洞。
修复备份与恢复不当的方法包括定期进行完整备份、使用加密方式保护备份数据、制定恢复策略等。
一、实验目的及要求1. 了解缓冲区溢出攻击的原理和类型。
2. 掌握缓冲区溢出攻击的实验方法和步骤。
3. 理解缓冲区溢出攻击的危害性。
4. 学习防范和避免缓冲区溢出攻击的方法。
二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 漏洞利用工具:Metasploit4. 实验环境搭建:使用虚拟机软件(如VMware)搭建实验环境,靶机为Windows 7 SP1,攻击机为Kali Linux。
三、实验内容1. 漏洞分析:分析实验环境中存在的缓冲区溢出漏洞。
2. 攻击实现:利用Metasploit工具对靶机进行攻击,实现远程代码执行。
3. 防御措施:学习防范和避免缓冲区溢出攻击的方法。
四、实验步骤1. 漏洞分析- 使用Ghidra工具对实验环境中的漏洞程序进行反汇编,分析程序中的缓冲区溢出漏洞。
- 发现漏洞程序存在缓冲区溢出漏洞,攻击者可以通过输入超长字符串来覆盖返回地址,从而控制程序的执行流程。
2. 攻击实现- 使用Metasploit工具中的`exploit/multi/handler`模块,设置攻击目标为靶机的IP地址和端口。
- 使用`set payload`命令设置攻击载荷,选择`windows/x64/meterpreter/reverse_tcp`,该载荷可以在攻击成功后与攻击机建立反向连接。
- 使用`set LHOST`命令设置攻击机的IP地址,使用`set LPORT`命令设置端口号。
- 使用`set target`命令设置攻击目标,选择漏洞程序的模块和参数。
- 使用`exploit`命令启动攻击,等待攻击成功。
3. 防御措施- 代码审计:对程序进行代码审计,及时发现并修复缓冲区溢出漏洞。
- 输入验证:对用户输入进行严格的验证,限制输入长度,防止输入超长字符串。
- 边界检查:在代码中添加边界检查,防止缓冲区溢出。
- 安全编程:遵循安全编程规范,使用安全的编程语言和库,避免使用存在漏洞的函数。
安全测试中的缓冲区溢出漏洞检测在安全测试中,缓冲区溢出漏洞是一个重要的检测点。
本文将介绍什么是缓冲区溢出漏洞以及如何进行其检测。
一、什么是缓冲区溢出漏洞缓冲区溢出漏洞是指当程序在向一个缓冲区写入数据时,超过了该缓冲区的容量,导致数据溢出到相邻的内存区域。
攻击者可以通过利用这种溢出,覆盖控制数据、篡改程序逻辑,甚至执行恶意代码,从而导致系统崩溃、数据泄漏等严重后果。
二、缓冲区溢出漏洞检测方法1. 静态代码分析静态代码分析是一种通过分析源代码或可执行文件的方法,来查找可能存在的漏洞。
在缓冲区溢出漏洞检测中,静态代码分析可以通过识别潜在的缓冲区溢出点以及对应的输入来进行检测。
一些静态代码分析工具可以检测出一些明显的溢出漏洞,如strcpy、strcat等函数的使用。
但是,对于复杂的缓冲区溢出漏洞,静态代码分析往往无法完全覆盖,因此需要结合其他方法进行检测。
2. 动态测试动态测试是通过观察和控制程序的执行来检测漏洞。
在缓冲区溢出漏洞检测中,常用的动态测试方法是输入模糊测试(fuzzing)。
输入模糊测试通过构造各种异常输入来触发程序的潜在漏洞,其中就包括缓冲区溢出。
通过不断尝试大量的输入组合,可以增加发现溢出漏洞的概率。
3. 符号执行符号执行是一种通过符号代替具体输入值,对程序进行路径覆盖分析的方法。
在缓冲区溢出漏洞检测中,符号执行可以通过生成多个具有不同特征的符号输入,来探索程序可能存在的漏洞路径。
基于符号执行的漏洞检测工具如KLEE可以在一定程度上检测缓冲区溢出漏洞。
4. 模糊测试模糊测试是在动态测试中的一种常用方法。
通过模拟攻击者向程序输入异常数据,如大量随机字符、特殊字符等,来触发潜在的漏洞。
对于缓冲区溢出漏洞的检测,模糊测试可以通过构造各种边界情况的输入数据,来发现程序对于异常输入的处理是否存在问题。
三、缓冲区溢出漏洞检测的挑战缓冲区溢出漏洞检测面临一些挑战,包括以下几个方面:1. 多种编程语言和平台缓冲区溢出漏洞可能存在于多种编程语言和平台中,例如C、C++、Java等。
软件安全课程实验报告
实验二缓冲区溢出漏洞分析与验证
一、实验内容
1)本课程实验研究对象是一个Web服务器zookws,该服务器上运行一个Python的web应用zoobar,web用户之间转移一种称为zoo
bars的货币,分析web服务器的逻辑,寻找缓冲区溢出漏洞并触
发该漏洞;
2)实验环境为Ubuntu,在VMware Player虚拟机中的vm-6858运行,系统有两个账号:
root:口令6858,用来安装软件
httpd:口令6858,运行服务器和实验程序
二、实验预备
1.运行ifconfig查看ip
2.远程ssh连接
3. make编译程序
4.启动服务器
5.用浏览器访问zook服务
6.用ps命令查看当前运行的进程
三、寻找漏洞
1.实验缓冲区利用的是strcpy的缓冲区漏洞,找到代码中是否有strcpy,找到了,在dir_join中。
四、触发漏洞
1.打开服务器,启动web
2.那么就可以将原来分配的1024字节大小的缓冲区进行溢出,将请求的路径设
置很长,要超过1024,达到将代码覆盖的效果。
3.漏洞利用结果
五、实验分析与总结
这次实验让我们亲身经历了一次代码审计及缓冲区漏洞利用的过程,实验很有意思,学到的知识也非常的多,通过代码审计,在脑中便利可能的漏洞利用点,然后找出漏洞,并通过shell脚本利用漏洞来进行缓冲区溢出攻击,可以深刻的了解缓冲区漏洞的原理,在以后的审计代码中,会留意,在自己编写程序时,也会避免使用危险函数。
漏洞发掘与缓冲区溢出检测技术赵鑫北京邮电大学信息工程学院,北京(100876)E-mail:jarious@摘要:本文通过分析缓冲区溢出发生的原理和一般利用过程,并结合漏洞发掘技术,提出了缓冲区溢出的几种检测方法,即通过进行缓冲区边界检查和指针完整性检查,并辅以攻击数据行为检测和编写正确的代码,来达到检测缓冲区溢出的目的。
这几种方法可以有效地检测缓冲区溢出问题,从而避免缓冲区溢出带来的危害。
关键词:缓冲区溢出,漏洞发掘,安全中图分类号:TP3931.引言一般来说,漏洞(Vulnerability)是指系统或应用程序存在的某种未曾预料到的未授权、不安全状态,它的出现往往是由于某些编程、配置或操作上的缺陷(Flaw)以及一些特定的条件引起的,攻击者往往需要构造条件,利用这些缺陷,使系统或应用程序由正常状态进入该状态,从而破坏正常的安全机制。
缓冲区溢出漏洞利用技术主要是从溢出点与Shellcode技术两部分来进行研究。
那么,缓冲区溢出漏洞检测技术就可以分别针对这两个方面展开。
针对溢出点主要采取的是缓冲区边界检查及指针完整性检查,而攻击数据特征检测则主要针对Shellcode。
2.缓冲区溢出漏洞原理缓冲区是程序运行的时候机器内存中的一个连续块,它可以在栈(stack)、堆(heap)或未初始化数据段(bss)中。
正常情况下,系统将数据存放在其分配好的一定大小的一段缓冲区内,若存在某些编程错误,使得攻击者可以通过控制该缓冲区或其它缓冲区内的数据,来控制程序流程,从而达到攻击目标,称该漏洞为缓冲区溢出漏洞,称这样的攻击为缓冲区溢出攻击。
就目前的发展情况来看,缓冲区溢出攻击一般分为基于栈(stack-based)的缓冲区溢出攻击与基于堆(heap/bss-based)的缓冲区溢出攻击。
在进程的内存空间中,栈(stack)起到了保存有关当前函数调用上下文的容器的作用。
许多内容都可能进入栈空间,其中包括:函数的非静态局部变量值、堆栈基址、当函数返回时程序应该跳转到的返回地址以及传递到函数中的参数等,其结构如图1所示。
图1 函数栈空间结构当程序员编写程序时出现边界检验错误,不限制写入buffer中内容的长度时,就会出现由于写入内容过多,导致缓冲区溢出,堆栈结构被破坏。
结果,可能引起程序运行失败,产生严重的系统崩溃,也可能由于精心构造的字符串,而使得返回地址被某个设计好的地址覆盖,改变程序运行路径,执行攻击者设置的其它指令。
这种边界检查错误多发生在调用一些字符串或内存拷贝函数时,如在C/C++语言编写的程序中使用strcpy、strcat、sprintf、vspritnf、memcpy等函数,而不限制拷贝字符数目。
3.漏洞发掘技术目前,漏洞发掘主要采用的方法有黑盒测试,补丁比对,静态分析、动态调试等几种方法。
这些技术都不完备,各有其优缺点,在漏洞发掘过程中往往需要相互补充。
安全漏洞属于软件缺陷的一个子集,软件测试技术是漏洞发掘中的一项重要技术。
黑盒测试是软件测试技术中的一种重要手段,已经发展了很多年,理论比较成熟。
通过测试输入非常规的命令行参数、交互时的输入、环境变量等数据来触发潜在的安全漏洞,成功的标志是导致有溢出漏洞的程序异常退出。
在Linux系统上通常的出现“段错误”的提示信息,在Windows系统下通常弹出出错对话框。
不过,黑盒测试无法真正理解程序的流程,而且,在没有产品详细功能介绍的条件下,面对太多的可能情况,黑盒测试很难把目标的问题全部暴露出来。
补丁比对方法对于开源的软件比较方便,通过直接比较补丁文件与源文件代码,就可以很快的确定漏洞代码出现的位置。
但对于大多数不开源的软件来说,只能通过反汇编来比较二进制的补丁文件,但往往源程序作些许改动,经过编译得到的汇编程序就会有很大改动,这样从反汇编文件中就很难看出真正关键的改动。
目前,补丁比对的工具比较多,比较常用的有:UltraCampare、examdiff、gvim。
但它们对于较大的文件一般都无法处理。
静态分析中,目前发展比较成熟的是基于源码的静态分析,它能检查包括缓冲区漏洞、格式化字符串、竞争条件等常见的安全问题。
这些工具的基本原理是将源代码与有漏洞的特征代码进行比对,是建立在文本分析的方法上。
其分析结果准确性较低,只能作为参考。
而基于反汇编的静态分析技术主要是基于IDA Pro的脚步挖掘技术。
IDA Pro强大的反汇编功能对于分析反汇编代码有很大帮助,同时,它还提供IDC自动化脚本功能。
IDC是IDA Pro 提供的类似于C语言的脚本语言,程序的开始点同样是main函数。
IDA Pro提供给IDC的内置函数可以深入到程序的流程和指令的分析,甚至可以直接模拟芯片指令对程序进行模拟计算。
对于动态调试,主要的目标就是跟踪程序流程,查看进程或线程堆栈的利用情况,查看关键函数的调用情况等。
大多数的调试器都提供跟踪程序流程的功能,如,在Windows下,SoftICE的,Ollydbg的,另外一些虚拟机,如bocus,也提供跟踪程序流程的功能。
在Linux 系统下,主要是利用ptrace系统调用。
但这些工具的问题在于,无法自定义跟踪,只能不分主次所有的执行语句都记录,这样跟踪数据就会很大,甚至可以说是海量的,从中难找到关键的信息,另外运行速度也是一个很大的问题。
4.缓冲区溢出检测技术缓冲区溢出漏洞的主要检测方法是缓冲区边界检查和指针完整性检查法。
缓冲区边界检查的出发点在于只要缓冲区不能被溢出,溢出攻击也就不可能实现了,所以它通过检测每次对缓冲区的读写操作有没有超过缓冲区边界来防止缓冲区溢出。
而指针完整性检查则是检测指针内容有没有被破坏,而不去预先阻止。
当检测到指针内容被修改后,再决定如何处理。
有些方法是提示出错,有些是做纠错处理,使程序正常继续。
这两种方法主要都是基于编译器实现的,核心的思路都是对返回地址或函数指针作一定的处理,来达到目标。
4.1 缓冲区溢出边界检查缓冲区边界检查中一个比较重要的技术是引用对象(referent-object)技术[1]。
这种技术的主要出发点是任何由界内指针计算得到的地址都与原指针对应同一个引用对象(即某个缓冲区对象)。
因此,其设计思路是建立一个缓冲区对象表,记录每一个静态、堆或栈缓冲区对象的基地址和缓冲区长度。
判断一个由界内指针计算而得的地址是否在界内,首先搜索对象表,得到界内指针对应的参考对象,然后根据其基地址及长度判断当前地址是否在参考对象规定的范围内。
这种方法可以对栈、堆及BSS段的缓冲区边界进行检查。
它采取了红黑树(Red/Black Tree)的方法来存储缓冲区对象,因为它的性能可以达到O(logn),比一般的二叉树要好。
另外,在每一个分配的堆缓冲区前加一个特殊结构的数据meta data以便于在缓冲区对象表中实现插入、删除操作。
它使用“目标代码插入”技术,对程序每次的内存访问操作都插入一段检测指令。
所以它不仅可以检测缓冲区溢出,也可以检查一般的内存泄漏等问题。
通过用这种方法检查,可执行代码在执行的时候数组的所有引用来保证其合法性。
4.2 指针完整性检查指针完整性检查技术是在栈的返回地址后加一个附加结构,称为“canary”。
如果有溢出攻击,“canary”就会被破坏,从而就会发现有攻击存在。
为了避免“canary”被攻击者伪造,设计者设计了两种生成“canary”的方法。
一种是利用在C语言中的终止符号,如0(null),CR,LF,-1(EOF)等不能在常用的字符串函数中使用的符号,因为这些函数一旦遇到这些终止符号,就结束函数过程了。
另一种是利用随机符号,用一个在函数调用时产生的一个32位的随机数来实现保密,使得攻击者不可能猜测到附加字节的内容。
而且,每次调用,附加字节的内容都在改变,也无法预测。
Stack Guard是针对栈返回地址溢出攻击的,而Point Guard则是在所有的指针后都加了“canary”,这样就可以面向所有的缓冲区溢出攻击[2]。
它是通过在函数调用时保存返回地址的值,在函数返回时比较当前返回地址的值与预先保留的值,如果不相同说明有溢出攻击。
它可以检测基于栈内返回地址的溢出攻击[1]。
4.3 攻击数据行为检测这种方法主要是从Shellcode的角度来检查溢出攻击。
一般来说,远程缓冲区溢出攻击需要传输大量的数据,以便将Shellcode植入目标主机,因此可以通过检测输入数据,并对其进行分析,来判断是否有攻击存在。
这种方法与入侵检测系统的设计思路是相同的,在实现上也多依赖于入侵检测系统。
分析输入数据是检测的核心,方法有很多,主要有建立攻击数据签名特征[3],利用沙盒(sandbox)模拟运行攻击代码[4]等。
4.4 编写正确的代码这是从程序员的角度,也是从源头避免缓冲区溢出的最根本的方法。
编写正确的代码是一件非常有意义但耗时的工作,特别象编写C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。
尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。
毕竟再优秀的程序员也会有犯错的时候,因此人们开发了一些工具和技术来帮助程序员编写安全正确的程序。
最简单的方法就是用grep来搜索源代码中容易产生漏洞的库的调用,比如对strcpy和sprintf的调用,这两个函数都没有检查输入参数的长度。
事实上,各个版本C的标准库均有这样的问题存在。
另外,静态分析工具也是程序开发人员检测缓冲区溢出的很有用的工具。
不过,由于开发时间、代码规模或其它原因,不一定所有的代码都能被检测到,同时对于已经存在的程序,还需要有其它的工具来检测和防范缓冲区溢出漏洞。
所有的缓冲区溢出漏洞都源于C语言缺乏类型安全。
如果只有类型-安全的操作才可以被允许执行,这样就不可能出现对变量的强制操作。
如果作为新手,可以推荐使用具有类型-安全的语言如Java和ML。
但是作为Java执行平台的Java虚拟机是C程序,因此通过攻击JVM的一条途径是使JVM的缓冲区溢出。
因此在系统中采用缓冲区溢出防卫技术来使用强制类型-安全的语言可以收到意想不到的效果。
4.5 不可执行的缓冲区这是从操作系统的角度来实现的预防缓冲区溢出攻击的手段。
通过使被攻击程序的数据段地址空间不可执行,从而使得攻击者不可能执行被殖入被攻击程序输入缓冲区的代码,这种技术被称为非执行的缓冲区技术。
事实上,很多老的Unix系统都是这样设计的,但是近来的Unix和Windows系统由于实现更好的性能和功能,往往在在数据段中动态地放入可执行的代码。
所以为了保持程序的兼容性不可能使得所有程序的数据段不可执行。
另外,有些攻击是直接利用C中的库函数或其它的系统调用来进行的,所以这种方法对这些攻击都是无效的。