The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Техника обхода SMEP-защиты при эксплуатации уязвимостей ядра Linux

19.11.2012 19:15

В ядре Linux 3.0 была представлена поддержка режима SMEP (Supervisor Mode Execution Protection), присутствующего в процессорах Intel на базе архитектуры Ivy Bridge. Использование SMEP не даёт переходить из режима ядра к выполнению кода, находящегося на пользовательском уровне, что позволяет блокировать эксплуатацию многих уязвимостей в ядре Linux (shell-код не будет выполнен, так как он находится в пространстве пользователя). Один из исследователей безопасности опубликовал интересный способ эксплуатации уязвимостей в ядре в обход защиты SMEP (существуют и другие пути обхода SMEP, но данный метод заслуживает внимания в силу своей оригинальности).

Метод построен на основе организации подстановки последовательности инструкций в исполняемую область JIT-компилятора (например, подсистемы BPF - Berkeley Packet Filter), генерирующего код на основе входных данных, которые могут контролироваться атакующим. Так как JIT-компилятор контролирует генерацию кода, так просто подставить инструкции не получится. Но можно воспользоваться тем, что входящие данные используются в качестве аргументов генерируемых инструкций. Например, для входных данных "$0xa8XXYYZZ" и "$0xa8PPQQRR" будет сгенерирован код:


   b8 ZZ YY XX a8    mov $0xa8XXYYZZ, %eax
   b8 RR QQ PP a8    mov $0xa8PPQQRR, %eax
   b8 ...

Если пропустить байт с кодом инструкции mov (b8) и передать управление на следующий за ним байт (ZZ) будет выполнен машинный код "ZZ YY XX". При этом переданные в хвосте данные "a8" будут обработаны как ничего не значащая команда test с аргументом из кода команды mov (b8):


   ZZ YY XX          (подконтрольные атакующему инструкции)
   a8 b8             test $0xb8, %al
   RR QQ PP          (подконтрольные атакующему инструкции)
   a8 b8             test $0xb8, %al

