Skip to content

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:

  1. Usando adb e jdwp, identifique o PID do aplicativo ativo que você deseja depurar:

    $ adb jdwp
    2355
    16346  <== último iniciado, corresponde ao nosso aplicativo
    
  2. Crie um canal de comunicação usando adb entre 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
    
  3. 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 jdb está sendo vinculado à porta do canal de comunicação local, encerre todas as sessões adb e inicie uma única nova sessão.