- PR -

Apacheの417エラー(Expectation Failed)について

1
投稿者投稿内容
shack
会議室デビュー日: 2008/09/19
投稿数: 3
投稿日時: 2008-09-20 00:24
はじめましてshackと申します。
Apacheの設定についてお教え願いたいと思っております。

ApacheにExpectヘッダーを付加してアクセスするとExpectヘッダーの内容がサイニダイズ処理されずにそのままエラーページに表示されてしまい、
クロスサイト・スクリプティングの危険性があるため回避したいと思っています。
以下のような感じです。

================================================
GET / HTTP/1.1
Host: xxxxx
Expect:<script>

HTTP/1.1 417 Expectation Failed
Date: Fri, 19 Sep 2008 15:08:57 GMT
Server: Apache
Content-Length: 366
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>417 Expectation Failed</title>
</head><body>
<h1>Expectation Failed</h1>
<p>The expectation given in the Expect request-header
field could not be met by this server.</p>
<p>The client sent<pre>
Expect: <script>
</pre>
but we only allow the 100-continue expectation.</p>
</body></html>
Connection closed by foreign host.
================================================

<検証環境>
Apacheバージョン: 1.3.33
Apacheバージョン: 1.3.37
Apacheバージョン: 2.2.28(こちらはサニダイズ処理はされてるっぽい)

<回避策検証1>
ドキュメントルートの.htaccessに「ErrorDocument 417 "Expectation Failed."」
の記述をする。

<結果>
telnetなどでアクセスしてみたのですが結果は記述する前と変わりませんでした。

<回避策検証2>
httpd.confに「ErrorDocument 417 "Expectation Failed."」
の記述をする。

<結果>
telnetなどでアクセスすると表示内容が変わり、対策は適応されたかと思います。

検証環境で行ったため回避策2の方法がとれたのですが、回避策2はApacheの再起動が必要なため、できれば回避策1で行いたいと思っていますが回避策1が適応されないのはなぜなのでしょうか?

お分かりの方がおられましたらご教示願いたいと思います。
よろしくお願いいたします。
akasaka
常連さん
会議室デビュー日: 2008/06/17
投稿数: 22
投稿日時: 2008-09-20 08:18
すいません。以下、ヤボな質問かと思いますが...

”.htaccessの最後の行のケツには改行入れてますか?”とかは大丈夫ですか?

httpd.confのAllowOverride、AccessFileNameの設定も大丈夫ですか?

1.3系でErrorDocumentに文字列を指定する場合は、
ErrorDocument 417 "Expectation Failed.
と、文字列の先頭にのみ二重引用符を付けろとのことですが、大丈夫ですか?
(たぶん、後ろの二重引用符については、付いてるとNGなのではなく、ただ単に表示されないだけかと思われますが。)


すいません。あと、shackさんの質問からはズレてしまいますが、

> <検証環境>
> Apacheバージョン: 1.3.33
> Apacheバージョン: 1.3.37
> Apacheバージョン: 2.2.28(こちらはサニダイズ処理はされてるっぽい)

ですが、
本番の 1.3.33 と 1.3.37 と 2.2.28 のApacheに対してこの処理を行わせたく、
本番と同じバージョンの検証環境を用意して確認したということなのでしょうか?
(目的は1.3.33、1.3.37、2.2.28の全てのバージョンで.htaccessに書いたErrorDocumentを機能させることですか?)


> Apacheバージョン: 2.2.28(こちらはサニダイズ処理はされてるっぽい)

2.2.28だと、そもそものサニタイズ処理はきちんとされてるんだけど、
<回避策検証1>の設定が意図した通りに働かなかった。(ErrorDocument記述が機能せず)
ということですね。


ExpectヘッダのXSS問題ということで、CVE-2006-3918の件でしょうか?
だとすれば、1.3.37では直ってませんでしたか?
shack
会議室デビュー日: 2008/09/19
投稿数: 3
投稿日時: 2008-09-21 08:12
akasakaさんお返事ありがとうございます。

お返事内容の検証は週末なため自宅のおもちゃサーバー2.2.28で行いました。


> ”.htaccessの最後の行のケツには改行入れてますか?”とかは大丈夫ですか?

大丈夫です。


> httpd.confのAllowOverride、AccessFileNameの設定も大丈夫ですか?

httpd.confのAllowOverride,AccessFileNameの設定も大丈夫です。
.htaccessに他のErrorDocument(404など)を記述すると意図した動作になっております。


> 文字列の先頭にのみ二重引用符を付けろとのことですが、大丈夫ですか?

akasakaさんの指摘後に「ErrorDocument 417 "Expectation Failed.」とやって見ましたが駄目でした。

ついでに以下のように通常ならInternal Server Errorになるような記述をしてみましたが
表示内容は投稿内容と同じでした。

========================================
hogehoge
ErrorDocument 417 "Expectation Fail
========================================

通常なら上記は「hogehoge」という記述が原因でInternal Server Errorになるはずですが
これを見ると.htaccessに記述してある処理に行く前にエラー画面を表示しているっぽい?


> 2.2.28だと、そもそものサニタイズ処理はきちんとされてるんだけど、
> <回避策検証1>の設定が意図した通りに働かなかった。(ErrorDocument記述が機能せ>ず)
ということですね。

まさにその通りでサニダイズされているかどうかじゃなくて417ならカスタムメッセージを出したいということです。
基本的に全てのサーバーに適応したいと思っています。
akasaka
常連さん
会議室デビュー日: 2008/06/17
投稿数: 22
投稿日時: 2008-09-21 22:32
なるほど、確かにそうなりますね。(.htaccessの方だけ効かない件)

1.3.33 / 1.3.37 / 1.3.41 / 2.0.63 / 2.2.8 / 2.2.9
の各バージョンで確認してみましたが、htaccessでのみ効かない状況は同じのようです。

> Apacheバージョン: 2.2.28(こちらはサニダイズ処理はされてるっぽい)

未来のバージョンになってます?

ちなみに、1.3.37もサニタイズ処理はされてましたので、このXSS問題があるバージョンは
CVE-2006-3918に記載のもの以前ということだと思います。


> 通常なら上記は「hogehoge」という記述が原因でInternal Server Errorになるはずですが
> これを見ると.htaccessに記述してある処理に行く前にエラー画面を表示しているっぽい?

例えば、ヘッダが

GET / HTTP/1.1

だけ(必須の Host: ヘッダがない。)だと、

HTTP/1.1 400 Bad Request

になりますが、これも同様に、httpd.confに書いたErrorDocumentは効きますが、
htaccessに書いたErrorDocumentは効きません。

ソースを眺めてみましたが、そうなっているような気がします。
(確認はしてませんので、確かだとは言えませんが。)
apache_1.3.41 の src/main/http_protocol.c の1139行目にある ap_read_request()の中、
リクエストを読んで処理を分けてます。Expectヘッダは一番最後の辺りですかね?
それのちょっと前にはHTTP1.1でHostヘッダがない場合とか...。

やはり、とりあえずの手段としては、httpd.confに書いて回避するしかないのでは?
shack
会議室デビュー日: 2008/09/19
投稿数: 3
投稿日時: 2008-09-23 01:02
お世話になっております。

> 未来のバージョンになってます?

おっと失礼しました。
2.2.8の間違いでした。

んーやっぱり.htaccessに記述じゃ駄目っぽいですね。
あきらめてhttpd.confに記述することにします。。。

いろいろなバージョンで試していただいたり、
ソースまで見ていただいてありがとうございました。


1

スキルアップ/キャリアアップ(JOB@IT)