MS14-019 の解析 と拡張カーネルv2.4b2

MS14-019 来ました
解析してみたところ、セキュリティホールの内容は、CMDファイルやBATファイル を起動する CMD /C を経由して起動されるが、起動者の意図しない場所にあるCMD.EXEから起動される恐れがあるというものでした。

Windows 2000 Kernel32 改造計画【BM】
というわけで、拡張カーネル v2.4bで同梱した、kernel32.dllは %systemroot%\system32\cmd.exe から強制的に起動するように実装してみました。

あと、拡張カーネル v2.4a以降v2.4bまでのゲーム対応版 kernel32.dll で一部の Vista 対応(Firefoxなども含む)アプリが不安定になる不具合が見つかりました。
というわけで、4/10 0:30に v2.4b2に差し替えてあります。
注意点として、HFSLIP 作成イメージ v13g の kernel32.dllは この影響を受けることがあります。

以下は 分析内容



CreateProcessInternalW

 L7C82A17B:
          push    [ebp-00000720h]
          mov    esi,[ntdll.dll!wcslen]
          call    esi
          push    [L7C885848]
          mov    [ebp-00000908h],eax
          call    esi
          pop    ecx
          pop    ecx
          mov    ecx,[ebp-00000908h]
          add    ecx,[ebp-000008D4h]
          add    eax,ecx
          lea    ecx,[eax+edi+01h]
          mov    [ebp-000009A4h],ecx
          mov    eax,fs:[00000018h]
          mov    [ebp-00000950h],eax
          add    ecx,ecx
          push    ecx
          push    [L7C8856D4]
          mov    eax,[eax+30h]
          push    [eax+18h]
          call    [ntdll.dll!RtlAllocateHeap]
          mov    esi,eax
          mov    [ebp-00000958h],esi
          cmp    esi,ebx
          jz     L7C8428E3
          push    [L7C885848]
          push    esi
          call    [ntdll.dll!wcscpy]
          pop    ecx
          pop    ecx
          cmp    [ebp-000006ADh],bl
          jnz    L7C82F1F9
          cmp    [ebp-00000716h],bl
          jnz    L7C82F1F9

  SWC7C82B44C_cmd__c_:
          unicode    'cmd /c ',0000h
 L7C885848:
         dd    SWC7C82B44C_cmd__c_

旧バイナリ

 L7C827A74:
          mov    eax,fs:[00000018h]
          mov    [ebp-000009A8h],eax
          push    00000210h
          push    [L7C8856D4]
          mov    eax,[eax+30h]
          push    [eax+18h]
          call    [ntdll.dll!RtlAllocateHeap]
 //         jmp    L7C842D82
// L7C842D82:
          mov    edi,eax
          mov    [ebp-00000854h],edi
          cmp    edi,ebx
          jz     L7C842A40
          push    00000104h
          push    edi
          push    SWC7C843A5C_ComSpec
          call    GetEnvironmentVariableW
          mov    [ebp-00000680h],eax
          cmp    eax,00000104h
          jc     L7C842DD4
          push    C000000Fh
          call    SUB_L7C809419
          mov    eax,fs:[00000018h]
          mov    [ebp-000009B0h],eax
 L7C842DC5:
          push    edi
 L7C842DC6:
          push    ebx
          mov    eax,[eax+30h]
          push    [eax+18h]
          call    esi
          jmp    L7C81D09E
 L7C842DD4:
          cmp    eax,ebx
          jnz    L7C842E0F
          push    000000F3h
          push    edi
          push    SWC7C843A44_SystemRoot
          call    GetEnvironmentVariableW
          mov    [ebp-00000680h],eax
          cmp    eax,000000F3h
          jnc    L7C842E69
          cmp    eax,ebx
          jz     L7C842E69
          push    SWC7C843A20__system32_cmd_exe
          push    00000104h
          push    edi
          call    SUB_L7C8631AF
          mov    [ebp-000009B8h],eax
 L7C842E0F:
          push    L7C843A14
          push    00000108h
          push    edi
          call    SUB_L7C8631AF
          mov    [ebp-000009D4h],eax
          cmp    [ebp-00000725h],bl
          jnz    L7C842E3F
          cmp    [ebp-0000074Fh],bl
          mov    [ebp-00000918h],ebx
          jz     L7C828CCD
 L7C842E3F:< br />          mov    dword ptr [ebp-00000918h],00000001h
          jmp    L7C828CCD
        
 L7C828C8C:
          mov    eax,fs:[00000018h]
          mov    [ebp-000009F0h],eax
          push    [ebp-0000085Ch]
          push    ebx
          mov    eax,[eax+30h]
          push    [eax+18h]
          call    [ntdll.dll!RtlFreeHeap]
          mov    [ebp-0000085Ch],ebx
          jmp    L7C8183F1
 L7C828CB6:
          push    [ebp-00000678h]
          call    [ntdll.dll!NtClose]
          mov    [ebp-00000678h],ebx
          jmp    L7C8183FD
 L7C828CCD:
          cmp    [ebp-00000725h],bl
          jnz    L7C82CB03
          cmp    [ebp-0000074Fh],bl
          mov    [ebp-00000914h],ebx
          jnz    L7C82CB03
 L7C828CEB:
          push    edi
          mov    edi,[ntdll.dll!wcslen]
          call    edi
          push    [ebp-0000079Ch]
          mov    [ebp-00000930h],eax
          call    edi
          pop    ecx
          pop    ecx
          mov    ecx,[ebp-00000930h]
          add    ecx,[ebp-00000914h]
          add    eax,ecx
          mov    ecx,[ebp-00000918h]
          lea    ecx,[eax+ecx+01h]
          mov    [ebp-000009DCh],ecx
          mov    eax,fs:[00000018h]
          mov    [ebp-000009E4h],eax
          add    ecx,ecx
          push    ecx
          push    [L7C8856D4]
          mov    eax,[eax+30h]
          push    [eax+18h]
          call    [ntdll.dll!RtlAllocateHeap]
          mov    edi,eax
          mov    [ebp-000009ECh],edi
          cmp    edi,ebx
          jz     L7C842E4E
          push    [ebp-00000854h]//
          push    edi
          call    [ntdll.dll!wcscpy]
          jmp    L7C842E84

 SWC7C843A20__system32_cmd_exe:
          unicode    '\system32\cmd.exe',0000h
 SWC7C843A44_SystemRoot:
          unicode    'SystemRoot',0000h
          Align    4
 SWC7C843A5C_ComSpec:
          unicode    'ComSpec',0000h

新バイナリ

 SWC7C5C696C_cmd_exe__c_:
          unicode    'cmd.exe /c ',0000h
 L7C5C6984:
          push    00000200h
          push    L7C5CE55C
          push    L7C5C6940
          call    ExpandEnvironmentStringsW
          test    eax,eax
          jnz    L7C5C69AB
          push    SWC7C5C696C_cmd_exe__c_
          push    L7C5CE55C
          call    lstrcpyW
 L7C5C69AB:
          push    [L7C5CB158]
          jmp    L7C5959D3

Windows 2000 パッチ用コード

おすすめ

コメントを残す

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