Top Banner
Bezpieczeństwo WebView w systemie iOS Łukasz Pilorz Spotkanie OWASP Kraków, 29 stycznia 2014
54

WebView security on iOS (PL)

Dec 05, 2014

Download

Technology

lpilorz

OWASP Kraków, January 2014
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: WebView security on iOS (PL)

Bezpieczeństwo WebView w systemie iOS

Łukasz Pilorz"!

Spotkanie OWASP Kraków, 29 stycznia 2014

Page 2: WebView security on iOS (PL)

Podziękowania:

browser-shredders.blogspot.com Mike Tigas

Page 3: WebView security on iOS (PL)

Teoria

Page 4: WebView security on iOS (PL)

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString:@“http://example.com“] ] ];

Page 5: WebView security on iOS (PL)
Page 6: WebView security on iOS (PL)

!

- loadRequest: !

- loadHTMLString:baseURL: !

- loadData:MIMEType:textEncodingName:baseURL: !

- stringByEvaluatingJavaScriptFromString: !

- goBack !

- goForward !

- stopLoading !

- reload

Page 7: WebView security on iOS (PL)

!id<UIWebViewDelegate> delegate"!NSURLRequest request"!UIDataDetectorTypes dataDetectorTypes"!enum { UIDataDetectorTypePhoneNumber = 1 << 0, UIDataDetectorTypeLink = 1 << 1, UIDataDetectorTypeAddress = 1 << 2, UIDataDetectorTypeCalendarEvent = 1 << 3, UIDataDetectorTypeNone = 0, UIDataDetectorTypeAll = NSUIntegerMax } !… !https://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html

Page 8: WebView security on iOS (PL)

UIWebViewDelegate

– webView:shouldStartLoadWithRequest:navigationType:

– webViewDidStartLoad:

– webViewDidFinishLoad:

– webView:didFailLoadWithError:

Pytania:Jak odróżnić nawigację w głównym dokumencie od nawigacji w ramce?Jak zablokować wyświetlanie obrazków lub uruchomienie JavaScript?Czy po webViewDidStartLoad może nie nastąpić webViewDidFinishLoad?Czy przed webViewDidFinishLoad może nie nastąpić webViewDidStartLoad?

Page 9: WebView security on iOS (PL)

Ograniczenia• Brak Nitro

• Brak obsługi HTTP 401

• Brak opcji wyłączenia JavaScript

• [Dotyczy też Safari]Content-Disposition: attachment; filename=“download.html”Content-Type: text/plain- zgadnijcie, jak zachowa się UIWebView? (więcej informacji w CVE-2011-3426)

• Blokuje JavaScript podczas przewijania

• Ograniczona obsługa atrybutu target i window.open() ~ document.location.assign()

• Brak obsługi RSS

Page 10: WebView security on iOS (PL)

Praktyka

Page 11: WebView security on iOS (PL)

Zalety• Aktualizacja treści bez aktualizacji w App Store

• HTML5 + JavaScript + CSS

• Możliwość wykorzystania tego samego kodu na wielu platformach (+ Apache Cordova / PhoneGap)

• .html / .key / .numbers / .pages / .xls / .pdf / .ppt / .doc / .rftd.zip / .rtf

• Automatyczna weryfikacja certyfikatów SSL

• Automatyczne narzucenie zasad Same Origin Policy… w nietypowej wersji

Page 12: WebView security on iOS (PL)

Typowe zalecenia bezpieczników• “Ensure that all UIWebView calls do not execute without proper input validation. Apply filters

for dangerous JavaScript characters if possible, using a whitelist over blacklist character policy before rendering. If possible call mobile Safari instead of rending inside of UIWebView which has access to your application.” (OWASP Mobile Top 10)

• “[…] maintain control of all UIWebView content and pages, and prevent the user from accessing arbitrary, untrusted web content.” (OWASP iOS Developer Cheat Sheet)

• “Inspect remote content via the use of the NSData class method dataWithContentsOfURL in an attempt to prohibit the loading of malicious script into a UIWebview. Do not load content remotely and then process the data returned before passing to a UIWebview (if at all avoidable) otherwise you grant local file system access to any malicious script that smuggles itself past your content inspectors.” (MWR Labs blog)

• Hmmm… Brzmi groźnie :-)

Page 13: WebView security on iOS (PL)

UIWebView w aplikacjach iOS• Chrome

• Coast

• Facebook

• SkyDrive

• Skype

• WinZip

• i setki innych

Page 14: WebView security on iOS (PL)

Bezpieczny UIWebView - jak się do tego zabrać?

Wymagania:

• bez redukowania planowanej funkcjonalności

• bez poświęcania tygodni na budowanie filtrów treści (i kolejnych na utrzymanie i poprawki)

• tak, by zabezpieczenia wymagały małej ilości kodu

• skutecznie

Page 15: WebView security on iOS (PL)

Krok 1

