一个unsigned和signed的漏洞
最近有一段时间没有写博客了,一直在刷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层出不穷,所以非必要还是统一有符号整数比较好。

浙公网安备 33010602011771号