函数getpeername的安全漏洞

函数getpeername的安全漏洞

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接收到的就会是一个很大的正整数,程序就可能读到没有被授权的内核内存区域。

From #