Prezentacja z konferencji Mobilization 2014.
Abstrakt:
Na rzeczywistych przykładach pokażę jak wygląda proces oceny bezpieczeństwa aplikacji mobilnych. Zobaczymy m.in. jak wykrywać słabości związane z przechowywaniem danych na urządzeniu, nieprawidłowości w transmisji, oraz najgroźniejsze - błędy w API po stronie serwera (np. błędy logiczne, kontroli dostępu, REST). Jednocześnie okaże się jakie techniki utrudniają ataki, jaki jest faktyczny wpływ na ryzyko poszczególnych podatności, oraz jakie zabezpieczenia warto zastosować w różnych aplikacjach.
2. Dzień dobry!
Pentester / konsultant bezpieczeństwa
Sławomir Jasek
Od 2003 roku:
Ocena bezpieczeństwa aplikacji, systemów, sieci...
Najskuteczniej pomagamy już od etapu projektowania.
3. Co będzie
● Spojrzenie pentestera (= intruza) na aplikacje mobilne
● Testowanie – na przykładach głównie Android
– Analiza paczki i kodu
– Dane zapisywane w urządzeniu i w logach
– RPC
– Transmisja
– API
● Podsumowanie
5. Jak?Inna aplikacja na
urządzeniu
Kradzież, zgubienie
urządzenia, przypadkowy
dostęp, inna aplikacja...
Podatności systemu
Social engineering,
słabości użytkowników
np. słabe hasło, zbyt
trudne mechanizmy
Ataki na
transmisję -
podsłuch,
słabości SSL
API – błędy kontroli
dostępu, logiczne,
konfiguracji...
Analiza
paczki
6. Kto?
„grubszy cwaniak”
„script-kiddie”
Krzysztof Jarzyna
ze Szczecina
Dorwał się do narzędzi,
wali na oślep, zwykle nie
bardzo rozumiejąc co się
dzieje.
Coś mu się przypadkiem
udało (lub nie), i afera
gotowa.
Ma motywację, zasoby
oraz możliwości
przeprowadzenia ataku
nakierowanego
7. Po co?
● Jak to po co?
Bo może!
● Dla sławy!
● Dla satysfakcji
● Dla pieniędzy
● Dla innych korzyści
● ... https://www.flickr.com/photos/viirok/2498157861
9. Paczka aplikacji
● Android
– Aplikacje bez root
np. „My App Sharer”
– APK Leecher
– Playdrone – masowe
pobieranie do chmury
– (nie wspominając root)
● iOS, inne – DRM nie jest problemem
11. Analiza kodu
● Do ataku jakiegoś procesu przydaje się rozumieć
jak on działa
● Własna kryptografia, błędy implementacji...
● Hasła, klucze, tokeny zaszyte w aplikacji
Np. tokeny FB, Google, MS, Yahoo i Linkedin aplikacji Airb2b – 10 milionów użytkowników
http://viennot.com/playdrone.pdf
● Tak, znaleźliśmy token FB w aplikacji ;)
12. Przykład
● Przesyłanie mailem danych do „bazy” –
support@pewnafirma.com
● Założenie : wysyłamy bezpośrednio przez nasz serwer
pocztowy – mail.pewnafirma.com, nie angażujemy kont
użytkownika
● Serwer oczywiście nie jest open-relayem, do wysłania maila
wymaga uwierzytelnienia
● Hasło zaszyte w aplikacji
● Co możemy zrobić? (oprócz wysyłania spamu)
To samo hasło do POP3 = dostęp do skrzynki!
13. Wytęż wzrok i znajdź klucz „szyfrujący”
w zaobfuskowanym kodzie
public final class a
implements b
{
private static final char[] a = { 67,72,65,82,84,79,83,67,72,76,85,68,78,73,69 };
private static void a(char[] paramArrayOfChar, char paramChar)
{
paramArrayOfChar[0] = paramChar; int i = 0;
if (i < paramArrayOfChar.length)
{
if (i % 2 == 0) { paramArrayOfChar[i] = a[(i % a.length)]; }
for (;;)
{
i++; break; paramArrayOfChar[0] = paramChar;
}
}
}
14. Wytęż wzrok i znajdź klucz „szyfrujący”
w zaobfuskowanym kodzie
public final class a
implements b
{
private static final char[] a = { 67,72,65,82,84,79,83,67,72,76,85,68,78,73,69 };
private static void a(char[] paramArrayOfChar, char paramChar)
{
paramArrayOfChar[0] = paramChar; int i = 0;
if (i < paramArrayOfChar.length)
{
if (i % 2 == 0) { paramArrayOfChar[i] = a[(i % a.length)]; }
for (;;)
{
i++; break; paramArrayOfChar[0] = paramChar;
}
}
}
„CHARSCHLUDNIE”
19. Logi, cache...
● Dość często zawierają pełne żądania HTTP,
wprowadzane klawisze – np. hasło użytkownika
INSERT INTO "cfurl_cache_response"
VALUES(2,0,1594297610,0,'http://dev/service/auth/createFirstSession?password=35
971831&sessionId=857006 &userId=24384344','1970-01-21 23:03:36');
20. Logi, cache...
● Dość często zawierają pełne żądania HTTP,
wprowadzane klawisze – np. hasło użytkownika
I/System.out( 1098): BaseActivity calling: /login onResponseData:
{"response":{"mask":"c794ffa2ffbdffc180ff41ff","phi":"/(...)
D/InputEventConsistencyVerifier( 1098): 0: sent at 6529438000000, KeyEvent { action=ACTION_UP,
keyCode=KEYCODE_3, scanCode=4, metaState=0, flags=0x8, repeatCount=0, eventTime=6529438,
downTime=6529371, deviceId=0, source=0x301 }
D/InputEventConsistencyVerifier( 1098): 0: sent at 6532144000000, KeyEvent { action=ACTION_UP,
keyCode=KEYCODE_5, scanCode=6, metaState=0, flags=0x8, repeatCount=0, eventTime=6532144,
downTime=6532032, deviceId=0, source=0x301 }
D/InputEventConsistencyVerifier( 1098): 0: sent at 6534378000000, KeyEvent { action=ACTION_UP,
keyCode=KEYCODE_7, scanCode=8, metaState=0, flags=0x8, repeatCount=0, eventTime=6534378,
downTime=6534277, deviceId=0, source=0x301 }
D/InputEventConsistencyVerifier( 1098): 0: sent at 6536876000000, KeyEvent { action=ACTION_UP,
keyCode=KEYCODE_0, scanCode=11, metaState=0, flags=0x8, repeatCount=0, eventTime=6536876,
downTime=6536811, deviceId=0, source=0x301 }
I/System.out( 1098): BaseActivity calling: /login/maskedPassword onResponseData:
{"response":{"state":"A","authenticated":true},"msgId":"1344674218830418930","errorCode":0,"time"
:1351588394408,"errorDesc":""}
21. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
22. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
23. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
24. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
25. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
26. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
27. Logi, cache – skutki
● Warunki wykorzystania trudne do spełnienia
– Kto może te logi czytać?
– Jak długo są przetrzymywane?
– Czy problem dotyczy tylko jednego feralnego builda?
– Czy problem występuje na wszystkich wersjach OS?
– Jakie dodatkowe warunki muszą być spełnione?
– ...
● Ale to może nie mieć żadnego znaczenia w obliczu
klęski wizerunkowej – np. Starbucks, styczeń 2014
40. Przechwytywanie ruchu
● Local proxy – co się dzieje „na łączu” (np. żądania HTTP)
– Burp: wersja darmowa na początek wystarczy
portswigger.net/burp
– Fiddler – MS
www.telerik.com/fiddler
– wiele innych
● Emulator przez proxy:
emulator -avd emu -http-proxy 127.0.0.1:8080
www.telerik.com/fiddler/
42. Co zrobi klient?
● Jeśli ten sam certyfikat byłby
podpisany innym CA?
[POWINIEN] wyświetlić
ostrzeżenie, przerwać
transmisję...
Zaakceptuje bez
mrugnięcia.
CA nie jest w
zaufanych
CA w zaufanych
43. Certyfikaty CA zaszyte w urządzeniach
● Ćwiczenie: sprawdź jakie CA masz w swoim
telefonie
● Np. iOS8 ma m.in. certyfikaty rządów:
Chin: China Internet Network Information Center
Hong Kongu: Hongkong Post e-Cert.
Japonii: 3 CA
Holandii: 3 CA (PKIoverheid)
Taiwanu: Government Root Certification Authority
Turcji: Scientific and Technological Research Council of Turkey
USA: 5 CA, Department of Defense
44. SSL – „Man in the middle”
CA
?
Verisign
www.pewnafirma.pl
Verisign
www.pewnafirma.pl
45. Stosunkowo często...
sslcontext = SSLContext.getInstance("TLS");
atrustmanager = new TrustManager[1];
atrustmanager[0] = new EasyX509TrustManager(null);
sslcontext.init(null, atrustmanager, null);
Pusty TrustManager – akceptuje wszystkie certyfikaty
49. Mobile CAPTCHA
● Proces rejestracji, potwierdzanej SMS
● CAPTCHA w celu ograniczenia masowego
nadużycia procesu (koszty SMS, przeciążenie
systemu...)
● Należy kliknąć w odpowiedni obrazek (1 z 6)
50.
51. Mobile CAPTCHA
● Pomysł chybiony już w założeniach
– Prawdopodobieństwo trafienia „na ślepo” bardzo
wysokie
● W implementacji jeszcze gorzej
– Każdy obrazek to inny statyczny plik, intruz może je zindeksować
i ustalić w którym miejscu jest obrazek przedstawiający żądane
słowo
57. Historia pewnej aplikacji...
● Mnóstwo błędów kontroli dostępu
● Po zgłoszeniu dostawcy:
„Kontrola dostępu w aplikacji jest, tylko na
testowym środowisku wyłączona”
● Pomimo napiętych terminów włączyć się udało
dopiero po kilku tygodniach ;)