var
来源:景安IDC资讯作者:server发布时间:2015-05-27点击:1998
缓冲区溢出攻击充分利用了应用程序源代码中的编程错误,即缓冲区大小,不足以容纳复制进它的数据,因此使用术语溢出表示毗邻的内存位置被覆写。对基于栈的缓冲区溢出来说,一次攻击的攻击将覆写函数的返回地址(该地址位于栈中)以使它指向由攻击者提供的代码,并由此使得攻击者可以控制此后进程的执行。另一种类型的缓冲区溢出攻击针对的是从堆中动态分配的内存区域。
缓冲区溢出漏洞通常是由于不当使用那些不能实现自动边界检查的库函数而引入C或c++应用程序的。这类函数包括strcpy()、strcat()、sprlntf()、gets()和scanf()。对通过malloc()和calloc()这样的函数从堆中分配的内存区域管理不善也会产生缓冲区溢出漏洞。
对于基于网络的攻击来说,并没有一种通用的方法来检测缓冲区溢出攻击。但对于通过加密通道传输数据的应用程序来说,如果一个攻击使用50个未加密的字符A填充一个缓冲区,那么这个行为将非常值得怀疑。(加密协议通常不会反复地发送同一个字符。)
如果这种攻击方式确实存在,并且它还被其他攻击方式在底层广泛地使用,我们就值得为查找这种行为添加一个iptables规则。例如,下面的规则针对的是SSL通信。请注意以一连串字符A所表示的字符申:
[iptablesfw]#iptables -I FORWARD 1 -p tCp --dPort 443 -m state --state
ESTABLISHED-mstring--string"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" -j LOC --log-prefix "SSL OVERFLOW"
因为攻击代码可以将填充字符A改变为任何其他字符,所以只需对攻击代码做出微小的修改就可以很容易地规避上面规则的检查。但有时候攻击代码是被一些自动化的蠕虫所使用,这些蠕虫并不会随意修改代码,所以上述策略在某些情况下还是很有效的。
Snort签名集中包含许多针对溢出攻击的签名,但这些签名通常在检测攻击时并不需要看到具体的填充字节。有时候,只需检查为某个特定应用程序所提供的参数长度就足以判断这是否是一次溢出攻击了。例如,下面的签名针对的是FTP服务器中chown命令的溢出攻击,它查看在一次FTP会话中,chown命令后跟随的数据是否至少有100个字节长。
虽然iptables不支持正则表达式引擎(否则我们就可以将上面以粗体字显示的pcre条件直接表达为一个iptables规则),但我们可以产生一个效果近似于这个Snort签名的iptables规则。例如,下面的iptables规则搜索site和chown字符串,并使用length匹配来搜索至少140个字节长的数据包。(这么做是因为length匹配开始于网络层首部而不是应用层,所以其中有20字节对应的是IP首部,20字节对应的是TCP首部)。
版权声明:本文系技术人员研究整理的智慧结晶,转载勿用于商业用途,并保留本文链接,侵权必究!