マイクロソフト CVE-2017-11882 を手作業でパッチを当てた? 調べてみたところ

「Microsoft Office」に17年前からの脆弱性が発覚、月例パッチで修正 - CNET Japan
0patch Blog: Did Microsoft Just Manually Patch Their Equation Editor Executable? Why Yes, Yes They Did. (CVE-2017-11882)

Microsoft が Office 2000から組み込んでいる数式エディタ  EQNEDT32.EXE に脆弱性が見つかりました

0Patch Blogによると、Microsoftが 17年前のバイナリを1回も更新せずにいて、それに手作業でパッチを当てた理由は「Microsoft がやらかした(ソース紛失)」だからだといっています。

さて、本当にそんなことがあるのか調べてみました


link1
まず、冒頭
BFCE0A3A -> 88FA9159 リンク日時
74710800 -> 092d0900 チェックサム
0000 -> 0040 DllCharacteristics IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (ASLR が有効)
481a->e83e 証明書テーブルサイズが大きくなった

          not    ecx
          sub    edi,ecx
          mov    eax,ecx
          mov    edx,edi

          lea    edi,[ebp-28h]
          mov    esi,edx
          shr    ecx,02h
          rep movsd
          mov    ecx,eax
          and    ecx,00000003h
          rep movsb
          lea    eax,[ebp-28h]
          push    eax

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L00411656
          mov    ecx,00000020h
 L00411656:

          mov    esi,edi
          lea    edi,[ebp-28h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          lea    eax,[ebp-28h]
          push    eax

処理速度を落として、赤字の処理をするようになっています ・ω・!
(水色は同じ処理)

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L004116C7
          mov    ecx,00000020h
 L004116C7:

          mov    esi,edi
          lea    edi,[ebp-00000088h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          movsx    eax,[ebp-43h]
          cmp    eax,00000001h

少し後ろに同じ処理の修正があります

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L00411795
          mov    ecx,00000020h
 L00411795:

          mov    esi,edi
          mov    edi,[ebp+10h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          mov    eax,00000001h
          jmp    L00411870

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L00411809
          mov    ecx,00000020h
 L00411809:
          mov    esi,edi
          mov    edi,[ebp+10h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          mov    eax,00000001h
          jmp    L00411870

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L00411854
          mov    ecx,00000020h
 L00411854:
          mov    esi,edi
          mov    edi,[ebp+10h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          mov    eax,00000001h
          jmp    L00411870

          not    ecx
          sub    edi,ecx
          mov    eax,ecx
          mov    edx,edi
          mov    edi,[ebp-04h]
          mov   &
nbsp;esi,edx
          shr    ecx,02h
          rep movsd
          mov    ecx,eax
          and    ecx,00000003h
          rep movsb

          mov    ax,[ebp+0Ch]

          not    ecx
          sub    edi,ecx
          cmp    ecx,00000021h
          jc     L00421A37
          mov    ecx,00000020h
 L00421A37:

          mov    esi,edi
          mov    edi,[ebp-04h]
          rep movsb
          xor    eax,eax
          stosb
          nop

          mov    ax,[ebp+0Ch]

6箇所同じ修正がありました。

なにやってるかというと、バッファーオーバーフロー時に32バイトに丸めています

 L00416503:
          mov    eax,[ebp+08h]
          mov    [ebp-04h],eax
          inc    [ebp+08h]
          call    SUB_L00416352
          mov    ecx,[ebp-04h]
          mov    [ecx],al
          mov    eax,[ebp-04h]
          movsx    eax,[eax]
          test    eax,eax
          jz     L00416529
          jmp    L00416503
 L00416529:
          mov    eax,[ebp+08h]
          mov    byte ptr [eax],00h

          mov    edi,[ebp+08h]
          mov    ecx,[ebp+0Ch]
          test    ecx,ecx
          jz     L00416521

 L0041650D:
          xchg    ebx,ecx
          call    SUB_L00416352
          stosb
          test    al,al
          jz     L00416521
          xchg    ecx,ebx
          loop    L0041650D
          dec    edi
          xor    eax,eax
          stosb
 L00416521:

こっちは、関数に最大バッファーサイズを設けて、超えた場合関数が強制的に終了するように変更されています

          lea    eax,[ebp-000001FCh]
          push    eax
          call    SUB_L004164FA
          add    esp,00000004h
          call    SUB_L00416569
          push    eax
          lea    eax,[ebp-000001FCh]
          push    eax
          call    SUB_L00418544
          add    esp,00000008h
          jmp    L00418318
          jmp    L00418318

          push    000001F4h
          lea    eax,[ebp-000001FCh]
          push    eax
          call    SUB_L004164FA
          add    esp,00000008h

          call    SUB_L00416569
          push    eax
          lea    eax,[ebp-000001FCh]
          push    eax
          call    SUB_L00418544
          add    esp,00000008h
          jmp    L00418318

よび出し元1

          movzx    ax,al
          mov    [ebp-00000108h],ax
          call    SUB_L00416352
          movzx    ax,al
          mov    [ebp-0000010Ch],ax
          lea    eax,[ebp-00000104h]
          push    eax
          call    SUB_L004164FA
          add    esp,00000004h
          mov    eax,[ebp-0000010Ch]
          push    eax
          lea    eax,[ebp-00000104h]
          push    eax
          call    SUB_L004214C6
          add    esp,00000008h
&
nbsp;         movsx    ecx,[ebp-00000108h]

          mov    [L0045ABE6+ecx*2],ax

          movzx    ebx,al
          call    SUB_L00416352
          movzx    ax,al
          mov    [ebp-0000010Ch],ax
          push    00000100h
          lea    eax,[ebp-00000104h]
          push    eax
          call    SUB_L004164FA
          add    esp,00000008h
          mov    eax,[ebp-0000010Ch]
          push    eax
          lea    eax,[ebp-00000104h]
          push    eax
          call    SUB_L004214C6
          add    esp,00000008h
          mov    ecx,ebx
          nop dword [dword rax + rax + 0x00000000]
  // 何もしない
          mov    [L0045ABE6+ecx*2],ax

よび出し元2

8バイトの何もしない命令が埋め込まれてるのは笑った ・ω・

後は、リソーステーブルが少しいじられてバージョン情報などが書き換わっているのと
電子署名のバイナリデータで差異があることぐらいです

link2

バイナリエディタで操作した決定的な証拠はこれです

なんと、エクスポートテーブルがバイナリとして書き出された日時が 2000/11/9 のままなのです ・ω・

link3
リソーステーブルもそうですね ・ω・ニヤソ

おすすめ

4件のフィードバック

  1. anonymous より:

    命令長が大きく同じ結果になる別のオペコードに置き換えて誤魔化したりせず、素直にnopで埋めてくるのがMSの萌えポイントだと思うの

  2. anonymous より:

    命令長が大きく同じ結果になる別のオペコードに置き換えて誤魔化したりせず、素直にnopで埋めてくるのがMSの萌えポイントだと思うの

  3. plum より:

    そもそもサードパーティ製なのでソース持ってなかったんじゃね?って話も出てるようですね。

  4. plum より:

    そもそもサードパーティ製なのでソース持ってなかったんじゃね?って話も出てるようですね。

コメントを残す

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