セキュアコーディングガイド
第9版(Android 8.0対応)
セキュアコーディングWG リーダー
安藤彰

<Akira.Ando@sony.com>
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

1

アジェンダ• セキュアコーディングガイドについて•〃

第9版の改定内容• ガイド HTML版のご紹介

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

2セキュアコーディングガイド

セキュアコーディング
ガイドについて2018/3/9

一般社団法人日本スマートフォンセキュリティ協会3

２０１２年６月

初版公開

Androidアプリセキュリティのノウハウ集
通称：JSSECセキュアコーディングガイド
PDF文書とセキュアなサンプルコード一式（無償）
http://www.jssec.org/report/securecoding.html「Android セキュアコーディング」と検索

デファクトスタンダードなガイド・基準
通信キャリアや多くのアプリベンダーでも活用。
受入基準にするアプリ発注会社もある。

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会4ガイドの歴史• 年1回から2回のペースで改訂
2012年6月 2012年11月
2013年4月 2014年7月• 2014年

2014年4月2014年8月

2015年6月

2015年6月

2016年2月

2016年9月

2017年2月

2016年2月

2016年9月

2017年2月– 英語版リリース

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

5セキュアコーディングガイド

第９版
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

6

第9版の特徴
２０１８年２月１日版 改定内容
主な改定内容はAndroid 8.0 (Oreo)への対応
・Autofillフレームワーク

・Permission
・Account Manager
・SSLv3非サポートについて・Android ID
・WebView
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

7Autofillフレームワーク

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

8Autofillフレームワーク• Autofillフレームワークとは？
・ユーザーが入力した情報を「保存」
・再度入力時に保存しておいた情報を「自動入力」を実現するための枠組みを提供する• 扱うデータ
ユーザー名、パスワード、住所、電話番号、クレジットカード情報 etc…
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

9Autofillフレームワーク• 登場人物– 利用アプリ：自動入力の対象アプリ– Autofillサービス：自動入力機能を実装するサービス– ユーザー： Autofillサービスの選択や保存の許可を行う– Autofillフレームワーク：3者間を繋ぐ役目

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

10Autofillフレームワーク• ユーザーによるAutofillサービスの選択「このアプリが信頼できることを確認してください」
選択とシステムが固定で表示する

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

11Autofillフレームワーク• 概要(保存)アクティブなアプリが自動的に対象になる

デフォルトではActivity上のすべてのテキストが含まれる

2018/3/9

ユーザーの許可後に入力データを受け取り、保存する

保存にはユーザーの許可が必要

一般社団法人日本スマートフォンセキュリティ協会

12Autofillフレームワーク• 概要(保存)「○○をXXに保存しますか？」とシステムが固定で表示する※○○：データ名※XX：Autofillサービス名
許可 or 拒否2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

13Autofillフレームワーク• 概要(自動入力)

ユーザーが選択したデータが自動入力される

2018/3/9

属性情報を元に、候補リストを作成する

入力するデータは、必ずユーザーが選択する一般社団法人日本スマートフォンセキュリティ協会

14Autofillフレームワーク• 概要(自動入力)

選択
ユーザー名に紐づくパスワードも自動で入力される

ユーザー名をリストから選択する

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

15Autofillフレームワーク• リスク– Autofillサービスがマルウェア・うっかりウェアだったら、、、⇒「重要情報の漏えい」や「偽情報の自動入力」につながる危険性がある

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

16Autofillフレームワーク• 対策– ユーザーが適切なAutofillサービスだけを選択(インストール)する– 保存時にユーザーが適切に許可を与える– 自動入力時にユーザーが正しく候補を選択する

Autofill機能のセキュリティは、ユーザーの選択や許可によるところが大きい！

• アプリにできることは、、、
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

17Autofillフレームワーク• アプリにできる対策
唯一、View(Activity)毎にAutofill機能を無効にすることだけ！

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

18Autofillフレームワーク• ガイドでは、以下の構成で解説– Autofillフレームワークの仕組み– セキュリティ上の懸案– リスクに対する対策

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

19Permission

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

20Permission• 「5.2.3.6 Android 6.0以降のPermissionモデルの仕様変更について」について、Android 8.0における変更点を追記
端末のAndroidOSバージョン

≧8.0

≧6.0
≦5.1

2018/3/9

アプリのtargetSDKVersion

アプリへの権限付与のタイミング

ユーザーによる権限制御≧26

