セキュリティホール MS10-097 の解析

マイクロソフト セキュリティ情報 MS10-097 - 重要 : インターネット接続のサインアップ ウィザードの安全でないライブラリのロードにより、リモートでコードが実行される (2443105) のターゲットである isign32.dll を解析しました。


旧コードから削られた箇所

 SUB_L63C96FD4:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          sub    esp,00000094h
          mov    eax,[L63C9DA10]
          push    SWC63C92790_smmscrpt_dll
          mov    [ebp-04h],eax
          call    [KERNEL32.dll!LoadLibraryW]
          call    SUB_L63C96E9A
          test    eax,eax
          jnz    L63C9709C
          push    esi
          push    edi
          push    00000007h
          pop    ecx
          mov    esi,SWC63C927AC__icwscrpt_exe_
          lea    edi,[ebp-24h]
          rep movsd
          movsw

新コードで追加された箇所

 SWC63C92EAC__windir__connection_wizard_:
          unicode    '%windir%\connection wizard\',0000h
 SWC63C92EE4_SafeDllLoadPath:
          unicode    'SafeDllLoadPath',0000h

;------------------------------------------------------------------------------
 SUB_L63C985CC:
          mov    edi,edi
          push    ebp
          mov    ebp,esp
          sub    esp,0000042Ch
          mov    eax,[L63C9DA10]
          push    ebx
          push    esi
          push    edi
       
          mov    esi,SWC63C92518_nogood
          lea    edi,[ebp-00000410h]
          movsd
          movsd
          movsd
          mov    [ebp-04h],eax
          mov    eax,[ebp+08h]
          mov    [ebp-00000428h],eax
          mov    eax,[ebp+0Ch]
          movsd
          xor    ebx,ebx
          mov    [ebp-00000420h],eax
          xor    eax,eax
          push    0000007Ch
          pop    ecx
          lea    edi,[ebp-00000400h]
          rep stosd
          mov    ecx,00000082h
          lea    edi,[ebp-0000020Eh]
          mov    [ebp-00000210h],bx
          rep stosd
          mov    eax,[L63C9DCB0]
          cmp    eax,ebx
          mov    esi,00000104h
          mov    [ebp-00000414h],ebx
          mov    [ebp-0000041Ch],ebx
          mov    [ebp-00000424h],ebx
          mov    [ebp-00000418h],esi
          mov    [ebp-0000042Ch],ebx
          jnz    L63C98664
          push    SSZ63C92F04_lpfnInetGetAutodial_is_NULL____
          call    SUB_L63C9352C
          xor    eax,eax
          inc    eax
          jmp    L63C9886F
 L63C98664:
          push    00000100h
          lea    ecx,[ebp-00000410h]
          push    ecx
          lea    ecx,[ebp-0000042Ch]
          push    ecx
          call    eax
          lea    eax,[ebp-0000041Ch]
          push    eax
          push    SWC63C92798_Software_Microsoft_Internet_Conn
          push    80000002h
          call    [ADVAPI32.dll!RegOpenKeyW]
          cmp    eax,ebx
          jnz    L63C98741
          lea    eax,[ebp-00000418h]
          push    eax
          lea    eax,[ebp-00000210h]
          push    eax
          lea    eax,[ebp-00000424h]
          push    eax
          push    ebx
          push    SWC63C92EE4_SafeDllLoadPath
          push    [ebp-0000041Ch]
          call    [ADVAPI32.dll!RegQueryValueExW]
          test    eax,eax
          jnz    L63C98741
  &nb
