这个C用户输入代码是否易受攻击?

时间:2017-04-06 09:29:28

标签: c security buffer-overflow

我有这段代码从用户那里读取输入:

unsigned int readInput(char * buffer, unsigned int len){
    size_t stringlen = 0;
    char c;
    while((c = getchar()) != '\n' && c != EOF){
        if(stringlen < (len-1)){
            buffer[stringlen] = c;
            stringlen++;
        }
    }
    buffer[stringlen+1] = '\x00';
    return stringlen;
}

char * buff的大小已设置为len,并且memset包含“0”。此代码是否容易受到任何漏洞攻击?

4 个答案:

答案 0 :(得分:1)

根据平台的不同,unsigned int可能太小而无法容纳数字13194139533312。你应该总是使用size_t来表示C中的缓冲区大小,不这样做可能是一个漏洞,是的。

此外,当然getchar()不会返回char,因此也会被破坏。

我说&#34;是&#34;,该代码容易受到攻击。

答案 1 :(得分:1)

您的代码可能会写出超出边界并使数组元素未初始化:

char buf[10];  // uninitialized!

readInput(buf, 10);   // feed 12 TB of data

这有未定义的行为,因为您写入buf[10]

readInput(buf, 10);  // feed 8 bytes of data

strlen(buf);

这有未定义的行为,因为您读取了未初始化的值buf[8]

错误在于您分配使用错误索引的空终止符的方式。它应该说:

buffer[stringlen] = '\0';
//     ^^^^^^^^^

由于您计算len - 1,因此您的代码还应具有len必须严格为正的前提条件。这是明智的,因为您承诺生成以null结尾的字符串。

答案 2 :(得分:1)

假设缓冲区分配了=IF(B3="","",IF(ABS(B3)=0,0,LEN((ABS(B3)/10^LEN(ABS(B3)))*10^(LEN(ABS(B3)/10^LEN(ABS(B3)))-LEN(INT(ABS(B3)/10^LEN(ABS(B3))))-1)))+LEN(B3)-LEN(ABS(B3))-IF(LEFT(B3,1)="-",1,0)+IF(OR(LEFT(B3,1)=".",LEFT(B3,2)="-."),1,0))+IF(AND(NOT(ISERROR(FIND(".",B3))),ISERROR(FIND(".",ABS(B3)))),-1,0) 个字节,最明显的问题是:

len

这是因为循环可以在buffer[stringlen+1] = '\x00'; 等于stringlen的情况下退出,因此您正在写入len-1。但是,您应该只写入最多buffer[len]的索引。

所以让我们解决这个问题如下:

len-1

这是你真正想要的,因为你尚未写入buffer[stringlen] = '\x00';

一个微妙的错误是如果len为0(你可能会说永远不会发生),那么buffer[stringlen]是MAXINT,因此len-1总是为真。因此,代码将始终缓冲0长度缓冲区上的溢出。

答案 3 :(得分:-1)

您的问题是代码是否容易受到攻击。答案是否定的,它不易受攻击,当然也不是漏洞的常见定义。

这是一些未知输入(可能是对手)和缓冲区之间的接口。您已正确包含防止缓冲区溢出的机制,因此您的代码是安全的。 [我们假设getchar()中的所有内容都不是您的问题的主题]。

代码是否按预期工作是一个不同的故事,(其他人已经在终止NULL之前指出了漏洞),但这不是你的问题。