Як технічно працює шифрування Marshmallow?


14

Щойно я встановив Marshmallow на Nexus 5 через натиснуте оновлення. Мене плутає спосіб роботи шифрування. Я добре володію технічними знаннями шифрування на комп’ютерах. Я хотів би отримати подібні знання про Android 6.

Далі - що я зробив і як я заплутався. Після скидання на заводські налаштування я встановив PIN-код, а потім зашифрував пристрій. Під час завантаження він попросив мене ввести свій PIN-код, який очікувався. Потім я видалив PIN-код і перезавантажив пристрій. Він не запитував жодного PIN-коду під час завантаження, але пристрій все ще повідомив про себе як зашифрований у меню налаштування. Останнє - це мене бентежить, коли я очікував, що PIN розблокує ключ розшифровки.

Запитання:

  • У випадку шифрування без PIN-коду, звідки береться ключ розшифровки? Я припускаю, що він зберігається на чіпі, подібному до TPM, це правильно? Якщо так, що заважає хакеру вимагати цей ключ від мікросхеми? Чи перевіряє хеш прошивки? Ще щось? Технічні деталі були б дуже вдячні.
  • У разі шифрування за допомогою PIN-коду використовується PIN-код як додатковий маркер для доступу до ключа розшифровки? Або процес розшифровки працює точно так, як ніби не було PIN-коду.

TL; DL відповідь:

Ключ розшифровки розблокований із усім наведеним нижче:

  • PIN-код (або пароль тощо) або пароль за замовчуванням, якщо його немає
  • TEE (апаратний генератор підписів, який використовує ключі, які неможливо витягти)
  • Сіль (легко доступна, але запобігання нападам веселкових столів)

Спасибі. Хоча це стосується і льодяника, наскільки я знаю, це правильна відповідь. Я подумав, що між M і L є різниця, тому що я не пам'ятаю, як можна було налаштувати шифрування без паролів на L або мати можливість видалити свій PIN-код після шифрування.
marcv81

Відповіді:


15

Я цитую тут посібник з Android , але:

ПРИМІТКА:

Я використовував джерело, не має прямого відношення до Marshmallow, але стосується Lollipop і вище.

TL: DR

Я зараз вирішу питання ОП. Далі випливатимуть технічні деталі.

  1. Ключ шифрування за замовчуванням надходить з апаратного джерела (мікросхема, аналогічна TPM) та пароля за замовчуванням AOSP, визначеного як default_passwordу cryptfs.cвихідному файлі, див. Нижче.

  2. Так, не просто за замовчуванням, але будь-який пароль вводиться у ключ і зберігається на чіпі, подібному до TPM, який називається TEE (скорочення "Довірене середовище виконання", див. Нижче для подальшої інформації).

  3. Хакер з доступом UART / JTAG до чіпів на SoC пристрою технічно може отримати доступ до ключа TEE, або ж користувацьке ядро ​​може випустити цю інформацію в хакер. Деякі агентства з трьома листами в теоріях конспірації, можливо, можуть співпрацювати з OEM, щоб отримати ці незахищені ядра, які використовуються у виробничих пристроях, але я б не закладав у них багато магазинів. Знову див. Останній розділ цієї відповіді для отримання більш детальної інформації.

Єдине, що не дозволяє хакеру отримати доступ до ключа, - це чимало зусиль, необхідних для цього.

  1. Перевірка хешу (контрольної суми) мікропрограмного забезпечення (Google називається "Перевірена завантаження" ) насправді робиться на Lollipop і вище за замовчуванням (і доступна від JellyBean 4.3 далі), модулем ядра, який називається dm-verity. Однак це не залежить від стану шифрування.

Джерело: Тут посібник із безпеки AOSP .

  1. Про процес, пов’язаний із розшифруванням системи користувальницьким паролем, дивіться нижче. Я просто скажу тут, що пароль користувача бере участь як у створенні, так і у використанні ключа шифрування.

Огляд

