JSSEC セキュリティフォーラム 2017行ってまいりました。
ということで今回はセキュアコーディングガイドの更新のポイントをまとめていきたいと思います。
Network Security ConfigurationとPinningの実装が今回の更新のポイント
本日のセキュリティフォーラムでは明日公開のAndroid アプリのセキュア設計 セキュアコーディングガイド2月1日版(←9日公開)を頂けました。471PもあるのでPDFだと読みづらいので助かります。
さて、この第8版は待ちきれず出した9月の第7版の発表10日後に出てしまったAndroid7.0対応の記述を盛り込んだもので、Android4.0以前の記述を大幅カットしたそうです。
今回の更新はNetwork Security ConfigurationとPinning実装を抑えれば良いそうです。
セキュリティフォーラムの内容を踏まえ、それぞれ詳しく解説していきます。
Network Security Configuration:XMLで書けるようになった通信設定
Network Security ConfigurationはAndroid7.0からの実装ですがXMLの数行の設定で
複雑で神経を使うJavaコードを書かなくとも通信設定が書けるのは大きいですね。
Network Security Configurationは以下の2ステップで使えるようになります。
ステップ1:Androidmanifest.xmlで太字の部分を追加します。
<?xml version=“1.0” encoding=“utf-8”?>
<manifest … >
<application android:networkSecurityConfig=“@xml/network_security_config”
… >
…
</application>
</manifest>
ステップ2 res/xml/network_security_config.xml
:を編集します。
クライアント証明書を使用する
システムにインストールされている証明書ではなくアプリ内の所定の場所に入っている証明書(CA)を利用したい場合の設定です。設定するのは①プライベート証明書のパスと②ドメインの設定の2つです。
①プライベート証明書のパス
raw配下なので@raw/(証明書名)
domain-configをbase-configにしておけばドメインを細かく指定しなくとも全て
<?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>
デバックの時だけプラベート証明書を使うConfiguring CAs for Debugging
IPAでも”プレス発表 【注意喚起】HTTPSで通信するAndroidアプリの開発者はSSLサーバー証明書の検証処理の実装を”なんてありましたが、2017年現在もデバッグ時のみプライベート(オレオレ)証明書を許可したつもりが・・なんてアプリ実は結構な頻度で見かけます。
https://www.ipa.go.jp/about/press/20140919_1.html
http://blog.tokumaru.org/2014/09/androidkindlesslcve-2014-3908.html
https://jvn.jp/vu/JVNVU90369988/index.html などなど
Configuring CAs for Debuggingを設定しておけばandroid:debuggableがtrueの時のみ、debug-overridesに書かれた内容が適用されます。
※android:debuggable=trueはRuntime codeInjectionの原因になるので設定を残してリリースしないように気をつけましょう!
<?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
非暗号化通信を許可しないの設定が下記3行で済む、iOSのATS(Application Transport Security)がAndroidでも使えるようになった的な設定です。Androidがついに追いついたのか・・
<?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
などなど、いままでJavaで書いていたものが・・と発見があるはずです。
公式の技術情報をチェックしましょう。
Pinning実装は次回の記事、Android7.0対応セキュアコーディングガイド更新内容まとめ②で書いていきたいと思います。
以上です。ご参考になれば幸いです。