【问题标题】:Is it possible to exploit a vulnerable function if its input is safe?如果输入是安全的,是否可以利用易受攻击的功能?
【发布时间】:2015-04-30 07:42:45
【问题描述】:

假设我的代码有如下缓冲区溢出漏洞

int func(const char *str){
    char buffer[100];
    unsigned short len = strlen(str);

    if(len >= 100){
        return -1;
    }
    strncpy(buffer,str,strlen(str));
    return 0; 
}

(取自question

如果这个漏洞是从另一个函数(不是用户输入)获取输入并且str的长度总是小于100,有没有办法利用这个漏洞?

例如

int main() {
    int user_input;
    if (cin >> user_input) {
        if(user_input == 1)
          func("aaaa");
        else 
          func("bbbb");
    }
}

假设代码中没有其他漏洞。

只是一个假设的问题,有什么想法吗?

【问题讨论】:

  • 如果str的长度始终小于100,则不存在漏洞。
  • 如果你确定len 总是小于100,我看不出if(len >= 100) 的原因
  • @smttsp 您是否阅读了您所链接问题的答案?如果strlen(str) > 65535 出现漏洞,str 的来源无关紧要
  • 您的main 内存严重损坏。您不能读入字符串文字的字节,顺便说一句,不推荐将其转换为非const char * 并且应该发出编译器警告。即使您被允许写入user_input 的字节,该数组也会太短而无法容纳字符串"1"。此外,比较 char 缓冲区和 == 可能不会达到您的预期。
  • strlen(str) 作为 strncpy 的参数是一个严重的错误,总是创建一个非 nul 终止的字符串,因为 strncpy 认为目标缓冲区只能包含没有终止 nul 的字符串,这可能会被利用如果这段代码能以某种方式正常工作。参数应该是 sizeof(buffer)。

标签: c++ c security exploit


【解决方案1】:

简而言之,没有漏洞。每个输入都经过净化 = 没有漏洞。

但这并不意味着您应该不修复它。虽然没有物理漏洞,但存在很多潜在漏洞。 现在您不会传递超过 100 个字符的内容。但是从现在开始的几个月呢?你还记得你只能传递少于 100 个字符的输入吗?我不这么认为。

您可以通过以下方式修复它:

  1. 选择将strlen 保留在size_t 中(但如果变量大于4GB,这将无法避免缓冲区溢出)
  2. 使用动态分配的缓冲区并检查您是否成功malloc
  3. 使用strnlensizeof(buffer) 而不是strlen
  4. len 作为第二个参数传递(可能很烦人)

使用strncpy(a, b, strlen(b)) 与使用strcpy(a,b) 相同。通过if 指令中的检查可以在一定程度上防止这种情况发生,但是选择unsigned short 来存储它无论如何都变得毫无价值。最好使用strncpy(a, b, len) 来明确len 确实需要在那里,以防检查被重构掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2016-04-04
    • 2016-04-29
    • 2015-06-08
    • 2015-12-31
    • 1970-01-01
    相关资源
    最近更新 更多