首页
社区
课程
招聘
[讨论]谁能准确地说出下面代码中存在什么严重漏洞?
2008-11-20 19:42 6374

[讨论]谁能准确地说出下面代码中存在什么严重漏洞?

2008-11-20 19:42
6374
最近,我在Windows Server中又挖到了一处新的漏洞,通知给微软的同时,觉得这个该漏洞代表了程序员编码过程中普遍忽略了的一类安全问题(至少我在写程序的时候很少会注意到这种问题(有点掉大家胃口))。分享一些写安全代码的经验,毕竟从别人的跟头里学习经验的开销比自己载跟头才学习的开销低。于是试着把这个新漏洞的问题抽象成了下面的程序,考考大家的眼力,看看大家能不能一眼看出漏洞出现在什么位置,什么条件下会引发问题?(高手可以自动飘过)
注意只有input从外界报文获取。

char* hello(unsigned input){
      char hello[] = "hello,baby!bala bala bala bala!\n";
      char *buffer;

      unsigned int hellosize = strlen(hello);
      unsigned int bufsize = hellosize*4 + 1;

      if ( (hellosize*input) > bufsize)
              return NULL;

      buffer = new char[bufsize];
      memset(buffer,0, bufsize);

      for (unsigned int i = 0; i<input; i++){
              strcpy( buffer + i*hellosize, hello);
      }
      return buffer;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 2108
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 6 2008-11-20 20:11
2
0
莫非说的是整数溢出的事???

当input是一个很大的数导致hellosize*input超过了unsigned int的范围时发生整数溢出

由此引起缓冲区溢出。

以前就有人公布过这种漏洞,不过那是个短整数溢出导致缓冲区溢出的情况。不过道理是一样 。
雪    币: 231
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
说爱我 2008-11-20 20:24
3
0
unsigned int hellosize = strlen(hello);
      unsigned int bufsize = hellosize*4 + 1;

新手。
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
icersg 2008-11-20 21:00
4
0
同意2楼的。
单说楼主的这个例子,既不能控制覆盖内容,又没办法控制覆盖的范围,只能让程序垮掉,不能利用吧?有人能针对楼主的程序利用一下吗?
雪    币: 2108
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
书呆彭 6 2008-11-20 21:14
5
0
楼主大概是说他找到了个整数溢出的漏洞,已经报告给MS了。

至于上面那个例子,就是为了说明有”整数溢出“这样的漏洞的。

我看见过的一个公布的真实的整数溢出漏洞是网络服务中的,可以远程溢出,其危险程度无比大,还好那是很久之前的漏洞了。不知道楼主这次又挖掘出哪个服务中的漏洞了。。。
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2008-11-20 21:34
6
0
函式名称跟变量名称同名 ?
雪    币: 22
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
supermilg 2008-11-21 17:02
7
0
感谢大家的讨论,和楼上说的一样,我希望告诉大家的是警惕整数溢出。问题最初出现在下面的这个判断语句:
if ( (hellosize*input) > bufsize)
我想大家一定经常会写,通常我们容易忽略乘法带来的整数溢出,一旦整数溢出,这个条件就会被Bypass,导致后面的strcpy过量拷贝。

我程序只是抽出MS程序员犯的实质错误,这个错误位于一个打了多次补丁的系统服务中,当然,这个函数也相当复杂,不是那么容易像这个程序一样一眼就看出来的。这次发现的这个漏洞也很严重,因为通常整数溢出都会带来堆溢出或栈溢出。

事实上,建议大家看看CVE 2007年的一份漏洞统计报告,关于整数溢出产生的漏洞数量已经排到第三位,成为软件漏洞的第三大来源。因此大家写代码一定要警惕又警惕。一不小心就会踩地雷呀!
雪    币: 22
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
supermilg 2008-11-21 17:03
8
0
》》函式名称跟变量名称同名 ?

确实好像我的程序写得有问题,谢谢提醒,哈哈,我还真没注意到!
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
feix 2009-1-23 10:04
9
0
不错。提倡多发表一些关于安全代码的文章。
游客
登录 | 注册 方可回帖
返回