By Shinichi Sugiyama

JavaScriptで書かれたオープンソースのウェブアプリケーションフレームワークであるAngularJSサンドボックスをバイパスすることで、ユーザーのパスワードを盗む攻撃のXSSをマクドナルドの公式サイトで行えることをエンジニアのTijme Gommersさんが実証しています。

Stealing passwords from McDonald's users - Tijme Gommers

https://finnwea.com/blog/stealing-passwords-from-mcdonalds-users

Gommersさんは、「安全ではない暗号ストレージの脆弱性をついたり、XSSを用いたりすることでマクドナルドのユーザーが使用するパスワードを盗み出すことが可能」と主張。この方法を用いればパスワードの他に氏名・住所・連絡先などの個人情報も盗むことができるそうです。

アメリカのマクドナルドのホームページには検索ページがあり、このページは検索パラメーターを反映させたページを生成します。

例えば検索ページで「***********-test-reflected-test-***********」という文字を入力して検索すれば……



「https://www.mcdonalds.com/us/en-us/search-results.html?q=***********-test-reflected-test-***********」というURLが生成され、ソースコードには「***********-test-reflected-test-***********」という文字列が含まれることがわかります。



マクドナルドはAngularJSを使用しているので、検索値を使ってスコープIDを探ることも可能。AngularJSのタグ「{}」を入力すると、AngularJSが「{}」を「9」に変換していることがわかります。





セキュリティ企業のPortSwiggerがブログの中で「AngularJSのサンドボックスを使用しない方が良い」と説明しているように、AngularJSのサンドボックスは脆弱性を持つことで知られています。なお、AngularJSのバージョン1.6以降ではサンドボックスが廃止されています。

しかし、マクドナルドのホームページがどのバージョンのAngularJSを使用しているのか調べてみたところ、バージョン1.5.3のAngularJSを使用していることがわかりました。



そしてタグを入力してみるとコードが実行されることも判明。



さらに、外部サイトのJavaScriptファイルを読み込ませることにも成功。



続いて、マクドナルドのサインインページを表示してみると、通常は「Remember me」などと表示されるところに、「Remmember my password」と表示されていることがわかります。



この「password」という単語に食いついたGommersさん。全てのJavaScript上で「password」という単語を調査したところ、面白いコードを発見。



ここからクッキーに保存されていた「penc」という値を発見。この中に暗号化されたパスワードを発見。



さらに、マクドナルドのホームページでは全てのユーザーのパスワードが同じ暗号化鍵を使用して暗号化されていることも判明。暗号化に使用されているのはCryptoJSという暗号化スクリプトでした。



Gommersさんはマクドナルドのホームページをiframeで読み込み、サイトを偽装することでクッキーを盗み出すことに成功。クッキー内の暗号化されたパスワードから、自身の作成した暗号化前のパスワードを表示させることにも成功しています。



なお、Gommersさんはマクドナルドに複数回にわたってこの問題を報告しているそうですが、「返事はない」と自身のブログに記しています。