您的位置:首页 > 其它

一个unsigned和signed的漏洞

2015-05-22 21:42 148 查看
  最近有一段时间没有写博客了,一直在刷CSAPP,今天在chapter2看到了一个有趣的小故事,特来分享。

  在FreeBSD中的getpeername库中,有以下一段C代码(简化后)

  

void memcpy(void *dest,void *src, size_t n);
#define KSIZE 2014
char kbuf[KSIZE];

int copy_from_kernel(void *user_dest, int maxlen){
int len=KSIZE<maxlen?KSIZE:maxlen;
memcpy(user_dest, kbuf, len);
return len;
}


  这段程序的意思是把内核中的部分内容复制到一个面向用户的数组里面。

  而当年的程序员忽略了size_t在C中定义为无符号整数,如果输入maxlen为负数的话,则maxlen作为形参传入memcpy中的时候会成为一个非常大的无符号整数,从而造成内核崩溃和溢出攻击。

  因为无符号和符号数之间的转换造成的bug层出不穷,所以非必要还是统一有符号整数比较好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