Таким образом у злоумышленника появляется возможность формирования произвольной последовательности трёхбайтовых команд, выполняемой в пространстве ядра. При эксплуатации уязвимости, управление может быть передано на данные команды, в которых можно повысить привилегии процесса или отключить SMEP и передать управление на обычный shell-код в пространстве пользователя. Рабочий прототип реализации атаки на JIT-компилятор BPF и демонстрационный модуль ядра для передачи управления по произвольному адресу в пространстве ядра можно найти на данной странице.

  1. Главная ссылка к новости (http://mainisusuallyafunction....)
  2. OpenNews: Начало тестирования ядра Linux 3.7-rc1
  3. OpenNews: В ядре Linux 3.7 будет унифицирована и значительно расширена поддержка ARM-платформ
  4. OpenNews: Релиз системы виртуализации Xen 4.2.0
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/35375-smep
Ключевые слова: smep, security, linux, kernel
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (32) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Имя (?), 19:49, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    хе-хе, обратная сторона jit

    а способы защиты придумают?

     
     
  • 2.3, mihalych (ok), 20:08, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Интересует другое - как запустить код с однобайтовым смещением?
     
     
  • 3.11, Аноним (-), 20:46, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Интересует другое - как запустить код с однобайтовым смещением?

    Через баг в ядре. Если вы его найдете.

     
     
  • 4.29, Аноним (-), 00:34, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Через баг в ядре. Если вы его найдете.

    Почему "баг" - в единственном числе? Таких багов же куча. Сотни обнаружили, десятки - еще нет, тысячи - добавят в будущем.

     
     
  • 5.32, Аноним (-), 10:21, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Почему "баг" - в единственном числе?

    Потому что для эксплуатации хватит и одного.

     
     
  • 6.33, Аноним (-), 13:42, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    А я мне больше нравится, когда есть выбор :)
     
  • 3.23, pavlinux (ok), 23:52, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    https://github.com/kmcallister/alameda/blob/master/alameda.c
     
  • 2.22, Anonim (??), 23:02, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Аппаратная защита за атакующими никогда не будет поспевать. Интел родит следущие процы только через год, а сабжевая технология уже бесполезна как и все предыдущие.
     
     
  • 3.31, Онаним (?), 02:22, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • –3 +/
    причем тут intel, аппаратная защита, если проблема в jit
     

  • 1.4, Аноним (-), 20:13, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    только вот совсем забыли указать, как же осуществить "передачу управления с однобайтовым смещением".
    теоретики, такие теоретики
     
     
  • 2.7, Аноним (-), 20:29, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > только вот совсем забыли указать, как же осуществить "передачу управления с однобайтовым
    > смещением".
    > теоретики, такие теоретики

    http://mainisusuallyafunction.blogspot.com/2012/11/attacking-hardened-linux-s из первых уст, с реальными примерами и объяснением.

     

  • 1.6, anonymous (??), 20:29, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    breakin news!
    можно бинарные инструкции записать в строку char* и передать их как содержимое сетевого пакета или в функцию sprintf, и тогда если передать управление на смещение этих данных, они будут выполнены!
     
     
  • 2.8, Аноним (-), 20:32, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > breakin news!
    > можно бинарные инструкции записать в строку char* и передать их как содержимое
    > сетевого пакета или в функцию sprintf, и тогда если передать управление
    > на смещение этих данных, они будут выполнены!

    Вы понимаете что такое execution prevention в кернел спейсе от всего что в юзерспейсе?

     
  • 2.9, Аноним (-), 20:33, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    не будут, так как будут записаны в noexec область c данными.
     

  • 1.10, Аноним (-), 20:46, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > При передаче управления c однобайтовым смещением

    Epic cheat! Парни из интеля усиленно делят на ноль от такой наглости :)

     
     
  • 2.13, Аноним (-), 20:57, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А вас не смущает, что "mov $0xa8XXYYZZ, %eax" занимает 5 байт и следующая инструкция будет с пятибайтовым смещением  или что указатель не обязательно должен быть чётным числом ? :-)
     
     
  • 3.15, Аноним (-), 21:07, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > А вас не смущает, что "mov $0xa8XXYYZZ, %eax" занимает 5 байт и
    > следующая инструкция будет с пятибайтовым смещением  или что указатель не
    > обязательно должен быть чётным числом ? :-)

    Тем не менее, можно вполне годно подогнать данные так чтобы выполнилось нечто осмысленное.

    Это вы еще не видели просто прототип кода который запускается на трех напрочь разных архитектурах и выбрасывает в конце концов "свой" процессор на "свой" кусок кода. После того как я увидел это - я уже ничему не удивляюсь.

     
     
  • 4.18, mavriq_ (?), 21:37, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Это вы еще не видели просто прототип кода который запускается на трех напрочь разных архитектурах и выбрасывает в конце концов "свой" процессор на "свой" кусок кода

    и у вас пример есть? или хотя-бы ключевые слова по которым гуглить?
    все-таки, допустим, arm-овский код довольно сильно отлиачется от x86 или mips
    это конечно гипотетически возможно, но сильно слабо верится что есть реализация
    Вообще - какие ТРИ разные архитектуры предполагаются

     
     
  • 5.24, pavlinux (ok), 00:03, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Древний пример, '84 году, под VAX, PDP и ещё кого-то



    short main[] = {
    277, 04735, -4129, 25, 0, 477, 1019, 0xbef, 0, 12800,
    -113, 21119, 0x52d7, -1006, -7151, 0, 0x4bc, 020004,
    14880, 10541, 2056, 04010, 4548, 3044, -6716, 0x9,
    4407, 6, 5568, 1, -30460, 0, 0x9, 5570, 512, -30419,
    0x7e82, 0760, 6, 0, 4, 02400, 15, 0, 4, 1280, 4, 0,
    4, 0, 0, 0, 0x8, 0, 4, 0, ',', 0, 12, 0, 4, 0, '#',
    0, 020, 0, 4, 0, 30, 0, 026, 0, 0x6176, 120, 25712,
    'p', 072163, 'r', 29303, 29801, 'e'
    };



     
  • 2.27, Аноним (-), 00:30, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Epic cheat! Парни из интеля усиленно делят на ноль от такой наглости :)

    Вообще-то, именно от такой наглости они и оборонялись. Но не прокатило.

     

  • 1.12, Аноним (-), 20:52, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    А что в ядре без этого мало кода, который хотелось бы запустить?
    Зачем там shell-код? Кто-то запускает shell в ядре? Хотим, например, файл прочитать, а прав нет. Так передаём управление в код read на место после проверки прав. Всё.
     
     
  • 2.14, Аноним (-), 21:03, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Что всё? Вот у вас /proc/jump, пишете в него адрес - ядро выполняет код по этому адресу, пускай даже SMEP не включен, покажите пример как прочитать файл?

    Ну есть у вас адрес sys_read, "передали вы ему управление", аргументы ему пушкин скормит?

     
     
  • 3.16, Аноним (-), 21:09, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Ну есть у вас адрес sys_read, "передали вы ему управление", аргументы ему
    > пушкин скормит?

    Можно перезаписать код какой-то процедуры своим кодом и сигануть на него :). Но даже и просто jump-ом куда попало можно наделать дел, да.

     
     
  • 4.17, Аноним (-), 21:12, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > перезаписать код какой-то процедуры своим кодом и сигануть на него :).

    бинго, Ваш перезаписанный код находится ниже 0xbfffffff (читай в юзерспейсе), а тут внезапно SMEP. Что делать?

    > просто jump-ом куда попало можно наделать дел

    Просто kernel oops нафиг надо, повысить привилегии вот цель


     

  • 1.19, Васька (??), 22:03, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    а я то как дурак думал что все данные выравниваются по границам четверного слова.
     
     
  • 2.21, Аноним (-), 22:27, 19/11/2012 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > а я то как дурак думал что все данные выравниваются по границам четверного слова.

    данные != исполняемые инструкции. Инструкции не выравниваются.

     

  • 1.20, Анонище (?), 22:11, 19/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Все эти ваши языки программирования... кто знает ассемблер, тот правит миром.
     
     
  • 2.25, Аноним (-), 00:07, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Кто знает ассемблер, тот знает ассемблер.
    И если уж править, то не миром, а ограниченным одной архитектурой мирком.
     
     
  • 3.28, Аноним (-), 00:32, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Кто знает ассемблер, тот знает ассемблер.
    > И если уж править, то не миром, а ограниченным одной архитектурой мирком.

    Обычное утверждение из серии "кто знает slackware, тот знает linux". Обычно, заявляющие это люди слабо знакомы с предметной областью, и поэтому полагают ее на редкость однообразной и примитивной.

     
  • 2.26, pavlinux (ok), 00:08, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Все эти ваши языки программирования... кто знает ассемблер, тот правит миром.

    А можно я сразу в опкодах писать буду?

     
     
  • 3.30, Аноним (-), 01:42, 20/11/2012 [^] [^^] [^^^] [ответить]  
  • +1 +/
    55 89 e5 83 ed 04 68 6e 6f 0a 00 bb 01 00 00 00 89 e9 b8 04 00 00 00 89 c2 cd 80 89 e5 5d b8 01 00 00 00 31 db cd 80 c3
     

  • 1.34, Buy (ok), 16:40, 20/11/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Опять все загублено.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру