新聞中心
【前言】

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出通江免費(fèi)做網(wǎng)站回饋大家。
日前谷歌公開(kāi)了一個(gè)今年1月份更新的漏洞。這個(gè)漏洞修復(fù)了一個(gè)存在于A(yíng)ndroid 5.1版本以下圖片渲染的問(wèn)題,可以查看相關(guān)鏈接。
9patch是Android上特有的一種圖片格式,就是在普通的png圖片的基礎(chǔ)了增加了一些像素的邊框,使之具有可隨意拉伸、縮放的功能。
【9patch文件格式概述】
前面說(shuō)到9patch文件是一種特殊png圖片,我們先來(lái)看下png文件結(jié)構(gòu)。
在png文件的起始處是一個(gè)被稱(chēng)為signature的東西,即文件簽名,很多人把它叫做文件頭,長(zhǎng)度為8個(gè)字節(jié),這8個(gè)字符的值是固定的。
在signature之后是一個(gè)chunk塊序列,每個(gè)chunk塊的大小都是不定的,里面存儲(chǔ)著圖像數(shù)據(jù),chunk塊的結(jié)構(gòu)如下:
偽代碼描述如下:
在chunk的起始處是chunk長(zhǎng)度,被定義為4字節(jié)大端整數(shù)。這個(gè)chunk長(zhǎng)度僅僅是chunkdata的長(zhǎng)度,不包括自身、type和crc的長(zhǎng)度,因此整個(gè)chunk塊的長(zhǎng)度還需要加上這三個(gè)域的大小。之后一個(gè)4字節(jié)的字符序列,只能由英文字符組成,表示chunk塊的類(lèi)型。隨后chunk數(shù)據(jù)部分,長(zhǎng)度由開(kāi)始的length指定,當(dāng)length為0時(shí)這個(gè)域可以不存在。最后是整個(gè)塊的CRC校驗(yàn)碼。再往后?就是下一個(gè)chunk塊了啊。
下面說(shuō)下本文的主角9patch文件。它是包含類(lèi)型為”npTc”在chunk的png文件??聪耮oogle官方的定義(已過(guò)濾不相關(guān)的若干代碼):
來(lái)看一個(gè)普通的9patch文件
這個(gè)9patch文件的npTc塊位于第一個(gè)IHDR塊之后,chunk長(zhǎng)度為0x20,data域的值都為0,圖中指出了numXDivs、numYDivs和numColors的位置,依次可以推出其他數(shù)據(jù)域的值。#p#
【漏洞分析】
(懶得看的話(huà)直接跳到最后看結(jié)論)。
在5.1版本上加載一張盡心構(gòu)造的9patch圖片,就會(huì)導(dǎo)致進(jìn)程Crash,如下圖所示。
看錯(cuò)誤是引用了不合法的地址,看google的補(bǔ)丁吧:
補(bǔ)丁一共有兩處:
1. chunk塊中numXDivs、numYDivs、numColors三個(gè)變量的定義改成了無(wú)符號(hào)型
2. npTc塊的peek函數(shù)中的斷言改成了判斷不等再返回
numXDivs、numYDivs、numColors這三個(gè)變量什么要改成無(wú)符號(hào)型,為什么不能是負(fù)的,如果是負(fù)的會(huì)怎么樣,帶著問(wèn)題再分析,看看哪里用到了這三個(gè)值。
從這里可以看出xDivsOffset是Res_png_9patch結(jié)構(gòu)的長(zhǎng)度,這是一個(gè)常量,一般來(lái)說(shuō)是0x20。yDivsOffset的值在此基礎(chǔ)上增加大小為numXDivs的int數(shù)組的長(zhǎng)度,colorsOffset的值在yDivsOffset的基礎(chǔ)上增加大小為numYDivs的int數(shù)組的長(zhǎng)度。再回溯:
而yDivsOffset和colorsOffset以決定了yDivs和colors兩個(gè)數(shù)組的地址,那只要精心構(gòu)造numXDivs、numYDivs就可以在一定范圍內(nèi)訪(fǎng)問(wèn)其他任意的內(nèi)存,,看來(lái)剛才報(bào)的引用非法地址應(yīng)該就是這里了。
還有一處引用了numXDivs、numYDivs、numColors的地方。
再看看調(diào)用serializedSize的地方:
這里用serializedSize()的返回值和length進(jìn)行比較,而numXDivs、numYDivs、numColors可以為負(fù),影響了serializedSize正常的計(jì)算,觸發(fā)斷言,中斷程序。
【總結(jié)】
分析了這么多,來(lái)總結(jié)漏洞成因。
Res_png_9patch結(jié)構(gòu)中定義了numXDivs、numYDivs、numColors的類(lèi)型為有符號(hào)數(shù),當(dāng)它們得到負(fù)值時(shí)會(huì)影響yDivsOffset、colorsOffset和serializedSize的取值,從而導(dǎo)致堆溢出,現(xiàn)象就是數(shù)組越界。
將之前文件中的numXDivs、numYDivs、numColors三位其中某一位修改為負(fù)數(shù)(即大于0x80)即可驗(yàn)證此漏洞。
【檢測(cè)方案】
掌握這個(gè)漏洞的細(xì)節(jié)以后要防就很容易了,只要遍歷png文件的所有chunk塊,針對(duì)其中的npTc塊進(jìn)行檢測(cè),判斷numXDivs、numYDivs、numColors是否為負(fù),只要其中有一個(gè)為負(fù)則可判定為惡意文件,相關(guān)檢測(cè)代碼如下:
網(wǎng)站題目:Android9patch圖片解析堆溢出漏洞分析(CVE-2015-1532)
新聞來(lái)源:http://www.dlmjj.cn/article/djhohpj.html


咨詢(xún)
建站咨詢(xún)
