blob: 0023b838415fb4e2b276eb35291a925cb86603f6 [file] [log] [blame] [view] [edit]
# Auth Factors
[TOC]
## Overview
This document outlines the relative security strengths of the different types of
auth factor supported by Cryptohome. For more basic information about "what is
an auth factor?" see the [general architecture document](architecture.md).
## Terminology
Here are some descriptions of specific terms this document uses.
### Credential
A credential is something you present to ChromeOS (and Cryptohome) to attempt to
prove you are who you say you are. It could be "something you know" such as a
password, or a PIN. It could be "something you have" like a smart card. It could
be "something you are" like a fingerprint.
### Auth Factor
A credential, or set of credentials, that Cryptohome accepts to prove your
identity. When referring to a specific type of auth factor this document will
generally use bold all-caps such as **PASSWORD** to refer to a password-based
auth factor. The type of credentials involved are specified by the type of the
auth factor, and Cryptohome's policies are all defined in terms of auth factors.
### Capability
Cryptohome will grant different capabilities based on the type of auth factor
presented for authorization. An example of a capability would be "decrypt and
mount the home directory".
### Enforcement
In the context of Cryptohome, there are two levels of enforcement for policies
regarding capabilities that are relevant. The first is **soft** enforcement:
this means that the capability is enforced purely by the cryptohome daemon. The
second is **hard** enforcement: this means that the capability is enforced by
some combination of hardware and cryptography.
Obviously, hard enforcement is generally stronger than soft enforcement because
breaking through hard enforcement can require work that is very expensive (or
sometimes even impossible) in terms of time and compute resources. However, even
soft enforcement is significant, because breaking it effectively requires root
access to a device.
Note that there are also security policies which are enforced by layers of the
software stack above Cryptohome (generally, Chrome). Most commercial security
policies fall into this category. For the most part a full enumeration of these
policies is out of the scope of cryptohome and this document, but some
particularly relevant ones are defined here. Generally this level of enforcement
is referred to as "Chrome-only".
### Tier
This document categorizes auth factors by dividing them into different tiers.
The capability policies are then defined in terms of tiers of factors; for
example, one capability may require a tier 1 credential while another only
requires a tier 2 credential. This means the strength of a factor is defined
solely by the tier that it is in.
Nevertheless, within a tier we do also provide some subdivision into subtiers of
relative strength. This is done to provide additional background on the
reasoning for why these tiers are structured the way they are, and to help
inform future decisions regarding factors and tiers (e.g. moving a factor up or
down a tier, or breaking a tier up into two separate tiers).
## Credential and Auth Factor strength
When comparing the relative strength of credentials, it can be difficult to
produce a strict ordering because there are several different dimensions to
compare them along. To make this clearer the strength of a credential is for
each type of credential is explained first, then the ordering of the different
type of credentials is given.
### "Thing you know" credentials
For credentials based around a secret value that you know (e.g. password, PIN,
secret handshake, etc.) the general strength is based on how difficult it would
be for an attacker to compromise it with a brute force search. A reasonable
measure of this is to assume that an attacker has physical access to your
Chromebook and is trying to decrypt your home directory; how much time and
effort will it take to brute-force a secret-based credential?
The primary measures of this are how much entropy the credential has, and the
maximum rate at which unlock attempts can be made. In general a factor with less
entropy is weaker than one with more entropy, but if the attempt rate on the low
entropy factor is much lower then this weakness could be mitigated or even
canceled out. For example, consider a 6-digit PIN (1 million possible values)
which is rate limited by hardware to at most 100 attempts per day; on average
this would take more than 10 years to brute force. This could end up being much
slower than brute forcing a higher entropy credential like a password if that
credential allowed millions of attempts per second! One can be even more
aggressive and even do a hard lockout (no more attempts allowed) but such a
credential cannot be used as the only credential as it opens you up to
denial-of-service attacks where an attacker deliberately uses up all of your
attempts.
One additional note regarding entropy: Cryptohome does not directly enforce any
randomness in credential values supplied by users. In fact, with passwords it
never even sees your "real" plaintext password as Chrome only supplies a hash of
it, and so enforcing password restrictions below the Chrome layer is not
currently possible. This does mean that in practice we do assume that other
external systems and layers are providing some level of "passwords are actually
high entropy" enforcement.
### "Things you have" credentials
For credentials based around a physical thing you have in your possession the
general strength is based around how difficult it is to copy or steal, in
combination with how easy they are to invalidate if they are stolen or lost.
In practice Cryptohome does not currently support any standalone "thing you
have" type credentials; instead they're used in combination with "thing you
know" credentials to strengthen the overall factor. Therefore, at this time
doing precise comparisons of relative strength is not necessary.
Note that because "things you have" credentials may be entirely third-party
devices or equipment, barring some mechanism to be able to verify the quality or
robustness of a particular type of device such credentials may not actually be
considered particularly secure.
### "Things you are" credentials
These credentials are basically biometrics: you present something of yourself to
a scanner (e.g. a finger to a fingerprint reader, your face to a camera) and
that result is matched against a stored record.
These credentials have some similarity to "things you have" credentials, in that
their relative strength can be defined based on how hard they are to steal or
copy. While we generally consider actually stealing body parts to be very
difficult, there are other ways to copy biometrics: for example, how easy it is
to "steal" your face by taking a picture of it.
However, there is an added weakness that's more unique to these credentials,
which is a non-zero false positive rate. Most biometric credentials are "fuzzy"
in the sense that you can't really do an exact match (e.g. you can't just do a
pixel-precise match of two images). The higher this rate, the weaker the
credential is; however, this can also be ameliorated via rate limiting like with
a low-entropy credential.
Finally, there is one added weakness to things you are credentials in that
they're also usually impractical to change. While this doesn't make the
credential itself easier to compromise, it does restrict the usability somewhat
as it can only be disabled.
## Auth Factor tiers
The auth factors are divided into tiers, where for practical purposes all that
matters about a factor is what tier it falls into. What tier a factor is in
defines how much we trust it: is this a factor that can be used to decrypt a
user's home directory, or only one that is trusted to unlock a device, or
something else?
Within a tier we also provide a partial ordering of factors, but this is
informational and not something that actions are taken upon.
### Tier 1: Strong auth factors
These are auth factors that we consider to be sufficient to use as your only
factor, providing full access to your device without any reservations.
1. **CRYPTOHOME_RECOVERY**
1. **PASSWORD**
#### Justification
At this time we consider **PASSWORD** to be the "standard" strong auth factor.
Having it is sufficient to secure full access to a device, and it's long been
acceptable to have a password-only system. That may change in the future but for
now it's useful to continue using it as the starting point, measuring other
types of factors against it.
The **CRYPTOHOME_RECOVERY** auth factor is considered similarly stronger than
**PASSWORD**. It combines requiring a password-level credential (for an owner
account) with device access and tamper-resistant logging of the authentication
occurring.
### Tier 2: Strong-ish auth factors
These are auth factors that we consider sufficient to provide full access to
your device, but where we implement some additional restrictions at the UI
level.
1. **SMART_CARD**
1. **PIN**
#### Justification
The **PIN** auth factor is weaker than the strong factors because a PIN is a
password with an enforced smaller character set and length. This means that PINs
provide the same properties as passwords but much lower entropy. This is
mitigated by requiring cryptographically enforced rate limiting on PIN attempts
that put a bound on how easily they can be forced. This is sufficient for the
factor to be considered tier 2 and allowed full access.
On paper the **SMART_CARD** auth factor is clearly stronger than the **PIN**
factor because it's composed of both a PIN and a physical card, both of which
have to be presented in order to authenticate. In fact one could argue that it's
even stronger than some of our other tier 1 factors such as **PASSWORD**.
However, the problem is that smart cards are all third party products which we
have no way of verifying the overall quality of. To account for this uncertainty
we still consider **SMART_CARD** to be stronger than our first party **PIN**
implementation but we don't count it as part of the *ideal* tier 1 factors.
### Tier 3: Weak auth factors
These are auth factors that can be used to unlock a locked device, but which
cannot be used to login in a device which is not already logged in.
1. **LEGACY_FINGERPRINT**
#### Justification
The **LEGACY_FINGERPRINT** authentication mechanism does not provide any way to
securely store a key that gets released by the auth process; instead it only
provides a yes/no result. This makes it impossible to use with any capability
other than unlock.
### Tier ∞: Not allowed
With a regular account, these factors cannot be used at all. This tier is
generally reserved for factors that are only intended to be used in special
contexts.
1. **KIOSK**
#### Justification
The **KIOSK** auth factor provides no actual security, since in practice its
credential is equivalent to a **PASSWORD** with a pre-set, well-known password.
Thus, they should never be used with an actual normal account.
### Special: Kiosk Accounts
For persistent kiosk accounts on a device we use different rules: the **KIOSK**
auth factor is treated as being tier 1 and all other types of auth factor are
tier ∞ (not allowed). Cryptohome enforces this restriction.