アプリ実行時(付与はPermission単位)

あり

<26

アプリ実行時(付与はGroup単位)

あり

＜23

インストール時あり(早急な対応が必要)≧23

アプリ実行時(付与はGroup単位)あり＜23≧23

インストール時あり(早急な対応が必要)

インストール時なし＜23

インストール時なし

一般社団法人日本スマートフォンセキュリティ協会

21Android 6.0 (Marshmallow)の変更点• Runtime Permissionの導入
実行時に確認

インストール
時に確認

従来のPermission確認画面

2018/3/9

新しいPermission確認画面

一般社団法人日本スマートフォンセキュリティ協会

22Android 6.0 (Marshmallow)の変更点• 保護レベルがdangerousのpermissionのみ
影響① 実行中の必要に応じたユーザー許諾② Permission Group単位での権限管理
同じPermission Groupに属するpermissionは一度の要求で全てgrantされる③ ユーザーによる許可の取り消し (revoke)– targetSdkがAndroid Mより前のバージョンでも、Android M 端末上では、ユーザーは権限をrevokeできる– Android Mより前のOSの動作する端末上では新しいモデルは適用されない
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

23Android 6.0 (Marshmallow)の問題点• Permission Group単位での権限管理
例えば、READ_CONTACTSパーミッションを許可すると、// AndroidManifes.xml内の宣言<uses-permission android:name=“android.permission.
READ_CONTACTS”/>// READ_CONTACTSを要求する例
requestPermissions(new String[] {Manifest.permission. READ_CONTACTS},REQUEST_CODE);

同じGroupのWRITE_CONTACTSパーミッションが不要な場合でも一緒に付与されてしまう
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

24Android 8.0 (Oreo)の改善点• ユーザーから見たUIは同じ– Group単位での許可ダイアログの表示• 実装において明示的な利用宣言・要求が必須になった// AndroidManifes.xml内の宣言<uses-permission android:name=“android.permission.
WRITE_CONTACTS”/>// WRITE_CONTACTSを要求する例requestPermissions(new String[] {Manifest.permission. WRITE_CONTACTS},REQUEST_CODE);

明示的宣言が無い場合は許可されない• 取消単位はGroupのまま同じ
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

25

Account Manager

2017/11/16

一般社団法人日本スマートフォンセキュリティ協会

26

Account Manager• 追加– 5.3.3.3 Android 8.0（API Level 26）以降で署名の一致しないAuthenticatorのアカウントを読めるケース•

Android 8.0（API Level 26）以降で署名の一致しないAuthenticatorのアカウント情報を取得できるケースとその対策に関する記述を追記• 変更・拡充– 5.3.2.6 Account Managerにパスワードを保存しない（推奨）•Android 7.0(API Level 24)以降のパスワード保存場所に関する記述を追記•

Android 6.0(API Level 23)以降およびAndorid 8.0(API Level 26)以降のAccountManagerに関するPermissionとメソッドの対応を追記– 5.3.3.1 Account Managerの利用とPermission– 5.3.2.4 KEY_INTENTには、ログイン画面Activityのクラス名を指定した明示的Intentを与える（必須）•2018/3/9

Android 4.4（API Level 19）前後でのKey Intentの挙動の違いについて追記
一般社団法人日本スマートフォンセキュリティ協会

27

SSL3.0非サポート

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

28

SSLv3非サポートについて• OSレベルでSSLv3のサポートを中止！
SSL 3.0
SSL 3.0
TLS 1.0
TLS 1.1
TLS 1.2

2018/3/9

AndroidOreo(8.0)

TLS 1.0
TLS 1.1
TLS 1.2
一般社団法人日本スマートフォンセキュリティ協会

29Android ID

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

30

変更点
• Android Nougat (7.1) 以前端末固有値：
端末毎にユニークな識別子• Android Oreo (8.0) 以降
アプリ固有値：
端末 X アプリ毎にユニークな識別子
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

31何が違うのか？
• 例えば、あるアプリがIDと趣味を多数の端末から集めてWebページに(うっかり)掲載
AndroidNougat(7.1)

AID=ID2

2018/3/9

うひひ、この端末の持ち主、変な趣味持ってるな。脅しちゃえ！

ID0:読書ID1:スポーツ
ID2:変な趣味
ID3:映画鑑賞
ID4:…
…

