覆盖引发溢出缓冲区参数问题
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
的返回值。如果它等于或大于,则学生姓名被截断。
【讨论】:
以上是关于覆盖引发溢出缓冲区参数问题的主要内容,如果未能解决你的问题,请参考以下文章
2018-2019-1 20165228 《信息安全系统设计基础》缓冲区溢出漏洞实验报告