初遇缓冲区溢出攻击

初遇缓冲区溢出(Stack Buffer Overflow)攻击



那天晚上,某种业务有好几个服务端进程在短时间内崩溃了。

同事上去看了,发现都是在处理来自同一个地方东莞的同一个IP地址过来的请求时发生core dump。

恩,诡异,当时我们先跟运维同事联系,在该业务的几个服务器上 临时紧急禁掉该IP的连接。


我也上去看了,用GDB查看core文件。看了trace back基本上知道,都是在处理某个类型的消息请求时出的问题。再查看了一下当时的一些临时变量,然后明白了。

接收到客户端发来的这种类型的请求消息后,进入处理函数。 服务端会根据请求消息中的一个字段 ,做某种计算,计算的结果放到一个函数中声明的长度为100的数组。

计算的结果的长度和请求消息中的字段的长度有关,请求消息中的数据越长,计算结果越长。

调试器中显示,当时计算结果有576个字节,显然长度为100字节的数组装不下(正常客户端发的都不会超过这个长度), 导致栈空间被胡写.... 


这不就是经常听说的缓冲区溢出攻击吗? 只要它重写了该函数本次调用的返回地址,就可以返回后执行攻击者的代码。而服务端进程基本都以root权限运行,所以这样攻击者可以做很多事情。


不过还好,正因为缓冲区溢出很经典,C/C++先驱们也有了一些对策。GCC编译器做了Stack-Smashing Protector 机制,在单字节数组后插入一些金丝雀(Canary, 因为大家在矿井作业时,会用金丝雀来预警,如果金丝雀死了,那证明有毒气),如果canary被改掉,在函数执行完成返回之前会检查一下Canary,发现被篡改则不再继续执行,中止程序,避免执行攻击者的代码。


所以我们的程序出现这个log:

“*** stack smashing detected ***

并且进程崩溃掉了,证明GCC的保护起作用了。缓冲区溢出攻击没有得逞。


GCC编译器的Stack-Smashing Protector 机制由编译选项-fstack-protector(或-fstack-protector-all)来开启,在那之前我们并没有刻意增加这个编译选项,幸好Ubuntu linux默认是打开-fstack-protector选项的。

http://soc.if.usp.br/doc/gcc-4.1-doc/gcc.html

 On Ubuntu the default is -fstack-protector, to turn it off use -fno-stack-protector


事后,增加简单的长度检查就可以修复这个问题。因为这个代码来自服务区比较公用的一个基本库,所以我猜测其他和客户端直接连接的服务端进程也存在类似问题。虽然邮件抄送给大佬,不过没引起重视,不久之后其他组果然也发现类似问题.....


其实,平时在代码中有访问数组的地方,可以多考虑边界检查,从编程规范上预防类似问题。



-------------------------------------------------------------------------------------------------

更多博文请订阅RSS,更多微博请关注@千里孤行Nerd



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值