【发布时间】:2016-07-13 16:13:48
【问题描述】:
我有一个函数接受包含敏感数据的struct * 指针(在char 数组中)作为参数(类似于小型库)。
两个struct模型如下:
struct struct1 {
char str[1024]; /* maybe even 4096 or 10KB+ */
size_t str_length;
}
struct struct2 {
char *str;
size_t str_length;
}
测试函数为:
/* Read str_length bytes from the char array. */
void foo(struct struct1/struct2 *s) {
int i;
for (i = 0; i < s->str_length; i++) {
printf("%c\n", s->str[i]);
}
}
我担心的是,由于 str_length 参数是一个任意值,因此可能会故意将其设置为导致缓冲区溢出(实际上是某个愚蠢到故意在自己的程序中制造安全漏洞的人,但我觉得我必须考虑到这种情况)。但是,通过使用 struct1 模型,我可以简单地使用以下命令检查可能的缓冲区溢出:
if (s->str_length > sizeof(s->str)) {
/* ERROR */
}
问题在于长度数组在编译时实际上是未知。所以我不知道是使用char * 指针(struct2 样式,所以没有溢出检查)还是定义一个非常大的数组(struct1),这会限制最大长度(我想避免),并且大多数时候会分配不必要的空间(我想这在内存稀缺的嵌入式系统中可能会出现问题)。我知道我必须做出妥协,我个人会使用 struct2 模型,但我不确定它是否是安全方面的好选择。
【问题讨论】:
-
如果你想要一个带有全功能范围检查的软垫舞台教练,你绝对不应该使用 C。例如,如果用户更改指针怎么办?
-
习惯上在 struct 的末尾定义一个绝对巨大的数组以供您的 lib 使用,并让用户管理它的实际分配并传入一个指针和“真实”大小。您保持灵活性,不会浪费任何实际空间。当然不能直接复制struct!
-
安全?它是 C - 你已经没有安全性了:)
标签: c struct buffer-overflow