覆盖引发溢出缓冲区参数问题

Posted

技术标签:

【中文标题】覆盖引发溢出缓冲区参数问题【英文标题】:coverity is throwing overrun-buffer-arg issues 【发布时间】:2022-01-03 04:12:45 【问题描述】:

coverity 抛出以下错误: overrun-buffer-arg: 用 "key_name + len" 和 "256U" 调用 "snprintf" 是可疑的,因为 "key_name" 指向 256 字节的缓冲区并且函数调用可能访问 "(char *)(key_name + len) + 255U"。

char key_name[256];

u_int32_t  len;

snprintf(key_name+len, 256, "%s", student->name);

请建议如何解决此问题

【问题讨论】:

【参考方案1】:

如果 len 不是 0,则 snprintf 可以写入缓冲区 key_name 之外。例如,如果student->name 很长。或者如果len 接近 256 或更高。

由于snprintf 是专门为防止缓冲区溢出而设计的,因此这是一条非常有用的警告消息。

应该是这样的:

char key_name[256];
size_t len = 0;

snprintf(key_name + len, sizeof key_name - len, "%s", student->name);

这应该适用于每个0 len sizeof key_name。即使len 增长,例如典型的其他snprintf 调用,这将确保它不会溢出缓冲区。

编辑: 您还应该对照sizeof key_name - len 检查snprintf 的返回值。如果它等于或大于,则学生姓名被截断。

【讨论】:

以上是关于覆盖引发溢出缓冲区参数问题的主要内容,如果未能解决你的问题,请参考以下文章

使用缓冲区溢出覆盖位于缓冲区下方的局部变量

缓冲区溢出:如何从 ESP 进行相对跳转?

2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告

如何在没有缓冲区溢出的情况下遍历链表?

2018-2019-1 20165323《信息安全系统设计基础》缓冲区溢出漏洞实验报告

堆栈缓冲区溢出会导致堆损坏吗?