| page.title=System and kernel 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> | |
| <p>At the operating system level, the Android platform provides the security of | |
| the Linux kernel, as well as a secure inter-process communication (IPC) | |
| facility to enable secure communication between applications running in | |
| different processes. These security features at the OS level ensure that even | |
| native code is constrained by the Application Sandbox. Whether that code is | |
| the result of included application behavior or a exploitation of an application | |
| vulnerability, the system would prevent the rogue application from harming | |
| other applications, the Android system, or the device itself.</p> | |
| <h3 id="linux-security">Linux Security</h3> | |
| <p>The foundation of the Android platform is the Linux kernel. The Linux kernel | |
| itself has been in widespread use for years, and is used in millions of | |
| security-sensitive environments. Through its history of constantly being | |
| researched, attacked, and fixed by thousands of developers, Linux has become a | |
| stable and secure kernel trusted by many corporations and security | |
| professionals.</p> | |
| <p>As the base for a mobile computing environment, the Linux kernel provides | |
| Android with several key security features, including:</p> | |
| <ul> | |
| <li>A user-based permissions model</li> | |
| <li>Process isolation</li> | |
| <li>Extensible mechanism for secure IPC</li> | |
| <li>The ability to remove unnecessary and potentially insecure parts of the kernel</li> | |
| </ul> | |
| <p>As a multiuser operating system, a fundamental security objective of the Linux | |
| kernel is to isolate user resources from one another. The Linux security | |
| philosophy is to protect user resources from one another. Thus, Linux:</p> | |
| <ul> | |
| <li>Prevents user A from reading user B's files</li> | |
| <li>Ensures that user A does not exhaust user B's memory</li> | |
| <li>Ensures that user A does not exhaust user B's CPU resources</li> | |
| <li>Ensures that user A does not exhaust user B's devices (e.g. telephony, GPS, | |
| bluetooth)</li> | |
| </ul> | |
| <h3 id="the-application-sandbox">The Application Sandbox</h3> | |
| <p>The Android platform takes advantage of the Linux user-based protection as a | |
| means of identifying and isolating application resources. The Android system | |
| assigns a unique user ID (UID) to each Android application and runs it as that user | |
| in a separate process. This approach is different from other operating systems | |
| (including the traditional Linux configuration), where multiple applications | |
| run with the same user permissions.</p> | |
| <p>This sets up a kernel-level Application Sandbox. The kernel enforces security | |
| between applications and the system at the process level through standard Linux | |
| facilities, such as user and group IDs that are assigned to applications. By | |
| default, applications cannot interact with each other and applications have | |
| limited access to the operating system. If application A tries to do something | |
| malicious like read application B's data or dial the phone without permission | |
| (which is a separate application), then the operating system protects against | |
| this because application A does not have the appropriate user privileges. The | |
| sandbox is simple, auditable, and based on decades-old UNIX-style user | |
| separation of processes and file permissions.</p> | |
| <p>Since the Application Sandbox is in the kernel, this security model extends to | |
| native code and to operating system applications. All of the software above the | |
| kernel in <em>Figure 1</em>, including operating system libraries, application | |
| framework, application runtime, and all applications run within the Application | |
| Sandbox. On some platforms, developers are constrained to a specific | |
| development framework, set of APIs, or language in order to enforce security. | |
| On Android, there are no restrictions on how an application can be written that | |
| are required to enforce security; in this respect, native code is just as | |
| secure as interpreted code.</p> | |
| <p>In some operating systems, memory corruption errors generally lead to | |
| completely compromising the security of the device. This is not the case in | |
| Android due to all applications and their resources being sandboxed at the OS | |
| level. A memory corruption error will only allow arbitrary code execution in | |
| the context of that particular application, with the permissions established by | |
| the operating system.</p> | |
| <p>Like all security features, the Application Sandbox is not unbreakable. | |
| However, to break out of the Application Sandbox in a properly configured | |
| device, one must compromise the security of the the Linux kernel.</p> | |
| <h3 id="system-partition-and-safe-mode">System Partition and Safe Mode</h3> | |
| <p>The system partition contains Android's kernel as well as the operating system | |
| libraries, application runtime, application framework, and applications. This | |
| partition is set to read-only. When a user boots the device into Safe Mode, | |
| only core Android applications are available. This ensures that the user can | |
| boot their phone into an environment that is free of third-party software.</p> | |
| <h3 id="filesystem-permissions">Filesystem Permissions</h3> | |
| <p>In a UNIX-style environment, filesystem permissions ensure that one user cannot | |
| alter or read another user's files. In the case of Android, each application | |
| runs as its own user. Unless the developer explicitly exposes files to other | |
| applications, files created by one application cannot be read or altered by | |
| another application.</p> | |
| <h3 id="se-linux">Security-Enhanced Linux</h3> | |
| <p>Android uses Security-Enhanced | |
| Linux (SELinux) to apply access control policies and establish an environment of | |
| mandatory access control (mac). See <a | |
| href="{@docRoot}devices/tech/security/selinux/index.html">Validating | |
| Security-Enhanced Linux in | |
| Android</a> for details.</p> | |
| <h3 id="crypto">Cryptography</h3> | |
| <p> Android provides a set of cryptographic APIs for use by applications. These | |
| include implementations of standard and commonly used cryptographic primitives | |
| such as AES, RSA, DSA, and SHA. Additionally, APIs are provided for higher level | |
| protocols such as SSL and HTTPS. </p> | |
| <p> Android 4.0 introduced the <a href="http://developer.android.com/reference/android/security/KeyChain.html">KeyChain</a> class to allow applications to use the system credential storage for private | |
| keys and certificate chains. </p> | |
| <h3>Rooting of Devices</h3> | |
| <p> By default, on Android only the kernel and a small subset of the core | |
| applications run with root permissions. Android does not prevent a user or | |
| application with root permissions from modifying the operating system, kernel, | |
| and any other application. In general, root has full access to all | |
| applications and all application data. Users that change the permissions on an | |
| Android device to grant root access to applications increase the security | |
| exposure to malicious applications and potential application flaws. </p> | |
| <p> The ability to modify an Android device they own is important to developers | |
| working with the Android platform. On many Android devices users have the | |
| ability to unlock the bootloader in order to allow installation of an alternate | |
| operating system. These alternate operating systems may allow an owner to gain | |
| root access for purposes of debugging applications and system components or to | |
| access features not presented to applications by Android APIs. </p> | |
| <p> On some devices, a person with physical control of a device and a USB cable is | |
| able to install a new operating system that provides root privileges to the | |
| user. To protect any existing user data from compromise the bootloader unlock | |
| mechanism requires that the bootloader erase any existing user data as part of | |
| the unlock step. Root access gained via exploiting a kernel bug or security | |
| hole can bypass this protection. </p> | |
| <p> Encrypting data with a key stored on-device does not protect the application | |
| data from root users. Applications can add a layer of data protection using | |
| encryption with a key stored off-device, such as on a server or a user | |
| password. This approach can provide temporary protection while the key is not | |
| present, but at some point the key must be provided to the application and it | |
| then becomes accessible to root users. </p> | |
| <p> A more robust approach to protecting data from root users is through the use of | |
| hardware solutions. OEMs may choose to implement hardware solutions that limit | |
| access to specific types of content such as DRM for video playback, or the | |
| NFC-related trusted storage for Google wallet. </p> | |
| <p> In the case of a lost or stolen device, full filesystem encryption on Android | |
| devices uses the device password to protect the encryption key, so modifying | |
| the bootloader or operating system is not sufficient to access user data | |
| without the user’s device password. </p> | |
| <h3>User Security Features</h3> | |
| <h4 id="filesystem-encryption">Filesystem Encryption</h4> | |
| <p>Android 3.0 and later provides full filesystem encryption, so all user data can | |
| be encrypted in the kernel using the dmcrypt implementation of AES128 with CBC | |
| and ESSIV:SHA256. The encryption key is protected by AES128 using a key | |
| derived from the user password, preventing unauthorized access to stored data | |
| without the user device password. To provide resistance against systematic | |
| password guessing attacks (e.g. “rainbow tables” or brute force), the | |
| password is combined with a random salt and hashed repeatedly with SHA1 using | |
| the standard PBKDF2 algorithm prior to being used to decrypt the filesystem | |
| key. To provide resistance against dictionary password guessing attacks, | |
| Android provides password complexity rules that can be set by the device | |
| administrator and enforced by the operating system. Filesystem encryption | |
| requires the use of a user password, pattern-based screen lock is not supported.</p> | |
| <p>More details on implementation of filesystem encryption are available at <a | |
| href="/devices/tech/security/encryption/index.html">Encryption</a>.</p> | |
| <h3 id="password-protection">Password Protection</h3> | |
| <p>Android can be configured to verify a user-supplied password prior to providing | |
| access to a device. In addition to preventing unauthorized use of the device, | |
| this password protects the cryptographic key for full filesystem encryption.</p> | |
| <p>Use of a password and/or password complexity rules can be required by a device | |
| administrator.</p> | |
| <h3 id="device-administration">Device Administration</h3> | |
| <p>Android 2.2 and later provide the Android Device Administration API, which | |
| provides device administration features at the system level. For example, the | |
| built-in Android Email application uses the APIs to improve Exchange support. | |
| Through the Email application, Exchange administrators can enforce password | |
| policies — including alphanumeric passwords or numeric PINs — across | |
| devices. Administrators can also remotely wipe (that is, restore factory | |
| defaults on) lost or stolen handsets.</p> | |
| <p>In addition to use in applications included with the Android system, these APIs | |
| are available to third-party providers of Device Management solutions. Details | |
| on the API are provided at <a | |
| href="https://developer.android.com/guide/topics/admin/device-admin.html">Device | |
| Administration</a>.</p> |