Firefox Add-on「NoRedirect」で HTTP レスポンスコードによるリダイレクトを防止する

いわゆる Gumblar に .htaccess を悪用して Exploit コードが仕込まれたサイトに誘導される方法が確認されたようですね。ラックが発表した注意喚起の動作概要を引用します。

【動作概要】
この.htaccessファイルが置かれる影響は、主要検索サイトからのアクセス、および404、403などのエラーがApacheのリダイレクト機能で攻撃サイトに転送されることです。攻撃サイトに転送された後、他のGumblar攻撃と同様に、悪性プログラムの感染被害に遭われることが推測されます。

「注意喚起」の記事 | セキュリティ対策のラック

この注意喚起から分かることは、あくまで Exploit コードへと利用者を誘導する手法で新しいものが確認されただけであって、対策はこれまでの Gumblar(に限らず Web Exploit 全般)へのものと変わらないと思います(2009年11月3日の日記を参照)。

ただ、以前短縮 URL のリダイレクトについて調べた*1ときに HTTP レスポンスによるリダイレクトを防止する方法が見つけられなかったので、改めて調べてみました。すると、Firefox Add-on「NoRedirect」を見つけました。これを試用してみました。

結論

「NoRedirect」では、「HTTP レスポンスコードによるリダイレクト」と「meta タグによるリダイレクト」の際に、リダイレクト前に確認画面を挿入できるようです。ただし、JavaScript によるリダイレクト」はブロックできませんでした。リダイレクト先の確認に使えそうなので、しばらく使ってみようかなと思いました。

注意喚起の .htaccess の挙動を確認する

注意喚起の .htaccess の挙動を確認してみました。注意喚起の .htaccess を基に以下の .htaccess を作成して、僕の借りてるさくらインターネットの公開ディレクトリ(一時的に作成した demomo ディレクトリ以下)に設置しました。この .htaccess を設置した URL に対して、(a) Google の検索結果からのアクセス、(b) 存在しないファイルへのアクセスを実施しました。

# HostRule
RewriteEngine On
RewriteCond %{HTTP_REFERER} .*google.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*ask.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*yahoo.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*excite.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*altavista.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*msn.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*netscape.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*aol.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*hotbot.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*goto.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*infoseek.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*mamma.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*alltheweb.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*lycos.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*search.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*metacrawler.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*yandex.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*rambler.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*mail.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*dogpile.*$ [NC,OR]
RewriteCond %{HTTP_REFERER} .*ya.*$ [NC]
RewriteRule ^(.*)$ http://www.google.ru/ [R=301,L]

ErrorDocument 401 http://www.google.ru/
ErrorDocument 403 http://www.google.ru/
ErrorDocument 404 http://www.google.ru/
ErrorDocument 500 http://www.google.ru/
# /HostRule
(a) Google の検索結果からのアクセス

http://q1w2e3.sakura.ne.jp/demomo/(今はありません) に Firefox 3.6 でアクセスします。なお、アクセスする際に Firefox Add-on「Tamper Data」で RefererGoogle で「ほげ」を検索した時の URL を設定しました。該当 URL にアクセスすると、HTTP レスポンスコード 301 が返ってきて、http://www.google.ru/ にリダイレクトされました。

上記の通信を Firefox Add-on「Live HTTP Headers」でキャプチャしました。以下、キャプチャ結果です。

http://q1w2e3.sakura.ne.jp/demomo/

GET /demomo/ HTTP/1.1
Host: q1w2e3.sakura.ne.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Referer: http://www.google.co.jp/search?q=%E3%81%BB%E3%81%92&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox
If-Modified-Since: Sat, 06 Mar 2010 11:49:38 GMT
If-None-Match: "46-4b924152"

HTTP/1.1 301 Moved Permanently
Date: Sat, 06 Mar 2010 11:55:02 GMT
Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
Location: http://www.google.ru/
Keep-Alive: timeout=5, max=19
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
----------------------------------------------------------
http://www.google.ru/

GET / HTTP/1.1
Host: www.google.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PREF=ID=a766140dc336d442:NW=1:TM=1267876370:LM=1267876370:S=LYwT1F_fiCsNH57R; NID=32=heJQG18gWByFgSDiKqSa_RdL8lV8MwiT2_eNu_lc0_AfeikHkKwL2Wzaf_EppKUvdyHdr4uCx0YfQs-ata8RHtUWLbcvVMsj58caVdpVu3uBRauZ7u5ZNjXLCsbqdM-u

