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