一般社団法人日本スマートフォンセキュリティ協会32何が違うのか？
• Android 8.0の端末だと、各アプリ取得できるIDが違うので、
AID=ID2-2
AndroidOreo(8.0)

。。。

ID0-1:読書
ID1-1:スポーツ
ID2-1:変な趣味
ID3-1:映画鑑賞
ID4-1:…
…

AID=ID2-1
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

33Android ID• 特徴– 端末リセットするまで値は変わらない– 7.1以前：端末固有な値– 8.0以降：端末 X アプリ固有な値• 正確には、開発者(署名)単位なので再インストール後も値は不変• 多少安全性が加味されたが、「ユーザーによる取り換え困難なID」に変わりないので、プライバシー情報と紐づけた利用には注意が必要
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

34

WebView

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

35

WebView• Network Security Configuration の平文通信禁止フラグが有効になった– Android 7.1まではWebViewに関しては効果が無かった<?xml version="1.0" encoding="utf-8"?><network-security-config><domain-config cleartextTrafficPermitted="false"><domain includeSubdomains="true">jssec.org</domain></domain-config></network-security-config>
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

36Android 7.xでは• 平文通信を禁止しても、、、※(注意)理解優先のために実装は正確ではありません

URL uri = “http://example.com/api”;
uri.openConnect ();example.com

AndroidNougat(7.1)

WebView wv = new WebView();
wv.loadUrl(“http://example.com/”);2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

WebView は平文通信できてしまう37

Android 8.0以降は• 平文通信を禁止すれば、、、※(注意)理解優先のために実装は正確ではありません

URL url = “http://example.com/api”;
url.openConnection ();example.com

AndroidNougat(7.1)

WebView wv = new WebView();
wv.loadUrl(“http://example.com/”);2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

接続方法によらず平文通信を防止できる38

(参考) Network Security Configurationとは• Android 7.0 から追加された機能で、アプリ毎にHTTPS通信の制御ができる
– プ
ライベ
ート証明書を使ったHTTPS通信
– ピ
ンニング
による証明書検証– 非暗号化（HTTP）通信の抑制– etc…

<?xml version="1.0" encoding="utf-8"?><network-security-config><domain-config cleartextTrafficPermitted="false"><domain includeSubdomains="true">jssec.org</domain></domain-config></network-security-config>

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

39セキュアコーディングガイド

ガイドHTML版のご紹介
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

40HTML版について• URL– http://www.jssec.org/dl/android_securecoding/• 特徴– 見出しの階層構造– 各見出しへの直接リンク– ソースコードの可読性向上
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

41

概要
PDF版ガイド

2018/3/9

HTML版

一般社団法人日本スマートフォンセキュリティ協会

42

見出し
階層的な見出しで、目的の記事に素早くアクセス！

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

43各見出しへの直接リンク
章・節にも直接リンクできて、参照が便利に！
「5.2.3.3. APKの改ざんを検出する」

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会44

コードの可読性向上
ページをまたがず、色も付いて、見やすく！

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

45セキュアコーディングガイド

第10版(告知)
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

46Android P (9.0) 開発者プレビュー公開！
Oreo (8.0) との差分などの情報が開示！

2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

47

第10版
• おそらく、Android P 対応が中心になります！

乞う、ご期待！
2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

48

セキュアコーディングガイド

さいごに2018/3/9

一般社団法人日本スマートフォンセキュリティ協会

49ご協力いただける方は下記の要領でご連絡ください
1.

JSSECに会員としてご参加くださ 2. 次の書式でメール送信してください
いTo: Akira.Ando@sony.com– 会員かどうかは下記URLで確認
http://www.jssec.org/members/•– 会員として無理な方は、Androidセキュリ
ティ部にご参加ください(下記URL)
https://groups.google.com/group/androidsecurity-japan
右の(4)では「Androidセキュリティ部」と記載してください••

ご協力お願い致します2018/3/9

Subject: JSSECセキュアコーディングWG参加
本文:(1) Google account: (メアドを記載)(2) First name: (名前を記載)(3) Last name: (名字を記載)(4) Organization: (組織名を記載)(5) Git access: (必要 or 不要)– 各種アカウント発行後、メール返信にてご連絡いたします(1)はGmailメアドまたはご自身のメアドをGoogleアカウ
ント化したもの(4)は下記URLページ内から選択•
http://www.jssec.org/members/

一般社団法人日本スマートフォンセキュリティ協会

50