Sunday, February 19, 2012

Системни защити на паметта и ЕМЕТ

DEP - Data Execution Prevention
Проблемите с които деп се занимава са от семейството на Buffer overrun, Buffer Overflow атаки. Тази група атаки, се състои в подвеждане на програмата да приеме повече информация, от колко нейния буфер може да поеме, като тази информация която ще се подава е изпълним код, най-често скрипт или червей или рууткит, или троянски кон. Имаш дадена програма която работи и тя има буфер 1000 знака, за уеб адрес. При което задаваш въпрос на програмата, колко ти е голям буфера за адреси, програмата казва 1000 байта, и после питаш можеш ли да приемеш -4096 байта? програмата прави бърза проверка, как се отнася -4096 спрямо 1000, вижда че е по-малко и докладва, мога, давай ги. Тогава ти подаваш реално 4096 вместо -4096 които си докладвал, и в един момент, стигаш 1000 байта и буфера е пълен, 1001 символ препълва буфера, и става проблем. ос по спешност зарязва всичко, и поспешност процесора зарязва всичко, и ти виждаш часовничето на уин, да се въртии компютъре не приема командите ти. Процесора по спешност изпълнява прииждащите данни от буфера, докато се освободи достатъчно място буфера, за да приеме останалите данни. проблемът е че тези данни не са данни, а е код на някой вредител който е току що инжектиран в системата. В този момент си вече хакнат, и компютъра е пробит, проникването е успешно, компютъра е заразен с червей или имаш троянски кон който в момента отваря връзка към стопанина си, за да я регистрира във Firewall като очаквана и вече връщане назад няма.



DEP има за цел да елиминира този сценарии. Правилно настроен, DEP тотално елимина този сценарии, и го прави 100% неприложим, независимо от обстоятелствата. Грешно настроен DEP винаги може да изпусне нещо.

DEP се дели на 2 основни нива, софтуерен, който се налага от ОС и хардуерен който се налага от процесора. не всички процесори имат хардуерновграден DEP. Първите процесори с хардуерно вграден DEP се появяват 2004 година, и товаса само високите модели във високия клас процесори. Всички процесори без изключение произведени след средата на 2005 година, имат хардуерен DEP на общо основание.

Софтуеринят DEP има 4 степени на сила, които са:

Always Off - DEP е тотално изключен, и не работи.

Opt-In - най-слабата степен на защита, само програми които са направени сами изришно да търсят закрила DEP ще бъдат пазени от DEP останалите няма да бъдат пазени.

Opt-Out - Почти най-силната степен на DEP. По подразбиране всички програми биват пазени, само тези които са направени изришно да отказват защита от DEP няма да бъдат пазени.

Always ON - Всички биват пазени от DEP задължително, на общо основание, независимо искат или не. това е най-силната защита която софтуерния DEP предлага.

Хардуерният DEP има само 2 нива

Always off - изключен

Always on - задължително за цялата памет без изключения, без значение искаш или не.

Хардуерният DEP маркира цялата памет като non executable и променя, индивидуални адреси, ако в тях има код който би трябвало да се изпълни. В момента в който процесора види че се опитват да го накарат да изпълни нещо, от област маркирана като non-executable процесора сам си казва тая няма да я бъде и веднага спира процеса който е жертва, и процеса който се опитва злоупотреби с процеса жертва, без процесора да е приел или изпълнил каквато и да било команда или парче код.

Софтуерният DEP прави същото, за Stack, heap и другите области от паметта - memory allocations които програмите използват в работата си.

В този ред на мисли основната защита, идва от процесора, но намесата на ОС не е за подценяване. Смислените настройки и за софуерният DEP и за хардуерният DEP винаги и задължително always on, като по този начин елиминираш всякакви предпоставки и опити, нещо да стане зад гърба на DEP, и тотално елиминираш, цялото семейство атаки които са на базата на buffer overrun/Buffer overflow. Само при тези настройки ставаш наистина неуязвим за тови род атаки. Иначе всеки компромис, който правите, се отразява на степента на защита която DEP ще осигури. В началото Много програми вървяха слабо или изобщо не вървяха с DEP но тов вече не така, под натиска на потребителите, Интел, АМД и Микрософт, нещата се промениха и все повече програми вече работят адекватно под DEP.

