内存溢出攻击,又称缓冲区溢出攻击,是指恶意攻击者将超过实际缓冲区的大小写入正常程序的缓冲区,导致缓冲区溢出的行为。利用程序本身的弱点破坏正常的堆栈结构,使程序偏离正常的执行轨迹,从而达到攻击者的目的。缓冲区溢出的根本原因是C语言本身的不安全性。一方面,数组的边界或指针的使用没有限制。另一方面,C语言库函数中有许多函数可以导致缓冲区溢出,如strcpy、mallo、csprintf等。
缓冲区溢出分为栈溢出、堆溢出等。CiscoIOS是Cisco为其路由交换设备开发的商业软件,不开源,是二进制ELF文件。目前,二进制代检测码内存溢出攻击的方法主要有两种,即静态分析和动态分析。静态分析使用的主要技术包括词法分析、约束解释、抽象解释和类型检查,以及定理证书、模型检测和验证等技术。主要特点是在程序不执行的情况下检测安全威胁,代码覆盖率高。但静态分析无法处理间接跳转过程,无法实时获取寄存器和内存运行时的信息,导致静态分析误报率和漏报率较高。
动态分析技术是对程序在动态运行过程中的行为进行监控和分析,以发现运行过程中的安全威胁。由于是在程序执行过程中对安全威胁的检测,具有检测结果准确、误报率低的优点。动态分析技术主要包括污点分析、符号执行和模糊测试(fuzzing)等,其中符号执行和fuzzing技术主要用于软件漏洞挖掘,污点分析主要用于攻击行为的检测。根据分析的数据粒度,动态污点分析技术可分为粗粒度动态污点分析技术和细粒度动态污点分析技术。粗粒度污点分析一般用于攻击检测,细粒度污点分析主要用于程序脆弱性发现。粗粒度污点分析具有速度快、占用空间小的优点,适合跟踪判断攻击过程中的数据流是否有问题;细粒度污点分析具有分析精度高的优点,但空间消耗相对较大。本文从提高攻击检测效率出发,采用粗粒动态污点分析技术检测CiscoIOS攻击行为。