RDot

RDot (https://rdot.org/forum/index.php)
-   Целевые системы/Target systems (https://rdot.org/forum/forumdisplay.php?f=22)
-   -   Intel CPU: SMAP и SMEP (https://rdot.org/forum/showthread.php?t=2443)

SynQ 03.10.2012 13:06

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 19.11.2012 09:10

Дожили: Attacking hardened Linux systems with kernel JIT spraying

SynQ 05.04.2013 12:04

Во FreeBSD SMEP похоже внедрили этой ревизией.

SynQ 10.07.2013 10:28

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 12:53

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 15:04

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

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

SynQ 31.10.2015 14:28

Важный момент: в структуре таблиц памяти достаточно, чтобы только в одном (!) уровне был установлен флаг Superuser и тогда SMEP не помешает выполнению.

SynQ 28.02.2016 12:28

Нашли баг - начиная с версии 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 12:47

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

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

overxor 23.05.2016 19:54

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


Часовой пояс GMT +3, время: 18:04.

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