MS14-027 の解析 と XP/2000への影響
マイクロソフト セキュリティ情報 MS14-027 – 重要
一通り解析終わったのですが、パッチ作るのは大変なので後回しで・・・
OS |
最も深刻 な脆弱性 の影響 |
総合的 深刻度 |
置き換えられる 更新プログラム |
WinXP SP3 |
特権の昇格 |
重要 |
KB975713 |
Win2000 SP4 |
特権の昇格 |
重要 |
KB975713 |
まず気になったのが、
msvcrt.dll の__dllonexit / _onexit 及び、 ntdll.dll の RtlDllShutdownInProgress をコールするようになったこと
おそらく、レジストリで読み込んだ設定を解放するタイミングを調整してるような感じ
SUB_L774175A9: push ebp mov ebp,esp cmp dword ptr [L7741B6CC],FFFFFFFFh jnz L774175BE pop ebp jmp_msvcrt.dll!_onexit: jmp [msvcrt.dll!_onexit] L774175BE: push L7741B6C8 // サイズ? push L7741B6CC // 確保したアドレス ? push [ebp+08h] call jmp_msvcrt.dll!__dllonexit add esp,0000000Ch pop ebp retn SUB_L774175DA: push ebp mov ebp,esp push [ebp+08h] call SUB_L774175A9 neg eax sbb eax,eax neg eax pop ecx dec eax pop ebp retn |
次。今まで HKEY_CLASS_ROOT で呼んでたレジストリ処理が全て HKEY_LOCALMACHINE の SOFTWARE\Classes の該当キーを RegOpenKeyExW で開いた時の KEY の返り値に置き換わっている。
SUB_L7740DCA7: push ebp mov ebp,esp push ecx mov eax,fs:[00000018h] push esi xor esi,esi cmp [eax+00000F9Ch],esi mov [ebp-04h],ecx jz L7740DD37 mov eax,fs:[00000018h] mov eax,[eax+30h] cmp [eax+000001D4h],esi jnz L7740DD37 push [ebp+08h] call SUB_L7740DC15 test al,al jz L7740DD37 push ebx push edi lea eax,[ebp+08h] push eax push 00020019h push esi mov esi,[ADVAPI32.dll!RegOpenKeyExW] mov ebx,SWC7740DD40_SOFTWARE_Classes push ebx mov edi,80000002h push edi call esi test eax,eax lea eax,[ebp+08h] push eax push 00020019h push 00000000h push ebx push edi jg L7740DD15 call esi mov esi,eax jmp L7740DD25 L7740DD15: call esi mov esi,eax and esi,0000FFFFh or esi,80070000h L7740DD25: test esi,esi pop edi pop ebx jl L7740DD37 mov eax,[ebp+08h] mov ecx,[ebp-04h] mov [ecx+00000098h],eax L7740DD37: mov eax,esi pop esi leave retn 0004h |
さらに call SUB_L7740DC15 を追ってみよう
SUB_L7740DC15: push ebp mov ebp,esp call SUB_L7740DACF test eax,eax jz L7740DC45 push [ebp+08h] mov eax,L7740DC50 call SUB_L7740DA65 test & nbsp; eax,eax jnz L7740DC45 push [ebp+08h] mov eax,[L7741BDE4] call SUB_L7740DA65 test eax,eax jz L7740DC48 L7740DC45: xor eax,eax inc eax L7740DC48: pop ebp retn 0004h L7740DC50: unicode '.exe',0 unicode '.lnk',0 unicode '.cmd',0 unicode '.bat',0 unicode '.pif',0 unicode '.scf',0 unicode '.com',0 unicode '.scr',0 L7740DA65: push ebp mov ebp,esp push esi mov esi,eax test esi,esi jz L7740DA77 cmp dword ptr [ebp+08h],00000000h jnz L7740DA96 L7740DA77: xor eax,eax L7740DA79: pop esi pop ebp retn 0004h |
呼ばれているファイル拡張子が .exe, .link, .cmd, .bat, .pif, .scf, .com, .scr
のいずれかでないことをチェックしている
SUB_L7740DACF: push ebp mov ebp,esp push ecx push ecx push ebx push esi push edi mov edi,[KERNEL32.dll!InterlockedCompareExchange] push FFFFFFFFh push FFFFFFFFh mov ebx,L7741BDE4 push ebx xor esi,esi call edi test eax,eax mov [ebp-04h],eax jnz L7740DB7D push eax lea eax,[ebp-04h] push eax lea eax,[ebp-08h] push eax push SWC7740DBB0_UseLocalMachineSoftwareClassesWh push SWC7740DB8C_FileAssociation push 00000002h call SHLWAPI.519 mov esi,eax test esi,esi jl L7740DB25 cmp dword ptr [ebp-08h],00000007h jz L7740DB4C mov esi,8007070Ch jmp L7740DB4C L7740DB25: cmp esi,80070002h jnz L7740DB4C push L773E3268 call StrDupW mov esi,eax mov [ebp-04h],esi neg esi sbb esi,esi and esi,7FF8FFF2h add esi,8007000Eh L7740DB4C: test esi,esi jl L7740DB5F push L7740DAA8 call SUB_L774175DA test eax,eax pop ecx jz L7740DB64 L7740DB5F: mov esi,80004005h L7740DB64: test esi,esi jl L7740DB74 push 00000000h push [ebp-04h] push ebx call edi test eax,eax jz L7740DB7D L7740DB74: push [ebp-04h] call [KERNEL32.dll!LocalFree] L7740DB7D: x or eax,eax pop edi test esi,esi pop esi setge al pop ebx leave retn ;------------------------------------------------------------------------------ SWC7740DB8C: unicode 'FileAssociation',0 SWC7740DBB0: unicode 'UseLocalMachineSoftwareClassesWhenImpersonating',0 ;------------------------------------------------------------------------------ L7740DA7E: push esi push [ebp+08h] call StrCmpICW test eax,eax jz L7740DA9E push esi call jmp_msvcrt.dll!wcslen pop ecx lea esi,[esi+eax*2+02h] L7740DA96: cmp word ptr [esi],0000h jz L7740DA77 jmp L7740DA7E L7740DA9E: xor eax,eax inc eax jmp L7740DA79 L7740DAA8: call jmp_ntdll.dll!RtlDllShutdownInProgress test al,al jnz L7740DAC9 push 00000000h push L7741BDE4 call [KERNEL32.dll!InterlockedExchange] test eax,eax jz L7740DAC9 push eax call [KERNEL32.dll!LocalFree] L7740DAC9: retn |
さらに、アップデートを実行した時にレジストリに書き込まれる
HKLM,Software\Microsoft\Windows\CurrentVersion\Explorer\FileAssociation の UseLocalMachineSoftwareClassesWhenImpersonating というキーに
偽装されていた場合のソフトウェアクラスとして
拡張子、 ".bas",".hta",".js",".msi",".ps1",".reg",".vb",".vbs",".wsf" が追加登録されていている
この処理で 拡張子の偽装を検出したファイルははじいて何もしないで終了するというのがパッチの内容でした
シャットダウン時のメモリ解放の有無などがちょっと面倒なので、レジストリ登録してるこの拡張子一覧を、DLL内に持たせて、チェックすることで処理を簡略化してWindows 2000の SHLWAPI.DLL に実装しようかと考えています。
ちなみに、Windows 2000の 最新版DLLの SHLWAPI.DLL の アドレス 0x70AC0AAC からが該当コードになります
L70AC0AAC: push ebp mov ebp,esp push ecx push ecx and dword ptr [ebp-04h],00000000h push ebx push esi mov esi,ecx < ここに脆弱性のチェック処理を入れる必要がある mov eax,[esi+14h] cmp word ptr [eax],002Eh push edi mov ebx,L70A8E268 jnz L70AC0AF9 lea edi,[esi+00000098h] push edi push ebx push 00000000h push eax push 80000000h call SHLWAPI.544 |
Comments