【Apple WWDC 2016】iOS 10のApp Transport Securityと2016年末からのATS必須化についてAppleのエンジニアに聞いてきた

Apple WWDC 2016に参加するためにサンフランシスコへ来ているid:niwatakoです。

WWDC 2016のセッション にて、App Storeに公開するアプリは今年中にATS(App Transport Security)が要求されるようになるという発表がありました。

アプリからの通信をhttps接続のみに制限するATSの有効化がApp Storeへのアプリ提出には必須になるとのことですが、はてなブックマークのようにhttpのウェブページを含む不特定多数のコンテンツの表示が必要なアプリはどこまで制限されるのでしょうか。

WWDC期間中はAppleのエンジニアに質問が出来るLabが設けられているので、ATSとiOS 10でのATS周りの仕様について質問してきました。

2016/12/22 追記

2016年末とされていたApp Transport Security必須化の延期が発表されました。延期後の日程は現時点では未定です。

Supporting App Transport Security - News and Updates - Apple Developer

2016/09/07 追記

この記事に記載の情報は現在では古くなっています。

下記フォーラムでは、新たに NSAllowsLocalNetworkingNSAllowsArbitraryLoadsInMedia というキーが追加されること、 NSURLConnection がATSの許可するTLSの最低バージョンを無視するバグが修正され、従うようになることなどが告知されています。

forums.developer.apple.com

また情報が錯綜していた「 UIWebViewNSAllowsArbitraryLoadsInWebContent の対象になるのかどうか」については、UIWebView も対象になると記載されています。そのほか、ATSに関する最新の詳細はCocoa Keysドキュメントの NSAppTransportSecurity の部分を御覧ください。

developer.apple.com

WWDCにて、2016年末にATSが必須化されることが言及される

ATS(App Transport Security)とは、iOS9とOS X 10.11から導入されたアプリとネットワーク間のセキュアな通信を保証するための機能で、安全に暗号化されたhttps通信のみを許可し、安全でないレベルのhttps通信やhttp通信を遮断します。

How iOS Security Really Works および What's New in Security というセッションで、2016年末にApp Storeに公開するアプリにはATSが必要になるということが発表されました。

セッションスライド資料 Page 100/116

App Transport Security
• Required by App Store at end of 2016
• TLS v1.2, with exceptions for alreadyencrypted bulk data like media streaming

ATSの必須化とiOS 10の登場で、何が変わるのか

ATSはこれまで、ATS自体の無効化や、ホワイトリストを作成してATSの通信遮断対象から除外するドメインを指定したり、逆に全体のATSを無効にしながら一部のドメインについてはATSの対象としたり、あるいはATSが許容する暗号水準を下げたり、といった詳細なカスタマイズが可能でした。

ATSの設定は、アプリケーションのInfo.plistにキーを追加して値を設定しますが、利用可能なキーはこちらで確認出来ます。

developer.apple.com 注意:こちらのドキュメントは開発者向けのプリリリースのドキュメントであり、iOS 10の確定された最終仕様ではありません。今後正式なiOS 10がリリースされるまでの間に変更が加えられる可能性があります。


iOS 10 では、新たに NSAllowsArbitraryLoadsInWebContent というキーが追加され、このキーの設定値を YES にすることでウェブページの読み込み(と、AVFoundationのStreaming media)に限ってはhttp通信を許可することが可能になります。

つまり、iOS 9 では不特定多数のウェブページを表示するようなアプリはATSを無効化するしかなく、それによってウェブページの表示以外のhttp通信まで許してしまっていたのに対し、iOS 10では、不特定多数のウェブコンテンツを表示しつつも、それ以外の通信は安全なhttpsへの接続のみを許可することで、セキュリティを向上させることが可能になるのです。

また、それが可能になることで、ATSを無効化しなければならないケースはかなり限定的になると考えられるため、App Storeに公開されるアプリの全体的なセキュリティ水準の向上のために、2016年中のATS必須化がアナウンスされたのだと考えられます。セキュリティが向上しただけで、アプリの開発者がきちんと対応すれば、これまでどおりhttpのウェブページにもアクセスすることができます。

条件ごとにATSの仕様を把握し、適切にATSを設定する

ATSの設定の影響を受けるのは、ネットワーク通信を行うNSURLSessionや、ウェブページを表示するUIWebView、WKWebViewなどの通信を行うクラスです(アプリケーションから独立してウェブページの表示を行う SFSafariViewController はATSの影響を受けません)。

また、iOS 10から利用可能になるATSの新しい設定キー NSAllowsArbitraryLoadsInWebContent と、従来からあるATSの無効化設定キー NSAllowsArbitraryLoads が同時に存在した場合にはどちらが有効になるかの力関係があります。

iOSのバージョン、ATSの設定、通信を行うクラスの組み合わせ毎に、ATSがどのように機能するかを一覧にまとめました。

f:id:niwatako:20160616114803j:plain

iOS 9では従来通り、NSAllowsArbitraryLoadsYES であれば、自由にhttp通信が行えます。

iOS 10では、まず NSAllowsArbitraryLoadsInWebContentYES かどうかで条件が別れます。NSAllowsArbitraryLoadsInWebContent が、設定されていないか NO である場合は、iOS9と同じ挙動になります。 YES に設定されている場合は、iOS 10では NSAllowsArbitraryLoads が無視され、WKWebViewのみがhttp通信を許されるようになります。

このとき、データ通信を行うNSURLSessionに加え、UIWebViewについてもhttp通信が許可されないのがポイントです。なるべくWKWebViewを利用して欲しいとのことでした。また、NSExceptionDomains を設定すれば、指定したドメインへのNSURLSessionやUIWebViewからのhttp通信も許可されるそうです。

ただし、Apple のエンジニアの間でも情報が錯綜している

UIWebiewにも NSAllowsArbitraryLoadsInWebContent は有効なはずだ、とAppleのウェブテクノロジーエバンジェリストがTwitterで述べているようです。

ちなみに私がLabで質問したのはセキュリティの担当者でした。

ATSはセキュリティの機能で、2016年末に必須化することが発表されたのもセキュリティがテーマのセションです。なのでセキュリティエンジニアの言っている内容がよりATSの方針・意図を知るためには適切ではないかとは思っています。

しかし、Apple内部でも見解が統一されていない可能性があり、正式リリースまでの間に変更が加えられる可能性もありますのでご注意ください。

どのように対応すべきか

少なくとも今日私が話を聞いたLabのエンジニアの話をもとに考えると、これまでhttpのウェブページを利用するために NSAllowsArbitraryLoadsYES にしていた場合は、NSAllowsArbitraryLoadsInWebContent を追加して YES を設定し、WKWebViewのみhttp通信を許可するのが良いでしょう。

UIWebViewやNSURLSessionで不特定多数のサーバーに対してhttp通信を行わざるを得ない場合は、そのまま NSAllowsArbitraryLoads のみ YES に設定していれば良さそうです(審査時に理由の説明が必要)。

UIWebViewを利用している場合、特別理由がなければWKWebViewに移行することが強く推奨されそうです。


はてなのサマーインターンに参加するiOSエンジニアを募集中

はてなではSwiftを使ってiOSアプリを開発しています。今回のWWDCの基調講演のスライドの中にもSwiftで作られたアプリの一つとして、はてなブックマークアプリのアイコンが掲載されています。

そんな株式会社はてなでは "iOSアプリ開発実践コース" がある、はてなサマーインターン2016を開催します。

hatenacorp.jp

応募締め切りは2016年7月4日(月)となっています。宿泊費は出ますので、全国より奮ってご応募ください!