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
![](http://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Sigret_stackframe.svg/170px-Sigret_stackframe.svg.png)
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]
OS | ASLR | Přístroj | Mapa paměti | Umístění pevné paměti |
---|---|---|---|---|
Linux i386 | ![]() | návrat | [vdso] | |
Linux <3.11 ARM | ![]() | návrat | [vektory] | 0xffff0000 |
Linux <3,3 x86-64 | ![]() | Syscall a návrat | [vsyscall] | 0xffffffffff600000 |
Linux ≥ 3,3 x86-64 | ![]() | Syscall a návrat | Libc | |
Linux x86-64 | ![]() | návrat | Libc | |
FreeBSD 9,2 x86-64 | ![]() | návrat | 0x7ffffffff000 | |
Mac OSX x86-64 | ![]() | návrat | Libc | |
iOS ARM | ![]() | návrat | Libsystem | |
iOS ARM | ![]() | Syscall a návrat | Libsystem |
Ú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 P
a 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é
- Rozhraní jádra Linuxu
- Zranitelnost (výpočet)
- Exploit (zabezpečení počítače)
- Přetečení zásobníku
- Randomizace rozložení adresového prostoru
- Ochrana spustitelného prostoru
- NX bit
Reference
- ^ 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.
- ^ „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.
- ^ „Linux Cross Reference - sigcontext.h“.
- ^ „SIGRETURN (2) - Linux manual page“.
- ^ A b „Hra se signály: Přehled programování orientovaného na Sigreturn“. Citováno 2016-06-21.
- ^ A b C „Sigreturnovo orientované programování a jeho zmírnění“. Citováno 2016-06-20.
- ^ A b C Bosman, Erik; Boste, Herberte. „Framing Signals: a return to portable shellcode“ (PDF).
- ^ "ROPC - Turing kompletní kompilátor ROP (část 1)".
- ^ „CVE-2016-3672 - Unlimiting the stack not longer disables ASLR“. Citováno 2016-06-20.
- ^ „Sigreturnovo orientované programování a jeho zmírnění“. Citováno 2016-06-20.
- ^ „On vsyscalls and the vDSO“. Citováno 2016-06-20.
- ^ „Hack.lu 2015 - Stackstuff 150: Proč a jak funguje emulace vsyscall?“. Citováno 2016-06-20.
- ^ "Zabezpečení jádra Linuxu (SELinux vs AppArmor vs Grsecurity)".
- ^ „RAP: RIP ROP“ (PDF). Citováno 2016-06-20.
- ^ „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.
- ^ „Náhled technologie Control-Flow-Enforcement“ (PDF).