Prawdopodobnie NIE, jeśli to mobilna bankowość: http://blog.ioactive.com/2014/01/personal-banking-apps-leak-info-

through.html (20 z 40 testowanych aplikacji bankowości elektronicznej dla iOS jest podatnych na XSS w UIWebView)

Czy w Twojej aplikacji potrzebny jest UIWebView?

TAK !

NIE

“Nie tych robotów szukamy.Możesz wracać do swoich zajęć.”

Page 16: WebView security on iOS (PL)

Krok 2Czy dokumenty, które zamierzasz wyświetlać,

muszą być wyświetlane w Twojej aplikacji?

TAK !

!

!

NIE !

Wykorzystaj Safari, Chrome (x-callback-url?)

lub inną przeglądarkę

Page 17: WebView security on iOS (PL)

Krok 3Czy dane prezentowane w UIWebView

są ładowane bezpośrednio przez HTTP?

TAK - loadRequest(…)

!

Wykorzystaj https:// !

Nie wyłączaj walidacjicertyfikatów SSL

NIE - dane przekazywane lub

modyfikowane lokalnie !

!

Pamiętaj, aby ustawić baseURL"

Page 18: WebView security on iOS (PL)

!

- loadRequest: !

- loadHTMLString:baseURL: !

- loadData:MIMEType:textEncodingName:baseURL: !

- stringByEvaluatingJavaScriptFromString: !

- goBack !

- goForward !

- stopLoading !

- reload

Page 19: WebView security on iOS (PL)

baseURL vs Same Origin Policy• file:/// ma uprawnienia do odczytu lokalnych plików i dowolnych

