首页 -> 安全研究

安全研究

安全漏洞
Nullsoft Winamp畸形ID3v2标签溢出漏洞

发布日期:2005-07-18
更新日期:2005-07-18

受影响系统:
Nullsoft Winamp 5.091
Nullsoft Winamp 5.09
Nullsoft Winamp 5.03a
描述:
BUGTRAQ  ID: 14276
CVE(CAN) ID: CVE-2005-2310

Winamp是Nullsoft发布的免费音频播放器,支持多种格式。

Winamp在处理MP3文件的ID3v2标签时存在缓冲区溢出,攻击者可能利用此漏洞在用户机器上执行任意指令。

在播放完mp3文件时,Winamp会更新播放列表。如果ID3v2标签(比如ARTIST或TITLE)的某些部分超长的话,就可能溢出strcpy()函数中今后用作源址的值。strcpy()调用可以覆盖DATA段中的值,而该值之后在jump指令中会将代码执行指向攻击者所提供的缓冲区。

如果要溢出DATA段中的重要值,攻击者必须首先绕过安全检查。在下面的asm代码中,攻击者可以控制EAX寄存器,然后从函数返回后该EAX就可用作strcpy()的源址。

这段安全检查代码会测试内存中EAX地址的0x9B4偏移处是否存在0x00000001 (ECX)这个值。如果存在这个值的话,则从函数返回后相同的EAX内容就会用作strcpy()中的源址,否则EAX就会设置为位于当前EAX寄存器地址0x9B8偏移处的值,程序会跳至循环的开始。

--------------------------------------------------------
004371FA  /$ 8B4424 04      MOV EAX,DWORD PTR SS:[ESP+4]
004371FE  |> 85C0           /TEST EAX,EAX
00437200  |. 74 14          |JE SHORT Winamp.00437216
00437202  |. 8B88 B4090000  |MOV ECX,DWORD PTR DS:[EAX+9B4]
00437208  |. 3B4C24 08      |CMP ECX,DWORD PTR SS:[ESP+8]
0043720C  |. 74 0D          |JE SHORT Winamp.0043721B
0043720E  |. 8B80 B8090000  |MOV EAX,DWORD PTR DS:[EAX+9B8]
00437214  |.^EB E8          \JMP SHORT Winamp.004371FE
00437216  |> B8 DC124600    MOV EAX,Winamp.004612DC  ;  ASCII "No Entry"
0043721B  \> C3             RETN
--------------------------------------------------------

以下是反汇编的asm代码:

--------------------------------------------------------
char *check (char *arg, int val)  // val = 0x00000001
{
    while (arg != NULL)
    {
       if (*((int*)&arg[2484]) == val) // 0x9b4 = dec. 2484
        return arg;
       else arg = (char*)*((long*)&arg[2488]);  // 0x9b8 = dec. 2488
    }  
    arg = "No Entry";
    return arg;
}
--------------------------------------------------------

如果要绕过检查,必须将EAX (arg)设置为地址EAX+9B4值为0x00000001 (val)的字符串缓冲区地址,该字符串必须足够长,能够覆盖跳转地址。字符串至少应为284字节才能溢出到DATA段中的跳转地址。ID3v2数据位于DATA段中,其中有很多0x00000001值,因此可以确定一些Winamp和Windows版本的静态地址。

如果没有满足EAX+9B4=0x00000001这个条件,就会将EAX设置为EAX+9B8地址的值,然后重新测试,因此攻击者甚至可以创建用于在内存中扫描0x00000001的暴力猜测缓冲区。但这仅是理论上的可能性。

如果绕过了安全检查的话,就会执行strcpy(),覆盖跳转地址。strcpy()代码如下:

--------------------------------------------------------
00438D59  |. 50             PUSH EAX     ; /src = "FFFFFFFFFFFFFFFFFFFF..."
00438D5A  |. FF75 08        PUSH DWORD PTR SS:[EBP+8]        ; |dest
00438D5D  |. E8 60D20100    CALL <JMP.&MSVCRT.strcpy>        ; \strcpy
--------------------------------------------------------

strcpy()的目标地址为距离跳转地址280个字节。必须覆盖这个地址才能重新定向代码执行。在本文的具体例子中,该地址为0x00470D40。

执行完这些后,下一段代码会从地址0x00470E58执行代码。

--------------------------------------------------------
0041D440  /$ A1 580E4700    MOV EAX,DWORD PTR DS:[470E58]
0041D445  |. 85C0           TEST EAX,EAX
0041D447  |. 74 03          JE SHORT winamp.0041D44C
0041D449  |. FF60 48        JMP DWORD PTR DS:[EAX+48] <- 0wnZ Winamp
0041D44C  \> C3             RETN
--------------------------------------------------------

<*来源:Leon Juranic (ljuranic@LSS.hr
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=112145150924776&w=2
*>

测试方法:

警 告

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

http://security.lss.hr/PoC/demo.mp3

建议:
厂商补丁:

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

http://www.winamp.com/

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