Linux是一款开放源代码操作系统。 Linux内核包含的do_brk()函数对参数缺少充分边界检查,本地攻击者可以利用这个漏洞获得ROOT权限。 最近运行在X86机器的Linux内核运行在X86机器的物理内存管理使用简单平坦内存模型,每个用户进程内存地址范围为从0到TASK_SIZE字节。超过此内存的限制不能被用户访问,并包含此数据结构的内核代码。用户进程被分为几个逻辑段,成为虚拟内存区域,内核跟踪和管理用户进程的虚拟内存区域提供切当的内存管理和内存保护处理。 do_brk()是一个内部内核函数,用于间接调用管理进程的内存堆的增加和缩减(brk),它是一个mmap(2)系统调用的简化版本,只处理匿名映射(如未初始化数据),函数对其参数缺少正确的边界检查,可以利用建立任意大的虚拟内存区域,超过用户可访问的内存限制,因此此限制以上的内核内存会变成用户进程的一部分。 一般用户进程的内存分布类似如下: bash$ cat /proc/self/maps 08048000-0804c000 r-xp 00000000 03:02 207935 /bin/cat 0804c000-0804d000 rw-p 00003000 03:02 207935 /bin/cat 0804d000-0804e000 rwxp 00000000 00:00 0 40000000-40015000 r-xp 00000000 03:02 207495 /lib/ld-2.3.2.so 40015000-40016000 rw-p 00014000 03:02 207495 /lib/ld-2.3.2.so 40016000-40017000 rw-p 00000000 00:00 0 40020000-40021000 rw-p 00000000 00:00 0 42000000-4212f000 r-xp 00000000 03:02 319985 /lib/tls/libc-2.3.2.so 4212f000-42132000 rw-p 0012f000 03:02 319985 /lib/tls/libc-2.3.2.so 42132000-42134000 rw-p 00000000 00:00 0 bfffe000-c0000000 rwxp fffff000 00:00...
Linux是一款开放源代码操作系统。 Linux内核包含的do_brk()函数对参数缺少充分边界检查,本地攻击者可以利用这个漏洞获得ROOT权限。 最近运行在X86机器的Linux内核运行在X86机器的物理内存管理使用简单平坦内存模型,每个用户进程内存地址范围为从0到TASK_SIZE字节。超过此内存的限制不能被用户访问,并包含此数据结构的内核代码。用户进程被分为几个逻辑段,成为虚拟内存区域,内核跟踪和管理用户进程的虚拟内存区域提供切当的内存管理和内存保护处理。 do_brk()是一个内部内核函数,用于间接调用管理进程的内存堆的增加和缩减(brk),它是一个mmap(2)系统调用的简化版本,只处理匿名映射(如未初始化数据),函数对其参数缺少正确的边界检查,可以利用建立任意大的虚拟内存区域,超过用户可访问的内存限制,因此此限制以上的内核内存会变成用户进程的一部分。 一般用户进程的内存分布类似如下: bash$ cat /proc/self/maps 08048000-0804c000 r-xp 00000000 03:02 207935 /bin/cat 0804c000-0804d000 rw-p 00003000 03:02 207935 /bin/cat 0804d000-0804e000 rwxp 00000000 00:00 0 40000000-40015000 r-xp 00000000 03:02 207495 /lib/ld-2.3.2.so 40015000-40016000 rw-p 00014000 03:02 207495 /lib/ld-2.3.2.so 40016000-40017000 rw-p 00000000 00:00 0 40020000-40021000 rw-p 00000000 00:00 0 42000000-4212f000 r-xp 00000000 03:02 319985 /lib/tls/libc-2.3.2.so 4212f000-42132000 rw-p 0012f000 03:02 319985 /lib/tls/libc-2.3.2.so 42132000-42134000 rw-p 00000000 00:00 0 bfffe000-c0000000 rwxp fffff000 00:00 0 do_brk()函数在ELF和a.out装载器及brk(2)函数调用,这是三个不同渠道可用于利用这个do_brk()漏洞,成功利用此漏洞,进程内存可包含一个大的内存映射,如: 080a5000-c891d000 rwxp 00000000 00:00 0 本地攻击者可以利用这个漏洞完全控制系统,包括获得UID 0权限,修改内核代码和数据结构等。