Під час першого завантаження пристрій створює довільно генерований 128-розрядний головний ключ, а потім хеширує його паролем за замовчуванням і зберігається солі. Пароль за замовчуванням: "default_password" Однак отриманий хеш також підписується через TEE (наприклад, TrustZone), який використовує хеш підпису для шифрування головного ключа.

Ви можете знайти пароль за замовчуванням, визначений у файлі cryptfs.c проекту з відкритим кодом Android .

Коли користувач встановлює PIN-код / ​​пропуск або пароль на пристрої, лише 128-бітний ключ повторно шифрується та зберігається. (тобто зміни PIN-коду / проходу / шаблону користувача НЕ викликають повторного шифрування розділу розділів даних користувача.)

Запуск зашифрованого пристрою з шифруванням за замовчуванням

Це відбувається, коли ви завантажуєте зашифрований пристрій без пароля. Оскільки пристрої Android 5.0 шифруються під час першого завантаження, не повинно бути встановленого пароля, а отже, це стан шифрування за замовчуванням.

  1. Виявити зашифровані / дані без пароля

Визначте, що пристрій Android зашифровано, оскільки / неможливо встановити дані та встановити один із прапорів encryptableабо forceencryptвстановлено.

voldвстановлює vold.decryptв trigger_default_encryption, який запускає defaultcryptoслужбу. trigger_default_encryptionперевіряє тип шифрування, щоб побачити, чи / зашифровані дані з паролем або без нього.

  1. Розшифрування / дані

Створює dm-cryptпристрій через блоковий пристрій, щоб пристрій був готовий до використання.

  1. Монтаж / дані

voldпотім монтує розшифрований розділ real / data та готує новий розділ. Він встановлює властивість vold.post_fs_data_doneдо 0і потім встановлює vold.decryptв trigger_post_fs_data. Це змушує init.rcзапускати свої post-fs-dataкоманди. Вони будуть створювати необхідні каталоги і посилання , а потім встановити vold.post_fs_data_doneв 1.

Після того, як voldбачить 1 в цій власності, вона встановлює властивість vold.decryptв: trigger_restart_framework. Це змушує init.rcзапускати послуги в класі mainзнову, а також запускати служби в класі late_start вперше після завантаження.

  1. Початкові рамки

Тепер фреймворк завантажує всі свої служби, використовуючи розшифровані / дані, і система готова до використання.

Запуск зашифрованого пристрою без шифрування за замовчуванням

Це відбувається, коли ви завантажуєте зашифрований пристрій, на якому встановлений пароль. Пароль пристрою може бути шпилькою, малюнком або паролем.

  1. Виявити зашифрований пристрій за допомогою пароля

Визначте, що пристрій Android зашифровано через прапор ro.crypto.state = "encrypted"

voldнабори vold.decryptдля trigger_restart_min_frameworkтому , що / дані шифруються за допомогою пароля.

  1. Монтувати tmpfs

initвстановлює п'ять властивостей для збереження початкових параметрів кріплення, заданих для / даних, з параметрами, переданими з init.rc. voldвикористовує ці властивості для налаштування криптографічного відображення:

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

ro.crypto.fs_flags (8-значний шістнадцятковий номер ASCII, перед яким 0x)

  1. Запустіть рамки для запиту пароля

Рамка запускається і бачить, що vold.decryptвстановлено trigger_restart_min_framework. Це говорить про те, що він завантажується на tmpfs /dataдиск і йому потрібно отримати пароль користувача.

По-перше, проте, потрібно переконатися, що диск був правильно зашифрований. Він надсилає команду cryptfs cryptocompleteна vold. voldповертає 0, якщо шифрування було успішно завершено, -1 за внутрішньою помилкою, або -2, якщо шифрування не було успішно завершено. voldвизначає це, дивлячись у криптовалютні метадані CRYPTO_ENCRYPTION_IN_PROGRESSпрапора. Якщо його встановлено, процес шифрування був перерваний, і на пристрої немає корисних даних.

Якщо voldповертається помилка, користувальницький інтерфейс повинен відображати повідомлення користувачеві про перезавантаження та заводське скидання пристрою та надати користувачеві кнопку натиснути для цього.

  1. Розшифруйте дані паролем

