código aberto • Criada em 2011 por Mark Curphey • +42k de voluntários • Foco em segurança de aplicações, vulnerabilidades… • Publicam na área de segurança: ◦ Artigos ◦ Metodologias ◦ Documentações ◦ Ferramentas ◦ Tecnologias...
• MODE_WORLD_READABLE permite que todas aplicações acessem/leiam o conteúdo de key.xml • Aplicações compiladas em SDK < 17 podem ser afetadas, se rodar em Android < 4.2 (JELLY_BEAN_MR1)
"CREATE TABLE IF NOT EXISTS Accounts(Username VARCHAR,Password VARCHAR);"); notSoSecure.execSQL("INSERT INTO Accounts VALUES('admin','AdminPass');"); notSoSecure.close();
object with default implementations of a key chain KeyChain keyChain = new SharedPrefsBackedKeyChain( context, CryptoConfig.KEY_256); Crypto crypto = AndroidConceal.get().createDefaultCrypto(keyChain); // Check for whether the crypto functionality is available // This might fail if Android does not load libaries correctly. if (!crypto.isAvailable()) { return; }
new FileOutputStream(file)); // Creates an output stream which encrypts the data as // it is written to it and writes it out to the file. OutputStream outputStream = crypto.getCipherOutputStream( fileStream, Entity.create("entity_id")); // Write plaintext to it. outputStream.write(plainText); outputStream.close();
facilitado via USB quando habilitado modo “Transferir arquivos” • Arquivos não serão deletados quando o App for desinstalado • Não criptografado • O que fazer? Evitar/criptografar (Internal Storage)
com chave pública • Descriptografar com chave privada • É um container que armazena as chaves privadas • Criptografado com o PIN/Senha do usuário (lockscreen) • KeyStore é vulnerável se o Android for rooteado (Android precisa estar desbloqueado) /data/misc/keystore/
estar em ◦ Código fonte ◦ SharedPreferences ◦ Escondido no sistema de arquivos ◦ NDK dificulta, mas não garante • Podemos fazer o seguinte ◦ Pedir PIN/Senha para o usuário quando for ler informação sensível ◦ Armazenar no servidor e solicitar em tempo real (App. só vai funcionar online)
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(...); public static int wtf(...); }
é habilitado por padrão e enviado para Google Drive/Android Backup Service • Verificar se dados sensíveis estão criptografados • Desabilitar Backup caso não seja utilizado <application ... android:allowBackup="false"> </app>
e SDKs desconhecidos devem ser evitados ou analisados antes do uso • Nenhum ID que possa ser mapeado para uma conta ou sessão de usuário deve ser enviado para terceiros
via IPC • Se apenas sua aplicação vai utilizar esse mecanismo, utilizar LocalBroadcastManager android:exported="false" • Caso outras aplicações precisam receber esses dados, aplicar políticas de segurança utilizando <permission android:protectionLevel=["normal" | "dangerous" | "signature" | "signatureOrSystem"] />
screenshots continuamente em busca de dados sensíveis getWindow().setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); setContentView(R.layout.activity_main);
como login, senha, chaves de criptografia devem ser setadas para NULL imediatamente após uso • Utilizar objetos imutáveis para dados sensíveis, assim eles não poderão ser alterados
sensíveis, devem ser verificados algumas políticas de segurança ◦ PIN ou senha para desbloquear o dispositivo ◦ Versão mínima do Android ◦ Detecção de USB debugging ativo ◦ Detecção de dispositivo encriptado ◦ Detecção de dispositivo rooteado