安全研究

安全漏洞
SILC客户端及服务器密钥协商远程整数溢出漏洞

发布日期:2008-03-25
更新日期:2008-03-26

受影响系统:
SILC server <= 1.1.1
SILC client <= 1.1.3
不受影响系统:
SILC server 1.1.2
SILC client 1.1.4
描述:
BUGTRAQ  ID: 28373
CVE(CAN) ID: CVE-2008-1552

SILC(Secure Internet Live Conferencing)是安全的互联网会议讨论系统,可以发送任何类型的信息,包括多媒体信息,如视频、音频、图像等。

SILC处理畸形的数据交换时存在漏洞,远程攻击者可能利用此漏洞控制服务器。

如果要初始连接到SILC服务器,对等端(客户端、路由器和服务器)之间要执行相互认证并执行密钥协商协议以获得之后用于加密通讯的共享密钥。对等端之间的加密数据是通过以PKCS#1 1.5标准编码的报文交换的。

SILC的PKCS1编码功能是在silcpkcs1.c文件的silccrypt库中实现的,用于解码PKCS#1报文的代码在silc_pkcs1_decode函数中实现,如下所示:

/-----------

   SilcBool silc_pkcs1_decode(SilcPkcs1BlockType bt,
   const unsigned char *data,
   SilcUInt32 data_len,
   unsigned char *dest_data,
   SilcUInt32 dest_data_size,
   SilcUInt32 *dest_len)
   {
   int i = 0;

   SILC_LOG_DEBUG(("PKCS#1 decoding, bt %d", bt));

   /* Sanity checks */
   if (!data || !dest_data || dest_data_size < 3 ||
      data[0] != 0x00 || data[1] != (unsigned char)bt) {
    SILC_LOG_DEBUG(("Malformed block"));
    return FALSE;
  }

  /* Decode according to block type */
  switch (bt) {
  case SILC_PKCS1_BT_PRV0:
    /* Do nothing */
    break;

  case SILC_PKCS1_BT_PRV1:
    /* Verification */
(1) for (i = 2; i < data_len; i++)
      if (data[i] != 0xff)
    break;
    break;

  case SILC_PKCS1_BT_PUB:
    /* Decryption */
(2) for (i = 2; i < data_len; i++)
      if (data[i] == 0x00)
    break;
    break;
  }

  /* Sanity checks */
(3) if (data[i++] != 0x00) {
    SILC_LOG_DEBUG(("Malformed block"));
    return FALSE;
  }
  if (i - 1 < SILC_PKCS1_MIN_PADDING) {
    SILC_LOG_DEBUG(("Malformed block"));
    return FALSE;
  }
  if (dest_data_size < data_len - i) {
    SILC_LOG_DEBUG(("Destination buffer too small"));
    return FALSE;
  }

  /* Copy the data */
(4) memcpy(dest_data, data + i, data_len - i);

  /* Return data length */
  if (dest_len)
    *dest_len = data_len - i;

  return TRUE;
}


- -----------/

在上面的代码中,如果在传输私有(BT_PRIV1)或公开(BT_PUB)密钥材料时有效PKCS#1编码的恶意伪造报文所有位分别设置为0xff或非0x00的话,就会导致执行流在(1)和(2)退出循环,无符整数变量i设置为data_len,然后在(3)同一变量i以1递增,因此设置为data_len+1。在(3)传送过滤检查的特制报文最终会由于在(4)处memcpy()函数中传送的第三个参数中的整数溢出而导致内存破坏。由于i设置为了datalen+1,用于计算第三个参数值的data_len - i表达式会为-1,导致由于符号转换错误而覆盖进程内存。成功利用这个漏洞会导致程序拒绝服务,或以SILC程序的权限执行任意指令。

<*来源:Core Security Technologies
  
  链接:http://marc.info/?l=bugtraq&m=120647980023890&w=2
        http://silcnet.org/docs/release/SILC%20Client%201.1.4
        http://silcnet.org/docs/release/SILC%20Server%201.1.2
        http://security.gentoo.org/glsa/glsa-200804-27.xml
*>

建议:
厂商补丁:

Gentoo
------
Gentoo已经为此发布了一个安全公告(GLSA-200804-27)以及相应补丁:
GLSA-200804-27:SILC: Multiple vulnerabilities
链接:http://security.gentoo.org/glsa/glsa-200804-27.xml

所有SILC Toolkit用户都应升级到最新版本:

    # emerge --sync
    # emerge --ask --oneshot --verbose ">=3Dnet-im/silc-toolkit-1.1.7"

所有SILC Client用户都应升级到最新版本:

    # emerge --sync
    # emerge --ask --oneshot --verbose ">=3Dnet-im/silc-client-1.1.4"

所有SILC Server用户都应升级到最新版本:

    # emerge --sync
    # emerge --ask --oneshot --verbose ">=3Dnet-im/silc-server-1.1.2"

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

http://silcnet.org/software/download/

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