Android のセキュリティ機能とサービスは継続的に改善されています。左側のナビゲーションでリリースごとに強化されている機能の一覧をご覧ください。
Android 14
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 14 では、次のようなセキュリティ機能が強化されました。
- Android 10 で導入された Hardware Assisted AddressSanitizer(HWASan)は、AddressSanitizer に似たメモリエラー検出ツールです。Android 14 では、HWASan が大幅に改善されました。Android のリリースにバグが混入するのを防ぐのに HWAddressSanitizer がどのように役立つのかをお伝えします。
- Android 14 では、システム実行時の権限ダイアログに、アプリのデータ共有方法を目立つように表示するクリック可能なセクションが追加されました。これは、まずサードパーティと位置情報を共有するアプリから導入され、アプリがサードパーティとデータを共有する理由などの情報が表示されます。
- Android 12 では、モデムレベルで 2G サポートを無効にするオプションが導入されました。これは、2G の時代遅れのセキュリティ モデルに固有であるセキュリティ リスクからユーザーを保護するものです。企業のお客様にとって 2G を無効にすることが非常に重要であることをふまえ、Android 14 では、Android Enterprise でこのセキュリティ機能を利用できるようになりました。IT 管理者は、管理対象デバイスの 2G 接続へのダウングレードを制限できます。
- NULL 暗号化されたモバイル接続を拒否するためのサポートが追加されました。回線交換の音声および SMS トラフィックが常に暗号化され、受動的な無線傍受から保護されるようになります。詳しくは、モバイル接続を強化するための Android のプログラムをご覧ください。
- 複数の IMEI に対するサポートが追加されました。
- Android 14 以降では、高速な暗号化方式に対応したデバイス用のファイル名の暗号化モードとして AES-HCTR2 が推奨されています。
- モバイル接続性
- Android のセーフティ センターにドキュメントが追加されました。
- Android 14 をターゲットとするアプリが動的コードの読み込み(DCL)を使用している場合、動的に読み込まれるファイルはすべて読み取り専用としてマークする必要があります。そうしないと、システムは例外をスローします。アプリでは可能な限り、コードを動的に読み込まないようにすることをおすすめします。コードを動的に読み込むと、コード インジェクションやコードの改ざんによってアプリが不正使用されるリスクが大幅に高まります。
AOSP リリースノートの全文と、デベロッパー向け Android 機能と変更点のリストをご覧ください。
Android 13
每个 Android 版本中都包含数十种用于保护用户的安全增强功能。以下是 Android 13 中提供的一些主要安全增强功能:
- Android 13 添加了对多文档呈现的支持。 通过这个新的 Presentation Session 接口,应用可以执行多文档呈现,而现有 API 无法做到这一点。如需了解详情,请参阅身份凭据
- 在 Android 13 中,当且仅当源自外部应用的 intent 与其声明的 intent 过滤器元素匹配时,这些 intent 才会传送到导出的组件。
- Open Mobile API (OMAPI) 是一种标准 API,用于与设备的安全元件进行通信。在 Android 13 之前,只有应用和框架模块可以访问此接口。通过将其转换为供应商稳定版接口,HAL 模块还能够通过 OMAPI 服务与安全元件进行通信。 如需了解详情,请参阅 OMAPI 供应商稳定版接口。
- 从 Android 13-QPR 开始,共享 UID 被废弃。 使用 Android 13 或更高版本的用户应在其清单中添加 `android:sharedUserMaxSdkVersion="32"` 行。此条目可防止新用户获取共享 UID。如需详细了解 UID,请参阅应用签名。
- Android 13 添加了对密钥库对称加密基元的支持,例如支持 AES(高级加密标准)、HMAC(密钥哈希消息认证码)以及非对称加密算法(包括椭圆曲线加密、RSA2048、RSA4096 和曲线 25519 加密)
- Android 13(API 级别 33)及更高版本支持用于从应用发送非豁免通知的运行时权限。这可让用户控制他们会看到哪些权限通知。
- 针对请求访问所有设备日志的应用,添加了在每次使用时显示提示的功能,以便用户允许或拒绝授予访问权限。
- 推出了 Android 虚拟化框架 (AVF),它使用标准化 API 将不同的 Hypervisor 整合到一个框架下。 它提供安全、私密的执行环境,以便执行通过 Hypervisor 隔离的工作负载。
- 引入了 APK 签名方案 v3.1 所有使用 apksigner 的新密钥轮替都将默认使用 v3.1 签名方案,以便将 Android 13 及更高版本作为轮替目标。
Android 12
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 12 では、次のようなセキュリティ機能が強化されました。
- Android 12 では、BiometricManager.Strings API が導入されています。この API は、認証に BiometricPrompt を使用しているアプリ用にローカライズされた文字列を提供します。これらの文字列はデバイスで認識するためのもので、使用できる認証の種類を具体的に示します。Android 12 では、ディスプレイ内蔵指紋認証センサーもサポートしています。
- ディスプレイ内蔵指紋認証センサーのサポートが追加されました
- 指紋認証 Android インターフェース定義言語(AIDL)が導入されました
- 新しい顔認証 AIDL のサポートが追加されました
- プラットフォーム開発用の言語として Rust が導入されました
- ユーザーのおおよその位置情報へのアクセスのみを許可するオプションが追加されました
- アプリがカメラやマイクを使用している場合、ステータスバーにプライバシー インジケータが表示されるようになりました
- Android の Private Compute Core(PCC)が実装されました
- 2G サポートを無効にするオプションが追加されました
Android 11
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 11 で利用できる強化されたセキュリティ機能の主なものについては、Android リリースノートをご覧ください。
Android 10
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 10 では、セキュリティとプライバシーが強化されています。 Android 10 の変更点の一覧については、Android 10 リリースノートをご覧ください。
セキュリティ
BoundsSanitizer
Android 10 は、Bluetooth とコーデックで BoundsSanitizer(BoundSan)をデプロイします。BoundSan は、UBSan の境界サニタイザを使用します。 この緩和は、モジュール単位で有効になります。Android の重要なコンポーネントを安全に保護するものであり、無効にすることはできません。BoundSan は、次のコーデックで有効になっています。
libFLAClibavcdeclibavcenclibhevcdeclibmpeg2libopuslibvpxlibspeexresamplerlibvorbisideclibaaclibxaac
実行専用メモリ
デフォルトでは、AArch64 システム バイナリの実行可能コード セクションは、コードの再利用による Just-In-Time 攻撃を防ぐための強化緩和策として実行専用(読み取り不可)としてマークされています。データとコードを混在させたコードおよび、意図的にこれらのセクションを検査するコード(メモリ セグメントを最初に読み取り可能として再マップしない場合も含む)は機能しなくなりました。Android 10 のターゲット SDK を使用したアプリの API レベル 29 以降は、実行専用メモリ(XOM)セクションを読み取り可能にする必要はありません。
拡張アクセス
Trust Agent は、Smart Lock などの二次的な認証メカニズムの基盤となるメカニズムであり、Android 10 でのみロック解除を拡張できます。ロックされたデバイスのロックを Trust Agent で解除することはできなくなりました。また、デバイスをロック解除状態に保てるのは最長 4 時間です。
顔認証
顔認証を使用すると、ユーザーがデバイスを正面から見るだけでロック解除が可能です。Android 10 では、カメラフレームを安全に処理できる新しい顔認証スタックのサポートが追加されており、サポート対象のハードウェアにおける顔認証時にセキュリティとプライバシーを保護します。また Android 10 では、簡単にセキュリティ要件を満たせる実装方法が用意されており、オンライン バンキングなどのサービス トランザクションでセキュリティ機能をアプリケーションに統合できます。
整数オーバーフロー サニタイズ
Android 10 では、ソフトウェア コーデックで整数オーバーフローの無害化(IntSan)が有効になりました。デバイスのハードウェアでサポートされていないコーデックに対して、再生パフォーマンスが許容可能であることを確認します。IntSan は、次のコーデックで有効になっています。
libFLAClibavcdeclibavcenclibhevcdeclibmpeg2libopuslibvpxlibspeexresamplerlibvorbisidec
モジュラー システム コンポーネント
Android 10 は、一部の Android システム コンポーネントをモジュール化しており、Android の通常のリリース サイクル以外で更新できます。モジュールには次のものがあります。
- Android ランタイム
- Conscrypt
- DNS Resolver
- DocumentsUI
- ExtServices
- メディア
- ModuleMetadata
- ネットワーキング
- PermissionController
- Time Zone Data
OEMCrypto
Android 10 は OEMCrypto API バージョン 15 を使用します。
Scudo
Scudo は、ヒープ関連の脆弱性に対する耐性を高めるために設計された、動的なユーザーモード メモリ アロケータです。標準的な C の割り当て、割り当て解除のプリミティブ、C++ のプリミティブを提供します。
ShadowCallStack
ShadowCallStack
(SCS) は LLVM インストゥルメンテーション モードです。関数の戻りアドレスを非リーフ関数の関数プロローグに別々に割り当てられた ShadowCallStack インスタンスに保存し、戻りアドレスを関数エピローグの ShadowCallStack インスタンスから読み込むことで、戻りアドレス(スタック バッファなど)に対する上書きを回避します。
WPA3 と Wi-Fi Enhanced Open
Android 10 には、Wi-Fi Protected Access 3(WPA3)と Wi-Fi Enhanced Open のセキュリティ標準に対するサポートが追加され、既知の攻撃に対するプライバシーと堅牢性が強化されました。
プライバシー
Android 9 以前をターゲットとするアプリのアクセス
Android 9(API レベル 28)以前をターゲットとしているアプリが Android 10 以降で実行されている場合、プラットフォームでは次の動作が適用されます。
- アプリが
ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATIONについて<uses-permission>要素を宣言した場合、インストール中にACCESS_BACKGROUND_LOCATIONに<uses-permission>要素が自動的に追加されます。 - アプリが
ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATIONのいずれかをリクエストした場合、そのリクエストに対してACCESS_BACKGROUND_LOCATIONが自動的に追加されます。
バックグラウンドでのアクティビティ制限
Android 10 以降、バックグラウンドからのアクティビティの起動に関する制限が設定されました。この動作変更により、ユーザーに対する割り込みを最小限に抑え、ユーザーは画面内の表示内容により集中できるようになります。ユーザー操作の直接の結果としてアプリがアクティビティを起動する場合、アプリがこの変更の影響を受けることはまずありません。
バックグラウンドからのアクティビティ起動に代わるおすすめの手段について詳しくは、タイミングが重要なイベントをユーザーに通知する方法をご覧ください。
カメラのメタデータ
Android 10 では、getCameraCharacteristics() メソッドによってデフォルトで返される情報の範囲が変更されています。特に、このメソッドの戻り値に含まれる可能性のあるデバイス固有のメタデータにアクセスするには、アプリに CAMERA 権限が必要です。
これらの変更について詳しくは、権限を必要とするカメラ フィールドに関するセクションをご覧ください。
クリップボード データ
デフォルトのインプット メソッド エディタ(IME)のアプリまたは現在フォーカスのあるアプリでない限り、Android 10 以降ではクリップボード データにアクセスできません。
デバイスの位置情報
位置情報に対するアプリのアクセス権限をユーザーが詳細に制御できるようにするため、Android 10 では ACCESS_BACKGROUND_LOCATION 権限が導入されています。
ACCESS_FINE_LOCATION 権限や ACCESS_COARSE_LOCATION 権限とは異なり、ACCESS_BACKGROUND_LOCATION 権限が位置情報へのアプリのアクセスを制御するのは、そのアプリがバックグラウンドで実行しているときのみです。以下の条件のいずれかに該当する場合を除き、アプリはバックグラウンドで位置情報にアクセスしていると見なされます。
- 対象アプリに属するアクティビティが表示されている。
- フォアグラウンド サービスのタイプ
locationを宣言したフォアグラウンド サービスをアプリが実行している。
アプリのサービスに対してフォアグラウンド サービス タイプを宣言するには、アプリのtargetSdkVersionまたはcompileSdkVersionを29以上に設定する必要があります。フォアグラウンド サービスで、位置情報へのアクセスを必要とするユーザー開始アクションを実行し続ける方法についての説明をご覧ください。
外部ストレージ
デフォルトでは、Android 10 以降をターゲットとするアプリには外部ストレージに対するスコープ アクセス、つまり対象範囲別ストレージが付与されます。このようなアプリの場合、次のファイルの種類については、ストレージ関連のユーザー権限をリクエストしなくても外部ストレージ デバイスに表示されます。
- アプリ固有のディレクトリ内にあり、
getExternalFilesDir()を使用してアクセスするファイル。 - アプリによってメディアストアから作成された写真、動画、音声クリップ。
対象範囲別ストレージについて、および外部ストレージ デバイスに保存されたファイルを共有、アクセス、変更する方法について詳しくは、外部ストレージでファイルを管理する方法、およびメディア ファイルにアクセスして変更する方法をご覧ください。
MAC アドレスのランダム化
Android 10 以降が実行されているデバイスでは、デフォルトでランダム MAC アドレスが送信されます。
エンタープライズ ユースケースを扱うアプリ向けに、プラットフォームには MAC アドレスに関連する操作を行うための API が用意されています。
- ランダムな MAC アドレスを取得する: デバイス所有者アプリとプロフィール所有者アプリは、
getRandomizedMacAddress()を呼び出すことで、特定のネットワークに割り当てられたランダムな MAC アドレスを取得できます。 - 実際の出荷時 MAC アドレスを取得する: デバイス オーナー アプリでは、
getWifiMacAddress()を呼び出すことで、デバイスの実際のハードウェア MAC アドレスを取得できます。このメソッドは、大量のデバイスをトラッキングする際に便利です。
再設定不可能なデバイス ID
Android 10 以降で IMEI とシリアル番号の両方を含む再設定不可能なデバイス ID にアクセスするには、アプリに READ_PRIVILEGED_PHONE_STATE 特権が必要です。
BuildTelephonyManager
権限を持たないアプリが再設定不可能な ID に関する情報を求めようとした場合、プラットフォームの応答はターゲット SDK のバージョンによって異なります。
- アプリが Android 10 以降を対象にしている場合、
SecurityExceptionが発生します。 - アプリが Android 9(API レベル 28)以下を対象にしている場合、アプリに
READ_PHONE_STATE権限があれば、このメソッドはnullまたはプレースホルダ データを返します。それ以外の場合は、SecurityExceptionが発生します。
操作の認識
Android 10 では、ユーザーの歩数を検出したり、徒歩、サイクリング、車の運転など、ユーザーの操作を分類したりする必要があるアプリ向けに android.permission.ACTIVITY_RECOGNITION ランタイム権限が導入されています。このアクセス権限は、デバイスのセンサーデータが [設定] 内でどのように使用されているのかをユーザーに表示するように設計されています。
Google Play 開発者サービス内のライブラリの中には、Activity Recognition API や Google Fit API など、ユーザーがアプリに対してこの権限を付与していない限り結果を提供しないものがあります。
デバイス上の組み込みセンサーのうち、この権限の宣言を求めるのは、歩数計と歩行検出のセンサーのみです。
Android 9(API レベル 28)以前をターゲットとしているアプリの場合、アプリが次の条件をすべて満たしていれば、必要に応じてシステムが android.permission.ACTIVITY_RECOGNITION 権限をアプリに自動的に付与します。
- マニフェスト ファイルには
com.google.android.gms.permission.ACTIVITY_RECOGNITION権限が含まれます。 - マニフェスト ファイルには
android.permission.ACTIVITY_RECOGNITION権限は含まれません。
システムが android.permission.ACTIVITY_RECOGNITION 権限を自動的に付与した場合、アプリが Android 10 をターゲットにするよう更新された後もアプリはこの権限を保持します。ただし、ユーザーはいつでもシステム設定でこの権限を取り消すことができます。
/proc/net ファイルシステムの制限
Android 10 以降が実行されているデバイスでは、デバイスのネットワーク状態に関する情報が格納されている /proc/net にアプリがアクセスすることはできません。VPN など、この情報にアクセスする必要のあるアプリは、NetworkStatsManager クラスや ConnectivityManager クラスを使用する必要があります。
UI から削除された権限グループ
Android 10 の時点で、UI 内で権限がどのようにグループ化されているかをアプリでは検索できません。
連絡先アフィニティの削除
Android 10 以降、プラットフォームでは連絡先アフィニティ情報を管理しません。そのため、アプリによってユーザーの連絡先に対して検索が行われても、その検索結果はインタラクションの頻度では並べ替えられません。
ContactsProvider に関するガイドには、Android 10 以降すべてのデバイスでサポートが終了したフィールドとメソッドに関する注意事項が記載されています。
画面コンテンツに対するアクセスの制限
ユーザーの画面コンテンツを保護するため、Android 10 では READ_FRAME_BUFFER、CAPTURE_VIDEO_OUTPUT、CAPTURE_SECURE_VIDEO_OUTPUT の各権限の範囲を変更することで、デバイスの画面コンテンツへのサイレント アクセスを防止します。Android 10 の時点で、これらの権限は signature アクセス専用です。
デバイスの画面コンテンツにアクセスする必要があるアプリでは、MediaProjection API を使用する必要があります。この API により、ユーザーに同意を求めるプロンプトが表示されます。
USB デバイスのシリアル番号
Android 10 以降をターゲットとしているアプリの場合、ユーザーがアプリに対して USB デバイスや USB アクセサリへのアクセス権限を付与するまで、シリアル番号を読み取ることができません。
USB デバイスの操作の詳細については、USB ホストを設定する方法をご覧ください。
Wi-Fi
Android 10 以降をターゲットとするアプリは、有効 / 無効を切り替えることができません。WifiManager.setWifiEnabled() メソッドは常に false を返します。
Wi-Fi の有効 / 無効を切り替えるようにユーザーに促す必要がある場合は、設定パネルを使用します。
設定済み Wi-Fi ネットワークへの直接アクセスに関する制限
ユーザーのプライバシーを保護するために、Wi-Fi ネットワーク リストの手動設定は、システムアプリと Device Policy Controller(DPC)のみに制限されています。特定の DPC をデバイス オーナーまたはプロファイル オーナーのいずれかに指定できます。
Android 10 以降をターゲットとしている、システムアプリでも DPC でもないアプリの場合、次のメソッドでは有用なデータが返されません。
getConfiguredNetworks()メソッドからは常に空のリストが返されます。- 整数値を返すネットワーク操作メソッド(
addNetwork()およびupdateNetwork())はいずれも常に「-1」を返します。 - ブール値を返すネットワーク操作メソッド(
removeNetwork()、reassociate()、enableNetwork()、disableNetwork()、reconnect()、disconnect())は、常に「false」を返します。
Android 9
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 9 で利用できる強化されたセキュリティ機能の主なものについては、Android リリースノートをご覧ください。
Android 8
每个 Android 版本中都包含数十种用于保护用户的安全增强功能。以下是 Android 8.0 中提供的一些主要安全增强功能:
- 加密:在工作资料中增加了对撤销密钥 (evict key) 的支持。
- 验证启动:增加了 Android 启动时验证 (AVB)。支持回滚保护(用于引导加载程序)的启动时验证代码库已添加到 AOSP 中。建议提供引导加载程序支持,以便为 HLOS 提供回滚保护。建议将引导加载程序设为只能由用户通过实际操作设备来解锁。
- 锁定屏幕:增加了对使用防篡改硬件验证锁定屏幕凭据的支持。
- KeyStore:搭载 Android 8.0 及更高版本的所有设备都需要进行密钥认证。增加了 ID 认证支持,以改进零触摸注册计划。
- 沙盒:使用 Treble 计划的框架和设备特定组件之间的标准接口更紧密地对许多组件进行沙盒化处理。将 seccomp 过滤应用到了所有不信任的应用,以减少内核的攻击面。WebView 现在运行在一个独立的进程中,对系统其余部分的访问非常有限。
- 内核加固:实现了经过安全强化的 usercopy、PAN 模拟、初始化后变为只读以及 KASLR。
- 用户空间安全强化:为媒体堆栈实现了 CFI。 应用叠加层不能再遮盖系统关键窗口,并且用户可以关闭这些叠加层。
- 操作系统流式更新:在磁盘空间不足的设备上启用了更新。
- 安装未知应用:用户必须授予权限,系统才能从不是第一方应用商店的来源安装应用。
- 隐私权:对于设备上的每个应用和使用设备的每个用户,Android ID (SSAID) 都采用不同的值。对于网络浏览器应用,Widevine 客户端 ID 会针对每个应用软件包名称和网络来源返回不同的值。
net.hostname现在为空,并且 DHCP 客户端不再发送主机名。android.os.Build.SERIAL已被替换为Build.SERIALAPI(受到用户控制权限的保护)。改进了某些芯片组中的 MAC 地址随机分配功能。
Android 7
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 7.0 では、次のようなセキュリティ機能が強化されました。
- ファイルベースの暗号化。ストレージ領域全体を 1 単位として暗号化するのではなく、ファイルレベルで暗号化することで、デバイス上の個々のユーザーとプロファイル(個人用や仕事用など)を適切に切り離して保護できます。
- ダイレクト ブート。ファイルベースの暗号化によって有効化されるダイレクト ブートでは、ロック解除されていなくてもデバイスの電源が入っていれば、アラームやユーザー補助機能などの特定のアプリを実行できます。
- 確認付きブート。不正侵入されたデバイスが起動されないように、確認付きブートが厳格に適用されるようになりました。エラー修正がサポートされ、悪意のないデータの破損に対する信頼性が向上しています。
- SELinux。SELinux 構成が更新され、seccomp の適用範囲が拡大したことで、アプリ サンドボックスをさらにロックして攻撃対象領域を減らします。
- ライブラリのロード順序のランダム化と ASLR の改善。ランダム性を上げることで、コード再利用攻撃の精度が低下します。
- カーネルの強化。カーネルメモリの一部を読み取り専用にしてユーザー空間アドレスへのカーネル アクセスを制限し、既存の攻撃対象領域をさらに減らすことで、新しいカーネルのメモリ保護を強化しました。
- APK 署名スキーム v2。検証速度を改善して整合性に関する保証を強化するファイル全体の署名スキームが導入されました。
- 信頼できる CA ストア。アプリが安全なネットワーク トラフィックへのアクセスを制御しやすくするために、ユーザーがインストールした認証局とデバイス管理 API 経由でインストールされた認証局は、API レベル 24 以降をターゲットとするアプリではデフォルトで信頼されなくなりました。また、すべての新しい Android デバイスに、信頼できる同一の CA ストアが付属している必要があります。
- ネットワーク セキュリティ構成。宣言型構成ファイルを使用して、ネットワーク セキュリティと TLS を構成します。
Android 6
每个 Android 版本中都包含数十种用于保护用户的安全增强功能。以下是 Android 6.0 中提供的一些主要安全增强功能:
- 运行时权限:应用在运行时请求权限,而不是在安装时被授予权限。用户可以为 M 及更低版本的 Android 应用启用和停用权限。
- 验证启动:在执行系统软件之前,先对其进行一系列加密检查,以确保手机从引导加载程序到操作系统均处于正常状况。
- 硬件隔离安全措施:新的硬件抽象层 (HAL),Fingerprint API、锁定屏幕、设备加密功能和客户端证书可以利用它来保护密钥免遭内核入侵和/或现场攻击。
- 指纹:现在,只需触摸一下,即可解锁设备。开发者还可以借助新的 API 来使用指纹锁定和解锁加密密钥。
- 加装 SD 卡:可将移动媒体设备加装到设备上,以便扩展可用存储空间来存放本地应用数据、照片、视频等内容,但仍受块级加密保护。
- 明文流量:开发者可以使用新的 StrictMode 来确保其应用不会使用明文。
- 系统加固:通过由 SELinux 强制执行的政策对系统进行加固。这可以实现更好的用户隔离和 IOCTL 过滤、降低可从设备/系统之外访问的服务面临的威胁、进一步强化 SELinux 域,以及高度限制对 /proc 的访问。
- USB 访问控制:必须由用户确认是否允许通过 USB 访问手机上的文件、存储空间或其他功能。现在,默认设置是“仅充电”,如果要访问存储空间,必须获得用户的明确许可。
Android 5
5.0
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 5.0 では、次のようなセキュリティ機能が強化されました。
- デフォルトで暗号化。最初から L が搭載されたデバイスでは、フルディスク暗号化がデフォルトで有効になっているため、紛失したり盗まれたりしたデバイスのデータの保護が改善されています。L に更新したデバイスは、[設定] > [セキュリティ] で暗号化できます。
- フルディスク暗号化の改善。ユーザー パスワードは
scryptを使用してブルートフォース攻撃から保護されます。さらに可能な場合は、鍵がハードウェア キーストアにバインドされてデバイス外攻撃から保護されます。これまでと同様に、Android の画面ロック シークレットとデバイスの暗号鍵がデバイスから送信されたり、アプリに公開されたりすることはありません。 - SELinux による Android サンドボックスの強化。Android では、すべてのドメインで enforcing モードの SELinux が必要になりました。SELinux は、既存の任意アクセス制御(DAC)セキュリティ モデルを強化するために使用される、Linux カーネルの強制アクセス制御(MAC)システムです。この新しいレイヤは、潜在的なセキュリティの脆弱性に対する保護を強化します。
- Smart Lock。デバイスのロック解除に柔軟性を提供する Trustlet が Android に追加されました。Trustlet を使用すると、たとえば NFC や Bluetooth などを介して信頼できる別のデバイスが検出された場合や、認識済みの顔のユーザーによって使用された場合に、自動的にデバイスのロックを解除できます。
- スマートフォンとタブレットのマルチユーザー、制限付きプロファイル、ゲストモード。Android では、複数のユーザーがスマートフォンを利用できるようになり、データとアプリへのアクセス権を付与しなくてもデバイスに一時的にアクセスできるゲストモードも追加されました。
- OTA を使用しない WebView のアップデート。WebView は、フレームワークから独立して、システム OTA を使用せずに更新できるようになりました。WebView の潜在的なセキュリティの問題にすばやく対応できます。
- HTTPS と TLS / SSL の暗号の更新。TLSv1.2 と TLSv1.1 が有効になって前方秘匿性が優先され、AES-GCM が有効になり、脆弱な暗号スイート(MD5、3DES、エクスポート暗号化スイート)が無効になりました。詳しくは、https://developer.android.com/reference/javax/net/ssl/SSLSocket.html をご覧ください。
- 非 PIE リンカーのサポートの削除。Android では、PIE(位置独立実行形式)をサポートする動的にリンクされたすべての実行ファイルが必要になりました。これにより、Android のアドレス空間配置のランダム化(ASLR)実装が強化されます。
- FORTIFY_SOURCE の改善。
stpcpy()、stpncpy()、read()、recvfrom()、FD_CLR()、FD_SET()、FD_ISSET()の libc 関数で FORTIFY_SOURCE 保護が実装されました。これにより、これらの関数に関連するメモリ破損の脆弱性に対処できます。 - セキュリティに関する修正。Android 5.0 では、Android 固有の脆弱性に対する修正も行われています。これらの脆弱性に関する情報は、オープン ハンドセット アライアンスのメンバーに提供されています。修正プログラムは Android オープンソース プロジェクトで入手できます。また、Android の以前のバージョンがインストールされている一部のデバイスでも、セキュリティ強化のために修正プログラムが適用されている場合があります。
Android 4 以前
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 4.4 では、次のようなセキュリティ機能が強化されました。
- SELinux による Android サンドボックスの強化。Android で、enforcing モードの SELinux が使用されるようになりました。SELinux は、既存の任意アクセス制御(DAC)ベースのセキュリティ モデルを強化するために使用される、Linux カーネルの強制アクセス制御(MAC)システムです。これにより、潜在的なセキュリティの脆弱性に対する保護が強化されます。
- ユーザー別 VPN。マルチユーザー デバイスで、VPN がユーザーごとに適用されるようになりました。これにより、デバイスの他のユーザーに影響を与えることなく、VPN 経由ですべてのネットワーク トラフィックをルーティングできます。
- AndroidKeyStore での ECDSA プロバイダのサポート。ECDSA アルゴリズムと DSA アルゴリズムを使用できるキーストア プロバイダが Android に追加されました。
- デバイス モニタリングに関する警告。Android で、暗号化されたネットワーク トラフィックのモニタリングが可能なデバイス証明書ストアに証明書が追加された場合に警告が表示されます。
- FORTIFY_SOURCE。Android で FORTIFY_SOURCE レベル 2 がサポートされるようになったため、コードはすべてこれらの保護機能でコンパイルされます。FORTIFY_SOURCE は clang で動作するように拡張されました。
- 証明書の固定。Android 4.4 は、セキュア SSL/TLS 通信での不正な Google 証明書の使用を検出して阻止します。
- セキュリティに関する修正。Android 4.4 では、Android 固有の脆弱性に対する修正も行われています。これらの脆弱性に関する情報は、オープン ハンドセット アライアンスのメンバーに提供されています。修正プログラムは Android オープンソース プロジェクトで入手できます。また、Android の以前のバージョンがインストールされている一部のデバイスでも、セキュリティ強化のために修正プログラムが適用されている場合があります。
Android のすべてのリリースで、ユーザーを保護するためにさまざまなセキュリティ機能が強化されています。Android 4.3 では、次のようなセキュリティ機能が強化されました。
- SELinux による Android サンドボックスの強化。このリリースでは、Linux カーネルの SELinux 強制アクセス制御(MAC)システムを使用して Android サンドボックスが強化されています。SELinux の強化はユーザーとデベロッパーに認識されることなく、既存のアプリとの互換性を維持しながら、既存の Android セキュリティ モデルに堅牢性を追加します。互換性を確保するため、このリリースでは SELinux の permissive モードでの使用が可能です。このモードではポリシー違反がログに記録されますが、アプリが停止したりシステムの動作に影響したりすることはありません。
setuidまたはsetgidプログラムの削除。Android システム ファイルにファイル システム機能のサポートを追加して、すべてのsetuidまたはsetgidプログラムを削除しました。これにより、root の攻撃対象領域が減少し、潜在的なセキュリティの脆弱性が生じる可能性が低くなります。- ADB 認証。Android 4.2.2 以降では、ADB への接続は RSA 鍵ペアで認証されます。これにより、攻撃者がデバイスに物理的にアクセスできる ADB の不正使用が防止できます。
- Android アプリによる setuid の制限。zygote が生成したプロセスで使用する nosuid が
/systemパーティションにマウントされたことで、Android アプリでsetuidプログラムを実行できなくなりました。これにより、root の攻撃対象領域が減少し、潜在的なセキュリティの脆弱性が生じる可能性が低くなります。 - 権限の制限。Android zygote と ADB で、アプリの実行前に
prctl(PR_CAPBSET_DROP)を使用して不要な権限が削除されるようになりました。これにより、Android アプリとシェルからリリースされたアプリは特権を取得できなくなります。 - AndroidKeyStore プロバイダ。アプリで専用キーを作成できるキーストア プロバイダが Android に追加されました。これにより、他のアプリで使用できない秘密鍵を作成または保存するための API がアプリに提供されます。
- キーチェーン
isBoundKeyAlgorithm。 Keychain API で、システム全体で使用する鍵がデバイスのハードウェア ルート オブ トラストにバインドされていることをアプリが確認できるメソッド(isBoundKeyType)が提供されるようになりました。これにより、root が不正使用されてもデバイスからエクスポートできない秘密鍵を作成または保存できます。 NO_NEW_PRIVS。Android zygote は、prctl(PR_SET_NO_NEW_PRIVS)を使用して、アプリコード実行前の新しい権限の追加をブロックするようになりました。これにより、Android アプリは execve を介して権限を昇格する操作を実行できなくなります(Linux カーネルのバージョン 3.5 以上が必要です)。FORTIFY_SOURCE機能強化。Android x86 と MIPS でFORTIFY_SOURCEが有効化され、strchr()、strrchr()、strlen()、umask()の呼び出しが強化されました。これにより、潜在的なメモリ破損の脆弱性や終端文字のない文字列定数を検出できます。- 再配置の保護。静的にリンクされた実行可能ファイルの読み取り専用再配置(relro)が有効化され、Android コード内のテキストの再配置がすべて削除されました。これにより、潜在的なメモリ破損の脆弱性に対する多重防御が実現します。
- EntropyMixer の改善。EntropyMixer で、定期的なミキシングに加えて、シャットダウンまたは再起動時にエントロピーが書き込まれるようになりました。これにより、デバイスの電源投入時に生成されるすべてのエントロピーを保持できるため、プロビジョニング後すぐに再起動するデバイスで特に役立ちます。
- セキュリティに関する修正。Android 4.3 では、Android 固有の脆弱性に対する修正も行われています。これらの脆弱性に関する情報は、オープン ハンドセット アライアンスのメンバーに提供されています。修正プログラムは Android オープンソース プロジェクトで入手できます。また、Android の以前のバージョンがインストールされている一部のデバイスでも、セキュリティ強化のために修正プログラムが適用されている場合があります。
Android は、Android のセキュリティの概要に記載されているマルチレイヤ セキュリティ モデルを提供しています。Android の各アップデートでは、ユーザーを保護するために多くのセキュリティ機能が強化されます。Android 4.2 では、次のようなセキュリティ機能が強化されました。
- アプリの確認: ユーザーはアプリの確認を有効にし、アプリの検証ツールによってインストールの前にアプリをスクリーニングすることができます。害を及ぼす可能性があるアプリをユーザーがインストールしようとすると、アプリの確認がユーザーに警告することがあります。特に有害なアプリの場合、インストールをブロックすることもあります。
- プレミアム SMS の詳細な管理: 追加料金が発生する可能性があるプレミアム サービスを使用しているショートコードにアプリが SMS を送信しようとすると、Android によって通知が表示されます。ユーザーは、アプリによるメッセージの送信を許可するかブロックするかを選択できます。
- 常時接続 VPN: VPN 接続が確立されるまでアプリがネットワークにアクセスできないように VPN を構成できます。これにより、アプリが他のネットワークを経由してデータを送信することができなくなります。
- 証明書のピン留め: Android コアライブラリで証明書のピン留めがサポートされるようになりました。ピン留めされたドメインは、証明書が一連の想定される証明書にチェーンされていない場合、証明書の検証失敗を受け取ります。これにより、認証局のセキュリティ侵害を防ぐことができます。
- Android 権限の表示の改善: 権限は、ユーザーが簡単に理解できるグループに分類されています。ユーザーは権限について確認する際に、権限をクリックすれば詳細情報を確認できます。
- installd の強化:
installdデーモンは root ユーザーとして実行されないため、ルート権限昇格に対する潜在的な攻撃対象領域が狭まります。 - init スクリプトの強化: init スクリプトによって
O_NOFOLLOWセマンティクスが適用され、シンボリック リンク関連の攻撃を防ぐことができるようになりました。 FORTIFY_SOURCE: Android でFORTIFY_SOURCEが実装されるようになりました。これは、メモリ破損を防ぐためにシステム ライブラリとアプリで使用されます。- ContentProvider のデフォルト構成: 対象 API レベル 17 のアプリでは、デフォルトでコンテンツ プロバイダごとに
exportをfalseに設定します。これにより、アプリのデフォルトの攻撃対象領域が縮小します。 - 暗号: OpenSSL を使用するように、SecureRandom と Cipher.RSA のデフォルトの実装が変更されました。また、OpenSSL 1.0.1 を使用した TLSv1.1 と TLSv1.2 に対する SSLSocket のサポートが追加されました。
- セキュリティに関する修正: セキュリティに関する修正によってアップグレードされたオープンソース ライブラリには、WebKit、libpng、OpenSSL、LibXML が含まれています。Android 4.2 では、Android 固有の脆弱性に対する修正も行われています。これらの脆弱性に関する情報は、オープン ハンドセット アライアンスのメンバーに提供されています。修正プログラムは Android オープンソース プロジェクトで入手できます。また、Android の以前のバージョンがインストールされている一部のデバイスでも、セキュリティ強化のために修正プログラムが適用されている場合があります。
Android では、Android のセキュリティの概要に記載の多層的なセキュリティ モデルを提供しています。Android の各アップデートでは、ユーザーを保護するために多くのセキュリティ機能が強化されます。Android 1.5~4.1 では、次のようなセキュリティ機能が強化されました。
- Android 1.5
- スタック バッファ オーバーランを防ぐ ProPolice(-fstack-protector)
- 整数オーバーフローを削減する safe_iop
- double free() の脆弱性を防止し、チャンク統合攻撃を阻止する OpenBSD dlmalloc の拡張。チャンク統合攻撃は、ヒープの破損を悪用する一般的な方法です。
- メモリ割り当て時の整数オーバーフローを防止する OpenBSD calloc
- Android 2.3
- 書式文字列の脆弱性に対する保護機能(-Wformat-security -Werror=format-security)
- スタックとヒープでコードが実行されないようにするハードウェアベースの No eXecute(NX)
- null ポインタ逆参照の権限昇格を軽減する Linux の mmap_min_addr(Android 4.1 でさらに強化)
- Android 4.0
- メモリ内の鍵の場所をランダム化するアドレス空間配置のランダム化(ASLR)
- Android 4.1
- PIE(位置独立実行形式)のサポート
- 読み取り専用再配置と即時バインディング(-Wl、-z、relro -Wl、-z、now)
- dmesg_restrict の有効化(カーネル アドレスの漏洩の回避)
- kptr_restrict の有効化(カーネル アドレスの漏洩の回避)