安全研究

安全漏洞
PaintShop Pro Photo X2 FPX文件解析堆溢出漏洞

发布日期:2010-01-27
更新日期:2010-02-02

受影响系统:
Corel PaintShop Pro Photo X2 Ultimate 12.50
描述:
BUGTRAQ  ID: 37980

PaintShop Pro Photo X2是一套兼具完整功能与简易操作的专业级数码影像编辑软件。

PaintShop Pro Photo X2错误的相信了FPX文件中用户控制的数据并在拷贝数据时用作了循环计数器,这可能导致堆溢出。

首先,应用以常数调用malloc()分配了0xC08字节长的缓冲区:

/-----
[Module: JPEGACC.dll]

095F4D97  |.  68 080C0000   PUSH 0C08
;size of the buffer to be allocated
095F4D9C  |.  E8 9F4D0000   CALL JPEGACC.095F9B40
;call to malloc()
095F4DA1  |.  83C4 04       ADD ESP,4
095F4DA4  |.  894424 10     MOV DWORD PTR SS:[ESP+10],EAX
;saves the pointer returned by malloc()

- -----/

之后将FPX文件中的数据拷贝到了上述分配的缓冲区。在以下反汇编代码可见FPX文件中0x1406偏移处所分配的字节被解释为内部循环的循环计数器,以确定应调用多少次拷贝操作。拷贝操作是在09264C50地址的调用中执行的,拷贝到缓冲区的数据也是部分从FPX文件的0x1416偏移处开始获取的。

/-----
[Module: JPEGACC.dll]

09264DD2  |>  8B6C24 24     /MOV EBP,DWORD PTR SS:[ESP+24]
09264DD6  |.  33D2          |XOR EDX,EDX
09264DD8  |.  8A55 00       |MOV DL,BYTE PTR SS:[EBP]                ;
byte at offset 0x1406 in the FPX file (user controlled)
09264DDB  |.  45            |INC EBP
09264DDC  |.  8BFA          |MOV EDI,EDX                             ;
EDI=inner loop counter, byte at offset 0x1406 (user controlled)
09264DDE  |.  896C24 24     |MOV DWORD PTR SS:[ESP+24],EBP
09264DE2  |.  85FF          |TEST EDI,EDI
09264DE4  |.  74 28         |JE SHORT JPEGACC.09264E0E
09264DE6  |.  7E 26         |JLE SHORT JPEGACC.09264E0E
09264DE8  |.  8D68 08       |LEA EBP,DWORD PTR DS:[EAX+8]
09264DEB  |>  8B5424 28     |/MOV EDX,DWORD PTR SS:[ESP+28]          ;
EDX starts pointing to offset 0x1416 of the FPX file
09264DEF  |.  33C0          ||XOR EAX,EAX
09264DF1  |.  8BCE          ||MOV ECX,ESI
09264DF3  |.  55            ||PUSH EBP
09264DF4  |.  8A02          ||MOV AL,BYTE PTR DS:[EDX]               ;
reads bytes starting from offset 0x1416 (user controlled)
09264DF6  |.  46            ||INC ESI
09264DF7  |.  53            ||PUSH EBX
09264DF8  |.  42            ||INC EDX
09264DF9  |.  50            ||PUSH EAX
09264DFA  |.  51            ||PUSH ECX
09264DFB  |.  895424 38     ||MOV DWORD PTR SS:[ESP+38],EDX
09264DFF  |.  E8 4CFEFFFF   ||CALL JPEGACC.09264C50                  ;
copies user-controlled data to the buffer
09264E04  |.  83C4 10       ||ADD ESP,10
09264E07  |.  4F            ||DEC EDI                                ;
is the loop counter == 0?
09264E08  |.^ 75 E1         |\JNZ SHORT JPEGACC.09264DEB             ;
if not, repeat the copy operation
09264E0A  |.  8B4424 10     |MOV EAX,DWORD PTR SS:[ESP+10]
09264E0E  |>  D1E6          |SHL ESI,1
09264E10  |.  43            |INC EBX
09264E11  |.  83FB 08       |CMP EBX,8
09264E14  |.^ 7E BC         \JLE SHORT JPEGACC.09264DD2

- -----/

内部循环的每次迭代都会将0x80个对象拷贝到缓冲区,每次大小为8个字节,也就是大小为0xC08字节的缓冲区最多只能处理三次迭代,因此如果用户受骗打开的FPX文件中0x1406偏移处的字节值大于3就可以触发溢出,向缓冲区末尾后的某些位置写入可控字节。在退出外部循环后,应用会进入另一个循环,向缓冲区写入几个值为0的dword,此处的迭代次数为拷贝到缓冲区的对象数,也就是乘以0x80。

/-----
[Module: JPEGACC.dll]

09264E26  |.  8BD6          MOV EDX,ESI                              ;
EDX = number of objects copied to the buffer
09264E28  |>  C701 00000000 /MOV DWORD PTR DS:[ECX],0
09264E2E  |.  83C1 08       |ADD ECX,8
09264E31  |.  4A            |DEC EDX
09264E32  |.^ 75 F4         \JNZ SHORT JPEGACC.09264E28

- -----/

如果所处理的FPX文件如上所述触发了缓冲区溢出,这个循环也会写过缓冲区的限制,破坏内存内容,包括临近的块元数据,最终在应用试图通过调用ntdll.RtlFreeHeap释放所分配的缓冲区时导致内存访问破坏。

/-----
[Module: ntdll.dll]

7C9108D3    8902            MOV DWORD PTR DS:[EDX],EAX

Access violation when writing to [00000000]

- -----/

<*来源:Francisco Falcon
  
  链接:http://marc.info/?l=bugtraq&m=126507516309185&w=2
*>

建议:
厂商补丁:

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

http://www.corel.com/servlet/Satellite/us/en/Product/1184951547051

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