Implicit PendingIntent
PendingIntent Implícito
Descripción
Las vulnerabilidades de intención implícita (implicit intent) en aplicaciones de Android, en particular los PendingIntent implícitos, plantean riesgos de seguridad importantes. Estas vulnerabilidades surgen cuando los desarrolladores utilizan intenciones implícitas sin especificar el componente de destino de manera explícita, confiando en los filtros de intención para determinar el destinatario. Los atacantes pueden explotar esto enviando intenciones maliciosas que coinciden con los criterios de las intenciones implícitas, lo que lleva a acciones o accesos no autorizados. Los problemas comunes incluyen la suplantación de intención (intent spoofing), donde se elaboran intenciones falsas, y la posibilidad de que aplicaciones maliciosas registren filtros de intención que coincidan con los criterios de la intención implícita. La escalada de privilegios, la exposición de datos y los componentes inseguros son preocupaciones adicionales, a continuación se muestra una lista de posibles problemas de seguridad que podrían surgir del PendingIntent implícito:
- Suplantación de intención (Intent Spoofing):
-
Los atacantes pueden intentar enviar intenciones falsas que coincidan con los criterios del
PendingIntentimplícito. Esto podría llevar a que la aplicación realice acciones no deseadas, lo que podría causar brechas de seguridad. -
Filtros de intención maliciosos:
-
Si los filtros de intención no se configuran cuidadosamente, aplicaciones maliciosas podrían registrar filtros de intención que coincidan con los criterios del
PendingIntentimplícito. Esto puede resultar en que componentes no deseados realicen acciones confidenciales. -
Escalada de privilegios:
-
Un
PendingIntentimplícito puede conducir a una escalada de privilegios si el componente de destino requiere ciertos permisos. Un atacante podría explotar esto para desencadenar acciones que requieren privilegios más altos, lo que lleva a un acceso no autorizado. -
Exposición de datos:
-
Si se pasan datos confidenciales a través de un
PendingIntentimplícito, existe el riesgo de exposición de datos si la intención se intercepta o manipula. Los desarrolladores deben garantizar el cifrado y la validación adecuados de los datos enviados a través de intenciones. -
Registro dinámico de Broadcast Receiver:
-
Un
PendingIntentimplícito que desencadena un Broadcast Receiver puede ser susceptible a ataques si los receptores se pueden registrar de forma dinámica. Los atacantes podrían registrar sus propios receptores para interceptar las transmisiones y realizar acciones maliciosas. -
Componentes inseguros:
-
Si el componente de destino (Activity, Service, Broadcast Receiver) especificado por el
PendingIntentimplícito no está adecuadamente asegurado, puede ser vulnerable a varios ataques, incluida la escalada de privilegios o la manipulación de datos. -
Uso de entradas no confiables:
-
Si el
PendingIntentimplícito implica el uso de entradas no confiables, como datos recibidos de fuentes externas, podría introducir vulnerabilidades como ataques de inyección. Valide y sanee las entradas para prevenir tales riesgos de seguridad. -
Extras no protegidos:
-
Pasar información confidencial a través de extras en un
PendingIntentimplícito sin la protección adecuada puede provocar fugas de datos. Los desarrolladores deben ser cautelosos sobre qué información se incluye en los extras y asegurarse de que esté debidamente asegurada. -
Filtros de intención demasiado amplios:
-
Si los filtros de intención son demasiado amplios, podrían coincidir con componentes no deseados, aumentando la superficie de ataque y permitiendo potencialmente a los atacantes desencadenar acciones que no estaban previstas.
-
Fallo al verificar la identidad del llamante:
- Los componentes lanzados por un
PendingIntentimplícito deben verificar la identidad del llamante para evitar accesos no autorizados. Si no lo hace, puede resultar en vulnerabilidades de seguridad.
- Los componentes lanzados por un
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Create an implicit base Intent and wrap it in a PendingIntent
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
Recomendación
Los desarrolladores pueden abordar la vulnerabilidad aplicando cualquiera (o mejor aún, todas) de las siguientes opciones:
- Asegurarse de que los campos action, package y component de la intención base estén configurados (Intención explícita);
- Asegurarse de que el
PendingIntentsolo se entregue a componentes confiables; - Usar
FLAG_IMMUTABLE(agregado en SDK 23) para crearPendingIntents. Esto evita que las aplicaciones que reciben elPendingIntentcompleten propiedades no pobladas. En caso de que la aplicación también se ejecute en dispositivos con SDK 22 o versiones anteriores, recomendamos a los desarrolladores aplicar las opciones anteriores mientras fortalecen la creación dePendingIntentcon el patrón: - Ser cautelosos con los datos incluidos en las intenciones.
- Cancelar los
PendingIntentscuando ya no sean necesarios. - Mantener su aplicación actualizada con las últimas prácticas de seguridad de Android.
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
public class YourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT >= 23) {
// Create a PendingIntent using FLAG_IMMUTABLE
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, PendingIntent.FLAG_IMMUTABLE);
} else {
Intent base = new Intent("ACTION_FOO");
base.setPackage("some_package");
PendingIntent pi = PendingIntent.getService(this, 0, base, 0);
}
}
}
Enlaces
Estándares
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- REQ_11_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- CC_9_1
- HIPAA_CONTROLS:
- SECURITY221
- SECURITY212
- SECURITY213