宗晃サイバーセキュリティエンジニアリング部の西村です。2016というセキュリティカンファレンスでiOS版Firefoxの脆弱性に関する講演をしてきました。iOS版FirefoxはWebページの表示にiOSのWKWebViewを使用しており、講演の中で紹介した脆弱性はいずれもWKWebViewを利用するiOSアプリで発生しうるものです。この記事では、iOS版Firefoxの脆弱性事例を元に、WKWebViewでURLを取り扱う際に注意すべきポイントを紹介します。URLのuserinfoフィールドを考慮するWKWebViewでは、urlというプロパティを用いて、現在表示しているWebページのURLを取得できます。urlプロパティの値を表示するとき、注意すべき点があります。それは、URLのuserinfoというフィールドです。3986では、「http://user.password@hostname」という形でURLに認証情報(userinfo)を含めることが許されています。userinfoを画面に表示することは、接続するホストの誤認を招き、フィッシングに悪用される可能性がある(※クリックするとIETFのWebサイトに遷移します。)ことから、ブラウザのアドレスバーのようにURLをセキュリティインジケータとして表示する際には特別なケアが求められてきました。以下のURLを見てください。このURLは「cnn.example.com」というホストに接続するかのように見えますが、実際は「recruit-tech.co.jp」に接続します。http://cnn.example.com&story=breaking_news@recruit-tech.co.jp/userinfoを悪用した攻撃を防ぐため、ブラウザベンダーは様々な対策をしてきました。ExplorerやChromeはuserinfoをアドレスバーに表示しません。Safariは以下のようにフィッシングの疑いを伝える警告画面を表示します。WKWebViewのurlプロパティにはuserinfoを含むURLがそのまま含まれます。このため、urlプロパティの値をそのまま画面に表示すると、悪意のあるWebサイトにURLを偽装されるリスクが生じます。このような攻撃を避けるため、アプリでURLを表示する際は、事前にuserinfoを取り除くことが望ましいでしょう。iOS版Firefoxの初期バージョンでは、urlプロパティの値をそのままアドレスバーに出力していたため、以下のようにアドレスバーを偽装されるリスクがありました。Corporationから正式に脆弱性として認定されました(現在は修正済みです)。urlプロパティとWKWebViewの内部状態の不一致を考慮するWKWebViewでは、表示しているWebページが切り替わるとurlプロパティの値も自動的に切り替わりますが、このタイミングには時間差があります。urlプロパティの値はページの遷移を開始した時点で次のページのURLに切り替わるのに対し、WKWebViewの内部状態は、ページの読み込みが完了した時点(サーバからHTTPレスポンスを受信し終えた時点)で切り替わるのです。この更新タイミングの違いは、思わぬ脆弱性の原因となることがあります。FoundationのWebサイトに遷移します。この脆弱性は、パスワードマネージャーがログインフォームの自動入力を求められた際、WKWebViewのurlプロパティから要求元のサイトを識別していたためでした。表示中のWebページのURLに基づいてアプリで何らかの処理をする場合は、WKWebViewのurlプロパティは使用せず、各delegate関数に引数として渡されるWKFrameInfoオブジェクトのrequest.URLやsecurityOriginを用いることが望ましいでしょう。Messagesの誤った使い方や、アプリ内部でlocalhostのWebサーバを立てる際の注意点に触れています。ご興味のある方は、是非、講演スライドをご覧ください。宗晃リクルートグループ全体の脆弱性検査および修正支援に携わる。趣味はブラウザの脆弱性探し。ARCHIVES2020年2月2020年1月2019年12月2019年11月2019年10月2019年8月2019年7月2019年6月2019年5月2019年4月2019年3月2019年2月2019年1月2018年12月2018年11月2018年10月2018年9月2018年8月2018年7月2018年6月2018年5月2018年4月2018年3月2018年2月2018年1月2017年12月2017年11月2017年10月2017年9月2017年8月2017年7月2017年6月2017年5月2017年4月2017年3月2017年2月2017年1月2016年12月2016年11月2016年10月2016年9月2016年8月2016年7月2016年6月2016年5月2016年4月2016年3月2016年2月2016年1月2015年12月2015年11月2015年10月2015年9月2015年8月2015年7月SHAREリクルートグループサイトへ利用規約プライバシーポリシーお問い合わせ。