| page.title=Application security | |
| @jd:body | |
| <!-- | |
| Copyright 2014 The Android Open Source Project | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| <div id="qv-wrapper"> | |
| <div id="qv"> | |
| <h2>In this document</h2> | |
| <ol id="auto-toc"></ol> | |
| </div> | |
| </div> | |
| <h2 id="elements-of-applications">Elements of Applications</h2> | |
| <p>Android provides an open source platform and application environment for mobile | |
| devices. The core operating system is based on the Linux kernel. Android | |
| applications are most often written in the Java programming language and run in | |
| the Dalvik virtual machine. However, applications can also be written in native | |
| code. Applications are installed from a single file with the .apk file | |
| extension.</p> | |
| <p>The main Android application building blocks are:</p> | |
| <ul> | |
| <li> | |
| <p><strong>AndroidManifest.xml</strong>: The <a href="https://developer.android.com/guide/topics/manifest/manifes | |
| t-intro.html">AndroidManifest.xml</a> file is the control file that tells the system what to do with | |
| all the top-level components (specifically activities, services, broadcast | |
| receivers, and content providers described below) in an application. This also | |
| specifies which permissions are required.</p> | |
| </li> | |
| <li> | |
| <p><strong>Activities</strong>: An <a href="https://developer.android.com/guide/topics/fundamentals/activities.htm | |
| l">Activity</a> is, generally, the code for a single, user-focused task. It usually | |
| includes displaying a UI to the user, but it does not have to -- some | |
| Activities never display UIs. Typically, one of the application's Activities | |
| is the entry point to an application.</p> | |
| </li> | |
| <li> | |
| <p><strong>Services</strong>: A <a href="https://developer.android.com/guide/topics/fundamentals/services.html">Service</a> is a body of code that runs in the background. It can run in its own process, | |
| or in the context of another application's process. Other components "bind" to | |
| a Service and invoke methods on it via remote procedure calls. An example of a | |
| Service is a media player: even when the user quits the media-selection UI, the | |
| user probably still intends for music to keep playing. A Service keeps the | |
| music going even when the UI has completed.</p> | |
| </li> | |
| <li> | |
| <p><strong>Broadcast Receiver</strong>: A <a href="https://developer.android.com/reference/android/content/Broad | |
| castReceiver.html">BroadcastReceiver</a> is an object that is instantiated when an IPC mechanism | |
| known as an <a href="https://developer.android.com/reference/android/content/Intent.html">Intent</a> is issued by the operating system or another application. An application may | |
| register a receiver for the low battery message, for example, and change its | |
| behavior based on that information.</p> | |
| </li> | |
| </ul> | |
| <h2 id="the-android-permission-model-accessing-protected-apis">The Android Permission Model: Accessing Protected APIs</h2> | |
| <p>All applications on Android run in an Application Sandbox, described earlier in this document. | |
| By default, an Android application can only access a limited range of system | |
| resources. The system manages Android application access to resources that, if | |
| used incorrectly or maliciously, could adversely impact the user experience, | |
| the network, or data on the device.</p> | |
| <p>These restrictions are implemented in a variety of different forms. Some | |
| capabilities are restricted by an intentional lack of APIs to the sensitive | |
| functionality (e.g. there is no Android API for directly manipulating the SIM | |
| card). In some instances, separation of roles provides a security measure, as | |
| with the per-application isolation of storage. In other instances, the | |
| sensitive APIs are intended for use by trusted applications and protected | |
| through a security mechanism known as Permissions.</p> | |
| <p>These protected APIs include:</p> | |
| <ul> | |
| <li>Camera functions</li> | |
| <li>Location data (GPS)</li> | |
| <li>Bluetooth functions</li> | |
| <li>Telephony functions</li> | |
| <li>SMS/MMS functions</li> | |
| <li>Network/data connections</li> | |
| </ul> | |
| <p>These resources are only accessible through the operating system. To make use | |
| of the protected APIs on the device, an application must define the | |
| capabilities it needs in its manifest. When preparing to install an | |
| application, the system displays a dialog to the user that indicates the | |
| permissions requested and asks whether to continue the installation. If the | |
| user continues with the installation, the system accepts that the user has | |
| granted all of the requested permissions. The user can not grant or deny | |
| individual permissions -- the user must grant or deny all of the requested | |
| permissions as a block.</p> | |
| <p>Once granted, the permissions are applied to the application as long as it is | |
| installed. To avoid user confusion, the system does not notify the user again | |
| of the permissions granted to the application, and applications that are | |
| included in the core operating system or bundled by an OEM do not request | |
| permissions from the user. Permissions are removed if an application is | |
| uninstalled, so a subsequent re-installation will again result in display of | |
| permissions.</p> | |
| <p>Within the device settings, users are able to view permissions for applications | |
| they have previously installed. Users can also turn off some functionality | |
| globally when they choose, such as disabling GPS, radio, or wi-fi.</p> | |
| <p>In the event that an application attempts to use a protected feature which has | |
| not been declared in the application's manifest, the permission failure will | |
| typically result in a security exception being thrown back to the application. | |
| Protected API permission checks are enforced at the lowest possible level to | |
| prevent circumvention. An example of the user messaging when an application is | |
| installed while requesting access to protected APIs is shown in <em>Figure 2</em>.</p> | |
| <p>The system default permissions are described at <a href="https://developer.android.com/reference/android/Manifest.permission.html">https://developer.android.com/reference/android/Manifest.permission.html</a>. | |
| Applications may declare their own permissions for other applications to use. | |
| Such permissions are not listed in the above location.</p> | |
| <p>When defining a permission a protectionLevel attribute tells the system how the | |
| user is to be informed of applications requiring the permission, or who is | |
| allowed to hold a permission. Details on creating and using application | |
| specific permissions are described at <a href="https://develo | |
| per.android.com/guide/topics/security/security.html">https://developer.android.com/guide/topics/security/security.html</a>.</p> | |
| <p>There are some device capabilities, such as the ability to send SMS broadcast | |
| intents, that are not available to third-party applications, but that may be | |
| used by applications pre-installed by the OEM. These permissions use the | |
| signatureOrSystem permission.</p> | |
| <h2 id="how-users-understand-third-party-applications">How Users Understand Third-Party Applications</h2> | |
| <p>Android strives to make it clear to users when they are interacting with | |
| third-party applications and inform the user of the capabilities those | |
| applications have. Prior to installation of any application, the user is shown | |
| a clear message about the different permissions the application is requesting. | |
| After install, the user is not prompted again to confirm any permissions.</p> | |
| <p>There are many reasons to show permissions immediately prior to installation | |
| time. This is when user is actively reviewing information about the | |
| application, developer, and functionality to determine whether it matches their | |
| needs and expectations. It is also important that they have not yet | |
| established a mental or financial commitment to the app, and can easily compare | |
| the application to other alternative applications.</p> | |
| <p>Some other platforms use a different approach to user notification, requesting | |
| permission at the start of each session or while applications are in use. The | |
| vision of Android is to have users switching seamlessly between applications at | |
| will. Providing confirmations each time would slow down the user and prevent | |
| Android from delivering a great user experience. Having the user review | |
| permissions at install time gives the user the option to not install the | |
| application if they feel uncomfortable.</p> | |
| <p>Also, many user interface studies have shown that over-prompting the user | |
| causes the user to start saying "OK" to any dialog that is shown. One of | |
| Android's security goals is to effectively convey important security | |
| information to the user, which cannot be done using dialogs that the user will | |
| be trained to ignore. By presenting the important information once, and only | |
| when it is important, the user is more likely to think about what they are | |
| agreeing to.</p> | |
| <p>Some platforms choose not to show any information at all about application | |
| functionality. That approach prevents users from easily understanding and | |
| discussing application capabilities. While it is not possible for all users to | |
| always make fully informed decisions, the Android permissions model makes | |
| information about applications easily accessible to a wide range of users. For | |
| example, unexpected permissions requests can prompt more sophisticated users to | |
| ask critical questions about application functionality and share their concerns | |
| in places such as <a href="htts://play.google.com">Google Play</a> where they | |
| are visible to all users.</p> | |
| <table> | |
| <tr> | |
| <td><strong>Permissions at Application Install -- Google Maps</strong></td> | |
| <td><strong>Permissions of an Installed Application -- Gmail</strong></td> | |
| </tr> | |
| <tr> | |
| <td><img alt="Permissions at Application Install -- Google Maps" width=250 | |
| src="../images/image_install.png" /></td> | |
| <td><img alt="Permissions of an Installed Application -- Gmail" width=250 | |
| src="../images/image_gmail_installed.png" id="figure1" /></td> | |
| </tr> | |
| </table> | |
| <p class="img-caption"> | |
| <strong>Figure 1.</strong> Display of permissions for applications | |
| </p> | |
| <h2 id="interprocess-communication">Interprocess Communication</h2> | |
| <p>Processes can communicate using any of the traditional UNIX-type mechanisms. | |
| Examples include the filesystem, local sockets, or signals. However, the Linux | |
| permissions still apply.</p> | |
| <p>Android also provides new IPC mechanisms:</p> | |
| <ul> | |
| <li> | |
| <p><strong>Binder</strong>: A lightweight capability-based remote procedure call mechanism | |
| designed for high performance when performing in-process and cross-process | |
| calls. Binder is implemented using a custom Linux driver. See <a href="https://developer | |
| .android.com/reference/android/os/Binder.html">https://developer.android.com/reference/android/os/Binder.html</a>.</p> | |
| </li> | |
| <li> | |
| <p><strong>Services</strong>: Services (discussed above) can provide interfaces directly | |
| accessible using binder.</p> | |
| </li> | |
| <li> | |
| <p><strong>Intents</strong>: An Intent is a simple message object that represents an | |
| "intention" to do something. For example, if your application wants to display | |
| a web page, it expresses its "Intent" to view the URL by creating an Intent | |
| instance and handing it off to the system. The system locates some other piece | |
| of code (in this case, the Browser) that knows how to handle that Intent, and | |
| runs it. Intents can also be used to broadcast interesting events (such as a | |
| notification) system-wide. See | |
| [https://developer.android.com/reference/android/content/Intent.html](https://developer.android.com/reference/android/content/Intent.html.</p> | |
| </li> | |
| <li> | |
| <p><strong>ContentProviders</strong>: A ContentProvider is a data storehouse that provides | |
| access to data on the device; the classic example is the ContentProvider that | |
| is used to access the user's list of contacts. An application can access data | |
| that other applications have exposed via a ContentProvider, and an application | |
| can also define its own ContentProviders to expose data of its own. See <a href="https://developer.android.com/reference/android/content/ContentProvider.html">https://developer.android.com/reference/android/content/ContentProvider.html</a>.</p> | |
| </li> | |
| </ul> | |
| <p>While it is possible to implement IPC using other mechanisms such as network | |
| sockets or world-writable files, these are the recommended Android IPC | |
| frameworks. Android developers will be encouraged to use best practices around | |
| securing users' data and avoiding the introduction of security vulnerabilities.</p> | |
| <h2 id="cost-sensitive-apis">Cost-Sensitive APIs</h2> | |
| <p>A cost sensitive API is any function that might generate a cost for the user or | |
| the network. The Android platform has placed cost sensitive APIs in the list of | |
| protected APIs controlled by the OS. The user will have to grant explicit | |
| permission to third-party applications requesting use of cost sensitive APIs. | |
| These APIs include:</p> | |
| <ul> | |
| <li>Telephony</li> | |
| <li>SMS/MMS</li> | |
| <li>Network/Data</li> | |
| <li>In-App Billing</li> | |
| <li>NFC Access</li> | |
| </ul> | |
| <p> Android 4.2 adds further control on the use of SMS. Android will provide a | |
| notification if an application attempts to send SMS to a short code that uses | |
| premium services which might cause additional charges. The user can choose | |
| whether to allow the application to send the message or block it. </p> | |
| <h2 id="sim-card-access">SIM Card Access</h2> | |
| <p>Low level access to the SIM card is not available to third-party apps. The OS | |
| handles all communications with the SIM card including access to personal | |
| information (contacts) on the SIM card memory. Applications also cannot access | |
| AT commands, as these are managed exclusively by the Radio Interface Layer | |
| (RIL). The RIL provides no high level APIs for these commands.</p> | |
| <h2 id="personal-information">Personal Information</h2> | |
| <p>Android has placed APIs that provide access to user data into the set of | |
| protected APIs. With normal usage, Android devices will also accumulate user | |
| data within third-party applications installed by users. Applications that | |
| choose to share this information can use Android OS permission checks to | |
| protect the data from third-party applications.</p> | |
| <img alt="Access to sensitive user data available only through protected | |
| APIs" src="../images/image03.png" id="figure2" /> | |
| <p class="img-caption"> | |
| <strong>Figure 2.</strong> Access to sensitive user data is available only through protected APIs | |
| </p> | |
| <p>System content providers that are likely to contain personal or personally | |
| identifiable information such as contacts and calendar have been created with | |
| clearly identified permissions. This granularity provides the user with clear | |
| indication of the types of information that may be provided to the application. | |
| During installation, a third-party application may request permission to | |
| access these resources. If permission is granted, the application can be | |
| installed and will have access to the data requested at any time when it is | |
| installed.</p> | |
| <p>Any applications which collect personal information will, by default, have that | |
| data restricted only to the specific application. If an application chooses to | |
| make the data available to other applications though IPC, the application | |
| granting access can apply permissions to the IPC mechanism that are enforced by | |
| the operating system.</p> | |
| <h2 id="sensitive-data-input-devices">Sensitive Data Input Devices</h2> | |
| <p>Android devices frequently provide sensitive data input devices that allow | |
| applications to interact with the surrounding environment, such as camera, | |
| microphone or GPS. For a third-party application to access these devices, it | |
| must first be explicitly provided access by the user through the use of Android | |
| OS Permissions. Upon installation, the installer will prompt the user | |
| requesting permission to the sensor by name.</p> | |
| <p>If an application wants to know the user's location, the application requires a | |
| permission to access the user's location. Upon installation, the installer will | |
| prompt the user asking if the application can access the user's location. At | |
| any time, if the user does not want any application to access their location, | |
| then the user can run the "Settings" application, go to "Location & Security", | |
| and uncheck the "Use wireless networks" and "Enable GPS satellites". This will | |
| disable location based services for all applications on the user's device.</p> | |
| <h2 id="device-metadata">Device Metadata</h2> | |
| <p>Android also strives to restrict access to data that is not intrinsically | |
| sensitive, but may indirectly reveal characteristics about the user, user | |
| preferences, and the manner in which they use a device.</p> | |
| <p>By default applications do not have access to operating system logs, | |
| browser history, phone number, or hardware / network identification | |
| information. If an application requests access to this information at install | |
| time, the installer will prompt the user asking if the application can access | |
| the information. If the user does not grant access, the application will not be | |
| installed.</p> | |
| <h2 id="application-signing">Application Signing</h2> | |
| <p>Code signing allows developers to identify the author of the application and to | |
| update their application without creating complicated interfaces and | |
| permissions. Every application that is run on the Android platform must be | |
| signed by the developer. Applications that attempt to install without being | |
| signed will rejected by either Google Play or the package installer on | |
| the Android device.</p> | |
| <p>On Google Play, application signing bridges the trust Google has with the | |
| developer and the trust the developer has with their application. Developers | |
| know their application is provided, unmodified to the Android device; and | |
| developers can be held accountable for behavior of their application.</p> | |
| <p>On Android, application signing is the first step to placing an application in | |
| its Application Sandbox. The signed application certificate defines which user | |
| id is associated with which application; different applications run under | |
| different user IDs. Application signing ensures that one application cannot | |
| access any other application except through well-defined IPC.</p> | |
| <p>When an application (APK file) is installed onto an Android device, the Package | |
| Manager verifies that the APK has been properly signed with the certificate | |
| included in that APK. If the certificate (or, more accurately, the public key | |
| in the certificate) matches the key used to sign any other APK on the device, | |
| the new APK has the option to specify in the manifest that it will share a UID | |
| with the other similarly-signed APKs.</p> | |
| <p>Applications can be signed by a third-party (OEM, operator, alternative market) | |
| or self-signed. Android provides code signing using self-signed certificates | |
| that developers can generate without external assistance or permission. | |
| Applications do not have to be signed by a central authority. Android currently | |
| does not perform CA verification for application certificates.</p> | |
| <p>Applications are also able to declare security permissions at the Signature | |
| protection level, restricting access only to applications signed with the same | |
| key while maintaining distinct UIDs and Application Sandboxes. A closer | |
| relationship with a shared Application Sandbox is allowed via the <a href="https://developer.android.com/guide/topics/manifest/manifest-element.html#uid">shared UID | |
| feature</a> where two or more applications signed with same developer key can | |
| declare a shared UID in their manifest.</p> | |
| <h2 id="app-verification">Application Verification</h2> | |
| <p> Android 4.2 and later support application verification. Users can choose to | |
| enable “Verify Apps" and have applications evaluated by an application verifier | |
| prior to installation. App verification can alert the user if they try to | |
| install an app that might be harmful; if an application is especially bad, it | |
| can block installation. </p> | |
| <h2 id="digital-rights-management">Digital Rights Management</h2> | |
| <p>The Android platform provides an extensible DRM framework that lets | |
| applications manage rights-protected content according to the license | |
| constraints that are associated with the content. The DRM framework supports | |
| many DRM schemes; which DRM schemes a device supports is left to the device | |
| manufacturer.</p> | |
| <p>The <a href="https://developer.android.com/reference/android/drm/package-summary.html">Android DRM | |
| framework</a> is implemented in two architectural layers (see figure below):</p> | |
| <ul> | |
| <li> | |
| <p>A DRM framework API, which is exposed to applications through the Android | |
| application framework and runs through the Dalvik VM for standard applications.</p> | |
| </li> | |
| <li> | |
| <p>A native code DRM manager, which implements the DRM framework and exposes an | |
| interface for DRM plug-ins (agents) to handle rights management and decryption | |
| for various DRM schemes</p> | |
| </li> | |
| </ul> | |
| <p><img alt="Architecture of Digital Rights Management on Android | |
| platform" src="../images/image02.png" id="figure3" /></p> | |
| <p class="img-caption"> | |
| <strong>Figure 3.</strong> Architecture of Digital Rights Management on Android platform | |
| </p> |