Android アプリで意図しないクリアテキスト トラフィックへの逆行を防ぐ
2016年5月23日月曜日
[この記事は Alex Klyubin、Android セキュリティ チームによる Android Developers Blog の記事 "Protecting against unintentional regressions to cleartext traffic in your Android apps" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。]
アプリが HTTP などのクリアテキスト ネットワーク トラフィックを使ってサーバーと通信すると、第三者による盗聴や改ざんのリスクが生じます。これは、ユーザーの情報の漏えい、アプリへの不正なコンテンツの注入や攻撃につながる可能性があります。そのため、HTTP ではなく HTTPS を使用するなど、アプリでセキュアなトラフィックのみを使用することが理想的です。セキュアなトラフィックは、盗聴や改ざんから保護されています。
既に Android アプリの多くがセキュアなトラフィックのみを使用しています。ただし、そのようなアプリでも、何らかの偶発的な理由でクリアテキスト トラフィックに逆戻りしてしまう場合があります。たとえば、意図せずに何らかのサーバー コンポーネントを変更してしまうと、サーバーが HTTPS の URL ではなく、HTTP の URL をアプリに提供するかもしれません。その場合、アプリはクリアテキストでの通信を行うようになりますが、ユーザーの目に見える弊害は発生しません。つまり、アプリのデベロッパーやユーザーはこの状態に気づかない場合があります。
アプリでセキュアなトラフィックのみを使用していると思っている場合でも、Android Marshmallow(Android 6.0)に新しく導入されたメカニズムを使用して、偶発的な逆行の検知や防止を行うようにしてください。
android:usesCleartextTraffic は、アプリの minSdkVersion や targetSdkVersion を 23(Android Marshmallow)に設定しなくても使用できます。古いプラットフォームではこの属性は無視されるため、何の影響もありません。
なお、WebView にはこの機能はまだ適用されないことに注意してください。
それでも特定の状況では、クリアテキスト トラフィックがアプリを出入りする可能性があります。たとえば、Socket API は送受信するデータがクリアテキストに分類されるかどうかわからないため、クリアテキスト ポリシーは適用されません。一方、Android プラットフォームの HTTP スタックはトラフィックがクリアテキストかどうかわかるため、このポリシーが適用されます。
このポリシーは、Google AdMob にも適用されるようになっています。アプリでクリアテキスト トラフィックを使用しないと宣言した場合は、HTTPS の広告のみがアプリに配信されます。
サードパーティー製のネットワーク、広告、アナリティクス ライブラリは、このポリシーをサポートすることが推奨されます。NetworkSecurityPolicy クラスを使うと、クリアテキスト ポリシーを照会できます。
そもそも、この機能は TLS / SSL ではないセキュアなトラフィックを識別するためのものです。さらに重要な留意点は、HTTP プロキシを経由する TLS / SSL トラフィックも識別されてしまう可能性があることです。デベロッパーはアプリのユーザーが Android 端末に HTTP プロキシを設定しているかどうかは制御できないため、この問題が発生します。さらに、この機能の実装は今後も利用できるとは限りません。将来新しい TLS / SSL プロトコルのバージョンができた際に、それを拒否してしまう可能性があります。この機能が開発や QA のフェーズ専用であるのは、以上の理由からです。
いつものように、フィードバックや Android を改善するための提案を歓迎しています。HTTPS、Android セキュリティ <security@android.com> までご連絡ください。
Posted by Eiji Kitamura - Developer Relations Team
アプリが HTTP などのクリアテキスト ネットワーク トラフィックを使ってサーバーと通信すると、第三者による盗聴や改ざんのリスクが生じます。これは、ユーザーの情報の漏えい、アプリへの不正なコンテンツの注入や攻撃につながる可能性があります。そのため、HTTP ではなく HTTPS を使用するなど、アプリでセキュアなトラフィックのみを使用することが理想的です。セキュアなトラフィックは、盗聴や改ざんから保護されています。
既に Android アプリの多くがセキュアなトラフィックのみを使用しています。ただし、そのようなアプリでも、何らかの偶発的な理由でクリアテキスト トラフィックに逆戻りしてしまう場合があります。たとえば、意図せずに何らかのサーバー コンポーネントを変更してしまうと、サーバーが HTTPS の URL ではなく、HTTP の URL をアプリに提供するかもしれません。その場合、アプリはクリアテキストでの通信を行うようになりますが、ユーザーの目に見える弊害は発生しません。つまり、アプリのデベロッパーやユーザーはこの状態に気づかない場合があります。
アプリでセキュアなトラフィックのみを使用していると思っている場合でも、Android Marshmallow(Android 6.0)に新しく導入されたメカニズムを使用して、偶発的な逆行の検知や防止を行うようにしてください。
新たな保護メカニズム
セキュアなトラフィックのみを使用するアプリのクリアテキスト トラフィックへの逆行に対処するために、Android 6.0 Marshmallow(API レベル 23)には 2 つのメカニズムが導入されています。1 つ目は、実際のデバイスにインストールされた本番環境のアプリでクリアテキスト トラフィックをブロックするメカニズム。2 つ目は、開発中や QA 中のアプリで TLS/SSL 以外のトラフィックが発生した場合にログを出力したり、クラッシュさせるメカニズムです。次のセクションでは、この 2 つのメカニズムについて詳しく説明します。本番環境のアプリのクリアテキスト トラフィックのブロック
実際のデバイスにインストールされたアプリをクリアテキスト トラフィックへの逆行から保護するには、アプリの AndroidManifest.xml の application 要素で android:usesCleartextTraffic=”false” 属性を宣言します。これは、アプリにクリアテキスト ネットワークを使用する意図がないことを宣言するもので、これによって Android Marshmallow のプラットフォームのネットワーク スタックがアプリのクリアテキスト トラフィックをブロックするようになります。たとえば、アプリが何らかの偶発的な理由でクリアテキスト HTTP リクエストによるサインインを行おうとした場合、そのリクエストがブロックされるので、ユーザーの ID やパスワードがネットワークに漏れることはありません。android:usesCleartextTraffic は、アプリの minSdkVersion や targetSdkVersion を 23(Android Marshmallow)に設定しなくても使用できます。古いプラットフォームではこの属性は無視されるため、何の影響もありません。
なお、WebView にはこの機能はまだ適用されないことに注意してください。
それでも特定の状況では、クリアテキスト トラフィックがアプリを出入りする可能性があります。たとえば、Socket API は送受信するデータがクリアテキストに分類されるかどうかわからないため、クリアテキスト ポリシーは適用されません。一方、Android プラットフォームの HTTP スタックはトラフィックがクリアテキストかどうかわかるため、このポリシーが適用されます。
このポリシーは、Google AdMob にも適用されるようになっています。アプリでクリアテキスト トラフィックを使用しないと宣言した場合は、HTTPS の広告のみがアプリに配信されます。
サードパーティー製のネットワーク、広告、アナリティクス ライブラリは、このポリシーをサポートすることが推奨されます。NetworkSecurityPolicy クラスを使うと、クリアテキスト ポリシーを照会できます。
開発中のアプリのクリアテキスト トラフィックの検出
開発や QA の際にクリアテキスト トラフィックを検出するには、StrictMode API を使用して TLS / SSL 以外のトラフィックを検知するようアプリを変更し、それをシステムログに出力するか、アプリをクラッシュさせます(StrictMode.VmPolicy.Builder.detectCleartextNetwork() をご覧ください)。このツールは、アプリのどの部分が TLS / SSL(と DLTS)以外のトラフィックを使用しているかを判別する際に便利です。android:usesCleartextTraffic 属性とは異なり、この機能はユーザーに配布するアプリで有効にすることは想定されていません。そもそも、この機能は TLS / SSL ではないセキュアなトラフィックを識別するためのものです。さらに重要な留意点は、HTTP プロキシを経由する TLS / SSL トラフィックも識別されてしまう可能性があることです。デベロッパーはアプリのユーザーが Android 端末に HTTP プロキシを設定しているかどうかは制御できないため、この問題が発生します。さらに、この機能の実装は今後も利用できるとは限りません。将来新しい TLS / SSL プロトコルのバージョンができた際に、それを拒否してしまう可能性があります。この機能が開発や QA のフェーズ専用であるのは、以上の理由からです。
ネットワーク セキュリティ構成によるさらに細かいクリアテキスト ポリシーの宣言
Android N では、クリアテキスト トラフィック ポリシーをさらに細かく制御することができます。android:usesCleartextTraffic 属性は、アプリのすべての通信先に適用されます。それとは対称的に、Android N のネットワーク セキュリティ構成を使用すると、特定の通信先に対するクリアテキスト ポリシーを設定できます。たとえば、クリアテキスト トラフィックを許可しないポリシーに徐々に移行するために、まず重要度の高いバックエンド通信先のみで偶発的なクリアテキストをブロックし、その他の通信先ではクリアテキストを許可することができます。次のステップ
セキュリティを考慮すると、セキュアなネットワーク トラフィックのみを使用してアプリとサーバーの通信を行うことが推奨されます。Android Marshmallow では、この動作を強制することができますので、ぜひお試しください。いつものように、フィードバックや Android を改善するための提案を歓迎しています。HTTPS、Android セキュリティ <security@android.com> までご連絡ください。
Posted by Eiji Kitamura - Developer Relations Team