Уязвимость загрузчика OnePlus 3/3T позволяет перевести SELinux в разрешительный режим при быстрой загрузке

Серьезная уязвимость в загрузчике OnePlus 3/3T позволяет злоумышленникам переключать состояние SELinux с принудительного на разрешенное! Читайте дальше, чтобы узнать больше!

OnePlus 3 и OnePlus 3T являются одними из лучших телефонов, которые вы можете купить прямо сейчас. Хотя будущие флагманы 2017 года еще не представлены потребителям, в их отсутствие OnePlus 3/3T превосходит реальные показатели по производительности по доступной цене.

Но если быть честными в оценке устройства, мы должны признать, что, несмотря на все усилия OnePlus, OnePlus 3/3T не лишены недостатков. Например, ранее мы уже сообщали о таких проблемах безопасности, как OnePlus раскрыл данные IMEI по сети, когда вы проверяете наличие обновлений на своем телефоне. И теперь мы можем добавить в этот список еще одну проблему безопасности, имеющую потенциально более опасные последствия.

Уязвимость в загрузчике OnePlus 3/3T открывает двери для вредоносных атак. Как обнаружил Рои Хэй из исследовательской группы IBM X-Force по безопасности приложений и 

обнаружено на платформе IBM X-Force ExchangeЭта уязвимость позволяет злоумышленнику манипулировать состоянием SELinux на устройствах, тем самым переводя его в разрешительный режим. Все, что нужно злоумышленнику, — это либо физический доступ к устройству или удаленный доступ к соединению ADB к устройству.

SELinuxили Security-Enhanced Linux — это модуль безопасности ядра Linux, который обеспечивает доступ и управление политиками безопасности. SELinux был представлен в Android начиная с Android 4.3 и был настроен на обеспечение соблюдения режим по умолчанию, начиная с Android 4.4. Эта система обязательного контроля доступа помогает обеспечить соблюдение существующих прав контроля доступа и пытается предотвратить атаки с целью повышения привилегий. Это служит препятствием для несанкционированного контроля над вашим устройством, например, приложения или уязвимости, направленной на злонамеренное получение root-доступа. Установка SELinux в обеспечение соблюдения по умолчанию на Android служит первым шагом для защиты обычных пользователей от таких атак.

Эту уязвимость довольно легко эксплуатировать — на самом деле, похоже, что со стороны OnePlus это серьезная ошибка, а не то, как вы могли бы представить себе типичный эксплойт. Сначала злоумышленник перезагружает OnePlus 3/3T в режим «быстрой загрузки» — если у вас есть физический доступ, просто нажмите кнопку увеличения громкости во время загрузки, но если у вас этого нет, вы можете ввести команду ADB. adb reboot bootloader к устройству. Режим быстрой загрузки на устройстве предоставляет интерфейс USB, который не должен допускать выполнения каких-либо чувствительных к безопасности команд на заблокированных устройствах. Но на OnePlus 3/3T просто выдавая fastboot oem selinux permissive команда через интерфейс fastboot переключает режим SELinux с обеспечение соблюдения к Разрешительный.

fastboot oem selinux permissive
...
OKAY[ 0.045s]
finished. totaltime: 0.047s

...

OnePlus3:/ $ getenforce
Permissive
OnePlus3:/ $

Проблема еще больше усложняется тем, что в OnePlus 3 и 3T на экране «Об экране» нет записи, в которой упоминалось бы текущее состояние SELinux устройства. Жертва по-прежнему будет не обращать внимания на скомпрометированное состояние своего устройства, если она не станет свидетелем активного использования эксплойта. Отсутствие записи о состоянии SELinux на экране «Об экране» отсутствует как в открытых бета-версиях на базе Android 6.0, так и в официальных прошивках Android 7.0.

Существует несколько приложений для переключения состояния SELinux на Permissive, например: SELinuxModeChanger приложение. Переключение SELinux с помощью этого метода не позволяет сохранить состояние после перезагрузки. Хотя, ты можешь использовать сценарии поддерживать Разрешительный Состояние SELinux при аппаратной перезагрузке. Оба этих метода требуют root-доступа, а это означает, что пользователь уже знает о рисках, которым он подвергается. Но основная разница с изменением режима SELinux на Разрешительный использование указанной выше уязвимости заключается в том, что она не только сохраняется после жесткой перезагрузки, оно так и делает без необходимости root-доступа.

На сегодняшний день не существует никаких средств защиты от этой уязвимости.


ОБНОВЛЯТЬ:

Мы обратились к Султанхда, одного из самых известных разработчиков пользовательских ПЗУ для устройств OnePlus, чтобы узнать, сможет ли он помочь нам узнать больше об этой проблеме. Он быстро покопался в коде, чтобы найти исходный код, и вот что он нашел:

То, как «fastboot oem selinux «Команда работает, заключается в том, что она добавляет дополнительный аргумент в командную строку ядра при загрузке Linux. Дополнительный аргумент имеет форму «androidboot.selinux=", где может быть «разрешительным». Вот что становится забавным: «androidboot." Аргументы командной строки ядра анализируются с помощью init. В обычной производственной сборке Android («пользовательская» сборка) аргумент «androidboot.selinux» полностью игнорируется, и selinux всегда принудительно применяется. Итак, эта ошибка состоит из двух проблем:

  1. Пользователи могут заставить загрузчик передавать флаг, который обычно разрешает selinux для сборки ПЗУ для разработки/отладки.
  2. OnePlus изменил инициализацию Android, чтобы учитывать флаг «androidboot.selinux» даже для производственных сборок ПЗУ.

Вот где инициализация Android настроена на игнорирование флага «androidboot.selinux» для производственных сборок: https://android.googlesource.com/platform/system/core/+/android-6.0.0_r41/init/Android.mk#7

Флаг ALLOW_DISABLE_SELINUX в ​​исходном коде имеет значение 1 только для пользовательских отладочных и инженерных сборок.

(Это не влияет на мое ПЗУ, поскольку я собираю свое ПЗУ в производственном (пользовательском) режиме)

Таким образом, «androidboot.selinux» просто игнорируется в моем ПЗУ, «fastboot oem selinux» «Команда также, похоже, была создана OnePlus, поскольку такой команды не существует в общедоступных источниках загрузчика CAF. Я могу придумать 4 способа исправить это для пользователей с разблокированными загрузчиками:

  1. Отредактируйте загрузчик в шестнадцатеричном формате, чтобы изменить все экземпляры строки «selinux» на что-то другое (например, «sclinux»), чтобы флаг не распознавался при инициализации Android.
  2. Отредактируйте шестнадцатеричный двоичный файл инициализации Android в OxygenOS, чтобы заменить все экземпляры «androidboot.selinux» на что-то другое (например, «androidboot.sclinux»), чтобы инициализация Android не распознавала Флаг androidboot.selinux
  3. Добавьте хак в драйвер командной строки ядра, аналогичный моему обходу SafetyNet, чтобы скрыть флаг «androidboot.selinux» из инициализации Android.

Мы хотели бы поблагодарить Султанкса за его время и усилия, которые помогли нам разобраться в том, что происходит за кулисами. Мы также обратились к OnePlus, который знает о ситуации и изучает этот вопрос.


Мы надеемся, что OnePlus публично признает наличие серьезной проблемы и прозрачен в своих планах по ее устранению.