c - 绕过内存损坏限制

标签 c security audit

假设你是安全代码审计人员并且你已经陷入了一些 代码如下:

if(strlen(data) < 100) {
     strcpy(buffer, data);
}

为了破坏缓冲区,你会怎么做? 那可能吗?如果是这样,如何?为什么不使用该条件来确保代码安全?

最佳答案

一个明显的答案是如果 buffer 不是至少 101 chars 长,一个特殊的情况是程序员忘记了空终止符也被复制(如果 buffer 正好是 100 chars 长)。我可以从脑海中看到两个更微妙的攻击 vector :

  1. data 可能与不可读内存相邻并且不包含空终止符。这会导致段错误或访问冲突,但不会直接导致内存损坏。

  2. databuffer 在被视为字符串时可能会重叠。在这种情况下,行为是未定义的。

以第二种攻击为例,拿下面的代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char someImportantString[] = "Something that should not be overwritten";
    char buffer[101] = "\0goodbye cruel world";
    char data[16] = {'h', 'e', 'l', 'l', 'o',' ','w','o','r','l','d',
                     'x','x','x','x','x'};                         

    if(strlen(data) < 100)
    {
         printf("Probably not good\n");
         strcpy(buffer, data);
    }

    return 0;

}

这样做的可能结果是覆盖大量内存,然后出现段错误。

关于c - 绕过内存损坏限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21066684/

相关文章:

c - 如何将#defined 字符串文字转换为宽字符串文字?

c - 如何在 Mac OS X 上增加 C 中 "maximum open files"的限制

javascript - 保护 Electron 应用程序的最佳实践

postgresql - SQL Servfer 的 CONTEXT_INFO 的 PostgreSQL 等价物是什么?

php - 检测模型的变化; php yii 框架

c - 为什么msgrcv返回ENOMSG

c - 无法创建基于基本命令行参数的计算器

security - "if"语句有多安全?

ReactJS 中的安全漏洞或漏洞?

c# - Entity Framework 6 : audit/track changes