LAC WATCH

セキュリティとITの最新情報

RSS

ラックピープル | 

JSSECセキュアコーディングガイド最新版~改定内容とAndroid 11対応のノウハウとは?

デジタルペンテストサービス部の宮崎です。

Androidアプリ開発者の皆さん、JSSECセキュアコーディングガイドをご存知でしょうか?

一般社団法人日本スマートフォンセキュリティ協会(JSSEC)が発行する、Androidアプリケーション開発者向けのセキュア設計、セキュアコーディングのノウハウをまとめたTips集で、先日、最新版となる2020年11月1日版が公開されました。JSSECの公式サイトより無料で閲覧・ダウンロードすることができます。

ラックもJSSECの幹事企業で、私自身も本改訂版の執筆をさせていただきました。
今回は、最新版の改訂内容について一部紹介していきたいと思います。

セキュアコーディングガイド2020年11月1日版改訂内容

JSSECセキュアコーディングガイドは、Android OSのバージョンアップに追従するかたちで改訂が続けられています。

2012年6月版が初版となり、過去2年の版数と対象となるAndroidバージョンは以下のようになっています。

JSSECセキュアコーディングガイド Androidバージョン
2018年2月1日版 Android 8
2018年9月1日版 Android 9
2019年9月1日版 Android 10
2019年12月1日版 Android 10
2020年11月1日版 Android 11
JSSECセキュア
コーディングガイド
Androidバージョン
2018年2月1日版 Android 8
2018年9月1日版 Android 9
2019年9月1日版 Android 10
2019年12月1日版 Android 10
2020年11月1日版 Android 11
セキュアコーディングガイドとAndroidバージョンの対応

ご覧の通り、最新版である2020年11月1日版は、Android 11における変更点を中心に改訂が行われています。以下に、最新版における改訂内容を、ガイド本文より抜粋します。

最新版の訂正記事 訂正の要旨
3.1.1.2. Androidスマートフォンにおける機能資産 機能資産におけるアップデート情報についての説明を追記しました。
4.6.3.7. Android 11(API Level 30)における対象範囲別ストレージの適用について Android 11.0(API Level 30)における対象範囲別ストレージについての説明を追記しました。
5.2.3.6. Android 6.0 以降の Permission モデルの仕様変更について Android 11.0(API Level 30)における1回だけのアクセス許可についての説明を追記しました。
5.2.3.7. Android 11.0 以降での使用していないアプリの権限が自動リセットされる機能について Android 11.0(API Level 30)における権限の自動リセットについての説明を追記しました。
5.5.3.5. Android 11 でのデータアクセスの監査について Android 11.0(API Level 30)におけるデータアクセスの監査についての説明およびサンプルコードを追記しました。
5.5.3.6. Android 11 での位置情報アクセスについて Android 11.0(API Level 30)における位置情報アクセスについての説明を追記しました。
5.6.3.6. Conscryptモジュールについて Conscryptモジュールについての説明とAndroid 9 / Android 10における利用方法の違いについての説明を追記しました。
5.7.3.2. Android 11における生体認証の変更点 Android 11.0(API Level 30)における生体認証の変更点についての説明を追記しました。
2020年11月1日版改訂内容の一覧

Android 11では、対象範囲別ストレージや1回だけのアクセス許可など、ユーザーのプライバシーに配慮した変更が多くなされました。改訂内容一覧からもわかる通り、最新版のセキュアコーディングガイドでは、これら変更点について説明されています。

3.1.1.2. Androidスマートフォンにおける機能資産

この節ではスマートフォンにおける、機能資産に対する適切な保護について述べられています。機能資産とは、守るべき対象を「情報」と「機能」に分けて考えた場合、情報資産と対になる言葉です。以下でAndroid OSがアプリに提供する機能資産の一例をご紹介します。

  • SMSメッセージを送受する機能
  • カメラ撮影機能
  • 電話を掛ける機能
  • 音量変更機能
  • ネットワーク通信機能
  • 電話番号、携帯状態の読み取り機能

これらの機能がマルウェア等に勝手に利用されてしまうと、ユーザーのプライバシーを侵害したり意図しない課金を発生させたりすることが容易なため、機能資産として適切に保護する必要があるわけです。

JSSECのセキュリティ基準に100%準拠した
Androidアプリ脆弱性診断ツール

Secure Coding Checker®

また、機能資産にはAndroidアプリ間の連携機能も含まれます。たとえば、セキュリティアプリなどはスマートフォン内のあらゆるデータにアクセスする必要があるわけですが、このアプリが取得した内容を、適切な権限をもたない他のアプリから容易に取得できるようでは、ユーザーのプライバシーを保護することができません。

Android 11ではこのポリシーが厳密になり、アプリから他のアプリにアクセスする必要がある場合は、マニフェストファイルに明記することが必須となりました。以下に、Android 11以前と以降のマニフェストファイルの記述例を示します。

Android 11以前

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.jssec.android.activity.inhouseuser" >

Android 11以降

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.jssec.android.activity.inhouseuser" >

  <queries>
      <package android:name="org.jssec.android.activity.inhouseactivity" />
  </queries>

赤フォントの<queries>要素で、連携するアプリを明記しています。

実際、このポリシー変更のため、セキュアコーディングガイドに付属のサンプルの多くも修正が必要になりました。既存もしくは開発中のアプリをAndroid 11に対応させる際、Package Manger関連で期待した動作が得られない場合は、このポリシー変更が関係している可能性が高いため、是非、ガイドの当該節とそのサンプルコードを参照してみてください。

