Новогодние подарки, часть третья: хорошо ли мы себя вели

Часть первая: 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 845Samsung 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 S63.10.61Galaxy S73.18.14Galaxy S84.4.13Galaxy Note 84.4.13Galaxy A5 20173.18.14Sony XZ Premium4.4.78Xiaomi Mi A13.18.66Xiaomi Mi 64.4.21Xiaomi Mi 53.18.31Redmi Note 43.18.22Meizu MX63.18.22HTC U11+4.4.78Huawei Honor 94.1.18Huawei P104.1.18Huawei Mate 10 Pro4.4.23Nexus 6P3.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.