ウェブサイトオプティマイザーにセキュリティの問題が発覚

Googleのウェブサイトオプティマイザーにセキュリティの問題が発見されました。

利用者はGoogleからメール通知を受けていると思いますが、見落としていると危ないのでこのブログでもお伝えしておきます。

以下、Googleから送られてきたメールです。

ウェブサイト オプティマイザーにおけるセキュリティの問題

ウェブサイト オプティマイザーをご利用の皆様

いつもご利用いただきありがとうございます。ウェブサイト オプティマイザーにおける潜在的なセキュリティの問題についてお知らせいたします。ウェブサイト オプティマイザーの制御スクリプトの脆弱性を利用したクロス サイト スクリプティング(XSS)攻撃によって、お客様のサイトで悪意のあるコードが実行される可能性があることが判明しました。この攻撃が発生するのは、ウェブサイトまたはブラウザが既に別の攻撃を受けたことがある場合のみです。直ちに攻撃を受ける可能性は低いものの、サイトを保護するため対処していただくようお願いいたします。

バグは既に修正いたしましたので、新しいテストが影響を受けることはありません。しかし、現在実行中のテストにつきましては、サイトのバグを修正するために更新していただく必要があります。また、2010 年 12 月 3 日より前に作成し、一時停止または停止済みのテストのウェブサイト オプティマイザー スクリプトも同様に、コードを削除または更新していただく必要があります。

コードを更新するには 2 つの方法があります。現在のテストを停止し、古いスクリプトを削除して、新しいテストを作成する方法か、サイトのコードを直接更新する方法です。新しいテストを作成する方が簡単なので、前者の方法をおすすめします。

新しいテストを作成する

  1. 現在実行中のウェブサイト オプティマイザーのテストを停止します。
  2. サイトからウェブサイト オプティマイザーのスクリプトをすべて削除します。
  3. 通常どおりに新しいテストを作成します。新しいテストに脆弱性はありません。

ウェブサイト オプティマイザーの制御スクリプトを直接更新する

1. お客様のサイトで制御スクリプトを見つけます。次のとおりです。

A/B テストの制御スクリプト
<!-- Google Website Optimizer Control Script -->
<script>
function utmx_section(){}function utmx(){}
(function(){var k='XXXXXXXXXX',d=document,l=d.location,c=d.cookie;function f(n){
if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);return c.substring(i+n.
length+1,j<0?c.length:j)}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;
d.write('<sc'+'ript src="'+
'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'
+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='
+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
'" type="text/javascript" charset="utf-8"></sc'+'ript>')})();
</script><script>utmx("url",'A/B');</script>
<!-- End of Google Website Optimizer Control Script -->

多変量テストの制御スクリプト
<!-- Google Website Optimizer Control Script -->
<script>
function utmx_section(){}function utmx(){}
(function(){var k='XXXXXXXXXX',d=document,l=d.location,c=d.cookie;function f(n){
if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);return c.substring(i+n.
length+1,j<0?c.length:j)}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;
d.write('<sc'+'ript src="'+
'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'
+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='
+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
'" type="text/javascript" charset="utf-8"></sc'+'ript>')})();
</script>
<!-- End of Google Website Optimizer Control Script -->

2. 制御スクリプトで return c.substring(… という部分を探します。
3. この行を次のように修正します。
修正前: return c.substring(i+n.length+1,j<0?c.length:j)
修正後: return escape(c.substring(i+n.length+1,j<0?c.length:j))
必ず最後の閉じ括弧「)」を含めるようにしてください。

修正後の A/B テストの制御スクリプト
<!-- Google Website Optimizer Control Script -->
<script>
function utmx_section(){}function utmx(){} (function(){var k='XXXXXXXXXX',d=document,l=d.location,c=d.cookie;function f(n){ if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);
return escape(c.substring(i+n.length+1,j<0?c.length:j))}}}
var x=f('__utmx'),xx=f('__utmxx'),h=l.hash; d.write('<sc'+'ript src="'+
'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'
+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='
+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
'" type="text/javascript" charset="utf-8"></sc'+'ript>')})();
</script><script>utmx("url",'A/B');
</script>
<!-- End of Google Website Optimizer Control Script -->

修正後の多変量テストの制御スクリプト
<!-- Google Website Optimizer Control Script -->
<script>
function utmx_section(){}function utmx(){}
(function(){var k='XXXXXXXXXX',d=document,l=d.location,c=d.cookie;function f(n){
if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);
return escape(c.substring(i+n.length+1,j<0?c.length:j))}}}
var x=f('__utmx'),xx=f('__utmxx'),h=l.hash; d.write('<sc'+'ript src="'+
'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'
+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='
+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
'" type="text/javascript" charset="utf-8"></sc'+'ript>')})();
</script>
<!-- End of Google Website Optimizer Control Script -->

上記の制御スクリプトの例で、k=XXXXXXXXX という行はプレースホルダーです。

この更新後、テストは引き続き通常どおりに実行されます。テストの一時停止と再開は必要ありません。

今回の問題につきまして、皆様にご不便をおかけいたしましたことを深くお詫び申し上げます。Google ではウェブサイト オプティマイザーのセキュリティ向上に取り組んでおり、引き続き脆弱性の解決に努めてまいります。

今後ともどうぞよろしくお願いいたします。
Trevor
Google ウェブサイト オプティマイザー チーム

P.S.
コードの部分も原文をコピーしていますが、100%同じという保証はできません。
自身に届いているはずのメールを見てもらうか、もし届いていなければ転送するので連絡してくださいウェブに公開されたヘルプをご覧ください。
サイトのセキュリティに関する重要なお知らせ共有