3. 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í
4. 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
5. 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
6. 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
7. 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
9. 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
10. 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);
}
11. 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
12. 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>
13. 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_INFO
cmdsize 20
cryptoff 4096
cryptsize 724992
cryptid 1
ž Zachované importy
ž Kernel při zavedení binárky ověří podpis a
dešifruje v paměti
15. 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ěť
16. 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á
17. 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é
18. 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
19. IDA
ž vynikající disassembler
— ale hlavně mnohem víc
— kompletní analýza binárky
— dekompiler Hex-Rays ($$$)
ž podpora Objective-C, ARM
20.
21. 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
22. 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?
23. 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