安全研究
安全漏洞
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(网友投票)
绿盟科技给您安全的保障
