Milan Oulehla: Bezpečnost mobilních aplikací na Androidu

Post on 22-Jan-2018

68 views 2 download

transcript

MILAN OULEHLA Security researcher, Pentester, PT LAB - Penetration Testing LABoratory

Bezpečnost mobilních aplikací na

platformě Android

Úvod

Člen PT LAB – Penetration Testing Laboratory - http://ptlab.fai.utb.cz/oulehla/

Nezávislý konzultant v oblasti penetračního testování na mobilní platformě s důrazem na Android OS

Úvod

Spolupráce s OWASP (přednáška OWASP Czech Chapter Meeting)

Doktorské studiu na Fakultě aplikované informatiky Univerzity Tomáše Bati ve Zlíně

Výzkumu v oblastech aplikační bezpečnosti a detekci mobilního malware pomocí neuronových sítí.

Úvod

Přednáška je postavena na chybách ze skutečných aplikací.

Zdroje:

• PT LAB

• Má penetrační praxe

• Sledování programátorských fór (např. http://stackoverflow.com a další)

Úvod

NENÍ ZVEŘEJNĚNA ANI ČÁRKA Z ORIGINÁLNÍCH ZDROJOVÝCH KÓDŮ MÝCH ZÁKAZNÍKŮ NEBO ZÁKAZNÍKŮ PT LABU!

NEDOZVÍTE SE ANI IDENTITU APLIKACÍ ANI IDENTITU ZÁKAZNÍKŮ!

Vždy jsem si vzal princip dané zranitelnosti a vše jsem naprogramoval sám.

Úvod

Jedná se o skici => určité zjednodušení aby vynikla daná zranitelnost

Chráněná část aplikace, placená funkcionalita = aktivita

Útok pomocí syntaktické analýzy

Ukázat „kombajn“ na PasswordClass.apk Analýza 1: APKTool: APK --> *.smali Rekurzivní vyhledávání pomocí regulárních výrazů uvnitř souborů Analýza 2: Dex2jar: APK --> JAR Rekurzivní vyhledávání pomocí regulárních výrazů uvnitř souborů

Semiobfuskace

Samovysvětlující název: Semiobfuskovaný název:

třída: třída:

CheckCredentials ProcessTexts

metoda: metoda:

performAuthentication checkTextIntegrity

proměnná: proměnná:

password text_pattern

Log Leakage

3xZ: Zabezpečená síťová komunikace Zabezpečená mobilní aplikace Zapomenuté logy => Všechna práce se zabezpečováním • mobilních aplikací, • síťové komunikace, • serveru byla na nic!

Log Leakage

d(String tag, String msg, Throwable tr)

d(String tag, String msg)

...

e(String tag, String msg, Throwable tr)

e(String tag, String msg)

...

println(int priority, String tag, String msg)

Log Leakage

Zdroj: https://developer.android.com/reference/android/util/Log.html

Log Leakage

Ukázat Log Leakage na aplikaci

BestMaps9.apk

Log Leakage

Log Leakage

Single-Jump Attack

Cenná funkcionalita

Začátek

Ochranná část kódu

Single-Jump Attack

Cenná funkcionalita

Začátek

Ochranná část kódu

:navesti

goto :navesti

Single-Jump Attack

Princip aplikace BestGame6.apk

isFirstRun()?

Start MainActivity

Finish()

Vytvoří klíče a uloží je v KeyStore

/data/data/cz.utb.fai.bestgame6_ptlab/shared_prefs/app_protection.xml

rovnají se?

Rozšifrování passwd_key

pomocí klíče z KeyStore

Ne

Ne

Ano

Ano

Single-Jump Attack

Ukázat Single-Jump Attack na aplikaci BestGame6.apk

Multi-Jump Attack

Ochranná část kódu 1

Cenná funkcionalita 1

Začátek

Ochranná část kódu 2

Cenná funkcionalita 2

Ochranná část kódu 3

Cenná funkcionalita 3

Multi-Jump Attack

Ukázat Multi-Jump Attack na aplikaci:

RE2Multi-Jump.apk

• Nejprve nainstalovat a spustit původní app

• Pak teprve nainstalovat HACKED verzi

Negation Attack

Jeden z důvodů proč nepoužívat single factor authentication.

Negation Attack

Nezajímavý kód (např. nová výzva k zadaní

platného hesla) Cenná funkcionalita

Ověření

Úspěšné Neúspěšné

Nezajímavý kód (např. nová výzva k zadaní

platného hesla) Cenná funkcionalita

Ověření

Úspěšné Neúspěšné

Negation Attack

Princip aplikace BestMaps.apk

Přihlašovací údaje jsou ověřeny serverem Tady mimo aplikaci! Třída: ServerAuthentication Metoda performAuthentication() // public

Bylo ověření úspěšné?

NE

Opětovná výzva k zadaní přihlašovacích údajů

Login:user111 Password: heslo

ANO

Je spuštěna chráněná/placená část aplikace

Přihlašovací údaje jsou ověřeny serverem Tady mimo aplikaci! Třída: ServerAuthentication Metoda performAuthentication() // public

Bylo ověření úspěšné?

ANO!

Opětovná výzva k zadaní přihlašovacích údajů

Login:user111 Password: heslo

NE!

Je spuštěna chráněná/placená část aplikace

loginEditText = (EditText)findViewById(R.id.input_login); passwordEditText = (EditText)findViewById(R.id.input_password); ... ... public void checkCredentials_onClick(View v) { ServerAuthentication serverAuthentication = new ServerAuthentication(loginEditText.getText().toString(), passwordEditText.getText().toString()); if(serverAuthentication.performAuthentication()) { loginEditText.setText(""); passwordEditText.setText(""); Intent intent = new Intent(context, BestMapsActivity.class); startActivity(intent); } else { loginEditText.setText(""); passwordEditText.setText(""); Toast.makeText(context, "Wrong Credentials", Toast.LENGTH_LONG).show(); } }

Negation Attack

if(serverAuthentication.performAuthentication()) { // přihlašovaní údaje jsou platné // chráněná funkcionalita } else { // přihlašovaní údaje nejsou platné // výzva k opětovnému zadání přihlašovacích údajů }

Vrací: true = přihlašovaní údaje byly ověřeny false = přihlašovaní údaje nebyly ověřeny

Negation Attack

if(!serverAuthentication.performAuthentication())

{ // přihlašovaní údaje nejsou platné // chráněná funkcionalita } else { // přihlašovaní údaje jsou platné // výzva k opětovnému zadání přihlašovacích údajů }

Negation Attack

Ukázat Negation Attack na aplikaci

BestMaps.apk

Removal Attack

Ochranná část kódu

Cenná funkcionalita

Začátek

Cenná funkcionalita

Začátek

Spouští

Ne vždy lze použít Negation Attack, proto existuje Removal Attack, který je složitější ale mnohem ničivější

Pozor na PŘÉPSÁNÍ nebo ODSTRANĚNÍ aktivního obsahu registrů !!!

Removal Attack

Ukázat Removal Attack na aplikaci

BestMaps.apk

Pár slov na konec

• Neošetřené vstupy

• Nešifrovaná komunikace mezi mobilní aplikací a serverem

• Citlivé údaje nešifrované v lokální databázi

• Poskytovatelé obsahu bez korektního zabezpečení

Děkuji Vám za pozornost