安全研究

安全漏洞
Winamp LibSNDFile.DLL组件远程内存破坏漏洞

发布日期:2007-04-06
更新日期:2007-04-09

受影响系统:
Nullsoft Winamp 5.33
描述:
BUGTRAQ  ID: 23351

Winamp是一款流行的媒体播放器,支持多种文件格式。

Winamp在试图播放特制的.MAT文件时存在内存破坏漏洞,远程攻击者可能利用此漏洞控制处理了恶意.MAT文件的用户机器。

在以下代码段中:

    ----// SNIP SNIP //-------------------------------------------------
    .text:1000CCED                 cmp     [ebp+MY_DWORD], 40h        ; (1)
    .text:1000CCF1                 jl      short kont
    .text:1000CCF3
    .text:1000CCF3 loc_1000CCF3:                           ; CODE XREF: sub_1000CB3B+BAj
    .text:1000CCF3                 push    7Ah
    .text:1000CCF5                 jmp     faked
    .text:1000CCFA
    .text:1000CCFA
    .text:1000CCFA kont:                                   ; CODE XREF: sub_1000CB3B+1B6j
    .text:1000CCFA                 push    [ebp+MY_DWORD]
    .text:1000CCFD                 lea     eax, [ebp+var_64]
    .text:1000CD00                 push    eax
    .text:1000CD01                 push    ebx             ; int
    .text:1000CD02                 push    esi             ; DistanceToMoveHigh
    .text:1000CD03                 call    sub_10025A28
    .text:1000CD08                 mov     eax, [ebp+MY_DWORD]        
    .text:1000CD0B                 mov     byte ptr [ebp+eax+var_64], 0     ; (2)
    ----// SNIP SNIP //-------------------------------------------------

MY_DWORD值是受控的,储存在.mat文件开始起的0x39偏移处。从上面代码可见块(1)非常重要,因为如果MY_DWORD大于或等于0x40的话就不会出现内存覆盖。 在块(2)计算内存地址的方式得出以下基本的数学假设:
    1) x < 0x40
    2) y = ebp + x - 0x64

其中:
    x - 输入参数(MY_DWORD)
    y - 最终覆盖地址

然后经过一些简单的计算,就可以得出*y*的范围(最终覆盖地址),因为*x*是受0x40限制的。

这里可以得到:

    ** y < ebp - 0x64 + 0x40 **

也就是假设EBP = 0x010CFB7C的话,就可以得到:

    ** y < 0x10CFB58 **

简而言之从MY_DWORD值所计算出的最终地址一定小于0x10CFB58,这就使得攻击仅限于低于0x10CFB58的内存。如果仅考虑同目标进程一同加载的模块的话,就会得到一些符合上述条件的:

    ----// SNIP SNIP //-------------------------------------------------
    Executable modules
    Base       Size       Entry      Name       File version      Path
    00400000   00125000   0045FD3E   winamp     5,3,3,1100        winamp.exe
    00C70000   00012000   00C7D8B5   png                          png.w5s
    00C90000   00056000   00C9229F   MSVCR71    7.10.3052.4       MSVCR71.dll
    00D00000   0005E000   00D1ADD2   in_APE     3.99              in_APE.dll
    00E00000   0004F000   00E0E54E   in_cdda                      in_cdda.dll
    00E50000   0001B000   00E5F124   in_midi                      in_midi.dll
    00E70000   0001B000   00E80FFC   read_fil                     read_file.dll
    00E90000   0002B000   00EA77EF   in_mod                       in_mod.dll
    00EC0000   00008000   00EC3B89   in_mp4                       in_mp4.dll
    00ED0000   00028000   00EE7CF2   libmp4v2                     libmp4v2.dll
    00F00000   0003D000   00F3B640   in_mpc                       in_mpc.dll
    00F40000   0003E000   00F5ED76   in_vorbi                     in_vorbis.dll
    00F80000   00007000   00F814FC   in_wave                      in_wave.dll
    00F90000   0003D000   00FBAA8F   libsndfi                     libsndfile.dll
    ----// SNIP SNIP //-------------------------------------------------

以下情况可导致EIP重新定向:

    (DATA部分可写)
    
    ----// SNIP SNIP //-------------------------------------------------    
    ...
    .data:00472F14                                         ; sub_456A06+Bo ...
    .data:00472F18 ; __int32 off_472F18
    .data:00472F18 off_472F18      dd offset sub_456566    ; DATA XREF: sub_40340C+58r
    .data:00472F18                                         ; sub_4543E8+59r ...
    .data:00472F1C ; __int32 off_472F1C
    .data:00472F1C off_472F1C      dd offset sub_4565D5    ; DATA XREF: sub_406220+49r
    .data:00472F1C                                         ; sub_406587+BEr ...
    .data:00472F20 ; __int32 off_472F20
    .data:00472F20 off_472F20      dd offset sub_45668E    ; DATA XREF: sub_4097F4+B1r
    .data:00472F20                                         ; sub_45668E+Bo ...
    ...
    ----// SNIP SNIP //-------------------------------------------------    
    
off_472F1C实际上为:

    ----// SNIP SNIP //-------------------------------------------------    
    00472F1C  A0 AD 80 7C
    ----// SNIP SNIP //-------------------------------------------------    

是指向KERNEL32.DLL!GetProcAddress API函数的指针。在这种情况下,可获得以下重新定向:

    1) 7C80ADA0 -> 0080ADA0
    2) 7C80ADA0 -> 7C00ADA0
    3) 7C80ADA0 -> 7C8000A0
    4) 7C80ADA0 -> 7C80AD00

也就是说当WINAMP.EXE试图调用GetProcAddress函数时就会跳到用户所修改的地址。

<*来源:Piotr Bania (bania.piotr@gmail.com
  
  链接:http://www.piotrbania.com/all/adv/nullsoft-winamp-libsndfile-adv.txt
*>

测试方法:

警 告

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

http://www.piotrbania.com/all/adv/nullsoft-winamp-libsndfile-adv.txt

建议:
厂商补丁:

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

http://www.winamp.com/

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