Новогодние подарки, часть третья: хорошо ли мы себя вели
Часть первая: Meltdown.
Часть вторая: Spectre.
Одним из самых интересных вопросов, возникших в дискуссиях об аппаратных уязвимостях Meltdown и Spectre (см. ссылки выше) был вопрос о том, сделал ли нам Дед Мороз этот подарок в связи с тем, что в 2017 году мы вели себя плохо — или, наоборот, хорошо.
Попробую обосновать тезис о том, что мы вели себя хорошо, иначе Дед Мороз сделал бы нам этот подарок года через три-четыре.
Итак, что мы имеем? Аппаратная уязвимость Meltdown, позволяющая любому непривилегированному процессу читать память ядра ОС, а также любых работающих в этой ОС процессов, включая сертификаты, пароли, биткоин-кошельки и всё, что придёт вам в голову обрабатывать на компьютере.
Применение уязвимости не оставляет следов, а реализующий её код в общем случае не детектируется антивирусами.
Единственным способом защиты является срочная доработка ядра ОС с целью разделения виртуальных адресных пространств процесса и ОС. В Linux соответствующий патч называется KPTI, он оставляет в виртуальном адресном пространстве процесса только небольшой кусочек ядра — функции-трамплины, перебрасывающие при обращении к ним на соответствующие функции ядра, которое теперь живёт в другом адресном пространстве. Благодаря этому патч также получил название Forcefully Unmap Complete Kernel With Interrupt Trampolines, или FUCKWIT.
Meltdown достоверно подвержены:
- Практически все процессоры Intel
- Неназываемое число процессоров Apple на ядре ARM
- Процессоры на ядре ARM Cortex-A75
Особенный интерес в наших взаимоотношениях с Дедом Морозом представляет последний пункт — Cortex-A75.
Если не считать творчества Apple, живущего исключительно в контролируемых Apple устройствах, другие процессоры на ядрах ARM могут быть подвержены трудно эксплуатируемой уязвимости Spectre, по факту представляющей сейчас опасность только для браузеров с выполнением JS, или похожей на Meltdown, но очень сильно ограниченной уязвимости, известной из документов ARM под названием «Variant 3a» и не позволяющей читать содержимое ОЗУ.
На Cortex-A75 же в настоящий момент представлены всего два процессора, на которых представлены ровно ноль устройств:
- Qualcomm Snapdragon 845
- Samsung Exynos 8910
Про 845-й производитель прямо заявляет об использовании Cortex-A75, про 8910 достоверной информации нет, однако этот процессор имеет ряд эксклюзивных для A75 особенностей, а также будет прямо противопоставляться Snapdragon 845 в Galaxy S9.
Вероятно, в ближайшее время можно ожидать аналогичных моделей разработки Mediatek и HiSilicon.
Устройства на обоих процессорах будут показаны в конце февраля на MWC-2018 и вокруг неё — это, разумеется, Galaxy S9, а также флагманские модели других производителей.
Что это означает? Очень простую вещь: в течение 2018 года в живой природе появятся несколько десятков миллионов Android-смартфонов и планшетов, подверженных атаке Meltdown. В течение 2019 года это число легко может перевалить за сто миллионов.
Хотя при этом устройства среднего и нижнего сегмента останутся неуязвимыми — их процессоры выгоднее собирать из дешёвых ядер класса Cortex-A5x, не добавляя в них большие и дорогие Cortex-A7x — рынок дорогих и уязвимых смартфонов будет представлять серьёзный интерес для хакеров.
Но ведь, казалось бы, простое обновление линуксового ядра?…
Мы со своими десктопами и серверами немного избалованы возможностью обновления ядра. Даже для сверхконсервативной CentOS есть три уже готовые линейки ядер — базовое, longterm и mainline, что уж говорить про десктопные дистрибутивы. Захотели — накатили. Сначала рюмку коньяка, потом ядро, ну или наоборот, это у кого сколько смелости есть.
А теперь посмотрим на реалии мира смартфонов:
Модель | Ядро |
Galaxy S6 | 3.10.61 |
Galaxy S7 | 3.18.14 |
Galaxy S8 | 4.4.13 |
Galaxy Note 8 | 4.4.13 |
Galaxy A5 2017 | 3.18.14 |
Sony XZ Premium | 4.4.78 |
Xiaomi Mi A1 | 3.18.66 |
Xiaomi Mi 6 | 4.4.21 |
Xiaomi Mi 5 | 3.18.31 |
Redmi Note 4 | 3.18.22 |
Meizu MX6 | 3.18.22 |
HTC U11+ | 4.4.78 |
Huawei Honor 9 | 4.1.18 |
Huawei P10 | 4.1.18 |
Huawei Mate 10 Pro | 4.4.23 |
Nexus 6P | 3.10.73 |
Хороший зоопарк, правда?
Каждый смартфон живёт с тем ядром, которое для него было готово на момент выпуска его на рынок. В ходе всей жизни смартфона приходящие на него обновления не меняют версию ядра, хотя на само ядро могут накладываться дополнительные патчи — если вы посмотрите параметры ПО, дата сборки ядра в вашем смартфоне с большой вероятностью будет соответствовать одному из последних обновлений.
Версия ядра обусловлена как поддержкой его со стороны производителя чипсета, так и собственными наработками производителя смартфона.
Это означает, что наличие, например, патча KPTI в ядре 4.4.110 не означает, что производители могут быстренько выпустить обновление Android для своих смартфонов, которое принесёт всем их пользователям 4.4.110 с включённым KPTI. Нет, им надо будет развлекаться бэк-портированием соответствующего патча на то ядро, которое реально используется в их моделях, с последующим тестированием работоспособности и стабильности.
Смартфоны в этом похожи на серверные дистрибутивы линукса типа CentOS — только для них ещё и стороннего репозитария с kernel-lt и kernel-ml не существует.
На данный момент, однако, мы имеем всего два подверженных Meltdown ARM-процессора, не считая продукции Apple, которые ближайшие полгода будут применяться в ограниченном количестве моделей смартфонов, а прошивки этих смартфонов будут основаны на одном из более-менее свежих ядер серии 4.4, в которой патч KPTI есть хотя бы теоретически.
Теперь представьте, что было бы, если бы Meltdown был обнаружен не сейчас, а спустя два-три года. Сотни миллионов устройств (и уже не только смартфонов и планшетов), использующих десятки вариантов ядер из серий 4.4 и 4.9, каждое со своим набором патчей, основная разработка Linux при этом идёт где-то там в районе ядер 4.20…
Представили?
Спасибо, дедушка Мороз, что дал нам Meltdown до того, как им успели заразить всю мобильную индустрию.
Обещаем в 2018 году тоже вести себя хорошо.
P.S. Всё это совершенно не означает, что производители смартфонов действительно выпустят первые модели на Cortex-A75 с включённым KPTI.