The Android Security Team regularly receives requests for information about preventing potential security issues on Android devices. We also occasionally spot check devices and let device manufacturers and affected partners know of potential issues.
This page provides security best practices based on our experiences, extending the Designing for Security documentation we've provided for developers and includes details unique to building or installing system-level software on devices.
To facilitate adoption of these best practices, where possible the Android
Security Team incorporates tests into the
Android Compatibility Test Suite (CTS) and
Android Lint. We encourage
device implementers to contribute tests that can help other Android users (view
security-related tests at
root/cts/tests/tests/security/src/android/security/cts
).
Use the following best practices in your development processes and environment.
Source code review can detect a broad range of security issues, including those identified in this document. Android strongly encourages both manual and automated source code review. Best practices:
Automated testing can detect a broad range of security issues, including several issues discussed below. Best practices:
The signature of the system image is critical for determining the integrity of the device. Best practices:
Application signatures play an important role in device security and are used for permissions checks as well as software updates. When selecting a key to use for signing applications, it is important to consider whether an application will be available only on a single device or common across multiple devices. Best practices:
Google Play provides device manufacturers the ability to update applications without performing a complete system update. This can expedite response to security issues and delivery of new features, as well as provide a way to ensure your application has a unique package name. Best practices:
External parties must have the ability to contact device manufacturers about device-specific security issues. We recommend creating a publicly accessible email address for managing security incidents. Best practices:
Use the following best practices when implementing a product.
Root processes are the most frequent target of privilege escalation attacks, so reducing the number of root processes reduces risk of privilege escalation. CTS includes an informational test that lists root processes. Best practices:
In general, pre-installed apps should not run with the shared system UID. If is it necessary, however, for an app to use the shared UID of system or another privileged service (i.e., phone), the app should not export any services, broadcast receivers, or content providers that can be accessed by third-party apps installed by users. Best practices:
The Android Application Sandbox provides applications with an expectation of isolation from other processes on the system, including root processes and debuggers. Unless debugging is specifically enabled by the application and the user, no application should violate that expectation. Best practices:
New setuid programs should not be accessible by untrusted programs. Setuid programs have frequently been the location of vulnerabilities that can be used to gain root access, so strive to minimize the availability of the setuid program to untrusted applications. Best practices:
CTS verifier includes an informational test listing SUID files; some setuid files are not permitted per CTS tests.
CTS tests fail when a device is listening on any port, on any interface. In the event of a failure, Android verifies the following best practices are in use:
Logging data increases the risk of exposure of that data and reduces system performance. Multiple public security incidents have occurred as the result of logging sensitive user data by applications installed by default on Android devices. Best practices:
CTS includes tests that check for the presence of potentially sensitive information in the system logs.
World-writable directories can introduce security weaknesses and enable an application to rename trusted files, substitute files, or conduct symlink-based attacks (attackers may use a symlink to a file to trick a trusted program into performing actions it shouldn't). Writable directories can also prevent the uninstall of an application from properly cleaning up all files associated with an application.
As a best practice, directories created by the system or root users should not be world writable. CTS tests help enforce this best practice by testing known directories.
Many drivers and services rely on configuration and data files stored in
directories such as /system/etc
and /data
. If these
files are processed by a privileged process and are world writable, it is
possible for an app to exploit a vulnerability in the process by crafting
malicious contents in the world-writable file. Best practices:
Any code used by privileged device manufacturer processes must be in
/vendor
or /system
; these filesystems are mounted
read-only on boot. As a best practice, libraries used by system or other
highly-privileged apps installed on the phone should also be in these
filesystems. This can prevent a security vulnerability that could allow an
attacker to control the code that a privileged process executes.
Only trusted code should have direct access to drivers. Where possible, the preferred architecture is to provide a single-purpose daemon that proxies calls to the driver and restricts driver access to that daemon. As a best practice, driver device nodes should not be world readable or writable. CTS tests help enforce this best practice by checking for known instances of exposed drivers.
Android debug bridge (adb) is a valuable development and debugging tool, but is designed for use in controlled, secure environments and should not be enabled for general use. Best practices:
Many Android devices support unlocking, enabling the device owner to modify
the system partition and/or install a custom operating system. Common use
cases include installing a third-party ROM and performing systems-level
development on the device. For example, a Google Nexus device owner can run
fastboot oem unlock
to start the unlocking process, which presents
the following message to the user:
Unlock bootloader?
If you unlock the bootloader, you will be able to install custom operating system software on this phone.
A custom OS is not subject to the same testing as the original OS, and can cause your phone and installed applications to stop working properly.
To prevent unauthorized access to your personal data, unlocking the bootloader will also delete all personal data from your phone (a "factory data reset").
Press the Volume Up/Down buttons to select Yes or No. Then press the Power button to continue.
Yes: Unlock bootloader (may void warranty)
No: Do not unlock bootloader and restart phone.
As a best practice, unlockable Android devices must securely erase all user data prior to being unlocked. Failure to properly delete all data on unlocking may allow a physically proximate attacker to gain unauthorized access to confidential Android user data. To prevent the disclosure of user data, a device that supports unlocking must implement it properly (we've seen numerous instances where device manufacturers improperly implemented unlocking). A properly implemented unlocking process has the following properties:
unlocked
flag must not be set until
after the secure deletion is complete.ioctl(BLKSECDISCARD)
or equivalent should be used. For eMMC
devices, this means using a Secure Erase or Secure Trim command. For eMMC 4.5
and later, this means using a normal Erase or Trim followed by a Sanitize
operation.BLKSECDISCARD
is not supported by the underlying block
device, ioctl(BLKDISCARD)
must be used instead. On eMMC devices,
this is a normal Trim operation.BLKDISCARD
is not supported, overwriting the block devices
with all zeros is acceptable.fastboot oem lock
command.These requirements ensure that all data is destroyed upon the completion of an unlock operation. Failure to implement these protections is considered a moderate level security vulnerability.
A device that is unlocked may be subsequently relocked using the
fastboot oem lock
command. Locking the bootloader provides the same
protection of user data with the new custom OS as was available with the
original device manufacturer OS (e.g. user data will be wiped if the device is
unlocked again).