Upload
kuba-brecka
View
446
Download
2
Tags:
Embed Size (px)
Citation preview
@kubabrecka www.kubabrecka.com
Jak moc je důležité, aby programátor uměl… � Objektově-orientované programování � Funkcionální programování � Překladače, teorie automatů � Složitost � Databáze � Sítě � UI/UX � Reverzní inženýrství
Ale vlastně…
� …pojďme se podívat, jak hluboko vede králičí nora
� Pokusím se zodpovědět některé trochu tabuizované otázky � privátní API � validace, review � binární podoba, šifrování aplikace � některé bezpečnostní důsledky
Co je cílem � Ukázat
� co s vaší aplikací zmůže Apple � co je vidět v binárce � co lze dělat s jailbreaknutým zařízením � kde se berou “cracknuté” aplikace � co dovede dostatečně odhodlaný “black hat”
� Ne: porušovat zákon � Disclaimer: pouze pro výukové účely � Disclaimer 2: rozhodně nejsem security
expert, jen se rád hrabu v kódu
Sandbox
� Každá aplikace má svůj sandbox � vidí svůj adresář + některé systémové � pro zápis má jen předem určené adresáře
� Nemá smysl mít file managery � Přenos souborů mezi aplikacemi ad-hoc
Jailbreak � Vypnutá kontrola podpisů u aplikací � Zrušený sandbox
� čtení i zápis kamkoliv do filesystemu (!) � Vypne ASLR � Zruší blokování syscallů
� fork, exec, … � Debugging, attach to process � Cydia � tethered (snadno), untethered (horko
těžko) � jailbreakaři si šetří vulnerability do foroty
Jailbreak iOS 6.1 – evasi0n
� http://theiphonewiki.com/wiki/Evasi0n
Privátní API � Hlavičkové soubory v Xcode jsou
“osekané” � řada skrytých tříd i metod � důvod ○ zveřejněné API je pro Apple závazné a musí ho
podporovat ○ Apple si chce nechat možnost měnit vnitřnosti
� Class-dump � http://stevenygard.com/projects/class-dump/ � https://github.com/nst/iOS-Runtime-Headers � vyextrahuje z binárky všechny třídy a metody
Method swizzling � Všechny selektory se volají přes dynamický
dispatch � lze nahradit metodu změnou záznamu v
tabulkách metod � http://darkdust.net/writings/objective-c/method-
swizzling - (BOOL)swizzled_synchronize { ... [self swizzled_synchronize]; ...}+ (void)load { Method original = class_getInstanceMethod(self, @selector(synchronize)); Method swizzled = class_getInstanceMethod(self, @selector(swizzled_synchronize)); method_exchangeImplementations(original, swizzled);}
Validace aplikace
� Co se přesně posílá do Applu? � Zkompilovaná binárka pro ARMv6 (?),
ARMv7, ARMv7s � Ne: zdrojový kód, binárka pro simulátor
� Co se s aplikací děje při validaci? � kontrola některých náležitostí aplikace ○ ikona, profil, plist, …
� kontrola privátního API
Review aplikace � Co se s aplikací děje při review?
� Oficiální informace: pouze nicneříkající App Store Review Guidelines
� <spekulace> ○ zdaleka ne tolik testování, kolik si myslíte ○ nemají zdrojový kód ○ validace + automatizované testy
� zátěz CPU, baterie ○ manuální testy
� jestli aplikace jde spustit, jestli alespoň něco dělá � nezkoušejí všechny funkce aplikace
○ jednotlivé týmy se chovají dost jinak ○ těžko zjistitelné porušení podmínek se řeší “ex post”
� až když je aplikace dostatečně populární, aby to někoho zajímalo � </spekulace>
FairPlay a šifrování aplikací � Aplikace z App Store jsou šifrované
� jen binárka, navíc po jednotlivých sekcích # otool -arch all -Vl ...cmd LC_ENCRYPTION_INFOcmdsize 20cryptoff 4096cryptsize 724992cryptid 1
� Zachované importy � Kernel při zavedení binárky ověří podpis a
dešifruje v paměti
Šifrovaná binárka
Kde vzít dešifrovanou binárku
� Různě po Internetu v souborech .ipa � AppTrackr a spol. � iReSign
� A když není k mání? � V podstatě jediná metoda je extrakce z
jailbreaknutého zařízení ○ spustíte aplikaci v gdb, zastavíte a dumpnete
dešifrovanou paměť
Pro srovnání – Android � Java, Dalvik, Dalvik VM, .apk soubory
� bajtkód (.dex) � nástroj dex2jar z něj udělá běžné .class soubory � poté stačí použít libovolný nástroj pro
dekompilaci Javy (je jich spousta) � Kde získat .apk?
� na Internetu � přímo ze zařízení ○ obvykle v tom nic nebrání, případně rootnout
� Ochrana: obfuskace � ale její účinnost je přinejmenším sporná
Realita � Získat .ipa nebo .apk je snadné � Získat informace z binárky je
� Android – při obfuskaci středně obtížné ○ ale je to Java, snadno se dekompiluje
� iOS – obvykle středně snadné, protože jsou téměř vždy k dispozici kompletní názvy metod a tříd ○ ale je to ARM assembly
� Upravit binárku je � Android – snadné � iOS – obtížné
Hackerův toolbox � IDA 6.3
� Podpora pro Obj-C � Demo verze pro Mac ○ x86 + ARM
� iFunBox � Free � používá iTunesí knihovny (ale na černo)
� Charles – Web Debugging Proxy Application � http://www.charlesproxy.com/, $50
IDA
� vynikající disassembler � ale hlavně mnohem víc � kompletní analýza binárky � dekompiler Hex-Rays ($$$)
� podpora Objective-C, ARM
Network intercepting � Charles Proxy
� http://charlesproxy.com/ � přehledné sledování všech spojení ○ parsuje JSON, XML, …
� Settings – Wi-Fi – (network) – HTTP Proxy – Manual � veškerý provoz je pak veden přes Charlese
� SSL � Charles má vygenerovaný kořenový certifikát ○ charles.crt, nainstalovat do zařízení
� http://charlesproxy.com/charles.crt ○ pak funguje jako man-in-the-middle
Co proti tomu dělat?
� Krátká odpověď: nic � Dlouhá odpověď:
� drtivá většina ochran je “security by obscurity”, prolomení je jen otázkou dostatečného odhodlání útočníka
� vyplatí se realistický přístup místo paranoidního ○ co nejhoršího se může stát?
Tipy a triky
� Chcete vědět, jak něco funguje? � Tak se podívejte! � /Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/
○ UIKit, QuartzCore, Foundation, CoreGraphics, CoreFoundation, …
� Nemějte falešné představy o bezpečnosti � Viz iFunBox
Otázky?
Děkuji za pozornost. Kuba Břečka
@kubabrecka www.kubabrecka.com