4.6.3.7. Android 11(API Level 30)における対象範囲別ストレージの適用について

おそらくAndroid 11における変更点のうち、もっとも大きなウェートを占めるのが、この節で述べられている対象範囲別ストレージではないでしょうか。

対象範囲別ストレージとは、公式原文では「Scoped Storage」とあり、アプリは他のアプリのデータフォルダにはアクセスできないというポリシーのことを指します。たとえば、ユーザーがカメラアプリで撮影した写真を外部ストレージに保存した場合、他のアプリからは自由にその写真データへアクセスできず、Android OSが用意した所定の権限とアクセス方法によってのみアクセスできるというものです。

ユーザーのプライバシー保護の観点に基づくポリシーであり、もともとはAndroid 10から導入されていたポリシーではありましたが、既存のアプリへの影響が大きいという理由で、ポリシー自体をオプトアウトするrequestLegacyExternalStorageマニフェスト属性が暫定的に用意されていました。

アプリデータのアクセス方法についてはネット上でも情報が混乱しているため、改めて以下にまとめます。

コンテンツの種類 アクセス手段 必要な許可 他のアプリが
アクセス可能
アプリの
アンインストール時に
削除される
アプリ固有の
ファイル

内部ストレージの場合
getFilesDir() または
getCacheDir()

外部ストレージの場合
getExternalFilesDir() または
getExternalCacheDir()

内部ストレージには不要

Android 4.4(API レベル 19)以降を搭載するデバイスでアプリを使用する場合、外部ストレージには不要

ファイルが内部ストレージ内のディレクトリにある場合、不可能

ファイルが外部ストレージ内のディレクトリにある場合、可能

削除される
メディア MediaStore API

Android 10(API レベル 29)以降で他のアプリのファイルにアクセスする場合、READ_EXTERNAL_STORAGE または WRITE_EXTERNAL_STORAGE

Android 9(API レベル 28)以前では、すべてのファイルで許可が必要

可能(ただし、他のアプリでは READ_EXTERNAL_STORAGE 権限が必要) 削除されない
ドキュメントや
ファイル
SAF(Storage Access Framework) なし 可能(システムのファイル選択ツールを使用) 削除されない
コンテンツの種類 アプリ固有の
ファイル
メディア ドキュメントや
ファイル
アクセス手段

内部ストレージの場合
getFilesDir()
または
getCacheDir()

外部ストレージの場合
getExternalFilesDir()
または
getExternalCacheDir()

MediaStore API SAF
(Storage Access
Framework)
必要な許可

内部ストレージには不要

Android 4.4
(API レベル 19)以降
を搭載するデバイスで
アプリを使用する場合、
外部ストレージには不要

Android 10
(API レベル 29)以降
で他のアプリ
のファイルに
アクセスする場合、
READ_EXTERNAL_STORAGE
または
WRITE_EXTERNAL_STORAGE

Android 9
(API レベル 28)
以前では、
すべてのファイルで
許可が必要

なし
他のアプリが
アクセス可能

ファイルが
内部ストレージ内の
ディレクトリにある場合、
不可能

ファイルが
外部ストレージ内の
ディレクトリにある場合、
可能

可能
(ただし、他のアプリでは
READ_EXTERNAL_STORAGE
権限が必要)
可能
(システムのファイル
選択ツールを使用)
アプリの
アンインストール時に
削除される
削除される 削除されない 削除されない
アプリデータのアクセス方法

Android 10まで用意されていたrequestLegacyExternalStorageマニフェスト属性は、Android 11からは無効となりました。アプリをAndroid 11に対応させるには、上の表のアクセス方法に従う必要があります。この表から、ユーザーが作成した写真や動画などはMediaStore APIで、ダウンロードディレクトリに保存される電子書籍などはSAF(Storage Access Framework)によってでのみアクセスが可能であることが読み取れます。おそらく既存の音楽プレーヤーアプリや写真加工アプリは、ユーザデータへのアクセス方法をMediaStore APIを使用するよう変更することで対応可能かと思われます。

それでは、上記のアクセス方法だけでは従前の機能を実現できないアプリはどうなるのでしょうか?

ストレージの空き容量を確保するため端末内のキャッシュをクリアする機能を備えたバックアップアプリや、あるいはウイルス対策アプリなど端末内すべてのデータにアクセスする必要があるアプリの場合です。

これらアプリのためにも、それぞれ新規のパーミッションとアクセス手段が用意されています。

該当するアプリを開発されており、ターゲットOSをAndroid 11にバージョンアップする必要がある場合は、具体的な対応方法がガイド内に記載されておりますので、是非、ガイドの当該節とそのサンプルコードを参照してみてください。

おわりに

最新版のJSSECセキュアコーディングガイド 、2020年11月1日版の改訂内容の主な変更について紹介させていただきました。Androidアプリケーションを開発されている方で、JSSECセキュアコーディングガイドをご覧になったことがない方は、ぜひ一度ご覧になってみてください。ご覧になったことがある方も、最新版で訂正された記事をご確認いただくことをお勧めします。

より詳しく知るにはこちら

JSSECのセキュリティ基準に100%準拠した
Androidアプリ脆弱性診断ツール

Secure Coding Checkerは、JSSECが定めたAndroidアプリのセキュリティ基準に準拠しており、高品質な脆弱性検査が可能です。

この記事は役に立ちましたか?

はい いいえ