安全研究

安全漏洞
Linux Kernel ALSA驱动snd-page-alloc本地Proc文件信息泄露漏洞

发布日期:2007-09-25
更新日期:2007-09-26

受影响系统:
Linux kernel < 2.6.22.8
不受影响系统:
Linux kernel 2.6.22.8
描述:
BUGTRAQ  ID: 25807
CVE(CAN) ID: CVE-2007-4571

Linux Kernel是开放源码操作系统Linux所使用的内核。

Linux系统的ALSA声卡驱动实现上存在漏洞,本地攻击者可能利用此漏洞获取内核内存中的敏感信息。

Linux Kernel在处理多个/proc/driver/snd-page-alloc文件的读操作时存在安全漏洞,sound/core/memalloc.c文件中如下定义了读操作的系统调用snd_mem_proc_read:

  484 static int snd_mem_proc_read(char *page, char **start, off_t off,
  485                              int count, int *eof, void *data)
  486 {
  487         int len = 0;
  ...
  494         len += snprintf(page + len, count - len,
  495                         "pages  : %li bytes (%li pages per %likB)\n",
  496                         pages * PAGE_SIZE, pages, PAGE_SIZE / 1024);
  ...
  508         return len;
  509 }

在494行调用了snprintf以生成proc文件系统项的输出,如果提供了计数值1,snprintf就会仅向目标缓冲区写入单个字节,但如果有足够空间的话,函数就会返回应写入的字节数。没有设置过*eof值,也没有使用过*ppos值。

