MS14-027 の解析 と XP/2000への影響

マイクロソフト セキュリティ情報 MS14-027 – 重要

一通り解析終わったのですが、パッチ作るのは大変なので後回しで・・・

OS

最も深刻

な脆弱性

の影響

総合的

深刻度

置き換えられる

更新プログラム

WinXP

SP3

特権の昇格

重要

MS10-007

KB975713

Win2000 SP4

特権の昇格

重要

MS10-007

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

おすすめ

コメントを残す

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