Microsoft Windows – ‘USP10!otlList::insertAt’ Uniscribe Font Processing Heap Buffer Overflow (MS17-011)

  • 作者: Google Security Research
    日期: 2017-03-20
  • 类别:
    平台:
  • 来源:https://www.exploit-db.com/exploits/41647/
  • Source: https://bugs.chromium.org/p/project-zero/issues/detail?id=1022
    
    We have encountered a crash in the Windows Uniscribe user-mode library, in the memmove() function called by USP10!otlList::insertAt, while trying to display text using a corrupted font file:
    
    ---
    (4b44.24a8): Access violation - code c0000005 (first chance)
    First chance exceptions are reported before any exception handling.
    This exception may be expected and handled.
    eax=093bc154 ebx=0943c104 ecx=00000012 edx=00000000 esi=093bc10c edi=0943c104
    eip=76bc9f40 esp=001ee9b4 ebp=001ee9bc iopl=0 nv up ei pl nz ac pe nc
    cs=0023ss=002bds=002bes=002bfs=0053gs=002b efl=00010216
    msvcrt!memmove+0x5a:
    76bc9f40 f3a5rep movs dword ptr es:[edi],dword ptr [esi]
    0:000> kb
    ChildEBP RetAddrArgs to Child
    001ee9bc 7522e87a 0943c104 093bc10c 00000048 msvcrt!memmove+0x5a
    001ee9dc 752358bd 00000002 ffffffff 00000001 USP10!otlList::insertAt+0x3a
    001ee9f8 7523a414 001eee10 001eee34 00000002 USP10!InsertGlyphs+0x1d
    001eea3c 75239676 001eee10 001eee34 001eed24 USP10!SubstituteNtoM+0x224
    001eea7c 75231393 001eee10 001eee34 001eed24 USP10!otlMultiSubstLookup::apply+0xf6
    001eeae0 752335e1 00000000 001eee10 001eee34 USP10!ApplyLookup+0x183
    001eece4 7522f29f 42555347 001eee4c 001eee10 USP10!ApplyFeatures+0x481
    001eed30 7522f710 00000000 093da000 093d9b58 USP10!SubstituteOtlGlyphs+0x1bf
    001eed6c 752213c0 001eede8 001eee20 001eee4c USP10!SubstituteOtlChars+0x220
    001eefe8 7521548a 001ef0f4 001ef120 001ef108 USP10!HebrewEngineGetGlyphs+0x690
    001ef0a8 7521253f 001ef0f4 001ef120 001ef108 USP10!ShapingGetGlyphs+0x36a
    001ef190 751e5c6f 86011dce 093b6124 093b6318 USP10!ShlShape+0x2ef
    001ef1d4 751f167a 86011dce 093b6124 093b6318 USP10!ScriptShape+0x15f
    001ef234 751f2b14 00000000 00000000 001ef2b4 USP10!RenderItemNoFallback+0xfa
    001ef260 751f2da2 00000000 00000000 001ef2b4 USP10!RenderItemWithFallback+0x104
    001ef284 751f4339 00000000 001ef2b4 093b6124 USP10!RenderItem+0x22
    001ef2c8 751e7a04 000004a0 00000400 86011dce USP10!ScriptStringAnalyzeGlyphs+0x1e9
    001ef2e0 76ca5465 86011dce 093b6040 0000000a USP10!ScriptStringAnalyse+0x284
    001ef32c 76ca5172 86011dce 001ef714 0000000a LPK!LpkStringAnalyse+0xe5
    001ef428 76ca1410 86011dce 00000000 00000000 LPK!LpkCharsetDraw+0x332
    001ef45c 763c18b0 86011dce 00000000 00000000 LPK!LpkDrawTextEx+0x40
    001ef49c 763c22bf 86011dce 00000058 00000000 USER32!DT_DrawStr+0x13c
    001ef4e8 763c21f2 86011dce 001ef714 001ef728 USER32!DT_GetLineBreak+0x78
    001ef594 763c14d4 86011dce 00000000 0000000a USER32!DrawTextExWorker+0x255
    001ef5b8 763c2475 86011dce 001ef714 ffffffff USER32!DrawTextExW+0x1e
    001ef5ec 013abcec 86011dce 001ef714 ffffffff USER32!DrawTextW+0x4d
    [...]
    0:000> dd esi
    093bc10c00000b45 00010001 00000b46 00010002
    093bc11c00000b47 00010003 00000b48 00010004
    093bc12c00000b49 00010005 00000b4a 00010006
    093bc13c00000b4b 00010007 00000b4c 00010008
    093bc14c00000b4d 00010009 000b0000 67696c63
    093bc15c00000001 000b0000 00000001 000000f8
    093bc16c00000048 001104bd 00010000 00000b26
    093bc17c00010001 00000b27 00010002 00000b28
    0:000> dd edi
    0943c104???????? ???????? ???????? ????????
    0943c114???????? ???????? ???????? ????????
    0943c124???????? ???????? ???????? ????????
    0943c134???????? ???????? ???????? ????????
    0943c144???????? ???????? ???????? ????????
    0943c154???????? ???????? ???????? ????????
    0943c164???????? ???????? ???????? ????????
    0943c174???????? ???????? ???????? ????????
    ---
    
    The issue reproduces on Windows 7. It is easiest to reproduce with PageHeap enabled, but it is also possible to observe a crash in a default system configuration. In order to reproduce the problem with the provided samples, it might be necessary to use a custom program which displays all of the font's glyphs at various point sizes.
    
    Attached is an archive with 3 crashing samples.
    
    
    Proof of Concept:
    https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/41647.zip