Content #
2002年,FreeBSD实现的getpeername存在安全漏洞,代码的简化版本如下:
/* Declaration of library function memcpy */
void *memcpy(void *dest, void *src, size_t n);
/* Kernel memory region holding user-accessible data */
#define KSIZE 1024
char kbuf[KSIZE];
/* Copy at most maxlen bytes from kernel region to user buffer */
int copy_from_kernel(void *user_dest, int maxlen) {
/* Byte count len is minimum of buffer size and maxlen */
int len = KSIZE < maxlen ? KSIZE : maxlen;
memcpy(user_dest, kbuf, len);
return len;
}
如果maxlen使用了负数,那么len也会得到负数。然后len会作为参数n传给 memcpy。由于n被声明为size_t,是无符号的,memcpy接收到的就会是一个很大的正整数,程序就可能读到没有被授权的内核内存区域。