MASTG-TEST-0039: Testando se o Aplicativo é Debuggable
Deprecated Test
This test is deprecated and should not be used anymore. Reason: Nova versão disponível no MASTG V2
Please check the following MASTG v2 tests that cover this v1 test:
Visão Geral¶
Análise Estática¶
Verifique o arquivo AndroidManifest.xml para determinar se o atributo android:debuggable foi definido e encontrar seu valor:
...
<application android:allowBackup="true" android:debuggable="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme">
...
Você pode usar a ferramenta aapt do Android SDK com o seguinte comando para verificar rapidamente se a diretiva android:debuggable="true" está presente:
# Se o comando imprimir 1, então a diretiva está presente
# A expressão regular busca por esta linha: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
$ aapt d xmltree sieve.apk AndroidManifest.xml | grep -Ec "android:debuggable\(0x[0-9a-f]+\)=\(type\s0x[0-9a-f]+\)0xffffffff"
1
Para uma build de release, este atributo deve sempre estar definido como "false" (o valor padrão).
Análise Dinâmica¶
O adb pode ser usado para determinar se um aplicativo é depurável.
Use o seguinte comando:
# Se o comando imprimir um número maior que zero, então o aplicativo possui a flag de depuração
# A expressão regular busca por estas linhas:
# flags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
# pkgFlags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
$ adb shell dumpsys package com.mwr.example.sieve | grep -c "DEBUGGABLE"
2
$ adb shell dumpsys package com.nondebuggableapp | grep -c "DEBUGGABLE"
0
Se um aplicativo é depurável, executar comandos do aplicativo torna-se trivial. No shell do adb, execute run-as acrescentando o nome do pacote e o comando do aplicativo ao nome do binário:
$ run-as com.vulnerable.app id
uid=10084(u0_a84) gid=10084(u0_a84) groups=10083(u0_a83),1004(input),1007(log),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats) context=u:r:untrusted_app:s0:c512,c768
O Android Studio também pode ser usado para depurar um aplicativo e verificar a ativação da depuração para um app.
Outro método para determinar se um aplicativo é depurável é anexar o jdb ao processo em execução. Se isso for bem-sucedido, a depuração será ativada.
O seguinte procedimento pode ser usado para iniciar uma sessão de depuração com jdb:
-
Usando
adbejdwp, identifique o PID do aplicativo ativo que você deseja depurar:$ adb jdwp 2355 16346 <== último iniciado, corresponde ao nosso aplicativo -
Crie um canal de comunicação usando
adbentre o processo do aplicativo (com o PID) e seu computador host usando uma porta local específica:# adb forward tcp:[PORTA_LOCAL] jdwp:[PID_DO_APLICATIVO] $ adb forward tcp:55555 jdwp:16346 -
Usando
jdb, anexe o depurador à porta do canal de comunicação local e inicie uma sessão de depuração:$ jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=55555 Set uncaught java.lang.Throwable Set deferred uncaught java.lang.Throwable Initializing jdb ... > help
Algumas observações sobre depuração:
- A ferramenta jadx pode ser usada para identificar locais interessantes para inserção de breakpoints.
- O uso de comandos básicos para o jdb pode ser encontrado em Tutorialspoint.
- Se você receber um erro informando que "a conexão com o depurador foi fechada" enquanto o
jdbestá sendo vinculado à porta do canal de comunicação local, encerre todas as sessões adb e inicie uma única nova sessão.