blob: 6b9c80e6b1c9c340ea0c54f4074771a645a02812 [file] [log] [blame]
page.title=Implementing 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="introduction">Introduction</h2>
<p>The Android Security Team regularly receive requests for more information about
how to prevent potential security issues on Android devices. We also
occasionally perform spot-checks of devices and let OEMs and affected partners
know of potential issues.</p>
<p>This document provides OEMs and other partners with a number of security best
practices based upon our own experiences. This is an extension of the
<a href="http://developer.android.com/guide/practices/security.html">Designing for
Security</a> documentation we've provided for developers, including best
practices that are unique to those who are building or installing system-level
software on devices.</p>
<p>Where possible, the Android Security Team will incorporate tests into the
<a href="{@docRoot}compatibility/cts-intro.html">Android Compatibility Test
Suite</a> (CTS) and
<a href="http://tools.android.com/tips/lint">Android Lint</a> to facilitate adoption of
these best practices. We encourage partners to contribute tests that can help
other Android users. A partial list of security-related tests can be found at:
<code>root/cts/tests/tests/security/src/android/security/cts</code></p>
<h2 id="dev-process">Development process</h2>
<h3 id="sec-review">Source code security review</h3>
<p> 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.</p>
<ol>
<li><a href="http://tools.android.com/tips/lint">Android Lint</a>
<strong>should</strong> be run on all application code using the Android SDK.
Issues that are identified should be corrected.</li>
<li>Native code <strong>should</strong> be analyzed using an automated tool that
can detect memory management issues such as buffer overflows and off-by-one
errors.</li>
</ol>
<h3 id="auto-test">Automated testing</h3>
<p>Automated testing can detect a broad range of security issues, including many of
those identified in this document.</p>
<ol>
<li>CTS is regularly updated with security tests; the most recent version of CTS
<strong>must</strong> be run to verify compatibility.</li>
<li>CTS <strong>should</strong> be run regularly throughout the development process to detect
problems early and reduce time to correction. Android uses CTS as part of
continuous integration with our automated build process, which builds
multiple times per day.</li>
<li>OEMs <strong>should</strong> automate security testing of any interfaces including testing
with malformed inputs (fuzz testing).</li>
</ol>
<h3 id="sign-sysimg">Signing system images</h3>
<p>The signature of the system image is critical for determining the integrity of
the device. Specifically:</p>
<ol>
<li>Devices <strong>must not</strong> be signed with a key that is publicly known.</li>
<li>Keys used to sign devices <strong>should</strong> be managed in a manner consistent with
industry standard practices for handling sensitive keys, including a hardware
security module (HSM) that provides limited, auditable access.</li>
</ol>
<h3 id="sign-apk">Signing applications (APKs)</h3>
<p>Application signatures play an important role in device security. They 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.
Consider:</p>
<ol>
<li>Applications <strong>must not</strong> be signed with a key that is publicly known.</li>
<li>Keys used to sign applications <strong>should</strong> be managed in a manner consistent
with industry standard practices for handling sensitive keys, including an
HSM that provides limited, auditable access.</li>
<li>Applications <strong>should not</strong> be signed with the platform key.</li>
<li>Applications with the same package name <strong>should not</strong> be signed with
different keys. This often occurs when creating an application for different
devices, especially when using the platform key. If the application is
device-independent, then use the same key across devices. If the application
is device-specific, create unique package names per device and key.</li>
</ol>
<h3 id="apps-pub">Apps publishing</h3>
<p>Google Play provides OEMs with the ability to update applications without
performing a complete system update. This can expedite response to security
issues and delivery of new features. This also provides a way to make sure that
your application has a unique package name.</p>
<ol>
<li>Apps <strong>should</strong> be uploaded to Google Play to allow automated updates without
requiring a full OTA. Applications that are uploaded but "unpublished" are
not directly downloadable by users, but the apps are still updated. Users who
have ever installed such an app can install it again and again on their other
devices as well.</li>
<li>To avoid potential confusion, apps <strong>should</strong> be created with a package name
clearly associated with your company, such as by using a company trademark.</li>
<li>Apps published by OEMs <strong>should</strong> be uploaded on the Google Play store in
order to avoid package name impersonation by third-party users.<br/>
<br/>
If an OEM installs an app on a phone without publishing it on the Play store,
another developer could upload that same app, using the same package name,,
and change the metadata for the app. When presented to the user, this
unrelated metadata could create confusion.</li>
</ol>
<h3 id="incident-response">Incident response</h3>
<p>External parties must have the ability to contact OEMs about device-specific
security issues. We strongly recommend the creation of a publicly accessible
email address for managing security incidents.</p>
<ol>
<li>Create a <em>security@your-company.com</em> or similar address and publicize
it.</li>
<li>If you become aware of a security issue affecting Android OS or Android
devices from multiple OEMs, you <strong>should</strong> contact the Android
Security Team at <em>security@android.com</em>.</li>
</ol>
<h2 id="prod-implement">Product implementation</h2>
<h3 id="root-processes">Root processes</h3>
<p>Root processes are the most frequent target of privilege escalation attacks, so
reducing the number of root processes reduces risk of privilege escalation. CTS
has been expanded with an informational test that lists root processes.</p>
<ol>
<li>The devices <strong>should</strong> run the minimum necessary code as root. Where
possible, use a regular android process rather than a root process. The ICS
Galaxy Nexus has only six root processes - vold, inetd, zygote, tf_daemon,
ueventd, and init. Please let the Android team know if capabilities are
required that are not accessible without root privileges.</li>
<li>Where possible, root code <strong>should</strong> be isolated from untrusted data and
accessed via IPC. For example, reduce root functionality to a small Service
accessible via Binder and expose the Service with signature permission to an
an application with low or no privileges to handle network traffic.</li>
<li>Root processes <strong>must not</strong> listen on a network socket.</li>
<li>Root processes <strong>must not</strong> provide a general-purpose runtime for
applications. (e.g. a Java VM)</li>
</ol>
<h3 id="sys-apps">System apps</h3>
<p>In general, apps pre-installed by OEMs should not be running with the shared UID
of system. Realistically, however, sometimes this is necessary. If an app is
using the shared UID of system or another privileged service (i.e., phone), it
should not export any services, broadcast receivers, or content providers that
can be accessed by third-party apps installed by users.</p>
<ol>
<li>The devices <strong>should</strong> run the minimum necessary code as system. Where
possible, use an android process with its own UID rather than reusing the
system UID.</li>
<li>Where possible, system code <strong>should</strong> be isolated from untrusted data and
expose IPC only to other trusted processes.</li>
<li>System processes <strong>must not</strong> listen on a network socket.</li>
</ol>
<h3 id="process-isolate">Process isolation</h3>
<p>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.</p>
<ol>
<li>Root processes <strong>must not</strong> access data within individual application data
folders, unless using a documented Android debugging method.</li>
<li>Root processes <strong>must not</strong> access memory of applications, unless using a
documented Android debugging method.</li>
<li>The device <strong>must not</strong> include any application that accesses data or memory
of other applications or processes.</li>
</ol>
<h3 id="suid-files">SUID files</h3>
<p>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, and minimizing the availability of the program to untrusted
applications is a security best practice.</p>
<ol>
<li>SUID processes <strong>must not</strong> provide a shell or backdoor that can be used to
circumvent the Android security model.</li>
<li>SUID programs <strong>must not</strong> be writable by any user.</li>
<li>SUID programs <strong>should</strong> not be world readable or executable. Create a
group, limit access to the SUID binary to members of that group, and place any
applications that should be able to execute the SUID program into that
group.</li>
<li>SUID programs are a common source of user "rooting" of devices. To reduce
this risk, SUID programs <strong>should not</strong> be executable by the shell
user.</li>
</ol>
<p>The CTS verifier has been expanded with an informational test that lists SUID
files. Certain setuid files are not permitted, per CTS tests.</p>
<h3 id="listening-sockets">Listening sockets</h3>
<p>CTS tests have been expanded to fail when a device is listening on any port, on
any interface. In the event of a failure, Google will verify that the following
best practices are being used:</p>
<ol>
<li>There <strong>should</strong> be no listening ports on the device.</li>
<li>Listening ports <strong>must</strong> be able to be disabled without an OTA.
This can be either a server or user-device configuration change.</li>
<li>Root processes <strong>must not</strong> listen on any port.</li>
<li>Processes owned by the system UID <strong>must not</strong> listen on any
port.</li>
<li>For local IPC using sockets, applications <strong>must</strong> use a UNIX
Domain Socket with access limited to a group. Create a file descriptor for the
IPC and make it +RW for a specific UNIX group. Any client applications must be
within that UNIX group.</li>
<li>Some devices with multiple processors (e.g. a radio/modem separate from the
application processor) use network sockets to communicate between processors.
In those instances, the network socket used for inter-processor communication
<strong>must</strong> use an isolated network interface to prevent access by
unauthorized
applications on the device. One approach is to use iptables to prevent access by
other applications on the device.</li>
<li>Daemons that handle listening ports <strong>must</strong> be robust against malformed
data. Google may conduct fuzz-testing against the port using an unauthorized
client, and, where possible, authorized client. Any crashes will be filed as
bugs with an appropriate severity.</li>
</ol>
<h3 id="logging">Logging</h3>
<p>Logging of data increases the risk of exposure of that data and reduces system
performance. Multiple public security incidents have occurred as the result of
logging of sensitive user data by applications installed by default on Android
devices.</p>
<ol>
<li>Applications or system services <strong>should not</strong> log data provided from
third-party applications that might include sensitive information.</li>
<li>Applications <strong>must not</strong> log any Personally Identifiable Information (PII)
as part of normal operation.</li>
</ol>
<p>CTS has been expanded with a number of tests that check for the presence of
potentially sensitive information in the system logs.</p>
<h3 id="directories">Directories</h3>
<p>World-writable directories can introduce security weaknesses. Writable
directories may enable an application to rename other trusted files,
substituting their own files or conducting symlink-based attacks. By creating a
symlink to a file, the attacker may trick a trusted program into performing
actions it shouldn't.</p>
<p> Writable directories prevent the uninstall of an application from properly
cleaning up all files associated with an application. Directories created by the
system or root users <strong>should not</strong> be world writable.</p>
<p>CTS tests help enforce this best practice by testing known directories.</p>
<h3 id="config-files">Configuration files</h3>
<p>Many drivers and services rely on configuration and data files stored in
directories like /system/etc and various other directories in /data. If these
files are processed by a privileged process and are world writable, then it
could be possible for an app to exploit a vulnerability in the process by
crafting malicious contents in the world-writable file.</p>
<ol>
<li>Configuration files used by privileged processes <strong>should not</strong>
be world readable.</li>
<li>Configuration files used by privileged processes <strong>must not</strong> be
world writable.</li>
</ol>
<h3 id="native-code">Native code libraries</h3>
<p>Any code used by privileged OEM processes must be in /vendor or /system; these
filesystems are mounted read-only on boot. Any 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.</p>
<ol>
<li>All native code used by privileged OEM processes <strong>must be</strong> in /vendor or
/system.</li>
</ol>
<h3 id="device-drivers">Device drivers</h3>
<p>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 restrict access to the driver to that daemon.</p>
<p>Driver device nodes <strong>should not</strong> be world readable or
writable. CTS tests help enforce this best practice by checking for known
instances of exposed drivers.</p>
<h3 id="adb">ADB</h3>
<p>ADB <strong>must be</strong> disabled by default and must require the user to turn it on
before accepting connections.</p>
<h3 id="unlockable-bootloaders">Unlockable bootloaders</h3>
<p>Unlockable Android devices must securely erase all user data prior to being
unlocked. The failure to properly delete all data on unlocking may allow a
physically proximate attacker to gain unauthorized access to confidential
Android user data. We've seen numerous instances where device manufacturers
improperly implemented unlocking.</p>
<p>Many Android devices support unlocking. This allows the device owner to modify
the system partition and/or install a custom operating system. Common use cases
for this include installing a third-party ROM, and/or doing systems-level
development on the device.</p>
<p>For example, on Google Nexus devices, an end user can run <code>fastboot oem
unlock</code> to start the unlocking process. When an end user runs this command,
the following message is displayed:</p>
<blockquote>
<strong>Unlock bootloader?</strong>
<p>If you unlock the bootloader, you will be able to install custom operating
system software on this phone.</p>
<p>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.</p>
<p>To prevent unauthorized access to your personal data, unlocking the
bootloader will also delete all personal data from your phone (a "factory data
reset").
<p>Press the Volume Up/Down buttons to select Yes or No. Then press the Power
button to continue.</p>
<p><strong>Yes</strong>: Unlock bootloader (may void warranty)</p>
<p><strong>No</strong>: Do not unlock bootloader and restart phone.</p>
</blockquote>
<p>A device that is unlocked may be subsequently relocked, by issuing the
<code>fastboot oem lock</code> command. Locking the bootloader provides the same
protection of user data with the new custom OS as was available with the
original OEM OS. e.g. user data will be wiped if the device is unlocked again in
the future.</p>
<p>To prevent the disclosure of user data, a device that supports unlocking needs
to implement it properly.</p>
<p>A properly implemented unlocking process will have the following properties:</p>
<ol>
<li>When the unlocking command is confirmed by the user, the device MUST start an
immediate data wipe. The "unlocked" flag MUST NOT be set until after the
secure deletion is complete.</li>
<li>If a secure deletion cannot be completed, the device MUST stay in a locked
state.</li>
<li>If supported by the underlying block device,
<code>ioctl(BLKSECDISCARD)</code> 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 doing a normal Erase or Trim followed by a Sanitize
operation.</li>
<li>If <code>BLKSECDISCARD</code> is NOT supported by the underlying block
device, <code>ioctl(BLKDISCARD)</code> MUST be used instead. On eMMC devices,
this is a normal Trim operation.</li>
<li>If <code>BLKDISCARD</code> is NOT supported, overwriting the block devices
with all zeros is acceptable.</li>
<li>An end user MUST have the option to require that user data be wiped prior to
flashing a partition. For example, on Nexus devices, this is done via the
<code>fastboot oem lock</code> command.</li>
<li>A device MAY record, via efuses or similar mechanism, whether a device was
unlocked and/or relocked.</li>
</ol>
<p>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.</p>