Sigreturnově orientované programování - Sigreturn-oriented programming

Sigreturnově orientované programování (SROP) je zneužít zabezpečení počítače technika, která umožňuje útočníkovi spustit kód za přítomnosti bezpečnostních opatření, jako je nespustitelná paměť a podepisování kódu.[1] Poprvé byl představen na 35. konferenci IEEE o zabezpečení a soukromí v roce 2014, kde zvítězil cena za nejlepší studentský papír.[2] Tato technika využívá stejné základní předpoklady návratově orientované programování (ROP) technika: útočník ovládající zásobník volání, například prostřednictvím a přetečení vyrovnávací paměti zásobníku, je schopen ovlivnit regulační tok programu pomocí tzv. jednoduchých instrukčních sekvencí gadgety. Útok funguje tlačí kovaný sigcontext struktura[3] na zásobníku hovorů přepíše původní zpáteční adresu umístěním gadgetu, který umožňuje útočníkovi volat návrat[4] systémové volání.[5] K úspěšnému provedení tohoto útoku je často zapotřebí pouze jeden gadget. Tento gadget se může nacházet na pevném místě, což činí tento útok jednoduchým a efektivním, s nastavením obecně jednodušším a přenosnějším než ten, který potřebuje obyčejný návratově orientované programování technika.[1]

Programování orientované na sigreturn lze považovat za divný stroj protože umožňuje provádění kódu mimo původní specifikaci programu.[1]

Pozadí

Sigreturn-orientované programování (SROP) je technika podobná návratově orientované programování (ROP), protože zaměstnává opětovné použití kódu k provedení kódu mimo rámec původního toku řízení. V tomto smyslu musí být protivník schopen provést a rozbíjení zásobníku útok, obvykle prostřednictvím přetečení vyrovnávací paměti zásobníku, přepsat zpáteční adresu obsaženou uvnitř zásobník volání.

Stack hopping využívá

Pokud mechanismy jako prevence provádění dat jsou zaměstnáni, nebude možné, aby útočník pouze umístil a shell kód na zásobníku a způsobí, že ho počítač provede přepsáním zpáteční adresy. S takovými ochranami na místě stroj nespustí žádný kód přítomný v paměťových oblastech označených jako zapisovatelné a nespustitelné. Útočník proto bude muset znovu použít kód již existuje v paměti.

Většina programů neobsahuje funkce, které útočníkovi umožní přímo provést požadovanou akci (např. Získat přístup k a skořápka ), ale potřebné pokyny jsou často rozptýleny po paměti.[6]

Návratově orientované programování vyžaduje, aby tyto sekvence instrukcí, nazývané gadgety, byly zakončeny a RET návod. Tímto způsobem může útočník zapsat posloupnost adres pro tyto gadgety do zásobníku, a jakmile a RET je provedena instrukce v jednom gadgetu, řídicí tok bude pokračovat k dalšímu gadgetu v seznamu.

Mechanismus obsluhy signálu

Skládejte obsah při zpracování signálu (linux x86 / 64) včetně struktury sigcontext

Tento útok je umožněn tím, jak signály jsou zpracovány ve většině POSIX systémy podobné. Kdykoli je doručen signál, jádro musí kontextový přepínač do instalovaného ovladače signálu. K tomu jádro uloží aktuální kontext spuštění do rámečku na zásobníku.[5][6]Struktura tlačená do zásobníku je variantou architektury specifické pro architekturu sigcontext struktura, která obsahuje různá data zahrnující obsah registrů v okamžiku přepnutí kontextu. Po dokončení zpracování obslužné rutiny signálu se sigreturn () je voláno systémové volání.

Volání návrat syscall znamená možnost snadno nastavit obsah registrů pomocí jediného gadgetu, který lze snadno najít na většině systémů.[1]

Rozdíly od ROP

Existuje několik faktorů, které charakterizují využití SROP a odlišují ho od klasického využití programování orientovaného na návrat.[7]

Za prvé, ROP je závislý na dostupných gadgetech, které se mohou odlišovat velmi odlišně binární soubory, čímž jsou řetězce gadgetů nepřenosné.Randomizace rozložení adresového prostoru (ASLR) ztěžuje používání gadgetů bez únik informací získat jejich přesnou pozici v paměti.

Ačkoli Turing-kompletní Existují překladače ROP,[8] vytvoření ROP řetězce je obvykle netriviální.[7]

Exploze SROP jsou obvykle přenosné napříč různými binárními soubory s minimálním nebo žádným úsilím a umožňují snadné nastavení obsahu registrů, což by mohlo být netriviální nebo nerealizovatelné pro exploity ROP, pokud nejsou k dispozici potřebné gadgety.[6]Kromě toho SROP vyžaduje minimální počet gadgetů a umožňuje konstrukci efektivních kódů prostředí řetězením systémových volání. Tyto gadgety jsou vždy přítomny v paměti a v některých případech jsou vždy na pevných místech:[7]

seznam gadgetů pro různé systémy
OSASLRPřístrojMapa pamětiUmístění pevné paměti
Linux i386Anonávrat[vdso]
Linux <3.11 ARMNenávrat[vektory]0xffff0000
Linux <3,3 x86-64NeSyscall a návrat[vsyscall]0xffffffffff600000
Linux ≥ 3,3 x86-64AnoSyscall a návratLibc
Linux x86-64AnonávratLibc
FreeBSD 9,2 x86-64Nenávrat0x7ffffffff000
Mac OSX x86-64AnonávratLibc
iOS ARMAnonávratLibsystem
iOS ARMAnoSyscall a návratLibsystem

