# Analisis Estatico Android

## Herramientas

Entre las herramientas más conocidas tenemos:

* [MARA Framework](https://github.com/xtiankisutsa/MARA_Framework)
* [MobSF](https://github.com/MobSF/Mobile-Security-Framework-MobSF)
* [Qark](https://github.com/linkedin/qark)

{% hint style="info" %}

#### IMPORTANTE! ES NECESARIO TENER EN CUENTA QUE CUALQUIER HERRAMIENTA AUTOMATICA PUEDE GENERAR <mark style="color:red;">FALSOS POSITIVOS</mark>, POR LO QUE SE DEBEN ANALIZAR LOS RESULTADOS OBTENIDOS MANUALMENTE PARA DESCARTARLOS.

{% endhint %}

## Analizar

### Permisos de AndroidManifest.xml

* Debuggable

Este atributo permite depurar la aplicación.&#x20;

```bash
android:debuggable="true"|"false"
```

En el caso de no estar indicado el valor (es decir, si nos encontramos solamente `android:debuggable`), el apk NO es depurable.

* AllowBackup

```bash
android:allowBackup="true"|"false"
```

En el caso de estar como "true", permite realizar backups de los datos que contiene a través de ADB.

```bash
adb backup -f app_backup.ab -apk [apkName.apk]
```

* WAKE\_LOCK

```bash
<uses-permission android:name="android.permission.WAKE_LOCK" />
```

Permite que el dispositivo permanezca activo y evita que entre en estado de suspensión.

* GET\_TASKS

```bash
<uses-permission android:name="android.permission.GET_TASKS" />
```

Permite a la aplicación acceder a los procesos que se encuentran activos/corriendo en el dispositivo.

* WRITE\_EXTERNAL\_STORAGE

```bash
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```

Permite a la aplicación acceso de escritura al contenido de la tarjeta SD.

### Directorios y ficheros&#x20;

Para analizar el código fuente de la aplicación, podemos usar [JADX](https://github.com/skylot/jadx).

{% hint style="info" %}
En los WebView, debemos tener en cuenta\
\
`myWebView.settings.javaScriptEnabled = true`\
\
ya que puede facilitar la ejecución de XSS.
{% endhint %}

### Almacenamiento y Base de datos

Buscar palabras clave y llamadas a APIs usadas para almacenar información. Algunas de las clases y funciones son:

* clase `SharedPreferences` ( almacena parejas de clave-valor)
* clase `FileOutPutStream` (usa almacenamiento interno o externo)
* funciones `getExternal*` (usa almacenamiento externo)
* función`getWritableDatabase` (devuelve una bdd SQLiteDatabase con permisos de escritura)

{% hint style="info" %}
Buscar en el código fuente:

```
this.db = localUserSecretStore.getWritableDatabase("Password");
```

{% endhint %}

* función `getReadableDatabase` (devuelve una bdd SQLiteDatabase con permisos de lectura)
* funciones `getCacheDir` y `getExternalCacheDirs` (usan ficheros cacheados)

Ubicación común de claves/API keys/contraseñas:

* res/values/strings.xml
* build configs (local.properties o gradle.properties)
* `/data/data/<package-name>/shared_prefs`
* `/data/data/<package-name>/files/`

#### Base de datos

La ruta donde se almacenan las bdd de las aplicaciones es

`/data/data/<package-name>/databases/`

Copiar la base datos de la aplicación al entorno de pruebas con

```bash
adb pull /data/data/AppName/.. /destination/path/for/the/file
```

y posteriormente abrir SQLite e importar la base de datos.
