MS16-087 のコード解析

プリンタスプーラーの脆弱性

 L74C00E15:
          push    [L74C3C2D4]
          call    SUB_L74C00DAA
          mov    esi,[KERNEL32.dll!DeleteCriticalSection]
          push    L74C3C340
          call    esi
          push    L74C3C880
          call    esi

          call    SUB_L74C00E3B
          jmp    L74BFE7F3

追加コード1

 SUB_L74C07FB9:
          push    00000060h
          push    L74C07FD0
          call    SUB_L74BF2E7F
          xor    eax,eax
          mov    [ebp-20h],eax
          mov    [ebp-2Ch],eax
          mov    [ebp-44h],eax
          mov    [ebp-1Ch],eax
          mov    [ebp-54h],eax
          mov    [ebp-4Ch],eax
          mov    [ebp-24h],eax
          mov    ebx,[ebp+18h]
          push    ebx
          call    SUB_L74C209DB
          mov    [ebp-58h],eax
          mov    edi,L74C3C880
          push    edi
          mov    esi,[KERNEL32.dll!EnterCriticalSection]
          call    esi
          cmp    dword ptr [ebp-58h],00000001h
          jnz    L74C1645E
 L74C1643D:
          cmp    word ptr [L74C3F154],0000h
          jbe    L74C1645E
          push    edi
          call    [KERNEL32.dll!LeaveCriticalSection]
          push    000001F4h
          call    [KERNEL32.dll!Sleep]
          push    edi
          call    esi
          jmp    L74C1643D
 L74C1645E:
          xor    eax,eax
          mov    ax,[L74C3F154]
          inc    eax
          mov    [L74C3F154],ax
          push    edi
          call    [KERNEL32.dll!LeaveCriticalSection]
          jmp    L74C07FDC
 L74C16479:
          test    eax,00020000h
          jz     L74C07FEA
          test    byte ptr [ebp+15h],10h
          jnz    L74C07FEA
          mov    dword ptr [ebp-38h],00000001h ;************
          jmp    L74C07FEE

 L74C07FDC:
          mov    eax,[ebx+5Ch]
          test    eax,02000000h
          jnz    L74C16479
 L74C07FEA:
          and    dword ptr [ebp-38h],00000000h
 L74C07FEE:
          xor    eax,eax
          cmp    [ebp-38h],eax
          jnz    L74C083F8
          test    byte ptr [ebp+16h],02h
          mov    dword ptr [ebp-50h],00000001h
          jnz    L74C083F8
 
 
 SUB_L74C0839B:
          cmp    dword ptr [ebp-2Ch],00000000h
          jz     L74C083AB
          test    byte ptr [ebx+5Fh],02h
          jnz    L74C16590
 L74C083AB:
          mov    edi,[ebp-2Ch]
 
        test    edi,edi
          jz     L74C1663B
 L74C083B6:
          cmp    dword ptr [ebp+1Ch],00000000h
          jz     L74C083CE
          cmp    dword ptr [ebp-24h],00000000h
          jz     L74C083CE
          push    ebx
          push    [ebp-24h]
          push    [ebp-1Ch]
          call    SUB_L74C09258
 L74C083CE:
          call    SUB_L74BF1666
          xor    ebx,ebx
          cmp    [ebp-24h],ebx
          jz     L74C1666A
          push    [ebp-24h]
          push    [ebp-1Ch]
          call    SUB_L74C066BB
          jmp    L74C1666A
 L74C083EE:
          call    SUB_L74BF7CFE
          jmp    L74C16692
 L74C08416:          cmp    [ebp-4Ch],ebx
          jz     L74C0842B
          xor    eax,eax
          cmp    edi,ebx
          setz     al
          push    eax
          push    [ebp-4Ch]
          call    SUB_L74C08439
 L74C0842B:
          cmp    edi,ebx
          jz     L74C1669E
 L74C08433:
          retn

 L74C1666A:
          mov    esi,L74C3C880
          push    esi
          call    [KERNEL32.dll!EnterCriticalSection]
          xor    eax,eax
          mov    ax,[L74C3F154]
          dec    eax
          mov    [L74C3F154],ax
          cmp    [L74C3F154],bx
          jz     L74C083EE
 L74C16692:
          push    esi
          call    [KERNEL32.dll!LeaveCriticalSection]
          jmp    L74C08416

