"Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"のアクセスが酷い

前から同じような意味不明なアクセスがあったのだが、今回あまりに酷かったので本腰を入れて調べてみた。
挙動からしてブラウザプラグインっぽい。

何のソフトなのか

script.module.youtube.dlというモジュールでこのUser-Agent文字列は過去に使われている。(現在のmasterのHEADでは"Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20150101 Firefox/20.0 (Chrome)"で、その文字列を持ったアクセスも確認している)
リクエストヘッダ全体を比べると

Connection: close
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-us,en;q=0.5
Host: example.com

と、必須なConnectionとHost以外は一致しているし、Connection: closeとするのはHTTPライブラリをそのままで使うと多い挙動(コネクションプールなし)なので確度は高そうだ。ただウェブページに無差別にアクセスする挙動はこれを直接利用する本来のアプリケーションによるものではないかもしれない。
Yahoo!知恵袋にはRealDownloaderのものだと書いてあったのだが、確認はしていない。ただブラウザで表示しているデータを直接参照する能力が無いようなので実体が上記のような本体と協調して動く別プログラムなのは間違いないし、上記モジュールのコアを流用するというのはありそうな話だ。

症状

基本パターンとしてはブラウザがページ遷移するとロード完了時にそのページURLに対してHEADとGETリクエストを発行する。

* - - [../.../....:..:35:59 +0900] "GET / HTTP/1.1" 200 * "-" "Mozilla/5.0 (...) Chrome/..."
* - - [../.../....:..:36:00 +0900] "GET /style.css HTTP/1.1" 304 - "http://example.com/" "Mozilla/5.0 (...) Chrome/..."
* - - [../.../....:..:36:00 +0900] "GET /script.js HTTP/1.1" 304 - "http://example.com/" "Mozilla/5.0 (...) Chrome/..."
* - - [../.../....:..:36:10 +0900] "HEAD / HTTP/1.1" 200 - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"
* - - [../.../....:..:36:10 +0900] "GET / HTTP/1.1" 200 * "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"

HEADに先行してGETを余計に発行する場合もある。

* - - [../.../....:..:36:20 +0900] "GET /page.html HTTP/1.1" 200 * "http://example.com/" "Mozilla/5.0 (...) Chrome/..."
* - - [../.../....:..:36:23 +0900] "GET /page.html HTTP/1.1" 200 * "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"
* - - [../.../....:..:36:23 +0900] "HEAD /page.html HTTP/1.1" 200 - "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"
* - - [../.../....:..:36:23 +0900] "GET /page.html HTTP/1.1" 200 * "-" "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 (Chrome)"

ログから推測する限りキャッシュ機構の類をどのレイヤーにも持っていないらしく、利用者がページを行き来してページURLが変わるとブラウザ側がキャッシュやbfcacheを使ったとしても必ずこれらリクエストが発生する。
サーバ側は転送量が倍増〜三倍増するだけでなく、動的コンテンツで完全なレスポンスキャッシュができない場合は負荷も増える。
利用者側は当然、ネットワーク帯域が無駄になる上、CPU負荷も馬鹿にならなそうだ。

どうするのがいいのか

当面はUser-Agentベースでブロックするだけで良い気がする。/\(Chrome\)$/というのは実際のブラウザの文字列としては見たことがない*1
問題の拡張がYouTube埋め込み動画限定なのか不明だが、少なくともvideo要素やFlash Playerベースの動画を使わないサイトならば利用者にも影響はない。もし使っているサイトで利用者がダウンロードができなくなってもそれは機能拡張の欠陥として認識され、別の拡張に乗り換えを促せるのではと思う。

*1:Browser sniffing用の文字列はいいとして、ソフト名を含んだUser-Agentを使ってくれれば楽だが。もちろん変な挙動をfixしてくれればそれが一番。