2 февраля 2016 г.

Экран блокировки с пустым паролем в Android — это не баг, а фича!

...на самом деле баг тут есть.
    В Android есть полезная (необходимая!) штука — FDE, то есть полное шифрование диска. Матчасть можно почитать здесь: https://source.android.com/security/encryption/. Ну или чуть позже в этом самом блоге, я планирую перевести статью. При использовании шифрования (в Nexus 6 и более новых, а также в некоторых устройствах сторонних производителей его предлагают использовать при первом же включении) у пользователя просят пароль*. Этим паролем устройство НЕ шифруется. И это уже интересное, так что здесь логично поставить кат.

    * Здесь стоит сразу сделать пояснение. На уровне самого Android нет различия между PIN, паролем, чёртом лысым. Различие делается путём установки «качества» пароля. Например PASSWORD_QUALITY_NUMERIC позволяет использовать только цифры (и тогда системная клавиатура на экране блокировки будет подниматься не полная, а цифровая) и на уровне GUI это видится как PIN. А PASSWORD_QUALITY_NUMERIC_COMPLEX - это тот же PIN, только запрещает дублирование. Т. е. в первом случае можно использовать 1111, а во втором — нет.

    Так вот, пароль у пользователя просят не для шифрования устройства (устройство зашифровано совсем другим паролем, которое пользователь никогда не узнает), а для:
  1. Шифрования хранилища с настоящим ключом шифрования. Таким образом, в идеале (если Google или производитель прошивки конкретно на вашем устройстве не оставил бэкдор), производитель прошивки не может получить доступ к реальному ключу шифрования, не зная ваш пароль.
  2. Разблокировки уже загруженного устройства. Т. е. для экрана блокировки.
    Именно потому вы можете спокойно сколь угодно часто менять пароли и устройство не перешифровывается новым ключом по несколько часов - реально перешифровывается только хранилище ключа шифрования. Но пункт 2 здесь не просто так. Реально пароль экрана блокировки не имеет прямой связи с ключом шифрования. Просто для того, чтобы не заставлять запоминать два разных пароля (один — на включение устройства, чтобы загрузчик смог добраться до хранилища с ключом шифрования, второй — на экран блокировки), Google вызывает совершенно разные функции в разных местах, передавая в них этот код. Важно! Речь идёт об Android 5 от Google. В Android 6 от Google (а также в Android 5 от некоторых других производителей, например от Cyanogen) эти места уже разделены и вы можете зашифровать устройство, но не включать запрос пароля на загрузку устройства.
    
    Здесь мы вплотную подошли к возможностям приложений с правами Администраторов устройств (Device Administrator, DA). Среди прочих его, DA, возможностей есть две, важные нам сейчас:
  1. Установка своего (т. е. приложения) пароля
  2. Сброс пароля, т. е. его отключение
    Строго говоря, установка пароля и сброс пароля - это всё реально сброс. Только в первом случае передаётся пароль — resetPassword(your_password), а во втором случае пароль либо не передаётся, либо передаётся Null.

    Итак, представим ситуацию. Устройство зашифровано паролем «Vasya123». По причине описанной выше, этот пароль нужен и для включения устройства, и для экрана блокировки. Также на устройстве установлено приложение с правами DA, которое может ставить (а на самом деле сбрасывать) свой пароль. Пусть это будет «1111».
    Произошло некое событие, и приложение установило свой пароль. Но изменение пароля через DA не вызывает функции шифрования, меняется лишь пароль на экран блокировки. Теперь на включение устройства имеем пароль «Vasya123», а для уже загруженного устройства — «1111». События идут дальше и приложение вместо пароля передало пустую строку, т. е. совсем убрало пароль. Из-за не очень умной реализации со стороны Google этой фичи с «не заставлять запоминать два разных пароля», графическая оболочка по-прежнему ожидает ввод пароля, который уже Null. А значит нужно этот «нал» и передать. То есть нужно просто нажать кнопку ввода, не вводя никаких паролей!
    Теперь, до того момента, пока пользователь не задаст новый пароль в настройках Android, он будет на включении устройства вводить Васю, а на экране блокировки не вводить ничего, просто нажимая Enter.

    P. S. Это касалось DA. Есть ещё Device Owner и его возможности богаче, однако выходят за рамки этой статьи.