HTTP/1.1 200 OK
Date: Sat, 06 Mar 2010 11:55:05 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=a766140dc336d442:U=0a0843889d83e5da:NW=1:TM=1267876370:LM=1267876505:S=-cDAVQvBhsGroo0D; expires=Mon, 05-Mar-2012 11:55:05 GMT; path=/; domain=.google.ru
Content-Encoding: gzip
Server: gws
Content-Length: 4389
X-XSS-Protection: 0
(b) 存在しないファイルへのアクセス

http://q1w2e3.sakura.ne.jp/demomo/hoge(今はありません) に Firefox 3.6 でアクセスします。該当 URL にアクセスすると、HTTP レスポンスコード 302 が返ってきて、http://www.google.ru/ にリダイレクトされました。

上記の通信を Firefox Add-on「Live HTTP Headers」でキャプチャしました。以下、キャプチャ結果です。

http://q1w2e3.sakura.ne.jp/demomo/hoge

GET /demomo/hoge HTTP/1.1
Host: q1w2e3.sakura.ne.jp
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

HTTP/1.1 302 Found
Date: Sat, 06 Mar 2010 12:10:36 GMT
Server: Apache/1.3.42 (Unix) mod_ssl/2.8.31 OpenSSL/0.9.8e
Location: http://www.google.ru/
Keep-Alive: timeout=5, max=19
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
----------------------------------------------------------
http://www.google.ru/

GET / HTTP/1.1
Host: www.google.ru
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: PREF=ID=a766140dc336d442:U=0a0843889d83e5da:NW=1:TM=1267876370:LM=1267876505:S=-cDAVQvBhsGroo0D; NID=32=heJQG18gWByFgSDiKqSa_RdL8lV8MwiT2_eNu_lc0_AfeikHkKwL2Wzaf_EppKUvdyHdr4uCx0YfQs-ata8RHtUWLbcvVMsj58caVdpVu3uBRauZ7u5ZNjXLCsbqdM-u

HTTP/1.1 200 OK
Date: Sat, 06 Mar 2010 12:10:36 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 4388
X-XSS-Protection: 0

Firefox Add-on「NoRedirect」を試用する

Firefox Add-on「NoRedirect」をインストールし、すべての URL でリダイレクトチェックが有効になるように設定します。Firefox の [ツール]メニュー → [NoRedirect] を選択し、「NoRedirect」の設定画面を開きます。この設定画面で、正規表現パターンとして「.*」を追加します(下記画像の青枠を参照)。


設定が完了したら、前述の (a), (b) の URL にアクセスしてみました(下記 2 つの画像を参照)。「NoRedirect」を有効にしていると、HTTP レスポンスコード 301, 302 が返ってきた場合、リダイレクト前に確認画面が挿入されるようですね。これはいいかも。この確認画面でリンクをクリックすると、リダイレクト先にアクセスできます。



続いて、「bit.ly」の短縮 URL にもアクセスしてみます。きちんと確認画面が挿入されました。


meta タグによるリダイレクトも確認してみます。以下の内容の HTML ファイルを作成し、この HTML にインターネット経由でアクセスします。http://q1w2e3.sakura.ne.jp/a.html(今はありません)にアクセスすると、確認画面が挿入されました。

<html>
<head>
<meta http-equiv="refresh" content="0; url=http://www.google.ru/">
</head>
<body>
test
</body>
</html>


JavaScript によるリダイレクトについては、さすがにブロックできませんでした。ただし、JavaScript によるリダイレクトは Firefox Add-on「NoScript」を有効にしていればブロックできました。

「NoRedirect」では、「HTTP レスポンスコードによるリダイレクト」、「meta タグによるリダイレクト」を実行する前に確認画面を挿入することで、リダイレクトをブロックできました。「JavaScript によるリダイレクト」についてはブロックできませんでした。今回の Gumblar 手法を防御するだけではなく、短縮 URL サービスのリダイレクト先を確認することもできるため、個人的に使えそうだなと思いました。