blob: fbe0051bcc21a3230c49d890d4d0a64ce9bceb3e [file] [log] [blame]
page.title=Gatekeeper
@jd:body
<!--
Copyright 2015 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=overview>Overview</h2>
<p>The Gatekeeper subsystem performs device pattern/password authentication in a
Trusted Execution Environment (TEE). Gatekeeper enrolls and verifies passwords
via an HMAC with a hardware-backed secret key. Additionally, Gatekeeper
throttles consecutive failed verification attempts and must refuse to service
requests based on a given timeout and a given number of consecutive failed
attempts.</p>
<p>When users verify their passwords, Gatekeeper uses the TEE-derived shared
secret to sign an authentication attestation to
send to the <a href="{@docRoot}security/keystore/index.html">hardware-backed Keystore</a>. That is, a
Gatekeeper attestation notifies Keystore that authentication-bound keys (for
example, keys that apps have created) can be released for use by apps.</p>
<h2 id=architecture>Architecture</h2>
<p>Gatekeeper involves three main components:</p>
<ul>
<li><strong>gatekeeperd (Gatekeeper daemon)</strong>.
A C++ binder service containing platform-independent logic and corresponding
to the <code>GateKeeperService</code> Java interface.
<li><strong>Gatekeeper Hardware Abstraction Layer (HAL)</strong>.
The HAL interface in <code>hardware/libhardware/include/hardware/gatekeeper.h</code>,
and the implementing module.
<li><strong>Gatekeeper (TEE)</strong>.
The TEE counterpart of <code>gatekeeperd</code>. A TEE-based implementation of Gatekeeper.
</ul>
<p>To implement Gatekeeper:</p>
<ul>
<li>Implement the Gatekeeper HAL, specifically the functions in <code>gatekeeper.h</code>
(<code>hardware/libhardware/include/hardware/gatekeeper.h</code>).
See <a href="#hal_implementation">HAL Implementation</a>.
<li>Implement the TEE-specific Gatekeeper component, in part based on the following
header file: <code>system/gatekeeper/include/gatekeeper/gatekeeper.h</code>. This
header file includes pure virtual functions for creating and accessing
keys, as well as for computing signatures.
See <a href="#trusty_and_other_implementations">Trusty and other implementations</a>.
</ul>
<p>As shown in the following diagram, the <code>LockSettingsService</code> makes a request (via
Binder) that reaches the <code>gatekeeperd</code> daemon in the Android OS.
The <code>gatekeeperd</code>
daemon makes a request that reaches its counterpart (Gatekeeper) in the TEE.</p>
<img src="../images/gatekeeper-flow.png" alt="Gatekeeper flow" id="figure1" />
<p class="img-caption"><strong>Figure 1.</strong> High-level data flow for authentication by GateKeeper</p>
<p>The <code>gatekeeperd</code> daemon gives the Android framework APIs access to the HAL, and
participates in reporting device <a href="index.html">authentications</a> to Keystore.
The <code>gatekeeperd</code> daemon runs in its own process, separate from the system
server.</p>
<h2 id=hal_implementation>HAL Implementation</h2>
<p>The <code>gatekeeperd</code> daemon uses the HAL to interact
with the <code>gatekeeperd</code> daemon's TEE
counterpart for password authentication. The HAL implementation must be able to
sign (enroll) and verify blobs. All implementations are expected to adhere to
the standard format for the authentication token (AuthToken) generated on each
successful password verification. The contents and semantics of the AuthToken
are described in <a href="index.html">Authentication</a>.</p>
<p>Specifically, an implementation of the <code>gatekeeper.h</code> header file (in the
<code>hardware/libhardware/include/hardware</code> folder) needs to implement the
<code>enroll</code> and <code>verify</code> functions.</p>
<p>The <code>enroll</code> function takes a password blob, signs it, and returns the signature
as a handle. The returned blob (from a call to <code>enroll</code>) must have the structure
shown in <code>system/gatekeeper/include/gatekeeper/password_handle.h</code>.</p>
<p>The <code>verify</code> function needs to compare the signature produced
by the provided password and
ensure that it matches the enrolled password handle.</p>
<p>The key used to enroll and verify must never change, and should be re-derivable
at every device boot.</p>
<h2 id=trusty_and_other_implementations>Trusty and other implementations</h2>
<p>The <a href="{@docRoot}security/trusty/index.html">Trusty</a> operating system is
Google's open source trusted OS for TEE
environments. Trusty contains an approved implementation of GateKeeper. However,
<strong>any TEE OS</strong> can be used for the implementation of Gatekeeper.
The TEE <strong>must</strong> have access to a hardware-backed key as well as a secure,
monotonic clock <strong>that ticks in suspend</strong>.</p>
<p>Trusty uses an internal IPC system to communicate a shared secret directly
between Keymaster and the Trusty implementation of Gatekeeper ("Trusty
Gatekeeper"). This shared secret is used for signing AuthTokens that will be
sent to Keystore, providing attestations of password verification. Trusty
Gatekeeper requests the key from Keymaster for each use and does not persist
or cache the value. Implementations are free to share this secret in any way
that does not compromise security.</p>
<p>The HMAC key, used to enroll and verify passwords, is derived and kept solely
in GateKeeper.</p>
<p>The Android tree provides a generic C++ implementation of GateKeeper, requiring
only the addition of device-specific routines to be complete. To implement a
TEE Gatekeeper with device-specific code for your TEE, please refer to the
functions and comments in the following file:</p>
<pre>
system/gatekeeper/include/gatekeeper/gatekeeper.h
</pre>
<p>For the TEE GateKeeper, the primary responsibilities of a compliant
implementation are:</p>
<ul>
<li>Adherence to the Gatekeeper HAL
<li>Returned AuthTokens must be formatted according to the AuthToken specification
(described in <a href="index.html">Authentication</a>)
<li>The TEE Gatekeeper must be able to share an HMAC key with Keymaster, either by
requesting the key through a TEE IPC on demand or maintaining a valid cache of
the value at all times
</ul>
<h2 id=user_sids>User SIDs</h2>
<p>A User Secure ID (User SID) is the TEE representation of a user.
The User SID has no strong connection to an Android user ID.</p>
<p>A User SID is generated with a cryptographic
PRNG whenever a user enrolls a new password without providing a previous one.
This is known as an "untrusted" re-enroll.
A "trusted" re-enroll occurs when a user provides a valid, previous password.
In this case, the User SID is migrated to the new password handle,
conserving the keys that were bound to it.
The Android framework does not allow for an "untrusted" re-enroll under regular circumstances.</p>
<p>The User SID is HMAC'ed along with the password in the password handle when the
password is enrolled.</p>
<p>User SIDs are written into the AuthToken returned by the <code>verify</code>
function and associated to all authentication-bound Keystore keys. For
information about the AuthToken format and Keystore, see
<a href="index.html">Authentication</a>.
Since an untrusted call to the <code>enroll</code> function
will change the User SID, the call will render the keys bound to that password useless.</p>
<p>Attackers can change the password for the device if they control the Android
OS, but they will destroy root-protected, sensitive keys in the process.</p>
<h2 id=request_throttling>Request throttling</h2>
<p>GateKeeper must be able to securely throttle brute-force attempts on a user
credential. As shown in the <code>gatekeeper.h</code>
file (in <code>hardware/libhardware/include/hardware</code>),
the HAL provides for returning a timeout in milliseconds. The timeout
informs the client not to call GateKeeper again until after the timeout has
elapsed. GateKeeper should not service requests if there is a pending timeout.</p>
<p>GateKeeper must write a failure counter before verifying a user password. If
the password verification succeeds, the failure counter should be cleared. This
prevents attacks that prevent throttling by disabling the embedded MMC (eMMC)
after issuing a <code>verify</code> call. The <code>enroll</code> function also verifies
the user password (if provided) and so must be throttled in the same way.</p>
<p>If supported by the device, it is highly recommended that the failure counter
be written to secure storage. If the device does not support
file-based encryption, or if secure storage is too slow, implementations may
use RPMB directly.</p>