Android软件开发工具包BMP文件处理整数溢出漏洞

基本字段

漏洞编号:
SSV-2983
披露/发现时间:
未知
提交时间:
2008-03-06
漏洞等级:
漏洞类别:
其他类型
影响组件:
Android
漏洞作者:
未知
提交者:
Knownsec
CVE-ID:
补充
CNNVD-ID:
补充
CNVD-ID:
补充
ZoomEye Dork:
补充

来源

漏洞详情

贡献者 Knownsec 共获得  0.25KB

BUGTRAQ ID: 28006 CVE(CAN) ID: CVE-2008-0986

Android是Google通过Open Handset Alliance发起的项目,用于为移动设备提供完整的软件集,包括操作系统、中间件等。

Android SDK的libsgl.so库中的BMP::readFromStream(Stream *, ImageDecoder::Mode)方式在解析BMP图形文件头时存在整数溢出漏洞,远程攻击者可能利用此漏洞控制用户设备。

如果BMP文件头的offset字段值为负数且Bitmap Information部分(DIB头)指定了8 bpp的图形的话,解析器就会尝试分配画板并使用了该负数偏移来计算画板的大小。

以下代码使用白颜色(0x00ffffff)初始化画板,但如果选择了特制的负数偏移,就可以使用该值覆盖进程的任意地址。以下是Android中所捆绑的二进制程序的反汇编:

/-----------

.text:0002EE38 MOV LR, R7 ; R7 is the negative offset .text:0002EE3C MOV R12, R7,LSL#2 .text:0002EE40 .text:0002EE40 loc_2EE40 .text:0002EE40 LDR R3, [R10,#0x10] .text:0002EE44 ADD LR, LR, #1 .text:0002EE48 MOVL R2, 0xFFFFFFFF .text:0002EE4C ADD R1, R12, R3 ; R3 is uninitialized (because of the same bug) but ranges 0x10000-0x20000 .text:0002EE50 MOV R0, #0 .text:0002EE54 CMP LR, R9 .text:0002EE58 STRB R2, [R12,R3] ;Write 0x00ffffff to R12+13 (equals R1) .text:0002EE5C STRB R2, [R1,#2] .text:0002EE60 STRB R0, [R1,#3] .text:0002EE64 STRB R2, [R1,#1] .text:0002EE68 ADD R12, R12, #4 .text:0002EE6C BNE loc_2EE40

  • -----------/

以下是Android浏览器中的内存映射:

/-----------

ps

ps USER PID PPID VSIZE RSS WCHAN PC NAME root 1 0 248 64 c0084edc 0000ae2c S /init root 2 0 0 0 c0049168 00000000 S kthreadd ... root 1206 1165 16892 14564 c0084edc 00274af8 S ./gdb app_0 1574 535 83564 12832 ffffffff afe0c79c S com.google.android.browser root 1600 587 840 324 00000000 afe0bfbc R ps

cat /proc/1574/maps

cat /proc/1574/maps 00008000-0000a000 rwxp 00000000 1f:00 514 /system/bin/app_process 0000a000-00c73000 rwxp 0000a000 00:00 0 [heap] 08000000-08001000 rw-s 00000000 00:08 344 /dev/zero (deleted) ... #

  • -----------/

可见堆范围为0000a000-00c73000且可执行,如果堆中存储了虚表的话覆盖这个区域就会允许重新定向执行流。之后以同样的方式对Stream对象虚表执行了调用:

/-----------

.text:0002EB64 LDR R12, [R8] # R8 is the "this" pointer of the Stream Object .text:0002EB68 MOV R0, R8 .text:0002EB6C MOV LR, PC .text:0002EB70 LDR PC, [R12,#0x10] # A call is made to Stream+0x10

  • -----------/

由于Stream对象(R8)存储在堆上,因此可以用白色0x00ffffff填充堆,以0xffffff+0x10值上传程序计数器。

Google Android SDK m5-rc14 Google Android SDK m3-rc37a 厂商补丁:

Google

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

http://android-developers.blogspot.com/2008/03/android-sdk-update-m5-rc15-released.html

LinuxPoc ifzz HoldDie 共 3  兑换了

PoC (非 pocsuite 插件)

贡献者 Knownsec 共获得   1.25KB
1
2
3
4
5
6
7
<HTML>
<HEAD>
</HEAD>
<BODY>
<script·type="text/javascript">
//·Fill·0x200000·-·0xa00000·with·Breakpoints
var·nop·=·un
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ifzz HoldDie 共 3 兑换

参考链接

解决方案

临时解决方案

官方解决方案

升级到最新无漏洞版本

防护方案

人气 2895
评论前需绑定手机 现在绑定

暂无评论

※本站提供的任何内容、代码与服务仅供学习,请勿用于非法用途,否则后果自负