C数据类型引发的安全隐患

来源:互联网 发布:淘宝店铺链接怎么弄 编辑:程序博客网 时间:2024/05/04 09:12

来自于对《深入理解操作系统》的笔记整理


2002年从事FreeBSD的开源操作系统的getpeername函数简化后如下:


void *memcpy(void*user_dest,void*src,size_t n);#define KSIZE 1024char kbuf[KSIZE];int copy_from_kernel(void*user_dest,int maxlen){    int len=KSIZE<maxlen?KSIZE:maxlen;    memcpy(user_dest,kbuf,len);    return len;}
copy_from_kernel函数是要将一些操作系统内核维护的数据复制到
指定的用户可以访问的存储区域。对于用户来说,大多数内核维护的数据结构是不可以读的
因为这些数据结构可能包含其他用户和系统上运行的其他作业的敏感信息,但是kbuf的区域是用户
可以读的。参数maxlen给出的是分配给用户的缓冲区的长度,这个缓冲区是用参数user_dest指示的
”int len=KSIZE<maxlen?KSIZE:maxlen;“该语句确保复制的字节数据不会超出源或者目标缓冲区可用范围。

不过,假设有些怀有恶意的程序员在调用copy_from_kernel的代码的时候对maxlen使用了负数值
,那么,”int len=KSIZE<maxlen?KSIZE:maxlen;“该语句最小值计算会把这个值给len,然后len作为参数
n被传递给memcpy,不过参数n是size_t,在stdio.h中通过typedef定义的,典型的在32位的机器上被定义为unsigned 
int 既然n是无符号的,那么memcpy会把这个数当成一个非常大整数。虽然赋值了那么多字节,至少2^31个实际不会完成
因为程序会遇到进程中的非法地址错误,但是程序还是能够读到没有被授权的内核存储器的区域
可以看到,这个问题是由于数据类型不匹配造成的,在一个地方长度参数是有符号的,在另一个地方是无符号的
这样不匹配会造成缺陷,甚至导致安全漏洞。

这是我再一次感到数据类型重要性,警醒。
0 0
原创粉丝点击