procfs文件系统存在多个安全漏洞

/ns/ld/unix/data/20010228002534.htm

类别:core
程序:procfs
发布日期:2000-12-18
受影响的系统: 问题 #1: 所有在更正日期之前的FreeBSD 4.x系统.
问题 #2, #3: 所有在更正日期之前的FreeBSD 4.x和3.x系统.
更正日期:2000-12-16 (FreeBSD 4.2-STABLE)
2000-12-18 (FreeBSD 3.5.1-STABLE)
验证者:Frank van Vliet <karin@root66.org>
Joost Pol <nohican@niets.org> (Problem #1, #2)
Esa Etelavuori <eetelavu@cc.hut.fi> (Problem #3)
只限于FreeBSD:非
描述:

procfs是进程文件系统,它与一些相关数据一起构成一个对系统进程表的文件
系统接口。

在BSD系列的procfs代码中发现存在一些安全问题:

1) 由于缺乏对/proc/<pid>/mem和/proc/<pid>/ctl进行全面的访问控制检查,
未授权本地用户可能获得超级用户权限。如果用户可以控制这些文件,就可以
对访问该进程的地址空间并执行很多控制操作。

攻击的过程如下所示:攻击者可以fork()出一个子进程,然后在父进程中映射
子进程的地址空间。子进程然后再用exec()去执行一个以root身份运行的程序。
父进程将获得对子进程地址空间的读写权限,尽管子进程现在是以更高权限在
运行。父进程可以通过修改子进程地址空间中的数据来以子进程权限执行任意
代码。

2) 通过mmap()一个拥有/proc/<pid>/mem文件的进程,未授权的本地用户可以
造成本地拒绝服务攻击。可能导致系统内核陷入死循环,系统停止响应,必须
在控制台手工重启动系统。

3) 本地主机上拥有超级用户权限的用户,包括在jail(8)虚拟机上的超级用户,
可以在内核中造成一个缓冲区溢出,并绕过对超级用户权限的访问控制。这包括
突破"jail"环境,不需重启就可以降低系统安全等级,将恶意代码装入系统内核
(即使系统已经禁止可装载模块)

<*来源: Frank van Vliet (karin@root66.org)
Joost Pol (nohican@niets.org)
Esa Etelavuori (eetelavu@cc.hut.fi)
FreeBSD-SA-00:77 Several vulnerabilities in procfs
*>




--------------------------------------------------------------------------------
建议:

临时解决方法:

1) 为了解决问题1和问题2,以root身份按照下列步骤执行:

使用umount卸载procfs文件系统:

# umount -f -a -t procfs

在/etc/fstab中禁止自动装载procfs系统,删除或者注释下列行:

proc /proc procfs rw 0 0

2) 解决第3个问题更为困一些难,因为这需要限制超级用户权限,但下列步骤
可能已经足够了。

* 在jail环境中卸载所有的procf文件系统。这可以阻止jail root用户进一步
入侵整个系统。因为jail用户不能重新装载文件系统,因此即使攻击者成功
的获取jail环境中的root权限,他也不能突破jail.

* 在内核配置文件中删除"options PROCFS"行,并重新编译一个新的内核。
具体方法可以参见:
http://www.freebsd.org/handbook/kernelconfig.html

注意:卸载procfs可能对系统操作产生一些负面影响:在一些较老的版本中,
ps命令需要使用procfs文件系统。这也可能导致某些用户级的进程调试器例如
gdb不能使用。其他安装的二进制文件包括仿真Linux的二进制文件可能需要访
问procfs文件系统才能正确运行。

厂商补丁:

更新你的有问题的FreeBSD系统到更正日期之后的4.2-STABLE版本,或者自行
打补丁并重构。

为了修复自己的系统:从下列地址下载相关补丁,并以root身份执行下列命令:


[FreeBSD 3.5.1-RELEASE]

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.3.5.1.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.3.5.1.patch.asc

用你的PGP工具校验PGP签名。

[FreeBSD 4.1-RELEASE and FreeBSD 4.1.1-RELEASE]

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.4.1.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.4.1.patch.asc

用你的PGP工具校验PGP签名。

[FreeBSD 4.2-RELEASE]

# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.4.2.patch
# fetch ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/patches/SA-00:77/procfs.4.2.patch.asc

用你的PGP工具校验PGP签名。

# cd /usr/src/sys
# patch -p < /path/to/patch

如果procfs被静态编译进内核(例如,内核配置文件中包含有'options PROCFS'
)行,您应当重建并重新安装内核,并用新内核来重新启动系统以使补丁生效。

如果procfs被KLD动态加载(可以使用kldstat命令检查是否使用KLD加载),并
且安全等级没有提高,系统可以被即使修补,并不需要重新启动。在patch了源
码之后,您应当按照下列步骤执行:

# cd /usr/src/sys/modules/procfs
# make all install
# umount -f -a -t procfs
# kldunload procfs
# kldload procfs
# mount -f -a -t procfs