セキュリティホール 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に非対応な点以外は全て同じです。
Comments