C代码审计之缓冲区溢出漏洞及修复方案
当在某特定数据结构的内存空间的边界之外写入数据时,即会发生缓冲区溢出。
本篇主要针对字符串操作错误引发的漏洞。
1、无界字符串复制
发生于从源数据复制数据到一个定长的字符数组时
1.1 使用gets()从标准输入读取数据到一个定长的缓冲区中
// gets()函数读取输入时不会判断上限,很容易造成缓冲区溢出
char buf[8]; gets(buf);
修复方案:使用getchar()获取输入,并确保赋值给缓冲区的字符数不超过缓冲区的大小
char buf[SIZE];
int index = 0;
while((ch = getchar()) != '\n'){
if (index < SIZE -1 )
buf[index++] = ch;
}
buf[index] = '\0'; //超过分配的缓冲区大小时截断
1.2 复制和连接字符串。
//strcpy()、strcat()执行无界复制操作,同样不会检测上限
char s[128];
strcpy(s, argv[0]);
修复方案1:给数组动态分配适当的大小 char *s = (char *)malloc(strlen(argv[0]) + 1); //分配空间,加一是为了容纳空字符\0 if (s != NULL) strcpy(s, argv[0]); free(s);
修复方案2:使用strlcpy()、strlcat()代替strcpy(),这两个函数可指定目标缓冲区的大小,只复制前size个 strlcpy(char *dest, const char *src, size_t size) strlcat(char *dest, const char *src, size_t size)
2、空字符结尾错误
字符串没有正确地以空字符\0结尾。
//strncpy()、strncat()都可指定目标缓冲区的大小,但是它们不会在结尾为字符串添加空字符
char destination[MAX_SIZE]; strncpy(destination, source, sizeof(destination)-1); strcpy(c, destination); //执行到strcpy,destination结尾没有空字符,因此内存里\0前的内容都会复制给c,导致内存泄漏 修复:在结尾添加\0 destination[sizeof(destinatin) - 1] = '\0'
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步