ASLR - Address Space Layout Randomization
Тъй като под DEP част от експлойтите - цялото семейство на buffer overrun/Buffer overflow не успяват, се появи нов похват, наречен ROP - Return Oriented Programming. този метод се състои в извикване на парчета уиндоуски код, от съществуващи уиндоуски файловеи програми в паметта, и подреждането на тези парчета в такъв ред, че да изпълнят исканото действие, разчитайки че всички изпълними файлове ще са винаги на едни и същи места в паметта. така се избягва намесата на DEP тъй като тоава което се стартира е код, от адреси в stack, heap и останалите program memory alocations в които има код, и са маркирани като изпълними. Тъй като тов което се стартира е код, от област маркирана като изпълнима, това не дразни DEP, и DEP не реагира на ставащото. За DEP е нормално да стартираш код от област маркирана като изпълнима. Обаче се оказва че се стартира код, който работи по начин който нене замислян от микрософт. Това доведе до създаването на ASLR която помага цялото съдържание в паметта - Stack, heap, memory allocations да се зарежда и пренарежда на произволен принцип, така че парчетата код които ти трябват, постоянно да се разместват на произволен принцип в паметта, са цел, атакуващият да не знае къде да ги търси. ASLR е изцяло софтуерна защита, няма хардуерен вариант, от процесора както DEP, и отново има 4 степени

Always Off - напълно изключена

Opt-In - нищо несе променя и нищо не се размества в паметта, освен тези програми които сами си искат тази защита

Opt-Out - Всичко се размества в паметта, но тези програми които изришно заявят че искат да работят извън ASLR няма да бъдат пазени от ASLR. ВНИМАНИЕ ТАЗИ ЗАЩИТА МОЖЕ ДА Е ОПАСНА! НЕ ВСИЧКИ ДРАЙВЕРИ ЗА УСТРОЙСТВА МОГАТ ДА РАБОТЯТ ПОД ТОЗИ РЕЖИМ НА ЗАЩИТА, И Е ВЪЗМОЖНО НАКОЙ ДРАЙВЕР НА ДЕ СРАБОТИ, И СЕСТЕМАТА ДА ЗАБИЕ ПРИ ЗАРЕЖДАНЕ, И ДА ИЗВАДИ СИН ЕКРАН, ВЕДНАГА СЛЕД КАТО СЕ СКРИЕ ЛОГОТО НА УИНДОУС. ТОЗИПРОБЛЕМ ЕСЕ ПОЛУЧАВА НАЙ-ЧЕСТО ПРИ ДРАЙВЕРИ ЗА ВИДЕОКАРТИ НА НВИДИА И АТИ, И И ПОНЯКОГА ПРИ ДРАЙВЕРИ НА ДРУГИ УСТРОЙСТВА.

Always ON - ASLR е включена задължително за всички, задължително и на общо основание, независимо искат или не. Това е най-силната степен на защита която ASLR предлага, и в тази си степен ASLR стига доста далеч. В тази степен на защита, ASLR стига до положението в което паметта, Stack, heap, и останаите program memory allocations се разместват постоянно в рамките на едно буут-ване на компютъра. Пускаш word вършиш си работата, то стартирането води до разбъркване на всичко, спираш word и нещата се пренареждат. Пускаш го отново, word се зарежда на място различно от това в което е бил преди малко, и цялата памет heap, stack и всички meory allocatons се разбъркват наново, нищо че всичко това става в рамкита на едно буутване. При рестартиране на системата, всичкосе зарежда първоначално по различни адреси, спрямо предното зрареждане, и отново всичко се пренарежда с всяка пусната и спряна програма. Тази защита просто разбива модела на ROP - Return Oriented Programming, защото нещата биват размествани независимо какво се зареди или изтегли от паметта, така този който прилага ROP не знае къде да търси парчетат код кото му трябват, а дори да ги намери, ти самокот спреш или пуснеш една програма, всичко се пренарежда и трябва да се започва от нулата. ВНИМАНИЕ ТАЗИ ЗАЩИТА МОЖЕ ДА Е ОПАСНА! НЕ ВСИЧКИ ДРАЙВЕРИ ЗА УСТРОЙСТВА МОГАТ ДА РАБОТЯТ ПОД ТОЗИ РЕЖИМ НА ЗАЩИТА, И Е ВЪЗМОЖНО НАКОЙ ДРАЙВЕР НА ДЕ СРАБОТИ, И СЕСТЕМАТА ДА ЗАБИЕ ПРИ ЗАРЕЖДАНЕ, И ДА ИЗВАДИ СИН ЕКРАН, ВЕДНАГА СЛЕД КАТО СЕ СКРИЕ ЛОГОТО НА УИНДОУС. ТОЗИПРОБЛЕМ ЕСЕ ПОЛУЧАВА НАЙ-ЧЕСТО ПРИ ДРАЙВЕРИ ЗА ВИДЕОКАРТИ НА НВИДИА И АТИ, И И ПОНЯКОГА ПРИ ДРАЙВЕРИ НА ДРУГИ УСТРОЙСТВА.

