Slide 1

Slide 1 text

SEGURANÇA NO ANDROID você está se preocupando com isso? Rafael Toledo @_rafaeltoledo

Slide 2

Slide 2 text

O QUE QUEREMOS? Muitos usuários Usuários que transacionam Dados para evoluir e melhorar o produto

Slide 3

Slide 3 text

PORÉM... Com grandes poderes vem grandes responsabilidades

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

OPS...

Slide 8

Slide 8 text

PODE ACONTECER PERTO DE VOCÊ

Slide 9

Slide 9 text

INCLUSIVE COM VOCÊ!

Slide 10

Slide 10 text

ANDROID Ambiente de execução inseguro: Root, Custom Roms, Custom Kernels, Custom Recoveries, Apps

Slide 11

Slide 11 text

ANÁLISE & ATAQUE

Slide 12

Slide 12 text

QARK Quick Android Review Kit Ferramenta simples de usar capaz de encontrar vulnerabilidades de segurança comuns em aplicativos Android github.com/linkedin/qark

Slide 13

Slide 13 text

QARK $ python qarkMain.py

Slide 14

Slide 14 text

QARK Analisar um APK local ou baixar um APK do device / emulador conectado via ADB (incluindo os apps do sistema) Procurar por problemas no Android Manifest Descompilar usando 3 ferramentas diferentes

Slide 15

Slide 15 text

QARK

Slide 16

Slide 16 text

APKTOOL / DEX2JAR / JD-GUI Ferramentas para descompilação e visualização do código descompilado (JD-GUI) ibotpeaches.github.io/apktool github.com/pxb1988/dex2jar jd.benow.ca

Slide 17

Slide 17 text

APKTOOL / DEX2JAR / JD-GUI Navegação manual nas pastas do projeto nos permite: - Descobrir frameworks / bibliotecas utilizadas - Obter chaves de SDK / Tokens de Acesso - Entender e descobrir lógicas de negócio - Descobrir e explorar vulnerabilidades no cliente e servidor

Slide 18

Slide 18 text

ACESSO ROOT Permite controle total sobre o dispositivo Acesso a dados de apps, até então protegidos shell@android:/ $ ls /data/data opendir failed, Permission denied shell@android:/ $ su root@android:/ # ls /data/data :)

Slide 19

Slide 19 text

ACESSO ROOT Ler e Modificar facilmente arquivos dos apps (Shared Preferences, Content Providers, SQLite) Instalar outras ferramentas como o Frida - www.frida.re Frida permite injetar código JavaScript para explorar apps nativos não só Android, como iOS, Windows, Mac, Linux...

Slide 20

Slide 20 text

DROZER "O Drozer permite assumir o papel de um aplicativo Android e interagir com outros aplicativos, por meio do mecanismo de Comunicação Inter-Processo (IPC) do Android e do sistema operacional subjacente" labs.mwrinfosecurity.com/tools/drozer

Slide 21

Slide 21 text

$ drozer console connect Selecting 8b4345b... (LGE Nexus 4 6.0.1) ... drozer Console (v2.3.4) dz> list ...exibe os módulos do drozer... DROZER analisando um app

Slide 22

Slide 22 text

DROZER analisando um app dz> run app.package.info -a com.example.app Package: com.example.app Application Label: App Exemplo Process Name: com.example.app Version: 1.0 Data Directory: /data/data/com.example.app APK Path: /data/app/com.example.app-1/base.apk UID: 10052 GID: [3003]

Slide 23

Slide 23 text

DROZER analisando um app Shared Libraries: null Shared User ID: null User Permissions: - android.permission.INTERNET - android.permission.ACCESS_WIFI_STATE ... Defines Permissions: - com.example.app.permission.C2D_MESSAGE

Slide 24

Slide 24 text

DROZER possibilidades de ataque dz> run app.package.attacksurface com.example.app Attack Surface: 13 activities exported 7 broadcast receivers exported 0 content providers exported 4 services exported

Slide 25

Slide 25 text

DROZER listando Activities exportadas dz> run app.activity.info -a com.example.app Package: com.example.app com.example.app.SignInActivity com.example.app.HomeActivity dz> run app.activity.start --component \ com.example.app com.example.app.HomeActivity

Slide 26

Slide 26 text

DEFESA

Slide 27

Slide 27 text

DETECÇÃO DE AMBIENTE debug public static boolean isDebuggable(Context context) { return (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; }

Slide 28

Slide 28 text

DETECÇÃO DE AMBIENTE emulador public static boolean isEmulator() { return Build.FINGERPRINT.startsWith("generic") || Build.FINGERPRINT.startsWith("unknown") || Build.MODEL.contains("google_sdk") || Build.MODEL.contains("Emulator") || Build.MODEL.contains("Android SDK built for x86") || Build.MANUFACTURER.contains("Genymotion") || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) || "google_sdk".equals(Build.PRODUCT) || "goldfish".equals(Build.HARDWARE); }

Slide 29