Útoky

Linux

Příklad druhu gadgetu potřebného pro SROP exploits lze vždy najít v VDSO paměťová oblast na x86-Linux systémy:

__kernel_sigreturn proc u:pop     eaxmov     eax, 77hint     80h  ; LINUX - sys_sigreturnnopLea     esi, [esi+0]__kernel_sigreturn endp

Na některých Linuxové jádro verze ASLR lze deaktivovat nastavením limitu pro velikost zásobníku na neomezenou,[9] účinně obchází ASLR a umožňuje snadný přístup k miniaplikaci přítomné ve VDSO.

U linuxových jader před verzí 3.3 je také možné najít vhodný gadget na stránce vsyscall, což je mechanismus k urychlení přístupu k určitým systémovým voláním, které často používají starší programy, a nachází se vždy na pevném místě.

Turingova úplnost

Pomocí miniaplikací je možné zapisovat do obsahu rámců zásobníku, čímž vytváříme a samočinně se měnící program. Pomocí této techniky je možné vymyslet jednoduchou virtuální stroj, který lze použít jako cíl kompilace pro a Turing-kompletní Příklad takového přístupu lze najít v Bosmanově práci, která demonstruje konstrukci tlumočníka pro jazyk podobný jazyku Programovací jazyk Brainfuck Jazyk poskytuje programové počítadlo PC, ukazatel paměti Pa dočasný registr používaný pro 8bitové přidání A. To znamená, že také složité zadní vrátka lze vymyslet zamlžené útoky.[1]

Obrana a zmírnění

Existuje řada technik ke zmírnění SROP útoků, na které se lze spolehnout randomizace rozvržení adresního prostoru, kanáry a cookies nebo stíny.

Randomizace rozložení adresového prostoru

Randomizace rozložení adresového prostoru ztěžuje použití vhodných gadgetů tím, že jejich umístění je nepředvídatelné.

Signální cookies

Volalo zmírnění SROP signalizovat cookies bylo navrženo. Skládá se ze způsobu ověření, že struktura sigcontextu nebyla změněna pomocí náhodného souboru cookie XORed s adresou umístění zásobníku, kde má být uložen. Tímto způsobem návrat syscall potřebuje pouze ověřit existenci cookie na očekávaném místě, účinně zmírnit SROP s minimálním dopadem na výkon.[1][10]

Emulace Vsyscall

Ve verzích jádra Linux vyšších než 3,3 je emulováno rozhraní vsyscall a jakýkoli pokus o přímé spuštění gadgetů na stránce bude mít za následek výjimku.[11][12]

RAP

Grsecurity je sada oprav pro Linuxové jádro posílit a zlepšit zabezpečení systému.[13] Zahrnuje takzvanou Return-Address Protection (RAP), která pomáhá chránit před útoky na opakované použití kódu.[14]

SEČ

Od roku 2016 Intel vyvíjí a Technologie prosazování regulačního toku (SEČ), abychom pomohli zmírnit a zabránit zneužití zásobníku. CET funguje implementací stínového zásobníku v RAM, který bude obsahovat pouze zpáteční adresy chráněné CPU jednotka správy paměti.[15][16]

Viz také

Reference

  1. ^ A b C d E F Bosman, Erik; Bos, Herbert (2014). „Rámování signálů - návrat k přenosnému shellkódu“ (PDF). SP '14 Proceedings of the IEEE Symposium on Security and Privacy: 243–358. doi:10.1109 / SP.2014.23. ISBN  978-1-4799-4686-0. Citováno 2016-06-16.
  2. ^ „Ocenění v rámci sympozia IEEE 2014 o bezpečnosti a soukromí“. Zabezpečení IEEE. Technický výbor IEEE Computer Society pro bezpečnost a soukromí. Citováno 2016-06-17.
  3. ^ „Linux Cross Reference - sigcontext.h“.
  4. ^ „SIGRETURN (2) - Linux manual page“.
  5. ^ A b „Hra se signály: Přehled programování orientovaného na Sigreturn“. Citováno 2016-06-21.
  6. ^ A b C „Sigreturnovo orientované programování a jeho zmírnění“. Citováno 2016-06-20.
  7. ^ A b C Bosman, Erik; Boste, Herberte. „Framing Signals: a return to portable shellcode“ (PDF).
  8. ^ "ROPC - Turing kompletní kompilátor ROP (část 1)".
  9. ^ „CVE-2016-3672 - Unlimiting the stack not longer disables ASLR“. Citováno 2016-06-20.
  10. ^ „Sigreturnovo orientované programování a jeho zmírnění“. Citováno 2016-06-20.
  11. ^ „On vsyscalls and the vDSO“. Citováno 2016-06-20.
  12. ^ „Hack.lu 2015 - Stackstuff 150: Proč a jak funguje emulace vsyscall?“. Citováno 2016-06-20.
  13. ^ "Zabezpečení jádra Linuxu (SELinux vs AppArmor vs Grsecurity)".
  14. ^ „RAP: RIP ROP“ (PDF). Citováno 2016-06-20.
  15. ^ „RIP ROP: Chytrá zápletka společnosti Intel, která má zabíjet exploity využívající stack-hopping na úrovni CPU“. Citováno 2016-06-20.
  16. ^ „Náhled technologie Control-Flow-Enforcement“ (PDF).

externí odkazy