SUB_L74C209DB:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          sub    esp,0000000Ch
          push    ebx
          push    esi
          push    edi
          mov    edi,[ebp+08h]
          xor    esi,esi
          mov    ebx,00002000h
          test    [edi+5Ch],ebx
          mov    [ebp-04h],esi
          jz     L74C20A03
          mov    eax,[edi+00000080h]
          mov    [ebp+08h],eax
          jmp    L74C20A27
 L74C20A03:
          push    esi
          push    esi
          lea    eax,[ebp+08h]
          push    eax
          push    esi
          push    00020019h
          push    esi
          push    [L74C3C820]
          push    80000002h
          call    SUB_L74BF33B7
          test    eax,eax
          jz     L74C20A27
          mov    [ebp+08h],esi
 L74C20A27:
          cmp    dword ptr [ebp+08h],00000000h
          push    00000004h
          pop    esi
          mov    [ebp-08h],esi
          jz     L74C20A56
          push    edi
          lea    eax,[ebp-08h]
          push    eax
          lea    eax,[ebp-04h]
          push    eax
          lea    eax,[ebp-0Ch]
          push    eax
          push    SWC74C3E1A8_SerializeDriverInstallsAndUpgrad
          push    [ebp+08h]
          call    SUB_L74BF33F6
          test    eax,eax
          jnz    L74C20A56
          cmp    [ebp-0Ch],esi
          jz     L74C20A5A
 L74C20A56:
          and    dword ptr [ebp-04h],00000000h
 L74C20A5A:
          xor    eax,eax
          cmp    [ebp-04h],eax
          jz     L74C20A68
          mov    dword ptr [ebp-04h],00000001h
 L74C20A68:
          cmp    [ebp+08h],eax
          jz     L74C20A7B
          test    [edi+5Ch],ebx
          jnz    L74C20A7B
          push    eax
          push    [ebp+08h]
          call    SUB_L74BF338F
 L74C20A7B:
          mov    eax,[ebp-04h]
          pop    edi
          pop    esi
          pop    ebx
          leave
          retn    0004h

コード2

 SUB_L74C23AB3:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          push    esi
       
;   mov    esi,[KERNEL32.dll!CreateFileW]
          push    edi
          push    [ebp+20h]
          push    [ebp+1Ch]
          push    [ebp+18h]
          push    [ebp+14h]
          push    [ebp+10h]
          push    [ebp+0Ch]
          push    [ebp+08h]
          call    esi
          mov    edi,eax
          cmp    edi,FFFFFFFFh
          jnz    L74C23B0F
          call    [KERNEL32.dll!GetLastError]
          cmp    eax,00000050h
          jnz    L74C23B0F
          push    [ebp+08h]
          call    [KERNEL32.dll!DeleteFileW]
          test    eax,eax
          jz     L74C23B0F
          push    [ebp+20h]
          push    [ebp+1Ch]
          push    [ebp+18h]
          push    [ebp+14h]
          push    [ebp+10h]
          push    [ebp+0Ch]
          push    [ebp+08h]
          call    esi
          mov    edi,eax
 L74C23B0F:
          mov    eax,edi
          pop    edi
          pop    esi
          pop    ebp

          retn    001Ch

コード3 call CreateFileW が丸々置き換わっている

脆弱性の修正は3つのファイルに及んでいるのだけど、これはそのうちの一つ
localsp.dll の変更点の解析

操作が失敗すると同時に複数のプリンター キューをアップグレードすると、Windows Server 2003 または Windows XP を実行しているプリンター クライアント プリンター ドライバーのアップグレードします。

新しいバージョンは SerializeDriverInstallsAndUpgrades キーを参照してるから、このアップデートも適用されてる模様。

ちょっとややこしい・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です