fs/proc/generic.c文件中定义了从proc_file_read调用的这个函数:

   51 static ssize_t
   52 proc_file_read(struct file *file, char __user *buf, size_t nbytes,
   53                loff_t *ppos)
   54 {
  ...
  136                         n = dp->read_proc(page, &start, *ppos,
  137                                           count, &eof, dp->data);
  ...
  155                         n -= *ppos;
  156                         if (n <= 0)
  157                                 break;
  158                         if (n > count)
  159                                 n = count;
  160                         start = page + *ppos;
  ...
  186                 n -= copy_to_user(buf, start < page ? page : start, n);
  ...
  193                 *ppos += start < page ? (unsigned long)start : n;

在136行从对snd_proc_mem_read函数的调用返回了值n。由于返回值(在单个设备的情况下大约为41)大于所请求的读大小(1),在158行n值被设置为count,之后*ppos递增,从start(计算为page + *ppos)将n字节拷贝到了用户域。

在之后的用户域读操作中,如果*ppos大于0的话,proc_file_read函数就会拷贝过snd_mem_proc_read写入的页面,导致泄露内核内存。

<*来源:Neil Kettle (mu-b@65535.com
  
  链接:http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.22.8
        http://secunia.com/advisories/26918/
        http://labs.idefense.com/intelligence/vulnerabilities/display.php?id=600
        http://www.debian.org/security/2008/dsa-1505
*>

测试方法:

警 告

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

http://www.securityfocus.com/data/vulnerabilities/exploits/cve20074571_alsa.c

建议:
临时解决方法:

* 卸载snd_page_alloc模块
* 修改/etc/fstab中的加载参数限制对/proc文件系统的访问

厂商补丁:

Debian
------
Debian已经为此发布了一个安全公告(DSA-1505-1)以及相应补丁:
DSA-1505-1:New alsa-driver packages fix kernel memory leak
链接:http://www.debian.org/security/2008/dsa-1505

补丁下载:
Source archives:

http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.8-7sarge1.dsc
Size/MD5 checksum:      856 948be734bc12fb0ff08dfc1955d5e77d
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.8-7sarge1.diff.gz
Size/MD5 checksum:   150046 050e64b0872e80fb3151a4392d80dd08
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.8.orig.tar.gz
Size/MD5 checksum:  2493810 5d5e44e35ed109e2c293a20bd9d68489
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-i386_1.0.8+2sarge2.dsc
Size/MD5 checksum:     1121 2e094a561912a0acf6cc5edf3f122ca8
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-i386_1.0.8+2sarge2.tar.gz
Size/MD5 checksum:     5249 1604fe719636c98547f287653a7cf0a8

Architecture independent packages:

http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-headers_1.0.8-7sarge1_all.deb
Size/MD5 checksum:    13140 faa9b7ad33aeaa2dd7855616b9744a08
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-source_1.0.8-7sarge1_all.deb
Size/MD5 checksum:  2003186 e5d0518e4fce125fe34a3fa22693e462
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-base_1.0.8-7sarge1_all.deb
Size/MD5 checksum:   113854 7f369a8728e533884cd2ff081047f18a

i386 architecture (Intel ia32)

http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-386_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1262528 ff0e8032f0ea8b5ea174c97a7dd20da7
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-686_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1369022 2c141d44bb23f0ff23fc4051a064dbe9
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-386_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4396 7329077b0171010fb61d5c3bc18eb306
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-k7-smp_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1381190 874346a5f9bbce101ce1effbb10209aa
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-k7-smp_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4478 172afe01c05d84d413c730f92265d985
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-686-smp_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1412810 cc8bf0b6f778ca428dd1f2aa219898a7
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-686-smp_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4500 afd217d917c37147ae61f304e250a6fa
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-686_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4424 d3092f18e1ad781c7f31e25f101a21d8
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-k6_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1273414 80b20a46c7db9db7f2529980ca0b428d
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-k7_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4404 3b5b282a073c7c1bf0e00c6e97fb7828
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-k7_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1341600 5dc6b283f17aa35cfc1ea2f4f00a5805
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4.27-4-586tsc_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:  1289658 01d76b0a6ab3ce4d46b313d176692686
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-586tsc_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4416 fd54e30a86bf2c6995a4e805e6ffb340
http://security.debian.org/pool/updates/main/a/alsa-modules-i386/alsa-modules-2.4-k6_1.0.8+2sarge2_i386.deb
Size/MD5 checksum:     4410 5d64373b3207881b0e5fe8736d4c3e00

Debian GNU/Linux 4.0 alias etch
- -------------------------------

Stable updates are available for alpha, amd64, arm, hppa, i386, ia64, mips, mipsel, powerpc, s390 and sparc.

Source archives:

http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.13-5etch1.diff.gz
Size/MD5 checksum:   269718 b346005adcdc73426c37065eea9a2c25
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.13.orig.tar.gz
Size/MD5 checksum:  3047163 0d0a4bb89b8b47d6e1d267137c5c8ef8
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-driver_1.0.13-5etch1.dsc
Size/MD5 checksum:      860 e82a3d193fbf5ac715abfbaaaea1b66f

Architecture independent packages:

http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-source_1.0.13-5etch1_all.deb
Size/MD5 checksum:  2543382 8b7ab44905f0650255d207bc2bcf9de6
http://security.debian.org/pool/updates/main/a/alsa-driver/alsa-base_1.0.13-5etch1_all.deb
Size/MD5 checksum:   172574 d1b52f2b757b7767548eade4e14c512a
http://security.debian.org/pool/updates/main/a/alsa-driver/linux-sound-base_1.0.13-5etch1_all.deb
Size/MD5 checksum:    28502 c223d863a84d44d783efdce31339728a

补丁安装方法:

1. 手工安装补丁包:

  首先,使用下面的命令来下载补丁软件:
  # wget url  (url是补丁下载链接地址)

  然后,使用下面的命令来安装补丁:  
  # dpkg -i file.deb (file是相应的补丁名)

2. 使用apt-get自动安装补丁包:

   首先,使用下面的命令更新内部数据库:
   # apt-get update
  
   然后,使用下面的命令安装更新软件包:
   # apt-get upgrade

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

http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.22.8.tar.bz2

浏览次数:3836
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障