adresów URL (np. https://accounts.google.com) - niebezpieczne!

• nil/NULL == applewebdata:, uprawnienia jak file: - niebezpieczne!

• domyślnie UIWebView przyjmuje file:// (czyli @“test” == @“file://test”)

• dla http(s):// obowiązują standardowe zasady Same Origin Policy

• dla about: i data: również, bez kontekstu domeny

Page 20: WebView security on iOS (PL)

<script>a = document.location.href.split('/');if(a[0]==='file:') { path = ‘file:///'+a[3]+'/'+a[4]+'/'+a[5]+'/'+a[6]+'/'+a[7] +'/Library/Cookies/Cookies.binarycookies'; x = new XMLHttpRequest(); x.open('GET', path, false); x.send(); alert(x.responseText); }</script>

Page 21: WebView security on iOS (PL)

[webView loadHTMLString: [NSString stringWithContentsOfFile:@“/sciezka/do/pliku.html” encoding:NSUTF8StringEncoding error:&error] baseURL:[NSURL URLWithString:@“about:blank”]];

!

Potencjalny problem: obrazki, CSS itd. nie zostaną wczytane z file:///

Page 22: WebView security on iOS (PL)

Przykład: Chrome dla iOS

Page 23: WebView security on iOS (PL)

<!-- CVE-2012-2899 --> !

<script> function test() { pop = window.open('about:blank', '_blank'); pop.document.write( '<script>document.write(document.location)</scr' +'ipt><br><iframe src=“http://example.com/“' +'onload="alert(this.contentDocument.body.innerHTML)"></iframe>' ); } </script> <input type="button" onclick="test()" value=“Click">

Page 24: WebView security on iOS (PL)
Page 25: WebView security on iOS (PL)

Przykład: Coast by Opera

Page 26: WebView security on iOS (PL)
Page 27: WebView security on iOS (PL)
Page 28: WebView security on iOS (PL)

http://www.youtube.com/watch?v=_J-qe61_tAQ

Demo

Page 29: WebView security on iOS (PL)
Page 30: WebView security on iOS (PL)
Page 31: WebView security on iOS (PL)

Krok 4Czy UIWebView będzie prezentował dokumenty,

nad których treścią masz kontrolę?

TAK - mam kontrolę nad treścią

!

Upewnij się, że wyświetlane dokumenty nie są podatne na XSS

(DOM-based!)

NIE - nie mam kontroli nad treścią

!

Upewnij się, że użytkownik może rozpoznać źródło pochodzenia

!

Zastosuj CSP lub HTML Sandbox

Page 32: WebView security on iOS (PL)

Interfejs użytkownika• wyraźne rozdzielenie zaufanej i niezaufanej treści

• pasek adresu z aktualnym URLwebView.request.mainDocumentURL.absoluteStringvs[webView stringByEvaluatingJavaScriptFromString:@"window.location.href"]

• wskaźnik SSL

• ostrzeżenie przed pierwszym wyświetleniem niezaufanego pliku

• inne pomysły?

Page 33: WebView security on iOS (PL)
Page 34: WebView security on iOS (PL)
Page 35: WebView security on iOS (PL)

Cross-Site Scripting

• Stored (po stronie serwera lub iOS)

• Reflected (uwaga na URL scheme handlers)

• DOM-based (!)

• [webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerText='%@'", input]];

Page 36: WebView security on iOS (PL)

Cross-Site Scripting/JavaScript Injectioninput: ';alert(0)//🌙ꆁ

!

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerText='%@'", input]];

!

document.body.innerText='';alert(0)//🌙ꆁ'

Page 37: WebView security on iOS (PL)
Page 38: WebView security on iOS (PL)

- (NSString*) escapeForJavaScript:(NSString*)fromString { NSString *toString = @""; for(int i=0;i<fromString.length;i++) { toString = [NSString stringWithFormat:@“%@\\u%04X", toString, [fromString characterAtIndex:i] ]; } return toString; }

Page 39: WebView security on iOS (PL)

escapeForJavaScriptinput: ‘;alert(0)//🌙ꆁ !

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerText='%@'", [self escapeForJavaScript:input] ]];

document.body.innerText='\u0027\u003B\u0061\u006C\u0065\u0072\u0074\u0028\u0030\u0029\u002F\u002F\uD83C\uDF19\uA181'

Page 40: WebView security on iOS (PL)
Page 41: WebView security on iOS (PL)

innerHTML

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerHTML='%@'", [self escapeForJavaScript:input] ]]; !

Pytanie: dlaczego powyższy kod nie jest bezpieczny?

Page 42: WebView security on iOS (PL)

innerHTMLinput: <img src=x onerror=alert(0)> !

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"document.body.innerHTML='%@'", [self escapeForJavaScript:input] ]];

document.body.innerHTML='\u003C\u0069\u006D\u0067\u0020\u0073\u0072\u0063\u003D\u0078\u0020\u006F\u006E\u0065\u0072\u0072\u006F\u0072\u003D\u0061\u006C\u0065\u0072\u0074\u0028\u0030\u0029\u003E'

Page 43: WebView security on iOS (PL)
Page 44: WebView security on iOS (PL)

Krok 5Dodatkowe zabezpieczenia

Filtrowanie dopuszczonych URL !

http https data

about

Wyłączanie JavaScript!

Content-Security-Policy HTML5 Sandbox

!

Co może pójść nie tak?

Page 45: WebView security on iOS (PL)

[webView loadRequest: [NSURLRequest requestWithURL: [NSURL URLWithString:@“https://unknown.tld/untrusted.php“] ]];

Page 46: WebView security on iOS (PL)

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response { NSMutableDictionary *mHeaders = [NSMutableDictionary dictionary]; NSString *CSP = @"default-src 'none'; img-src *;style-src 'unsafe-inline' *;child-src *;frame-src *;sandbox allow-forms allow-top-navigation"; for(id h in response.allHeaderFields) { if(![[h lowercaseString] isEqualToString:@"content-security-policy"] && ![[h lowercaseString] isEqualToString:@"x-webkit-csp"]) { [mHeaders setObject:response.allHeaderFields[h] forKey:h]; } } [mHeaders setObject:CSP forKey:@"Content-Security-Policy"]; [mHeaders setObject:CSP forKey:@"X-Webkit-CSP"]; NSHTTPURLResponse *mResponse = [[NSHTTPURLResponse alloc] initWithURL:response.URL statusCode:response.statusCode HTTPVersion:@"HTTP/1.1" headerFields:mHeaders ]; [self.client URLProtocol:self didReceiveResponse:mResponse cacheStoragePolicy:NSURLCacheStorageNotAllowed ]; }

?

Page 47: WebView security on iOS (PL)

//<UIWebViewDelegate>- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if([request.URL.scheme isEqualToString:@"http" || [request.URL.scheme isEqualToString:@"https"] || [request.URL.scheme isEqualToString:@"about"] || [request.URL.scheme isEqualToString:@“data”]) { return YES; } return NO;}

Pytanie: Czy powyższy kod zablokuje odnośniki javascript:?

Page 48: WebView security on iOS (PL)

Krok 6O czym zapomnieliśmy?

Pentest

Cordova/PhoneGap !

i inne “mostki” Javascript/Objective-C

Page 49: WebView security on iOS (PL)

Page 50: WebView security on iOS (PL)

Linki(OWASP)

• https://www.owasp.org/index.php/IOS_Application_Security_Testing_Cheat_Sheet

• https://www.owasp.org/index.php/IOS_Developer_Cheat_Sheet

!

(iOS)

• http://www.apple.com/business/accelerator/develop/security.html & https://developer.apple.com/videos/wwdc/2010/

• http://stackoverflow.com/questions/3496505/differences-between-uiwebview-and-mobile-safari

!

(CSP)

• https://www.owasp.org/images/2/2b/Oxdef_csp_poland.pdf & http://niebezpiecznik.pl/OWASP2013-Krakow-CSP.pdf

• http://lists.w3.org/Archives/Public/public-webappsec/2012Mar/0043.html

Page 51: WebView security on iOS (PL)
Page 52: WebView security on iOS (PL)

http://browser-shredders.blogspot.com

Teaser: Breaking iOS browsers (before it will be cool ;-)

Page 54: WebView security on iOS (PL)