Практически все версии ядра Linux, от 3.8 до 4.5 (в git) подвержены достаточно серьезной уязвимости, которая дает возможность локальному юзеру получить права суперпользователя. Оказывается, уязвимость CVE-2016-0728 существует с 2012 года, а наиболее подвержены риску пользователи ОС Android. дело в том, что код приложений и игр, созданных с использованием NDK (Native Development Kit) и выложенных в Google Play, компания Google проверить не может.
Что касается ПК и серверов, то здесь ситуация не такая сложная, в особенности, если в системе всего один пользователь. Кроме того, не является слишком опасной эта уязвимость и тогда, если пользователям запрещено исполнять код, либо же различные экземпляры ОС находятся в среде виртуализации.
Уязвимость была обнаружена специалистами в keyrings, подсистеме ядра, которая отвечает за кэширование и хранение как ключей аутентификации, так и сертификатов для шифрования. При условии некорректного освобождения объектов возможно обращение к уже освобожденной области памяти в то время, когда процесс заменяет текущий keyrings сессии таким же экземпляром. Интересно, что код для эксплуатации найденной уязвимости довольно простой и состоит всего из 100 строк на С. Время выполнения эксплоита — полчаса.
Вся информация по проблеме доступна здесь — CVE-2016-0728. Сейчас обновления пакетов с ядром, ликвидирующие уязвимость, выпущены только разработчиками Debian.
Комментарии (42)
shanker
20.01.2016 01:13Я правильно понимаю, что приода уязвимости такова, что:
1. Успешная эксплуатация носит вероятностный характер
2. Неудачная эксплуатация никак не повлияет на уязвимую систему. В отличие от переполнений буфера или повреждения памяти, которые в случае неудачной эксплуатации приводят к отказу в обслуживании и\или перезагрузке системыToSHiC
20.01.2016 01:34+9Смысл атаки такой:
1. Есть функция, которая держит кусок памяти с рефкаунтом. Счётчик — int 32-битный, вне зависимости от того, amd64 у вас или нет.
2. Если увеличить счётчик на 2^32 раз, то он переполнится и начнёт расти с нуля. Когда счётчик будет равен нулю, ядро память освободит, но структурка со счётчиком ещё будет жить, мы ссылку на неё в юзерспейсе держим.
3. Как только память освободилась, нужно туда что нибудь записать, для этого нужно выделать память такого же размера. Вот тут тонкий момент — память нужно выделить сразу после того, как память будет освобождена, и выделить нужно кусочек такого же размера. Авторы эксплоита применяют для этого msgsnd. В структуре много указателей на функции, они записывают вместо одной из них (а именно — revoke) свою функцию userspace_revoke.
4. А дальше остаётся только вызвать revoke, который в итоге выполнит userspace_revoke.shanker
20.01.2016 01:45Работа с указателями и памятью подразумевает отказ в обслуживании в случае неудачной работы эксплоита?
ToSHiC
20.01.2016 01:52+2Не должно, потому что всё подчищается корректно, ссылка просто пропадает на тот, уже неиспользуемый, кусок памяти. В этом эксплоите используется особенность аллокатора памяти, чтобы записать данные в тот самый кусок, а не брутфорс, как это бывает обычно в случае с переполнением буфера.
ToSHiC
20.01.2016 12:32Я тут подумал и понял, что действительно, можно случайно что-то поломать. Если этот кусочек памяти отдадут другому процессу, и он туда запишет мусор, то при вызове функций keyring для этой сессии может произойти упячка.
chelaxe
20.01.2016 10:28Собрал под Ubuntu 14.04.3 LTS
uname -a Linux ubuntu 3.13.0-74-generic #118-Ubuntu SMP Thu Dec 17 22:52:10 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
sudo apt-get install libkeyutils-dev gcc cve_2016_0728.c -o cve_2016_0728 -lkeyutils -Wall ./cve_2016_0728 PP_KEY
Получил (30 минут):
uid=1000, euid=1000 Increfing... finished increfing forking... finished forking caling revoke... uid=1000, euid=1000
но прав root не получил…guyfawkes
20.01.2016 10:31+1Возможно, причина описана здесь, и в Ubuntu есть необходимый функционал в ядре?
chelaxe
20.01.2016 10:38Подсистема ядра keyrings насколько я понял присутствует или вопрос про что то иное?
guyfawkes
20.01.2016 11:54+1Я про «many kernels have SMEP/SMAP enabled»
chelaxe
21.01.2016 06:16Собственно вот:
If you check:
root@eben:/proc# cat keys
075e0cb4 IR-Q--- 63 expd 3f3f3f3f 1000 1001 keyring PP1: empty
16477452 I--Q--- 3 perm 1f3f0000 1000 65534 keyring _uid.1000: empty
19c6487a I--Q--- 21 perm 3f030000 1000 1001 keyring _ses: 1
2ad3452d I--Q--- 1 perm 1f3f0000 0 65534 keyring _uid_ses.0: 1
36d1aaca I--Q--- 2 perm 1f3f0000 0 65534 keyring _uid.0: empty
root@eben:/proc#
You will see it created the key. However if you check this — /proc/PID/smaps
example:
root@eben:/proc# find. -name «smaps»
./1/task/1/smaps
./1/smaps
./2/task/2/smaps
./2/smaps
./3/task/3/smaps
./3/smaps
./5/task/5/smaps
It's probably not going to work because SMAP ( Supervisor Mode Access Prevention ) is enabled within the running kernel. Which will only trigger /bin/sh with the current UID.
Hence in the release doc — Mitigations & Conclusions
The vulnerability affects any Linux Kernel version 3.8 and higher. SMEP & SMAP will make it difficult to exploit as well as SELinux on android devices. Maybe we’ll talk about tricks to bypass those mitigation in upcoming blogs, anyway the most important thing for now is to patch it as soon as you can.
Вы правы. SMAP включен что и не позволяет эксплуатировать уязвимость.
lega
20.01.2016 11:10Судя по этой информации проблема была только у ubuntu 15.10, но на данный момент она исправлена.
justabaka
20.01.2016 12:57Ну, как сказать… Wily, Vivid, Utopic и Trusty, и даже Precise с Trusty HWE: http://people.canonical.com/~ubuntu-security/cve/2016/CVE-2016-0728.html :)
У них просто USN выпускаются на продукт (пара дистрибутив-пакет), а не на уязвимость.
mariner
20.01.2016 13:58alex:/tmp> ./exp PP1
uid=1000, euid=1000
Increfing…
finished increfing
forking…
finished forking
caling revoke…
uid=1000, euid=1000
sh-4.3$ whoami
alex
sh-4.3$ uname -a
Linux alex-work 4.3.3-2-ARCH #1 SMP PREEMPT Wed Dec 23 20:09:18 CET 2015 x86_64 GNU/Linux
webportal
20.01.2016 13:59Простите, но что вы передали эксплоиту вместо PP_KEY?? )))
chelaxe
20.01.2016 14:39keyctl(KEYCTL_JOIN_SESSION_KEYRING, keyring_name)
Это параметр keyring_name. Ключевое имя программы работающей из под root. Как его найти я пока не понял.webportal
20.01.2016 14:56-1Первая же ссылка в статье)
UPD.
Дам подсказку: leak.cJ_o_k_e_R
21.01.2016 22:34Нет. Это любая строка символов. Можете использовать любой из списка
cat /proc/keys (предпоследний столбец, без ':' )
или задать свой. А далее, параллельно с запуском PoC эксплойта наблюдать как увеличивается третий столбец в строчке с Вашим keyring'ом:
watch cat /proc/keysToSHiC
21.01.2016 23:30+1Лучше уже использовавшийся не подавать, в эксплоите специально последние 5 итераций делают в выделенном цикле, чтобы сразу память занять. Правда мы с коллегами на разных машинах запускали, в том числе без SMEP, и пока ни разу не сработало. Но на гитхабе как минимум 1 человек отписался, что у него эксплоит сработал.
Вот вечно с этими линуксами проблемы, даже эксплоиты не могут нормально работать :)
winox
20.01.2016 12:35-20Извиняюсь, но… Пиздос!
bolk
20.01.2016 13:00+12Как будто это первая уязвимость, позволяющая поднять привелегии. Чего все так возбудились-то?
ProstoTyoma
20.01.2016 14:36+3Что-то в этот раз страшного названия не придумали и сайт про неё не открыли.
inkvizitor68sl
20.01.2016 14:05+3Я таких штук 10 помню, одной больше, одной меньше — материться поздно уже.
MaksVasilev
20.01.2016 14:37openSUSE Tumbleweed
4.4.0-1-default #1 SMP PREEMPT Mon Jan 11 14:46:34 UTC 2016 (83948c1) x86_64 x86_64 x86_64 GNU/Linux
Не удалось получить рута.
vv_kuznetsov
20.01.2016 17:16Slackware-14.1
$uname -a Linux darkstar 3.10.17 #2 SMP Wed Oct 23 16:34:38 CDT 2013 x86_64 Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz GenuineIntel GNU/Linux
Не работает.webportal
20.01.2016 17:39-1Говорил уже об этом выше. Вы просто передаёте строку PP_KEY на вход эксплоита… А нужно именно этот ключ. Получить его можно скопилив leak.c детали по первой же ссылке в статье. Вам блин всё готовое подавай смотрю. И так готовый эксплоит есть, так нет и воспользоваться не могут…
ToSHiC
20.01.2016 18:00+2Почему именно «этот» (кстати этот — это какой?), если эксплуатируется не содержимое ключа, а сам факт его наличия? leak.c — это пример, который показывает, что референс каунтер утекает, и всё. Если написанные выше утверждения не верны (их я почерпнул прочитав исходники эксплоита), то расскажите как обстоят дела на самом деле.
webportal
20.01.2016 19:00-2Под рукой нет системы подходящей. Но подозреваю что нужно указывать один из этих ключей http://joxi.ru/bmoeOLTM7MwxAy
J_o_k_e_R
21.01.2016 22:36+1Всё верно говорите. Кто-то почитал исходник, а кто-то просто так советы дает.
shanker
У меня первая ссылка в тексте («подвержены достаточно серьезной уязвимости») заблокирована провайдером — редиректит на zapret-info.at-home.ru
У кого-то ещё так же?
ToSHiC
http://webcache.googleusercontent.com/search?q=cache:QRFT7S9qim0J:perception-point.io/2016/01/14/analysis-and-exploitation-of-a-linux-kernel-vulnerability-cve-2016-0728/+&cd=2&hl=ru&ct=clnk&gl=ru
Antelle
Это национальный способ борьбы с уязвимостями: заблокируем и они не пройдут.
rboots
У меня одного заблокирована большая часть ресурсов о кодинге и IT, типа paulirish.com, но доступны сайты с порно, казино и лечением мочёй? Программирование теперь стало опасным для государственной безопасности?
inkvizitor68sl
Конечно, программисты же могут заменить целые министерства.
Idot
perception-point.io — у меня открывается, а paulirish.com — тоже заблокирован.
PS недавно узнал причину блокировки steps3d.narod.ru, оказалась причина блокировки в том, что автор — сторонник легализации короткоствола. То есть сайт заблокирован не за примеры с OpenGL, а за то что его сочли «экстремистским». Так что возможно, на paulirish.com — тоже нашли что-то подобное.
BaRoN
Кто ж его знает ).
Я Java-разработчик, всё что надо — вроде работает.
paulirish.com и perception-point.io тоже работают :)
У остальных — не знаю