В този редна мисли, най-облагодетелствани са интел базираните системи, където дъното, процесора, мрежвата карта, видеокартата, паметта и зуковата карта са интелски, чипсета също е интелски. този тип системи позволяват на ASLR да работи на 100% сила без това да причинява каквато и да било нестабилност с драйвери и устройства.

Heap Spray Protection
Следващата логична стъпка е дасе правят опити за отгатване на това къде ще са нещата. Тъй като висшите степени на ASLR не позволяват отгатване, съответно, се използва нова техника, наречена heap spray - един експлойт започва да се тиражира и разпръсква из целия Heap целия Stack и всички program memory allocations с надеждата че едно от разпръсскваните копия, на експлойта, ще уцели мястото където е файла който му трябва, и адреса на функцията във файла който търси. В момента в който уцели което му трябва, експлойта се получава. Heap spray protection действа катоправи 2 неща - 1 следи честонападаните адреси в паметта, ако нещо посегне към кой да е адрес, директно спира процеса който е жертв на експлойта и процеса който търси как и къде може да злоупотреби. 2. heap spray protection следи дали има нещо което се разпръсква в много копия из коя да е област от паметта, в момента в който забележи това поведение, спира процеса който го прави, ако е необходимо спира и процеса жертва на тази атака.

EAF - Export Address table Filtering.
Тази защита иама за цел да следи export address table, и в частност кой се обръща към нея. Ако не е системен файл на уиндоус няма достъп. Това е много сериозна пречка и спира shellcode exploits, още преди първата инструкция да бъде изпълнена.

Null Page Allocation Protection
всеобщото твардение, е, че още няма експлойти които пряко да злоупотребяват с некоректни обръщения към паметта. Тези които следят нещата по-надълбоко, обаче знаят за цяло семейство червеи, които се възползват от това, при първоначално проникване и заразяване на системата. Това семейство червеи, са неспособни да проникнат и да заразят системата при тази защита работеща.

Bottom up Randomization
това е защита създадена с мисълта да е втора цигулка, и с мисълта да е нещо което подсилва ASLR като внася попълнително произволно разбъркване в паметта, което трябва да е като помощна мярка срещу heap spray exploitation и Return Oriented Programming. Идеята е в разбъркването на паметта и на heaps, stacks, program memory allocations да се включи и разбърка малкото памет която остава неразбъркана. Ефекта е най-силен когато ASLR и Bottom Up Randomization работят заедно. Тази сащита сама не може да създаде сериозна пречка, и никога не е била замисляна да излезна и да играе ролята на първа цигулка както DEP и ASLR. Тук нарочно споменавам Heap и Stack в множествено число, защото вече не е само паметта на компютъра а влизат и мрежовите Stacks и Heaps към тези на паметта.

