Network Security Configurationについて - Android N

A+ a-

310Android NPreviewAndroid M調調調

Android MRuntime-PermissionNM調調



Network Secure Config

HTTPSIPA



 HTTPSAndroidSSL



Network Secure Config

RiskFinder







https使httpsCA


URLSSL







Android NNetWork Secutiry ConfigNetwork Security ConfigCA使Configring CAs for DebuggingHTTPS

Preview


Network Security Configuration(超訳)

今回新しくできた、Network Security Configurationページの翻訳というか超訳です。


AndroidNはネットワークセキュリティ設定(Network Security Configuration)機能が含まれています。この機能はアプリケーションのコードを変更することなく、宣言型設定ファイルを使用してネットワークセキュリティの設定をカスタマイズすることができます。

この設定は、特定のアプリケーションの特定のドメイン設定を変更できます。

この機能の主要な機能は以下となります。


Custom trust anchors:

アプリケーションのセキュア接続にどのCAを信用するかカスタマイズできます。

例えば特定の自己署名証明書を信頼する、制限されたパブリックCAのセットを信用するといった事ができます。


Debug-only overrides:

インストールベースに追加されるリスクなしで、デバッグ時のサーバーとの安全な接続を実現します。


Cleartext trafiic opt-out:

アプリケーションがクリアテキストトラフィックを使用してしまう事故から保護します。


Certificate pining

アプリケーションの特定な証明書へのセキュアなアクセスを実現します。


Adding a Security Configuration File

ネットワークセキュリティコンフィグレーション機能は、アプリケーションの設定をXMLファイルに記載して使用します。そして、アプリケーションのマニュフェストファイルに、このファイルを示すエントリを記載します。

以下のマニュフェストのコードは、このエントリを作成する方法を示しています。




<?xml version="1.0" encoding="utf-8"?>
...<app ...>
    <meta-data android:name="android.security.net.config"
               android:resource="@xml/network_security_config" />
    ...</app>


nexwork_security_configAndoroidManifest

Customizing Trusted CAs


CACA




CA使使

CACA

CA


(TLS,HTTPS)CAtarget API level23(Android M)CACAAndroid N
base-configdomain-config使


Configuring a Custom CA



自己署名証明書(オレオレ証明書)を使用しているサーバに接続したり、信用する非公開CA(会社の内部CA等)を使用する時に利用できます。


補足:そんなにないですが、端末自体に自己署名ルート証明書を入れるようなアプリケーションが現在ありますが、アプリケーション内に含める事ができるようになったので、運用が楽になりました。


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

PEMかDERフォーマットのCAの証明書をres/raw/my_caファイル記載します。


Limiting the Set of Trusted CAs


システムにインストールされているCAを信用したくないときに、代わりに指定したCAセットを指定することができます。これは、他のCAによって発行された不正な証明書からアプリを保護します。

信頼できるCAのセットを制限するための設定は、複数のCAがリソースに提供されている以外は、特定のドメインのカスタムCAを信頼することと似ています。


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">secure.example.com</domain>
        <domain includeSubdomains="true">cdn.example.com</domain>
        <trust-anchors>
            <certificates src="@raw/trusted_roots"/>
        </trust-anchors>
    </domain-config>
</network-security-config>

信頼するCAはPEMかDERのフォーマットでres/raw/trusted_rootsに追加する。もしPEMフォーマットを使うなら、PEMデータのみを含めなければならずextra textは含めない。また複数行の<certificates>属性を使用することができる。


補足)アンドロイドが普及するに従って、法律が異なる様々な国で使われるようになりました。端末にプリセットされるCAが不正なCAである可能性もありますし、既存の信頼されているCAがおかしな事をする可能性も捨てきれませんので(実際事故は起こっている)非常にセンシティブなアプリケーションの場合はこのような対処が必要になるという事でしょう。特定のサーバーにしか接続しないアプリはこのような仕組みを利用するのもありかもしれません。


参考


Trusting Additional CAs

アプリケーションは、システムによって信頼されていないCAを追加することができる。
これはシステムまだCAを含めていないといった時や、アンドロイドシステムの要件にまだ含まれていなという原因である可能性があります。

アプリは複数の証明書の場所を指定することによりこれを解決できます。


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="@raw/extracas"/>
            <certificates src="system"/>
        </trust-anchors>
    </base-config>
</network-security-config>


Configuring CAs for Debugging



HTTPSSSL

使CA

android:debuggabletruedebug-overrides



IDEandroid:debuggable

debuggable()


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <debug-overrides>
        <trust-anchors>
            <certificates src="@raw/debug_cas"/>
        </trust-anchors>
    </debug-overrides>
</network-security-config>


Opting Out of Cleartext Traffic



使cleatext()HTTPSHTTP使)



URL

NetworkSecurityPolicy.isCleartextTrafficPermitted()



secure.example.comHTTPS


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config usesCleartextTraffic="false">
        <domain includeSubdomains="true">secure.example.com</domain>
    </domain-config>
</network-security-config>



Pinning Certificates


CA
MiTMCA使AndroidN

X509SubjectPublicKeyInfo

使CA






res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
    </domain-config>
</network-security-config>

参考


Configuration Inheritance Behavior

値をセットしない特定の設定値は継承されます。

これは人間に理解可能な形で、複雑な設定を可能にします。

特定のエントリに値が設定されていない場合、次による一般的なエントリの値が使用されます。

値のセットされていないdomain-configは親のdomain-configの値を継承します。

値のセットされていないbase-configはプラットフォームのデフォルト値を使います。


例えば、example.comのサブドメインへの総ての接続がカスタムセットCAを使用しなければいけないときを検討します。追加で、クリアテキストトラフィックは、serure.example.comに接続している場合を除いて許可されています

ネスティングコンフィグレーションにより、example.comの内部設定のsecure.example.comにはtrust-anchorsを重複して記載する必要はありません(訳注:下記XML参照)


res/xml/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>


Configuration File Format

XMLの記載方法の説明なので省略(ざっと見ればわかります)


<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </base-config>

    <domain-config>
        <domain>android.com</domain>
        ...
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
        <pin-set>
            <pin digest="...">...</pin>
            ...
        </pin-set>
    </domain-config>
    ...
    <debug-overrides>
        <trust-anchors>
            <certificates src="..."/>
            ...
        </trust-anchors>
    </debug-overrides>
</network-security-config>


最後に

ネットワークセキュリティ設定機能をまとめますと

  • ルート証明書が無条件で信用できなくなった→アプリ単位のCAカスタマイズ
  • SSL証明書の検証不備→デバック用CAを使用可能
  • CA局信用できないなー→Pinning
  • クリアテキスト→んーなんか事件あったっけ?おまけ?

的な感じです。分かりやすいように、問題があった事件のURLも記載してみました。


デバック用のルート証明書って、リリースビルドの時に自動的に消されるのかなぁ、残ってしまうとやだなーとか、ちょと文章だけでは詳細わからない所がありますが、その点は追々調査していきたいと思います。






がく

がく

リスクファインダーはAndroidアプリのセキュリティホールを見つけます!

Androidスマートフォンが急速に普及するとともにアプリの脆弱性報告も急増しています。
リスクファインダーは、Androidアプリの脆弱性診断WEBサービスです。
500項目以上のチェックでアプリの脆弱性や問題を検出し、セキュアなアプリ開発をサポートします。

  • ブラウザでファイルをアップロードするだけ
  • アプリの脆弱性を指摘するだけでなく対処方法も提示
  • 頻繁にバージョンアップするAndroidの最新情報に素早く対応

リスクファインダーの詳細はこちら