This topic has been archived. It cannot be replied.
-
工作学习 / IT技术讨论 / 请教一个C的问题,不知有没有高手能答?Assume data and data_len are user controlled; find the security flaws in this function:
char *copy_data(char *data, unsigned int data_len)
{
unsigned int header_size = 8;
char *buf;
if (!(buf = malloc(data_len + header_size))) {
return NULL;
}
memcpy(buf, 'HEADER: ', 8);
memcpy(buf + 8, data, data_len);
return buf;
}
-spaceman(人在江湖);
2005-1-28
{339}
(#2099374@0)
-
malloc的时候多申请一位,最后把最后这个字符置成结束字符。
-isup(isup);
2005-1-28
(#2099399@0)
-
我找到1处:unsigned int计算溢出.若你的编译器认为unsigned int 是0到65535的话(如BC3等), 若用户输入的data_len大于65535-8(=65527)时,data_len + header_size将溢出并回卷到<8的数,malloc(data_len + header_size)实际也就分配了几个字节,你一用memcpy就一定冲毁buf了.
若你的编译器认为unsigned int 是最大4G的话,也有类似的data_len + header_size溢出4G的情况.
解决办法是在一开始就判断输入的data_len不能太大.
另外,你要用双引号"HEADER: "而不是用'单引号.
-armstrong2(动动猴他爸);
2005-1-28
{413}
(#2099424@0)
-
本农民闲着没事, 来帮你答一下这个Interview入门题.1. "NULL != data " not checked.
2. "buf" not initialized.
2. "data_len + header_size" may overflow.
3. 'XXXX' is for charactor not string.
4. "buf" is not released.
5. Should return "data" instead of "buf"
多努力, 兄弟
-laoliang(老亮);
2005-1-28
{241}
(#2099444@0)
-
低手来了. 实际上, 按你说的都改好了, 这个函数也不该用, 问题在于 unsigned int 的长度使得内存分配的危险太大.
-keepbugging(独行的猫);
2005-1-28
(#2099517@0)
-
谢谢,不过我看老亮兄没看清楚题,buf并非没有初始化。这个函数既然叫copy_data,应该要返回一个新的字符串而不是data。我想问题在于其他两位讲的data_len,太大了有溢出危险,太小了无法实现copy。
-spaceman(人在江湖);
2005-1-29
(#2099562@0)
-
这个函数没问题,然而调用它的函数却很容易出问题。因为没有释放申请的内存。写这种函数应该写一对: copy_data() 和 release_data(). 但如果程序不是长驻内存,并发很多的话也没事。
-aka(棒棒);
2005-1-29
(#2099952@0)