¿Por qué debemos usar checkCallingPermission en lugar de checkCallingOrSelfPermission en Android?

1

Escané un proyecto usando Fortify y dice que debo reemplazar checkCallingOrSelfPermission con el método checkCallingPermission .

No pude averiguar el riesgo de seguridad que presenta el método checkCallingOrSelfPermission.

Esta es la explicación de Fortify:

  

La función checkCallingOrSelfPermission () o   checkCallingOrSelfUriPermission () determina si la llamada   programa tiene el permiso requerido para acceder a un determinado servicio o un   URI dado. Sin embargo, estas funciones deben usarse con cuidado ya que   Puede otorgar acceso a aplicaciones maliciosas, careciendo de las adecuadas   permisos, asumiendo sus permisos de aplicaciones.

     

Esto significa una aplicación maliciosa, sin los permisos apropiados,   puede omitir su verificación de permisos usando el permiso de su aplicación   para acceder a los recursos negados de otra manera. Esto puede resultar en lo que   Es conocido como el ataque de diputado confuso.

    
pregunta mk_ 06.12.2016 - 14:45
fuente

2 respuestas

4

El agente confundido es cuando está operando en nombre de otro programa, pero no verifica los permisos adecuadamente. El ejemplo normal de esto es un cajero de una tienda de comestibles, escaneando artículos usando un código de barras. Si un cliente malicioso cambia el código de barras, por ejemplo, si coloca un código de barras de zanahoria en el filet mignon, y el cajero simplemente escanea y carga los precios de las zanahorias, está siendo un agente confundido. (Por otra parte, si él / ella se da cuenta, está aplicando la verificación apropiada y no es un agente confundido, sino competente)

En este caso, lo que dice Fortify es que estás dispuesto a sustituir tus propios permisos por los permisos de la persona que llama (eso es lo que hace checkCallingOrSelfPermissions) - estás diciendo que no importa lo que pueda hacer la persona que llama, vaya con lo que puedes hacer.

Es posible que esto sea lo que desea: si su programa está diseñado para ejecutar comandos privilegiados en nombre de programas sin privilegios, esto puede ser lo que usted desea. Sin embargo, si ese es el caso, usted es responsable de garantizar que la persona que llama ES la persona que llama realmente y que no esté haciendo nada malicioso. Fortify no puede ayudarlo allí. Ahí es donde realizaría una inspección de código intensa y real y algunas pruebas serias para asegurarse de que ese límite de confianza no pueda ser explotado por nada malicioso. Si su código pasa, normalmente lo anotaría, por lo que Fortify lo ignora. Estos se denominan límites de confianza y son donde desea pasar mucho tiempo de análisis para asegurarse de que está realizando los controles adecuados.

Probablemente solo quieras escuchar Fortify aquí y hacer el cambio, a menos que hayas realizado el trabajo para verificar tus entradas y estés seguro de que esta llamada no se puede usar para hacer algo malicioso Y es la única manera de hacer algo útil.

    
respondido por el crovers 06.12.2016 - 15:24
fuente
3

Imagina dos aplicaciones: Alice y Bob. Y, por el bien de la discusión, simule que el dispositivo solo tiene esas dos aplicaciones.

Si Bob llama a checkCallingPermission() , Bob pregunta: "¿Alice puede hacer esto?"

Si Bob llama a checkCallingOrSelfPermission() , Bob pregunta: "¿Alice o yo hacemos esto?", lo cual es una pregunta inusual. Normalmente utilizamos estos métodos para proteger las aplicaciones contra solicitudes no deseadas de terceros, y los permisos que nuestras aplicaciones tienen no importan para esa situación en particular.

Es posible que checkCallingOrSelfPermission() realmente sea lo que quieres. En mi humilde opinión, hay menos casos de uso para eso, por lo que vale la pena una advertencia del escáner para sugerir que quizás haya utilizado el método incorrecto. O, mejor aún, deshágase de ambos métodos y use los atributos android:permission en el manifiesto, si su caso de uso es bastante simple, ya que eso automáticamente defiende sus componentes basándose en el permiso nombrado.     

respondido por el CommonsWare 06.12.2016 - 15:28
fuente

Lea otras preguntas en las etiquetas