SEHOP - Structured Exception Handler Overwrite Protection
SEHOP съществува в Windows Vista SP1 и Уин 7 но е изключена по подразбиране с името SEHOP, и в Server 2008 и Server2008 R2 с друго име - SafeSEH, и в сървърите е включена по подразбиране. SEHOP и SafeSEH са имена на едно и също нещо. Най-новата техника за експлойтване e презаписван на SEH веригата. Това е похват използвайки 2 експлойта, от които първият трябва да насочи системата към втория, а втория да проникне и подчини системата. Какво е SEH? Това е Верига от handlers които имат за цел да поемат нещата ако нещо се обърка и някоя програма забие, или бъде спряна от системна защита. Обикновено процеса минава по следния начин, програма допуска грешка, някоя системна защита спира програмата, но програмата казва искам да ме поеме Structured exception handler. Ос казва добре, и пуск програмата по веригата от handlers докато там намери правилния handler да оправи нещата. как се злоупотребява с това? правилният handler който трабвада поеме случая и оправи нещата бива презаписан, с експлойт, който се представя за handler. След което системата бива атакована с експлойт, който ще позразни някоя от системните защити, и ще каже искам да ме обслужи handler. системата спира експлойта, и пуска Exception с който спрения експлойт да бъде пратен по веригата от Exception handlers докато си намери половинката. Попадайки на втория експлойт който е презаписал оригиналния handler, системата изпълнява втория експлойт. SEHOP е защитна мяркасрещу точнотози модел на поведение. При подаване на Structured Exception програма която иска да е обслужена от Handler не се праща веднага. Първо минава проверка, която проверява всички handlers по веригата. Ако дори един е презаписан, веригата ог handlers се анулира, пограмата бива спряна принудително, без да бъде пратена, да бъде обслужена от handler. Чак след кто всичко плиключи, веригата от Structred Exception Handlers бива създадена отново в оригиналния си вид, когато не е била променяна.

SEHOP има 4 степени на защита

Always Off - изключена. веригата от handlers не се проверява, преди нещо да бъде пуснато по нея.

Opt-In - Тук програмата изришно трябва да си поиска, да я обслужи handler, Ако поиска да бъде обслужена от Handler то веригата от handlers ще бъде задължително проверена преди пограмата да бъде пратена по веригата от handlers. Ако веригата от handlers не е променяна програмата ще бъде пратена, ако веригата от handlers е променена програмата ще бъде спряна без да бъде пратена по веригата. Променятана верига ще бъде анулирана и нова ще бъде създадена нанейно място.

Opt-out - Тук всяка програма ще бъде обслужвана от handlers, освен тези които изришно откажат. Преди програмата да бъде пратена да се обслужи от handler, веригата от handlers ще бъде задължително проверена преди пограмата да бъде пратена по веригата от handlers. Ако веригата от handlers не е променяна програмата ще бъде пратена, ако веригата от handlers е променена програмата ще бъде спряна без да бъде пратена по веригата. Променятана верига ще бъде анулирана и нова ще бъде създадена на нейно място.

Always on - тази степен се активира само и единствено ръчно, от регистри. Всички програми задължително и на общо основание биват обслужвани от handler независимо дали изришно заявяват че искат или изришно заявяват че не искат. Преди програмата да бъде пратена да се обслужи от handler, веригата от handlers ще бъде задължително проверена преди пограмата да бъде пратена по веригата от handlers. Ако веригата от handlers не е променяна програмата ще бъде пратена, ако веригата от handlers е променена програмата ще бъде спряна без да бъде пратена по веригата. Променятана верига ще бъде анулирана и нова ще бъде създадена на нейно място.

Защитите на паметта, са разделени на 2 големи групи, наглобално ниво, които обхващат и контролират цялата операционна система и всички програми и процеси в нея, и на ниво отделно приложение. На ниво гобална система защитите напаметта са DEP, ASLR, SEHOP, а на ниво индивидуално приложение, защитите на паметта са повече DEP, ASLR, SEHOP, EAF, Heap Spray Protection, Null Page Protecton, Bottom Up Randomization. Защитите на паметта се контролират частично от ОС, като контрола от ОС е крайно недостатъчен, или от инструмента EMET - Enhanced Mitigation Experience Toolkit който осигурява ПОЧТИ пълен контрол на всички защити на паметта, както на ниво система, и абсолютно пълен контрол на всички защити на паметта на ниво приложение. Нарочно споменавам почти пълен контор на защитите на ниво система, защото ЕМЕТ не позволява пълните 4 нива на защита на SEHOP да бъдат манипулирани свободно, а само нива always off, opt-in и opt-out, и липсва ниво always on, което трябва дасе активира ръчно с редактиране на регистри.

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.