サードパーティのjavascirptをウェブページに埋め込むことは、アクセス解析・ユーザー追跡や広告の挿入のために普通に行われている。このseesaaブログでも、google analyticsといったアクセス解析ツールや、広告業者のドメインでホストされているjavascriptを多数読み込んでいる。jQueryなどの基本ライブラリもgoogleやMicrosoftの提供するCDNから利用しているウェブサイトは多い。
scriptタグでウェブページに直接読み込まれたスクリプトは、読み込み元ウェブサイトと同じ権限を持つ。つまり、(httponlyでない)クッキーの読み書きや、フォーム内容の読み書き、同一ドメインへのリクエストの発行など、javascriptで可能なあらゆることが行える。他社が提供するスクリプトをウェブサイトに埋め込むということは、『ユーザーがアクセス・入力しうる全ての情報や機能』へのアクセス権限をブラウザ経由で第三者に提供することに等しい。
そして、ウェブサイトのオーナーが指定できるのは外部スクリプトのURLだけであって、その内容は外部スクリプトを提供する側が自由に変更できてしまう。導入当初はウェブサイトオーナーの意図した通りのスクリプトでも、ある日からXSS攻撃用の悪意あるスクリプトに変化するということは十分に起こりうる。XSSが可能になれば、"本物のドメイン"上でパスワード入力フォームを偽装することだって出来る。これが重要な情報を扱うウェブサイトやその同一ドメイン内に、第三者のスクリプトを埋め込んではならない理由だ。
MyJCBの場合、例えばログイン直後の画面でユーザー追跡用のjavascriptとしてrt.rtoaster.jpのスクリプトを読み込んでいるため、クレジットカード利用履歴ページをバックグラウンドで読み込むことが出来る。フォームを偽装すればMyJCBで入力する可能性があるオンライン取引用のパスワードなどを得ることも出来るだろう。
もちろん今現在漏洩が起こっているというわけではないが、悪意をもってrt.rtoaster.jp内のスクリプトを書き換えられれば、MyJCBで得られる情報やMyJCBにユーザーが入力しうるIDやパスワード・個人情報は全て漏洩しうる。
JCBが情報漏洩対策として自社サーバにおいて、どんなに厳重なセキュリティを保っていても、外部スクリプト配信サーバーのセキュリティが甘ければ、実質的にJCBのサーバー内の情報にアクセス出来てしまう。つまり、外部スクリプトの配信サーバーには、自社の配信サーバーと同等以上のセキュリティが要求される。意地の悪い言い方をすれば、MyJCBではhttps://my.jcb.co.jp/のサーバーのセキュリティ要件としてrt.rtoaster.jpと同等かそれ以下の甘い要件しか課していない、ということになる。
さらに意地の悪い考え方をすれば、外部スクリプト提供側やその末端のサーバーオペレータが悪意をもった場合、スクリプトを書き換えることで秘密裏にMyJCB内のデータを収集したり、パスワードやIDをフィッシングすることさえ出来てしまう。外部スクリプトはブラウザが直接配信サーバーから取得するため、MyJCBサイト側は内容を検査することはできない。JCBはスクリプトが意図に反して改変されていないかチェックしているかも知れないが、ABテストのようにごく一部の一般ユーザーだけをターゲットにするなど、バレにくくする方法もある。
外部スクリプトを用いず、アクセス解析や広告配信システム自体を購入して、同一ドメイン内の自社サーバーから配信すれば、第三者にブラウザ経由で情報が渡るリスクは生じない。実際のオペレータとして第三者に業務委託することになるかもしれないが、少なくとも、自社の他のサーバーと同じセキュリティの元で配信システムを管理する事ができる。
JCBは外部スクリプトをMyJCB内に埋め込む方法を選んで、自社で運用するよりも安価にサービスを得られたかもしれないが、第三者のサーバ経由で情報が漏洩するリスクを犯している。
サードパーティのスクリプトを埋め込む手法は便利だが、ユーザーがアクセス・入力しうる情報に重要なものが含まれていないか、十分に吟味した上で行うべきだ。
ラベル:セキュリティ