{"id":343,"date":"2016-06-05T22:09:45","date_gmt":"2016-06-05T22:09:45","guid":{"rendered":"http:\/\/www.apmuga.com\/wordpress\/?p=343"},"modified":"2016-06-16T11:10:29","modified_gmt":"2016-06-16T11:10:29","slug":"seguranca-das-aplicacoes-android","status":"publish","type":"post","link":"https:\/\/www.apmuga.com\/wordpress\/seguranca-das-aplicacoes-android\/","title":{"rendered":"Seguran\u00e7a das aplica\u00e7\u00f5es Android"},"content":{"rendered":"<p>Ao contr\u00e1rio do que se possa pensar, a seguran\u00e7a \u00e9 um mito. N\u00e3o existem solu\u00e7\u00f5es totalmente seguras. Basta olhar para os \u00faltimos meses, com o ataque \u00e0 infra-estrutura da Sony, o ataque \u00e0s centrifugadoras de ur\u00e2nio iranianas ou ao medi\u00e1tico conflito entre a Apple e o FBI, que trouxe para a estrelato a empresa israelita Cellebrite no dito \u201cimposs\u00edvel\u201d desbloqueio do iPhone.<\/p>\n<p>&nbsp;<\/p>\n<p>Tudo se resume a uma quest\u00e3o de empenho, tanto em recursos como em tempo, para conseguir quebrar e entrar em qualquer sistema. Exemplos disso, por excel\u00eancia, s\u00e3o os cofres-fortes. Explicando de forma resumida, a avalia\u00e7\u00e3o destes \u00e9 feita com base no tempo de que um \u201cladr\u00e3o\u201d profissional necessita para o arrombar usando processos mec\u00e2nicos e el\u00e9tricos, sem destruir o conte\u00fado. Um cofre da classe \u201cTL-15\u201d tem que, de acordo com a norma aguentar 15 minutos de tortura, com instrumentos mec\u00e2nicos e\/ou el\u00e9ctricos, antes de ser aberto.<\/p>\n<p>&nbsp;<\/p>\n<p>O segredo na escolha de um bom sistema de seguran\u00e7a, tanto no mundo real como no mundo digital, \u00e9 encontrar uma solu\u00e7\u00e3o que seja mais dif\u00edcil de penetrar e eleve o risco de se ser apanhado, de forma a que o nosso ladr\u00e3o n\u00e3o veja uma oportunidade, mas sim uma fonte de aborrecimentos. Precisamos de mostrar o seu atrevimento lhe vai sair caro.<\/p>\n<p>&nbsp;<\/p>\n<p>Dito isto, falando agora no mundo digital e mais precisamente em aplica\u00e7\u00f5es Android, h\u00e1 medidas simples que podemos tomar para dificultar a vida aos piratas. E o que \u00e9 mesmo uma aplica\u00e7\u00e3o Android? N\u00e3o \u00e9 mais do que um ficheiro comprimido, do formato ZIP, com a extens\u00e3o apk (Android Package), que \u00e9 lido pelo instalador do Android, respons\u00e1vel por definir espa\u00e7o, criar pastas e copiar os ficheiros nos devidos destinos para depois ser executado pelo sistema operativo quando for solicitado pelo utilizador.<\/p>\n<p>&nbsp;<\/p>\n<p>Dentro de um Android Package t\u00edpico, temos a seguinte estrutura:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img1.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-368 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img1.png\" alt=\"Estrutura de um ficheiro APK\" width=\"559\" height=\"219\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img1.png 559w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img1-300x118.png 300w\" sizes=\"(max-width: 559px) 100vw, 559px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><!--more--><\/p>\n<p>A pasta assets contem todos os ficheiros anexos, como imagens, icons ou ficheiros de ajuda. Na directoria META-INF, ficam as assinaturas dos ficheiros contidos no apk e, no direct\u00f3rio res, temos os elementos gr\u00e1ficos, icons e splash, usados pelo Launcher do Android.<\/p>\n<p>&nbsp;<\/p>\n<p>As defini\u00e7\u00f5es e os privil\u00e9gios necess\u00e1rios para correr a aplica\u00e7\u00e3o ficam gravados no AndroidManifest.xml, e o mapeamento dos elementos gr\u00e1ficos usado no c\u00f3digo ficam no resources.arsc. Por fim, e n\u00e3o menos importante, temos o classes.dex (Dalvik Executable) com o c\u00f3digo compilado.<\/p>\n<p>&nbsp;<\/p>\n<p>\u00c9 aqui que o assunto se torna interessante. Uma aplica\u00e7\u00e3o nativa Android ter\u00e1 todo o c\u00f3digo compilado no classes.dex e as imagens, entre outros recursos utilizados, localizadas na pasta assets.<\/p>\n<p>&nbsp;<\/p>\n<p>Uma das caracter\u00edsticas do Android \u00e9 n\u00e3o usar a cl\u00e1ssica m\u00e1quina virtual JAVA, mas sim uma nova m\u00e1quina virtual intitulada Dalvik, criada de raiz, pensada e optimizada para aumentar a velocidade e reduzir tamanhos. N\u00e3o \u00e9 usado o bytecode Java. Em vez disso, foi introduzido o DEX. Por exemplo, numa aplica\u00e7\u00e3o JAVA, cada classe \u00e9 compilada para um ficheiro class individual, enquanto que, no DEX, todas as classes ficam juntas num \u00fanico ficheiro. Outra vantagem do DEX \u00e9 o tamanho, geralmente mais de 50% inferior ao JAR descomprimido. Apesar destas diferen\u00e7as, \u00e9 poss\u00edvel converter o DEX em JAR. Temos v\u00e1rias aplica\u00e7\u00f5es freeware dispon\u00edveis para o efeito. A mais conhecida \u00e9 o dex2jar, dispon\u00edvel no Sourceforge, entre outros reposit\u00f3rios. Fazemos o download, descomprimimos o pacote e executamos a aplica\u00e7\u00e3o, apontando para o nosso apk.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img2.png\"><img decoding=\"async\" loading=\"lazy\" width=\"566\" height=\"198\" class=\"aligncenter wp-image-369 size-full\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img2.png\" alt=\"Converter DEX para JAR\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img2.png 566w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img2-300x105.png 300w\" sizes=\"(max-width: 566px) 100vw, 566px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Descomprimimos o ficheiro JAR, tamb\u00e9m ele no formato ZIP, e usamos um de muitos descompiladores dispon\u00edveis para o JAVA para convertar o ficheiro class. Pessoalmente gosto de usar o JD-GUI Java Decompiler, de Emmanuel Dupuy .<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img3.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-370 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img3.png\" alt=\"Reverse do c\u00f3digo\" width=\"584\" height=\"372\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img3.png 584w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img3-300x191.png 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Pegando numa aplica\u00e7\u00e3o h\u00edbrida, baseada no PhoneGap, o processo \u00e9 muito mais simples. Esta ter\u00e1 todo o seu c\u00f3digo, html e javascript, em texto livre, distribu\u00eddo na pasta assets, deixando os plugins do PhoneGap no classes.dex.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img4.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-371 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img4.png\" alt=\"SegurancaAndroid_img4\" width=\"554\" height=\"254\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img4.png 554w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img4-300x138.png 300w\" sizes=\"(max-width: 554px) 100vw, 554px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Com isto tudo, podemos alterar o c\u00f3digo e reverter o processo. Compilamos, criamos o JAR, convertemos para DEX, com ajuda do d2j-jar2dex. Precisamos de voltar a criar os hash de cada ficheiro, com base no jarsigner, e compactar tudo num novo ficheiro apk.<br \/>\nComo obter um apk? Para quem tiver o adb instalado, podemos ligar ao dispositivo e puxar diretamente o apk.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img5.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-372 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img5.png\" alt=\"Liga\u00e7\u00e3o ADB\" width=\"512\" height=\"119\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img5.png 512w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img5-300x70.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Para quem tiver pressa, podemos usar aplica\u00e7\u00f5es dispon\u00edveis do googlePlay, como o APKoptic ou o APK Extractor (Backup Apk) e gravar o ficheiro num cart\u00e3o sd para depois transferir para o nosso pc.<\/p>\n<p>&nbsp;<\/p>\n<p>Como saber o id do apk que pretendemos analisar? Ao navegar, no googlePlay, at\u00e9 \u00e0 p\u00e1gina de apresenta\u00e7\u00e3o do produto, conseguimos ler, no url do browser, o seu id.<\/p>\n<p>&nbsp;<\/p>\n<p>https:\/\/play.google.com\/store\/apps\/details?id=exemplo.app.pt.apk<\/p>\n<p>&nbsp;<\/p>\n<p>Nos outros ecossistemas, iOS, blackberry e Windows, o processo \u00e9 semelhante, apesar do n\u00edvel de dificuldade ser maior. De facto a Apple dedica muita energia \u00e0 seguran\u00e7a. As aplica\u00e7\u00f5es s\u00e3o digitalmente assinadas na Apple Store para serem instaladas num dispositivo espec\u00edfico. O controlo \u00e9 muito maior, e isso inclu\u00ed os programadores. Mas, h\u00e1 sempre um mas, ao fazer jailbreak de um iPhone, deitamos por terra esta barreira.<\/p>\n<p>&nbsp;<\/p>\n<p>Ser\u00e1 poss\u00edvel proteger as nossas aplica\u00e7\u00f5es ou temos que aceitar impavidamente esta situa\u00e7\u00e3o? A resposta \u00e9 nim. N\u00e3o \u00e9 poss\u00edvel ter uma garantia total. No entanto, \u00e9 poss\u00edvel prevenir. \u00c9 poss\u00edvel tornar a tarefa de tal modo herc\u00falea que fa\u00e7a desistir qualquer aprendiz a hacker.<\/p>\n<p>&nbsp;<\/p>\n<p>Primeiro, a seguran\u00e7a deve ser pensada desde o in\u00edcio. Devemos conhecer os mecanismos de defesa que a nossa plataforma de elei\u00e7\u00e3o oferece e desenhar a nossa aplica\u00e7\u00e3o nesse sentido. N\u00e3o se pode come\u00e7ar a codificar e esperar que a ofusca\u00e7\u00e3o do c\u00f3digo fa\u00e7a milagres. Devemos assumir que o nosso c\u00f3digo vai ser visto. Logo, ofuscar o c\u00f3digo \u00e9 essencial. N\u00e3o resolve o problema, mas faz parte da solu\u00e7\u00e3o. Para aplica\u00e7\u00f5es nativas, no Android Studio, basta configurar e ativar o Proguard. Para aplica\u00e7\u00f5es h\u00ecbridas, podemos usar o Google Closure Compiler com o n\u00edvel de compila\u00e7\u00e3o ADVANCED_OPTIMIZATIONS.<\/p>\n<p>&nbsp;<\/p>\n<p>Mesmo ofuscado, temos outro problema. Strings e valores de configura\u00e7\u00e3o, como por exemplo endere\u00e7os de acesso e chaves de encripta\u00e7\u00e3o, est\u00e3o dispon\u00edveis aos olhares mais indiscretos. O seu lugar, definitivamente, n\u00e3o \u00e9 no c\u00f3digo. Devem estar fora, idealmente criados na instala\u00e7\u00e3o, no \u201cInternal Storage\u201d.<\/p>\n<p>&nbsp;<\/p>\n<p>O \u201cInternal Storage\u201d \u00e9 um espa\u00e7o criado pelo Android, de acesso exclusivo da aplica\u00e7\u00e3o, n\u00e3o sendo acess\u00edvel aos outros processos em actividade, nem mesmo ao utilizador. Mesmo assim, num dispositivo rooteado, tal n\u00e3o \u00e9 garantia de seguran\u00e7a. \u00c9 poss\u00edvel corromper o sistema operativo e aceder ao \u201cInternal Storage\u201d . A\u00ed precisamos de encriptar os dados. Hoje em dia, os sistemas em chip (SoC) possuem um Trusted Execution Environment (TEE). Trata-se, com respetivas diferen\u00e7as de cada implementa\u00e7\u00e3o, de cada fabricante, de um processador virtual com capacidade para criar e gerir chaves privadas, totalmente inacess\u00edvel o resto dos processos em curso. Ali\u00e1s \u00e9 geralmente esse m\u00f3dulo que gere as chaves usadas pelas placas wifi desses mesmos SoC.<\/p>\n<p>&nbsp;<\/p>\n<p>O uso n\u00e3o podia ser mais simples. Criamos uma chave, que fica armazenada internamente e segura dentro do chip.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img6.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-373 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img6.png\" alt=\"Cria\u00e7\u00e3o de certificados\" width=\"588\" height=\"438\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img6.png 588w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img6-300x223.png 300w\" sizes=\"(max-width: 588px) 100vw, 588px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Podemos criar as chaves de que precisamos como, por exemplo, uma para o Internal Storage, onde codificamos tudo e garantimos que os dados s\u00f3 ser\u00e3o usados nesse equipamento. Podemos ter outro certificado para as comunica\u00e7\u00f5es com o servidor XPTO, em que fornecemos a chave p\u00fablica ao servidor.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img7.png\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-374 aligncenter\" src=\"http:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img7.png\" alt=\"Utiliza\u00e7\u00e3o da KeyStore\" width=\"599\" height=\"464\" srcset=\"https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img7.png 599w, https:\/\/www.apmuga.com\/wordpress\/wp-content\/uploads\/2016\/06\/SegurancaAndroid_img7-300x232.png 300w\" sizes=\"(max-width: 599px) 100vw, 599px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Comprometer uma KeyStore \u00e9 poss\u00edvel, mas entramos numa outra dimens\u00e3o no mundo da seguran\u00e7a. Cada fabricante ter\u00e1 a sua implementa\u00e7\u00e3o, os seus mecanismos de defesa e as suas falhas. De tempos a tempos surgem not\u00edcias da falha A ou B. Temos que nos manter atualizados e ver as implica\u00e7\u00f5es das mesmas nas nossas aplica\u00e7\u00f5es.<\/p>\n<p>&nbsp;<\/p>\n<p>O uso da keystore \u00e9 uma boa solu\u00e7\u00e3o, mas com restri\u00e7\u00f5es. Por exemplo, o keystore fica indispon\u00edvel quando o equipamento se encontra bloqueado e requer autentica\u00e7\u00e3o do utilizador, por c\u00f3digo ou por impress\u00e3o digital &#8211; pequeno detalhe que precisamos de relembrar quando desenhamos um servi\u00e7o. No entanto, combinando os v\u00e1rios pontos que vimos at\u00e9 agora, conseguimos ter uma seguran\u00e7a aceit\u00e1vel, que levar\u00e1 muito mais do que 15 minutos a piratear.<\/p>\n<p><a href=\"http:\/\/pplware.sapo.pt\/smartphones-tablets\/android\/conheca-melhor-a-seguranca-das-aplicacoes-android\/\" target=\"_blank\">Pplware &#8211; 2016-06-16<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ao contr\u00e1rio do que se possa pensar, a seguran\u00e7a \u00e9 um mito. N\u00e3o existem solu\u00e7\u00f5es totalmente seguras. Basta olhar para os \u00faltimos meses, com o ataque \u00e0 infra-estrutura da Sony, o ataque \u00e0s centrifugadoras de ur\u00e2nio iranianas ou ao medi\u00e1tico conflito entre a Apple e o FBI, que trouxe para a estrelato a empresa israelita [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,22,3],"tags":[],"_links":{"self":[{"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/posts\/343"}],"collection":[{"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/comments?post=343"}],"version-history":[{"count":20,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/posts\/343\/revisions"}],"predecessor-version":[{"id":404,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/posts\/343\/revisions\/404"}],"wp:attachment":[{"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/media?parent=343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/categories?post=343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.apmuga.com\/wordpress\/wp-json\/wp\/v2\/tags?post=343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}