# Pequenas ligações, grandes vulnerabilidades: Uma breve introdução a deep links Android.
## Introdução
Esse artigo tem como objetivo introduzir as vulnerabilidades que ocorrem no Android por meio do abuso de Intents. Tentarei ser o mais introdutório possível e listarei todas as referências necessárias, caso algum conceito pareça muito avançado. Será utilizado o aplicativo [InjuredAndroid](https://github.com/B3nac/InjuredAndroid) como exemplo de aplicativo vulnerável. 54lv3 pros companheiros da [@duphouse](https://www.instagram.com/duphouse/), sem eles esse texto não seria possível.
Recomendo a [série de vídeos](https://www.youtube.com/watch?v=4eso_7RyZ58) do Maycon Vitali sobre Android no geral, assim como [a minha talk](https://www.youtube.com/watch?v=WFUEbMFx2EQ) na DupCon com vulnerabilidades reais.
Perfil no Instagram sobre segurança em mobile: https://www.instagram.com/thatmobileproject/
## Intents
Os [Intents](https://developer.android.com/guide/components/intents-filters) funcionam como uma forma dos aplicativos se comunicarem internamente entre si. Por exemplo, se um aplicativo quer abrir o [InjuredAndroid](https://github.com/B3nac/InjuredAndroid) ele pode iniciar-lo por meio de um Intent utilizando a [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) `flag13://rce`.
```java
Intent intent = new Intent();
intent.setData(Uri.parse("flag13://rce"));
startActivity(intent);
```
Além de aceitar todos os elementos de uma [URI](https://en.wikipedia.org/wiki/Uniform_Resource_Identifier) ( scheme, host, path, query, fragment ), um Intent também pode levar dados [fortemente tipados](https://pt.wikipedia.org/wiki/Linguagem_tipada) por meio dos [Intent Extras](https://developer.android.com/reference/android/content/Intent#putExtra(java.lang.String,%20android.os.Bundle)). Na prática, *queries* e extras são as formas mais comuns de passar dados entre os aplicativos, eles serão discutidos com exemplos mais adiante.
## Intents Filters
Como o Android sabe qual aplicativo se refere `flag13://rce`? O InjuredAndroid define um [Intent Filter](https://developer.android.com/guide/components/intents-filters#Resolution) que diz quais tipos de Intent o Sistema Operacional deve enviar para ele.
O Intent Filter é definido no [AndroidManifest.xml](https://developer.android.com/guide/topics/manifest/manifest-intro). Vamos analizar a definição do Intent Filter relacionado a `flag13://rce` :
```xml
<activity
android:name=".RCEActivity"
android:label="@string/title_activity_rce"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter android:label="filter_view_flag11">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with "flag13://” -->
<data
android:host="rce"
android:scheme="flag13" />
</intent-filter>
</activity>
```
<sup>*https://github.com/B3nac/InjuredAndroid/blob/master/InjuredAndroid/app/src/main/AndroidManifest.xml*</sup>
O atributo `name` define qual [Activity](https://developer.android.com/reference/android/app/Activity) será inicializada, como ele começa com ponto, o nome é resolvido para `package`+`.RCEActivity` = `b3nac.injuredandroid.RCEActivity`. Dentro do Intent Filter, o `action` se refere ao [tipo de ação](https://developer.android.com/reference/android/content/Intent#intent-structure) que será executada, existem uma miríade de tipos de ações que são definidas na classe Intent porém na maioria das vezes é utilizado o `action` padrão `android.intent.action.VIEW`.
`category` são propriedades extras que definem como o Intent vai se comportar. `android.intent.category.DEFAULT` define que essa Activity pode ser inicializada mesmo se o Intent não tiver nenhum `category`. `android.intent.category.BROWSABLE` dita que a Activity pode ser inicializada pelo browser, isso é super importante pois transforma qualquer ataque em remoto. Digamos que um usuário entre em um site malicioso, esse site consegue inicializar um Intent que abre o App apenas se o Intent Filter tiver a propriedade `BROWSABLE`.
A *tag* [`data`](https://developer.android.com/guide/topics/manifest/data-element) especifica quais URLs vão corresponder com esse Intent Filter, no nosso caso, o `scheme` tem que ser `flag13` e o `host` igual a `rce`, ficando `flag13://rce`. Todas as partes da URI podem ser definidas, como *path*, *port*, etc.
## Vulnerabilidade
Agora que entedemos como Intents e Intents Filters funcionam, vamos procurar alguma vulnerabilidade no `flag13://rce` (O "rce" ficou meio óbvio né).
O código-fonte da Activity `b3nac.injuredandroid.RCEActivity` : https://github.com/B3nac/InjuredAndroid/blob/master/InjuredAndroid/app/src/main/java/b3nac/injuredandroid/RCEActivity.kt
A Activity é inicializada na função `onCreate` e é lá que o Intent será devidamente tratado.
## Tipos de vulnerabilidades
- XSS
- RCE
- SQLi
## Conclusão
## Próximos passos