Специалисты израильской security-компании Perception Point сообщили об обнаружении опасной 0day уязвимости в ядре Linux с идентификатором CVE-2016-0728. Уязвимость относится к типу Local Privilege Escalation (LPE) и охватывает все версии и модификации Linux, в которых используется ядро версии 3.8 и выше. Как не трудно догадаться, с ее помощью атакующие могут поднять свои привилегии в системе до максимального уровня root. Эксплойт может быть использован в системе уже после того как атакующие получили к ней удаленный доступ и запустили его на исполнение. Он также может использоваться вредоносными программами для получения в системе максимальных привилегий.
![](https://habrastorage.org/r/w780q1/files/d07/0b7/884/d070b7884aee490186329871c517cddb.jpg)
На ядре Linux основана и одна из самых востребованных на сегодняшний день мобильных ОС — Android. Таким образом, те версии Android, которые используют ядро Linux указанных версий также подвержены данной уязвимости. Это относится к версиям Android KitKat (4.4-4.4.4) и выше.
Уязвимость CVE-2016-0728 присутствует в подсистеме ядра Linux под названием keyring, которая предоставляет приложениям и системным компонентам ОС возможность безопасной работы с сохраненными в памяти криптографическими данными, такими как ключи шифрования. Точнее, уязвимость располагается в функции ядра join_session_keyring, которую приложение может вызвать с использованием API keyctl, указав ей константу KEYCTL_JOIN_SESSION_KEYRING. После того как к использованию объекта keyring подключаются в очередной раз из того же процесса, функция увеличивает для него счетчик ссылок, а затем забывает его уменьшить перед выходом из нее (reference leak). Таким образом, вызывая множество раз функцию keyctl с идентификатором KEYCTL_JOIN_SESSION_KEYRING для уже созданного объекта keyring, счетчик ссылок для него будет постоянно расти.
Эксплуатация уязвимости достигается через увеличение счетчика ссылок (поле usage объекта keyring) на максимально возможное значение таким образом, чтобы сигнализировать ядру, что его уже можно удалить. Так как само поле интерпретируется как знаковое целое (int), для этого нужно установить его старший бит. После того как ядро высвободит память для объекта, а указатель на него останется для приложения, эксплойт выделит по тому же адресу иной объект, заполнит его содержимое нужным указателем, а затем спровоцирует его вызов через один из указателей в объекте keyring, что приведет к исполнению кода по адресу, указанному эксплойтом.
![](https://habrastorage.org/r/w1560/files/28e/b60/f17/28eb60f17f9445cf8c7be87b79bb145c.png)
Рис. Результат успешной работы PoC для этой уязвимости (данные Perception Point).
По подсчетам Perception Point уязвимости подвержены десятки миллионов ПК и серверов, на которых установлена Linux с уязвимым ядром, а также 66% всех устройств под управлением Android. Компания указывает, что уязвимость присутствовала в ядре с 2012 г., т. е. уже около четырех лет. Такие защитные технологии как SMEP и SMAP, которые предотвращают коду режима ядра (с максимальными привилегиями с точки зрения микропроцессора) получать доступ к страницам виртуальной памяти пользовательского режима, не позволят коду эксплойта отработать нужным образом.
Мы рекомендуем пользователям установить соответствующее исправление для ОС сразу после его выхода.
![](https://habrastorage.org/files/d07/0b7/884/d070b7884aee490186329871c517cddb.jpg)
На ядре Linux основана и одна из самых востребованных на сегодняшний день мобильных ОС — Android. Таким образом, те версии Android, которые используют ядро Linux указанных версий также подвержены данной уязвимости. Это относится к версиям Android KitKat (4.4-4.4.4) и выше.
Уязвимость CVE-2016-0728 присутствует в подсистеме ядра Linux под названием keyring, которая предоставляет приложениям и системным компонентам ОС возможность безопасной работы с сохраненными в памяти криптографическими данными, такими как ключи шифрования. Точнее, уязвимость располагается в функции ядра join_session_keyring, которую приложение может вызвать с использованием API keyctl, указав ей константу KEYCTL_JOIN_SESSION_KEYRING. После того как к использованию объекта keyring подключаются в очередной раз из того же процесса, функция увеличивает для него счетчик ссылок, а затем забывает его уменьшить перед выходом из нее (reference leak). Таким образом, вызывая множество раз функцию keyctl с идентификатором KEYCTL_JOIN_SESSION_KEYRING для уже созданного объекта keyring, счетчик ссылок для него будет постоянно расти.
Эксплуатация уязвимости достигается через увеличение счетчика ссылок (поле usage объекта keyring) на максимально возможное значение таким образом, чтобы сигнализировать ядру, что его уже можно удалить. Так как само поле интерпретируется как знаковое целое (int), для этого нужно установить его старший бит. После того как ядро высвободит память для объекта, а указатель на него останется для приложения, эксплойт выделит по тому же адресу иной объект, заполнит его содержимое нужным указателем, а затем спровоцирует его вызов через один из указателей в объекте keyring, что приведет к исполнению кода по адресу, указанному эксплойтом.
![](https://habrastorage.org/files/28e/b60/f17/28eb60f17f9445cf8c7be87b79bb145c.png)
Рис. Результат успешной работы PoC для этой уязвимости (данные Perception Point).
По подсчетам Perception Point уязвимости подвержены десятки миллионов ПК и серверов, на которых установлена Linux с уязвимым ядром, а также 66% всех устройств под управлением Android. Компания указывает, что уязвимость присутствовала в ядре с 2012 г., т. е. уже около четырех лет. Такие защитные технологии как SMEP и SMAP, которые предотвращают коду режима ядра (с максимальными привилегиями с точки зрения микропроцессора) получать доступ к страницам виртуальной памяти пользовательского режима, не позволят коду эксплойта отработать нужным образом.
Мы рекомендуем пользователям установить соответствующее исправление для ОС сразу после его выхода.