Slide 29 text

DETECÇÃO DE AMBIENTE origem da instalação public static boolean verifyInstaller(Context context) { final String installer = context.getPackageManager() .getInstallerPackageName(context.getPackageName()); return installer != null && installer.compareTo("com.android.vending") == 0; }

Slide 30

Slide 30 text

DETECÇÃO DE AMBIENTE root RootBeer Verifica a presença de binários, apps e propriedades no device que possam indicar root github.com/scottyab/rootbeer

Slide 31

Slide 31 text

Storage criptografado no estilo chave-valor Não implementa a interface SharedPreference Utiliza a Conceal do Facebook para criptografia github.com/facebook/conceal github.com/orhanobut/hawk STORAGE Hawk

Slide 32

Slide 32 text

compile 'com.orhanobut:hawk:2.0.1' // Application ou primeira Activity Hawk.init(context).build(); Hawk.put(key, T); T value = Hawk.get(key); STORAGE Hawk

Slide 33

Slide 33 text

Extensão do SQLite com criptografia AES-256 Possui versão para Android - e possui versão comercial www.zetetic.net/sqlcipher/sqlcipher-for-android/ compile 'net.zetetic:android-database-sqlcipher:3.5.7@aar' STORAGE SQLCipher - SQLite

Slide 34

Slide 34 text

// Application ou primeira Activity SQLiteDatabase.loadLibs(context); File databaseFile = getDatabasePath("demo.db"); databaseFile.mkdirs(); SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase( databaseFile, "test123", null); database.execSQL("create table t1(a, b)"); database.execSQL("insert into t1(a, b) values(?, ?)", new Object[]{"one for the money", "two for the show"}); STORAGE SQLCipher - SQLite

Slide 35

Slide 35 text

CWAC-SafeRoom github.com/commonsguy/cwac-saferoom Permite integrar o SQLCipher com o Room (Architecture Components) STORAGE SQLCipher - integração com Room

Slide 36

Slide 36 text

Utilizar protocolos de criptografia mais recentes - TLS 1.2 SSL Pinning - github.com/square/okhttp/wiki/HTTPS Preocupação com autenticação / autorização - lógica SEMPRE no servidor { "authenticated": true } // SQN! NETWORKING

Slide 37

Slide 37 text

NETWORKING OkHttp: TLS 1.2 ConnectionSpec connectionSpec = new ConnectionSpec.Builder( ConnectionSpec.MODERN_TLS) .tlsVersions(TlsVersion.TLS_1_2) // Android 4.1+ .build(); new OkHttpClient.Builder() .connectionSpecs(Collections.singletonList(connectionSpec)) .build();

Slide 38

Slide 38 text

NETWORKING OkHttp: Certificate Pinning CertificatePinner certificatePinner = new CertificatePinner.Builder() .add("api.myproduct.com", "sha256/...") .add("api.myproduct.com", "sha256/...") .add("api.myproduct.com", "sha256/...") .build(); new OkHttpClient.Builder() .certificatePinner(certificatePinner) .build();

Slide 39

Slide 39 text

SAFETYNET API do Play Services SafetyNet Attestation API SafetyNet Safe Browsing API SafetyNet reCAPTCHA API (11.x) SafetyNet Verify Apps API (11.x) developer.android.com/training/safetynet/index.html

Slide 40

Slide 40 text

www.guardsquare.com/en/proguard Otimiza, ofusca classes e remove código não utilizado Parte do Toolkit do Android getDefaultProguardFile('proguard-android.txt') OFUSCAÇÃO Proguard

Slide 41

Slide 41 text

www.guardsquare.com/en/proguard Otimiza, ofusca classes e remove código não utilizado Parte do Toolkit do Android getDefaultProguardFile('proguard-android-optimize.txt') OFUSCAÇÃO Proguard

Slide 42

Slide 42 text

www.guardsquare.com/dexguard Ofuscação pra valer do código-fonte e resources Utilitários (RootDetector, CertificateChecker, DebugDetector, EmulatorDetector, TamperDetector) Custa caro, mas dependendo da criticidade do seu app, é um investimento que se paga! OFUSCAÇÃO Dexguard

Slide 43

Slide 43 text

# Proguard -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int i(...); public static int w(...); public static int d(...); public static int e(...); } github.com/JakeWharton/timber LOGGING

Slide 44

Slide 44 text

FIQUEM ALERTAS!

Slide 45

Slide 45 text

RECOMENDAÇÕES www.crypto101.io Livro: Android Security Internals Livro: Hacking Android github.com/rafaeltoledo/android-security

Slide 46

Slide 46 text

Centro Av. Presidente Wilson, 231 - 29º andar (21) 2240-2030 Cidade Monções Av. Nações Unidas, 11.541 - 3º andar (11) 4119-0449 Savassi Av. Getúlio Vargas, 671 Sala 800 - 8º andar (31) 3360-8900 www.concrete.com.br speakerdeck.com/rafaeltoledo