Практически все версии ядра 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)


  1. shanker
    20.01.2016 01:08
    +1

    У меня первая ссылка в тексте («подвержены достаточно серьезной уязвимости») заблокирована провайдером — редиректит на zapret-info.at-home.ru

    У кого-то ещё так же?


    1. ToSHiC
      20.01.2016 01:13
      +1

      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


    1. Antelle
      20.01.2016 08:30
      +25

      Это национальный способ борьбы с уязвимостями: заблокируем и они не пройдут.


      1. rboots
        20.01.2016 13:52
        +3

        У меня одного заблокирована большая часть ресурсов о кодинге и IT, типа paulirish.com, но доступны сайты с порно, казино и лечением мочёй? Программирование теперь стало опасным для государственной безопасности?


        1. inkvizitor68sl
          20.01.2016 14:03
          +12

          Конечно, программисты же могут заменить целые министерства.


        1. Idot
          20.01.2016 20:05
          +4

          perception-point.io — у меня открывается, а paulirish.com — тоже заблокирован.

          PS недавно узнал причину блокировки steps3d.narod.ru, оказалась причина блокировки в том, что автор — сторонник легализации короткоствола. То есть сайт заблокирован не за примеры с OpenGL, а за то что его сочли «экстремистским». Так что возможно, на paulirish.com — тоже нашли что-то подобное.


        1. BaRoN
          20.01.2016 21:05

          Кто ж его знает ).
          Я Java-разработчик, всё что надо — вроде работает.
          paulirish.com и perception-point.io тоже работают :)
          У остальных — не знаю


  1. shanker
    20.01.2016 01:13

    Я правильно понимаю, что приода уязвимости такова, что:
    1. Успешная эксплуатация носит вероятностный характер
    2. Неудачная эксплуатация никак не повлияет на уязвимую систему. В отличие от переполнений буфера или повреждения памяти, которые в случае неудачной эксплуатации приводят к отказу в обслуживании и\или перезагрузке системы


    1. ToSHiC
      20.01.2016 01:34
      +9

      Смысл атаки такой:
      1. Есть функция, которая держит кусок памяти с рефкаунтом. Счётчик — int 32-битный, вне зависимости от того, amd64 у вас или нет.
      2. Если увеличить счётчик на 2^32 раз, то он переполнится и начнёт расти с нуля. Когда счётчик будет равен нулю, ядро память освободит, но структурка со счётчиком ещё будет жить, мы ссылку на неё в юзерспейсе держим.
      3. Как только память освободилась, нужно туда что нибудь записать, для этого нужно выделать память такого же размера. Вот тут тонкий момент — память нужно выделить сразу после того, как память будет освобождена, и выделить нужно кусочек такого же размера. Авторы эксплоита применяют для этого msgsnd. В структуре много указателей на функции, они записывают вместо одной из них (а именно — revoke) свою функцию userspace_revoke.
      4. А дальше остаётся только вызвать revoke, который в итоге выполнит userspace_revoke.


      1. shanker
        20.01.2016 01:45

        Работа с указателями и памятью подразумевает отказ в обслуживании в случае неудачной работы эксплоита?


        1. ToSHiC
          20.01.2016 01:52
          +2

          Не должно, потому что всё подчищается корректно, ссылка просто пропадает на тот, уже неиспользуемый, кусок памяти. В этом эксплоите используется особенность аллокатора памяти, чтобы записать данные в тот самый кусок, а не брутфорс, как это бывает обычно в случае с переполнением буфера.


        1. ToSHiC
          20.01.2016 12:32

          Я тут подумал и понял, что действительно, можно случайно что-то поломать. Если этот кусочек памяти отдадут другому процессу, и он туда запишет мусор, то при вызове функций keyring для этой сессии может произойти упячка.


  1. 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 не получил…


    1. guyfawkes
      20.01.2016 10:31
      +1

      Возможно, причина описана здесь, и в Ubuntu есть необходимый функционал в ядре?


      1. chelaxe
        20.01.2016 10:38

        Подсистема ядра keyrings насколько я понял присутствует или вопрос про что то иное?


        1. guyfawkes
          20.01.2016 11:54
          +1

          Я про «many kernels have SMEP/SMAP enabled»


          1. 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 включен что и не позволяет эксплуатировать уязвимость.


    1. lega
      20.01.2016 11:10

      Судя по этой информации проблема была только у ubuntu 15.10, но на данный момент она исправлена.


      1. 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 выпускаются на продукт (пара дистрибутив-пакет), а не на уязвимость.


    1. 5ap
      20.01.2016 12:24

      вам нужно копать в сторону commit_creds и prepare_kernel_cred


    1. mariner
      20.01.2016 13:58

      alex:/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


    1. webportal
      20.01.2016 13:59

      Простите, но что вы передали эксплоиту вместо PP_KEY?? )))


      1. chelaxe
        20.01.2016 14:39

        keyctl(KEYCTL_JOIN_SESSION_KEYRING, keyring_name)
        

        Это параметр keyring_name. Ключевое имя программы работающей из под root. Как его найти я пока не понял.


        1. webportal
          20.01.2016 14:56
          -1

          Первая же ссылка в статье)

          UPD.
          Дам подсказку: leak.c


          1. chelaxe
            21.01.2016 06:09
            -1

            Скомпилил. Получил. Исходя из этого подставил значения. Результат тот же.


          1. J_o_k_e_R
            21.01.2016 22:34

            Нет. Это любая строка символов. Можете использовать любой из списка
            cat /proc/keys (предпоследний столбец, без ':' )
            или задать свой. А далее, параллельно с запуском PoC эксплойта наблюдать как увеличивается третий столбец в строчке с Вашим keyring'ом:
            watch cat /proc/keys


            1. ToSHiC
              21.01.2016 23:30
              +1

              Лучше уже использовавшийся не подавать, в эксплоите специально последние 5 итераций делают в выделенном цикле, чтобы сразу память занять. Правда мы с коллегами на разных машинах запускали, в том числе без SMEP, и пока ни разу не сработало. Но на гитхабе как минимум 1 человек отписался, что у него эксплоит сработал.

              Вот вечно с этими линуксами проблемы, даже эксплоиты не могут нормально работать :)


  1. Sykoku
    20.01.2016 11:56
    +6

    Я бы больше за Android'ы переживал.


    1. Zolg
      20.01.2016 12:18
      +7

      Нет худа без добра: части андроид-девайсов это принесёт радость root'а


      1. NeoTheFox
        20.01.2016 13:17

        Малому числу, так как одновременно с использованием ядер 3 и старше версий в Android повсеместно начали использовать SELinux, и он режет на корню такие эксплойты.


  1. winox
    20.01.2016 12:35
    -20

    Извиняюсь, но… Пиздос!


    1. bolk
      20.01.2016 13:00
      +12

      Как будто это первая уязвимость, позволяющая поднять привелегии. Чего все так возбудились-то?


      1. ProstoTyoma
        20.01.2016 14:36
        +3

        Что-то в этот раз страшного названия не придумали и сайт про неё не открыли.


    1. inkvizitor68sl
      20.01.2016 14:05
      +3

      Я таких штук 10 помню, одной больше, одной меньше — материться поздно уже.


  1. MaksVasilev
    20.01.2016 14:37

    openSUSE 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

    Не удалось получить рута.


  1. vv_kuznetsov
    20.01.2016 17:16

    Slackware-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
    

    Не работает.


    1. webportal
      20.01.2016 17:39
      -1

      Говорил уже об этом выше. Вы просто передаёте строку PP_KEY на вход эксплоита… А нужно именно этот ключ. Получить его можно скопилив leak.c детали по первой же ссылке в статье. Вам блин всё готовое подавай смотрю. И так готовый эксплоит есть, так нет и воспользоваться не могут…


      1. ToSHiC
        20.01.2016 18:00
        +2

        Почему именно «этот» (кстати этот — это какой?), если эксплуатируется не содержимое ключа, а сам факт его наличия? leak.c — это пример, который показывает, что референс каунтер утекает, и всё. Если написанные выше утверждения не верны (их я почерпнул прочитав исходники эксплоита), то расскажите как обстоят дела на самом деле.


        1. webportal
          20.01.2016 19:00
          -2

          Под рукой нет системы подходящей. Но подозреваю что нужно указывать один из этих ключей http://joxi.ru/bmoeOLTM7MwxAy


        1. J_o_k_e_R
          21.01.2016 22:36
          +1

          Всё верно говорите. Кто-то почитал исходник, а кто-то просто так советы дает.


  1. nikitasius
    20.01.2016 18:25

    Ну… таки опубликовали. Мою заметку поглотила лень.


  1. kstep
    21.01.2016 08:25
    +1

    В 4.3.3 (Arch Linux) уже закрыли дырку.