Старый 03.10.2012, 14:06   #1
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
Post Intel CPU: SMAP и SMEP

Коротенькая заметка.

Начиная с архитектуры IvyBridge (Core iX-3XXX) в процессорах Intel есть SMEP (Supervisor Mode Execution Protection).
Начиная с архитектуры Haswell Broadwell (предположительно Core iX-5XXX) в процессорах Intel будет SMAP (Supervisor Mode Access Protection).

SMEP

Не позволяет процессору, будучи в ring0, выполнять код со страниц, помеченных флагом User.
Таким образом, столь привычные способы эксплуатации, когда есть возможность перезаписать указатель в какой-нибудь структуре в ядре адресом в юзер-моде, заммапить этот адрес и ждать, что ядро прыгнет на него исполнять наш шелл-код, перестают работать.

SMAP

Не позволяет процессору, будучи в ring0, обращаться (например, читать) к страницам, помеченным флагом User.
Поскольку ядру это необходимо в работе, были введены 2 новые инструкции, которые должны использоваться перед и после обращением к страницам памяти с флагом User: CLAC/STAC.
Использование SMAP незначительно увеличивает размер ядра и уменьшает скорость работы.


Положение дел на сегодня:
Linux получил SMEP в 3.0, SMAP - в 3.7. Обе функции по умолчанию включены.
Windows получила SMEP в Win 8.
Mac OS X получила поддержку SMEP в Mountain Lion (нужно проверить).

http://forums.grsecurity.net/viewtopic.php?f=7&t=3046
http://vulnfactory.org/blog/2011/06/...t-it-on-linux/
[GIT PULL] x86/smap changes for v3.7

http://blog.ptsecurity.com/2012/09/i...al-bypass.html
http://blog.ptsecurity.com/2012/09/b...ows-8-x64.html

Последний раз редактировалось SynQ; 15.11.2013 в 13:53..
SynQ вне форума   Ответить с цитированием
Старый 19.11.2012, 10:10   #2
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Дожили: Attacking hardened Linux systems with kernel JIT spraying
SynQ вне форума   Ответить с цитированием
Старый 05.04.2013, 13:04   #3
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Во FreeBSD SMEP похоже внедрили этой ревизией.
SynQ вне форума   Ответить с цитированием
Старый 10.07.2013, 11:28   #4
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

SMAP похоже откладывается до 2015-го и релиза Broadwell.

Определить SMEP можно по grep smep /proc/cpuinfo или добавив вызов этой функции в любимый эксплойт:

Код:
int has_smep()
{
  int eax=7, ebx, ecx=0;

     __asm__("cpuid"
            :"=b"(ebx)
            :"a"(eax), "c"(ecx)
            :"%edx");

  if(ebx & (1 << 7))
        return 1; // has smep

  return 0;
}
Код:
if ( has_smep() )
   inglorious_exit()
SynQ вне форума   Ответить с цитированием
Старый 02.09.2013, 13:53   #5
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

C удивлением обнаружил, что в последних CentOS/RHEL есть поддержка SMEP (несмотря на ядро 2.6.32, - бэкпортировали).

https://access.redhat.com/site/docum...es/kernel.html
Цитата:
Red Hat Enterprise Linux 6.2 enables SMEP (Supervision Mode Execution Protection) in the kernel.
Т.е. начиная с 2.6.32-220, следует проверять /proc/cpuinfo.

P.S. Чтобы у себя отключить SMEP в опциях загрузки в /boot/grub/menu.lst (если grub) нужно добавить "nosmep".
SynQ вне форума   Ответить с цитированием
Старый 20.09.2015, 16:04   #6
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

В ядре 4.3 добавили аналог SMAP для архитектуры arm64:
http://lwn.net/Articles/651614/

Вообще для ARM аналоги:
SMEP – PXN (Privileged Execute Never)
SMAP – PAN (Privileged Access Never)

Последний раз редактировалось SynQ; 31.10.2015 в 15:26..
SynQ вне форума   Ответить с цитированием
Старый 31.10.2015, 15:28   #7
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Важный момент: в структуре таблиц памяти достаточно, чтобы только в одном (!) уровне был установлен флаг Superuser и тогда SMEP не помешает выполнению.
SynQ вне форума   Ответить с цитированием
Старый 28.02.2016, 13:28   #8
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

Нашли баг - начиная с версии 3.10 в 64-битных ядрах с поддержкой ia32, int $0x80 сисколлы не использовали SMAP.

http://seclists.org/oss-sec/2016/q1/446
https://git.kernel.org/cgit/linux/ke...8d048b4a4872aa
SynQ вне форума   Ответить с цитированием
Старый 22.05.2016, 13:47   #9
SynQ
 
Регистрация: 11.07.2010
Сообщений: 953
Репутация: 352
По умолчанию

В текущих FreeBSD поддержка SMEP так и не реализована.

В ark интела поддержка SMEP называется "OS Guard", и, что необычно, ее ставят не во все процессоры, так например Pentium 3805U на broadwell SMEP не поддерживает.

Последний раз редактировалось SynQ; 24.05.2016 в 14:09..
SynQ вне форума   Ответить с цитированием
Старый 23.05.2016, 20:54   #10
overxor
 
Регистрация: 14.10.2011
Сообщений: 73
Репутация: 90
По умолчанию

SynQ, во фряхе есть все. Просто под виртуализацией SMEP не включается.
__________________
[IO]
overxor вне форума   Ответить с цитированием
Ответ

Метки
exploit, intel, kernel, smep

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot