欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

CVE-2016-7595 Apple macOS/iOS CoreText OTL::GPOS::ApplyPairPos 越界访问漏洞分析

来源:本站整理 作者:riusksk 时间:2016-12-22 TAG: 我要投稿

前言
2016年12月的Apple安全公告中(macOS公告与iOS公告),修复4个由腾讯安全平台部终端安全团队报告的漏洞,其中有2个是字体解析造成的越界访问漏洞,影响 macOS/iOS/watchOS/tvOS等多个平台系统,本文主要分析其中的 CVE-2016-7595 字体漏洞【图1】。

图1
这个漏洞在报给Apple 17天后发布 macOS 10.2.2 测试版补丁,一个半月后发布安全公告和补丁(包括iOS、watchOS和tvOS),难得看见苹果这么积极一次。
漏洞分析
此次漏洞是通过Fuzzing发现的,直接对比poc与原始文件的数据,可以发现其实就1个字节的差异(0x00 => 0x6C)【图2】:

图2
用ttx命令分析字体格式:
 ╭─riusksk@MacBook ~/Downloads ‹›
 ╰─➤$ ttx poc.ttf
 Dumping "poc.ttf" to "poc#1.ttx"...
 Dumping 'GlyphOrder' table...
 Dumping 'head' table...
 Dumping 'hhea' table...
 Dumping 'maxp' table...
 Dumping 'OS/2' table...
 Dumping 'hmtx' table...
 Dumping 'cmap' table...
 Dumping 'fpgm' table...
 Dumping 'prep' table...
 Dumping 'cvt ' table...
 Dumping 'loca' table...
 Dumping 'glyf' table...
 Dumping 'name' table...
 Dumping 'post' table...
 Dumping 'gasp' table...
 /usr/local/lib/python2.7/site-
 packages/FontTools/fontTools/ttLib/tables/otTables.py:60: UserWarning:
 Coverage table has start glyph ID out of range: glyph27713.
 warnings.warn("Coverage table has start glyph ID out of range: %s." %
 start)
 An exception occurred during the decompilation of the 'GPOS' table
 Dumping 'GPOS' table...
 Dumping 'GSUB' table...
 Dumping 'DSIG' table...
从上面的提示可以看出,是在解析 GPOS 表时,通过 glyphID 去 Coverage 表索引时导致越界了,其中 glyph27713 的数值正是 0x6C41 27713 ,也就是上面图1中文件对比 的差异值。虽然这是FontTools工具的错误,不代表Apple系统本身,但它跟Apple系统 导致崩溃的是同一字节,从这可以直接得到导致崩溃的关键字节是glyphID值。
GPOS表
TrueType/OpenType字体格式中的GPOS表是用于为字体中文本布局及渲染提供glyph位 置信息的表,表中各个字体结构如图3所示

图3
GPOS表主要包含3个子表:ScriptList、FeatureList和LookupList,本次漏洞主要问题在 LookupList子表中的PairAdjustmentPositioning中,PairAdjustmentPositioning子表 (PairPos)被用于调整两个glyphs彼此之间的位置。
PairPos表下又包含多个PairSet数组,PairSet数组包含Coverage表中每个glyph对应的偏 移量,并按Coverage Index来排序。
PairSet下包含PairValueRecord指定每一glyph配对(pair)中的第二个 glyph(SecondGlyph)的glyph名和索引值GlyphID(对应【图3】中glyphRefID),同 时包含两个ValueRecord值去指定第一个glyph和第二个glyph的位置信息。
导致越界的漏洞正是用于索引的GlyphID(glyphRefID),用ttx解析原有正常字体文件 生成的xml文件,如图4所示,index="65"就是正常GlyphID值 00 41,如果随便给第1字 节设置个值都会导致崩溃。

图3
 
调试
用lldb调试下,崩溃后的地址及栈回溯如下:
 (lisa)run poc.ttf
Process 96714 launched 
Process 96714 stopped 
* thread #1: tid = 0x3f119d, 0x00007fffa7c01491 CoreText`OTL::GPOS::App
lyPairPos(OTL::LookupSubtable const*, TGlyphIterator&, OTL::Coverage co 
nst&) const + 411, queue = 'com.apple.main-thread', stop reason = EXC_B 
AD_ACCESS (code=1, address=0x3007ddfae) 
  frame #0: 0x00007fffa7c01491 CoreText`OTL::GPOS::ApplyPairPos(OTL::Lo
okupSubtable const*, TGlyphIterator&, OTL::Coverage const&) const + 411 
CoreText`OTL::GPOS::ApplyPairPos: 
->  0x7fffa7c01491 : mov    ax, word ptr [r14 + 2*rax + 0xa]
  0x7fffa7c01497 : rol    ax, 0x8
  0x7fffa7c0149b : movzx  eax, ax
  0x7fffa7c0149e : lea    rsi, [r14 + rax]
(lisa)register read rax
   rax = 0x00000000ffffffff
(lisa)x $r14+2*$rax+0xa
error: memory read failed for 0x3007c5600 
(lisa)bt
* thread #1: tid = 0x3f119d, 0x00007fffa7c01491 CoreText`OTL::GPOS::App
lyPairPos(OTL::LookupSubtable const*, TGlyphIterator&, OTL::Coverage co 
nst&) const + 411, queue = 'com.apple.main-thread', stop reason = EXC_B 
AD_ACCESS (code=1, address=0x3007ddfae) 

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载