sp;       cmp    [ebp-00000418h],ebx
          jz     L63C98741
          cmp    dword ptr [ebp-00000424h],00000001h
          jnz    L63C98741
          cmp    [ebp-00000210h],bx
          jz     L63C98741
          mov    eax,[ebp-00000418h]
          lea    eax,[ebp+eax*2-00000210h]
          cmp    [eax-02h],bx
          jz     L63C986F9
          inc    [ebp-00000418h]
          mov    [eax],bx
 L63C986F9:
          lea    eax,[ebp-00000210h]
          push    eax
          call    [KERNEL32.dll!lstrlenW]
          cmp    word ptr [ebp+eax*2-00000212h],005Ch
          jz     L63C9872B
          push    L63C9171C
          push    esi
          lea    eax,[ebp-00000210h]
          push    eax
          call    SUB_L63C9781A
          cmp    eax,ebx
          jl     L63C98820
 L63C9872B:
          push    SWC63C9D9BC_SBSCFG_DLL
          push    esi
          lea    eax,[ebp-00000210h]
          push    eax
          call    SUB_L63C9781A
          cmp    eax,ebx
          jmp    L63C9877E
 L63C98741:
          push    esi
          lea    eax,[ebp-00000210h]
          push    eax
          push    SWC63C92EAC__windir__connection_wizard_
          call    [KERNEL32.dll!ExpandEnvironmentStringsW]
          cmp    eax,ebx
          mov    [ebp-00000418h],eax
          jz     L63C98820
          cmp    eax,esi
          jnc    L63C98820
          push    SWC63C9D9BC_SBSCFG_DLL
          push    esi
          lea    eax,[ebp-00000210h]
          push    eax
          call    SUB_L63C9781A
          test    eax,eax

 L63C9877E:
          jl     L63C98820
          lea    eax,[ebp-00000210h]
          push    eax
          push    SSZ63C92E88_ISIGN32__Calling_LoadLibrary_on_
          call    SUB_L63C9352C
          pop    ecx
          lea    eax,[ebp-00000210h]
          pop    ecx
          push    eax
          call    [KERNEL32.dll!LoadLibraryW]
          cmp    eax,ebx
          mov    [ebp-00000414h],eax
          jz     L63C98820
          mov    esi,SSZ63C9D9D4_Configure
          push    esi
          push    SSZ63C92E60_ISIGN32__Calling_GetProcAddress_
          call    SUB_L63C9352C
          pop    ecx
          pop    ecx
          push    esi
          push    [ebp-00000414h]
          call    [KERNEL32.dll!GetProcAddress]
          cmp    eax,ebx
          mov    [L63C9DCD8],eax
          jz     L63C9880D
          lea    eax,[ebp-00000410h]
          push    eax
          push    [ebp-00000420h]
          push    SSZ63C92E2C_ISIGN32__Calling_the_Configure_e
          call    SUB_L63C9352C
          add    esp,0000000Ch
          lea    eax,[ebp-00000410h]
          push    eax
          push    [ebp-00000420h]
          push    [ebp-00000428h]
          call    [L63C9DCD8]
 L63C98809:
          mov    esi,eax
          jmp    L63C98825
 L63C9880D:
          push    SSZ63C92DF8_ISIGN32__Unable_to_call_the_Conf
          call    SUB_L63C9352C
          pop    ecx
          call    [KERNEL32.dll!GetLastError]
          jmp    L63C98809
 L63C98820:
          mov   
; esi,00000485h
 L63C98825:
          cmp    [ebp-0000041Ch],ebx
          jz     L63C9883F
          push    [ebp-0000041Ch]
          call    [ADVAPI32.dll!RegCloseKey]
          mov    [ebp-0000041Ch],ebx
 L63C9883F:
          cmp    [ebp-00000414h],ebx
          jz     L63C98853
          push    [ebp-00000414h]
          call    [KERNEL32.dll!FreeLibrary]
 L63C98853:
          cmp    [L63C9DCD8],ebx
          jz     L63C98861
          mov    [L63C9DCD8],ebx
 L63C98861:
          push    esi
          push    SSZ63C92DC4_ISIGN32__CallSBSConfig_exiting_w
          call    SUB_L63C9352C
          pop    ecx
          mov    eax,esi
 L63C9886F:
          pop    ecx
          mov    ecx,[ebp-04h]
          pop    edi
          pop    esi
          pop    ebx
          call    SUB_L63C9B9FA
          leave
          retn

解説するとsmmscrpt.dllを LoadLibraryする箇所が一か所削られて、SBSCFG.DLLをロードする箇所が、単に LoadLibrary するのではなく、 %windir%\connection wizard\SBSCFG.DLL からロードするか、
HKLM\Software\Microsoft\Internet Connection Wizard にある SafeDllLoadPath というレジストリーキーのパスを参照するようになっています(非公開情報っぽいですね)

でも、このレジストリを改竄されると、意味がないような気が|;・ω・)

Windows 2000のコードを解析してみると同じ個所がありました。
この位なら自前で修正できそうだったので、公開しました。
SafeDllLoadPathに非対応な点以外は全て同じです。

おすすめ

コメントを残す

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