Після cryptfs cryptocompleteуспішної роботи в рамках відображається інтерфейс користувача з запитом пароля диска. UI перевіряє пароль, надсилаючи команду cryptfs checkpwна vold. Якщо пароль правильний (що визначається успішним встановленням розшифрованого /dataу тимчасовому місці, а потім його відключення), vold зберігає ім'я розшифрованого блокового пристрою у властивості ro.crypto.fs_crypto_blkdevта повертає статус 0 до інтерфейсу користувача. Якщо пароль невірний, він повертає -1 в інтерфейс користувача.

  1. Зупинка рамки

Користувальницький інтерфейс виставляє графічну завантажувальну графіку, а потім викликає команду vold cryptfs restart. voldвстановлює властивість vold.decryptдо trigger_reset_main, що змушує init.rcробити class_reset main. Це зупиняє всі сервіси в mainкласі, що дозволяє tmpfs /dataвідключити функцію .

  1. Монтаж / дані

voldпотім монтує розшифрований реальний /dataрозділ і готує новий розділ (який, можливо, ніколи не був би підготовлений, якщо він був зашифрований за допомогою параметра wipe, який не підтримується у першому випуску). Він встановлює властивість vold.post_fs_data_doneдо 0і потім встановлює vold.decryptв trigger_post_fs_data. Це змушує init.rcзапустити його post-fs-data commands. Вони будуть створювати необхідні каталоги і посилання , а потім встановити vold.post_fs_data_doneв 1. Після того, як voldбачить 1в цій власності, вона встановлює властивість vold.decryptв trigger_restart_framework. Це змушує init.rcзапускати послуги в класі mainзнову, а також запускати послуги в класі late_startвперше після завантаження.

  1. Почніть повну рамку

Тепер фреймворк завантажує всі свої сервіси, використовуючи розшифровану файлову систему даних, і система готова до використання.

Зберігання зашифрованого ключа

Зашифрований ключ зберігається у крипто-метаданих. Резервне копіювання обладнання реалізується за допомогою можливості підпису TrE-середовища для підпису (TEE). Раніше ми зашифрували головний ключ, створений ключем, застосованим scryptдо пароля користувача та збереженої солі.

Для того, щоб зробити ключ стійким до нестандартних атак, ми розширюємо цей алгоритм, підписуючи отриманий ключ із збереженим ключем TEE. Потім підпис перетворюється на відповідний ключ довжини ще одним додатком scrypt. Потім цей ключ використовується для шифрування та розшифрування головного ключа. Щоб зберегти цей ключ:

  1. Створіть випадковий 16-байтовий ключ шифрування диска (DEK) та 16-байтну сіль.
  2. Застосуйте scryptдо пароля користувача та солі для отримання 32-байтового проміжного ключа 1 (IK1).
  3. Прокладка IK1 з нульовим байтом до розміру приватного ключа, зв’язаного з обладнанням (HBK). Зокрема, ми розміщуємо як: 00 || IK1 || 00..00; один нульовий байт, 32 байти IK1, 223 нульових байти.
  4. Підписаний IK1 із знаком HBK для отримання 256-байтного IK2.
  5. Нанесіть scryptна IK2 та сіль (таку ж сіль, як на етапі 2), щоб отримати 32-байт IK3.
  6. Використовуйте перші 16 байт IK3 як KEK, а останні 16 байт як IV.
  7. Шифруйте DEK за допомогою AES_CBC, з ключем KEK та вектором ініціалізації IV.

А як щодо Android N? Колеги зробили припущення, що шифрування Android 7 слабше, тому що запуск пристрою не захищений, як раніше, і тому зловмисник може мати його простіше, ніж раніше, ви вважаєте, це правда?
Девід

@ Давид, що виходить за рамки цього питання, будь ласка, запитайте іншу інформацію про Android Nougat.
Tamoghna Chowdhury


Як я можу розшифрувати розділ DATA у режимі відновлення? через init.recovery. <ro.hardware> .rc
Бенні

@ Бенні, будь ласка, задайте належне запитання з цього приводу
Tamoghna Chowdhury
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.