https: ページを HTTP header filter (out) で処理すると発生することがあるバグ Edit

この項はまだ検証・執筆中です。加筆・訂正歓迎。

バグの発生条件・内容・対策 Edit

バグの発生条件

バグの内容

  1. out のマッチが二度行われ、一度目のマッチがおかしくなる。二度目のマッチは正常。
    1. URL が https://host:port/ で終わっている物として処理されてしまう。結果、URLマッチがおかしくなり、\u, \p, \q, \a は正しくない物になる。(\a は、ブラウザが # 以降を送信しないため確認できていない) → 検証1参照
    2. https: から http: への $RDIR/$JUMP が正常に行われなくなる。 → 検証1参照
    3. https: から https: への $RDIR/$JUMP は、移動後の path/querystring 部分が、移動前の物になってしまう。(多分 anchor 部分も移動前の物になる) → 検証2参照

対策

未検証事項

検証1 Edit

検証フィルタ

[HTTP headers]
In = FALSE
Out = TRUE
Key = "URL: TEST1-1  https://ss1.xrea.com(:[0-9]+|)/ -> http://mixi.jp/ $RDIR (out) [NG]"
Match = "https://ss1.xrea.com(:[0-9]+|)/&\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(http://mixi.jp/)"

In = FALSE
Out = TRUE
Key = "URL: TEST1-2  https://ss1.xrea.com(:[0-9]+|)/abc.s65.xrea.com/ -> http://mixi.jp/ $RDIR (out) [OK]"
Match = "https://ss1.xrea.com(:[0-9]+|)/abc.s65.xrea.com/&\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(http://mixi.jp/)"

In = FALSE
Out = TRUE
Key = "URL: TEST1-3  https://ss1.xrea.com(:[0-9]+|)/ -> http://mixi.jp/ $RDIR (out) [OK]"
Match = "https://ss1.xrea.com(:[0-9]+|)/ $SET(https_out=$GET(https_out)a) $TST(https_out=aa) &\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(http://mixi.jp/)"

※TEST1-1, TEST1-2, TEST1-3 は同時に使わず別々に使用する

検証URL: https://ss1.xrea.com/abc.s65.xrea.com/?qstr#anchor

結果

[TEST1-1]
URL: = https://ss1.xrea.com:443/
\u = https://ss1.xrea.com:443/
\h = ss1.xrea.com
\p = /
\q = 
\a = 
RedirectTo: http://mixi.jp// (移動できず 4.5May ~ 4.5June+6)
RedirectTo: https://http://mixi.jp// (移動できず 4.5June+7 ~ 4.5June+8)

[TEST1-2, TEST1-3]
URL: = https://ss1.xrea.com:443/abc.s65.xrea.com/?qstr
\u = https://ss1.xrea.com:443/abc.s65.xrea.com/?qstr
\h = ss1.xrea.com
\p = /abc.s65.xrea.com/
\q = ?qstr
\a = 
RedirectTo: http://mixi.jp/ (正常に移動する)

検証2 Edit

検証フィルタ

[HTTP headers]
In = FALSE
Out = TRUE
Key = "URL: TEST2-1 https://ss1.xrea.com(:[0-9]+|)/ -> https://localhost/ $RDIR (out) [NG]"
Match = "https://ss1.xrea.com(:[0-9]+|)/&\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(https://localhost/)"

In = FALSE
Out = TRUE
Key = "URL: TEST2-2 https://ss1.xrea.com(:[0-9]+|)/? -> https://localhost/ $RDIR (out) [OK]"
Match = "https://ss1.xrea.com(:[0-9]+|)/?&\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(https://localhost/)"

In = FALSE
Out = TRUE
Key = "URL: TEST2-3 https://ss1.xrea.com(:[0-9]+|)/ -> https://localhost/ $RDIR (out) [OK]"
Match = "https://ss1.xrea.com(:[0-9]+|)/ $SET(https_out=$GET(https_out)a) $TST(https_out=aa) &\0"
Replace = "$ALERT(URL: = \0\r\n\\u = \u\r\n\\h = \h\r\n\\p = \p\r\n\\q = \q\r\n\\a = \a)$RDIR(https://localhost/)"

※TEST2-1, TEST2-2, TEST2-3 は同時に使わず別々に使用する

検証URL: https://ss1.xrea.com/abc.s65.xrea.com/?qstr#anchor

結果

[TEST2-1]
URL: = https://ss1.xrea.com:443/
\u = https://ss1.xrea.com:443/
\h = ss1.xrea.com
\p = /
\q = 
\a = 
RedirectTo: https://localhost/ (実際は https://localhost/abc.s65.xrea.com/?qstr へ移動している。 4.5May, 4.5June, 4.5June338(4.5June+3改), 4.5June+6, 4.5June+7, 4.5June+8)
 localhost の HTTPd のアクセスログ(SSLのみ): 127.0.0.1 - - [12/Jun/2011:09:22:07 +0900] "GET /abc.s65.xrea.com/?qstr HTTP/1.1" 200 236 (※200を返すようにファイルを設置している)

[TEST2-2, TEST2-3]
URL: = https://ss1.xrea.com:443/abc.s65.xrea.com/?qstr
\u = https://ss1.xrea.com:443/abc.s65.xrea.com/?qstr
\h = ss1.xrea.com
\p = /abc.s65.xrea.com/
\q = ?qstr
\a = 
RedirectTo: https://localhost/ (正常に https://localhost/ へ移動している。 4.5May, 4.5June, 4.5June338(4.5June+3改), 4.5June+6, 4.5June+7, 4.5June+8)
 localhost の HTTPd のアクセスログ(SSLのみ): 127.0.0.1 - - [12/Jun/2011:09:27:23 +0900] "GET / HTTP/1.1" 200 4785 (※200を返すようにファイルを設置している)

TEST2-1 を out で使用せず、in でのみ使用すると、バグは発生しない。
また、TEST2-2 は out で使用せず、in でのみ使用しても、バグは発生しない。

つっこみなど Edit



複製名前変更