一个不太明显的安全问题
在内核里面,程序的结构大概是这样:
函数开始……
struct bar foo;
某些处理(没动foo),然后……
strlcpy(foo.field, k->field, sizeof(k->field));
其他对foo其他字段的赋值处理……
最后
error = copyout(&foo, someaddress, sizeof(foo));
现在问题来了,上面这些东西的问题是什么?应该如何解决?
答案:上述代码引入了一个安全问题,这个安全问题可能导致内核某些敏感数据的泄露。
注意,foo是在栈上分配的,但是,编译器没有责任对其进行清零操作。由于使用了strlcpy,缓冲区可能包含某些不希望用户看到的内容。(最多泄露长度-1字节的内核内存)。