Cómo solucionar una vulnerabilidad de inyección de SQL

Esta información está dirigida a desarrolladores cuyas apps contengan una vulnerabilidad de inyección de SQL.

Novedades

Una o más de tus apps contienen una vulnerabilidad de inyección de SQL que debes corregir. Consulta la notificación en tu cuenta de Play ConsoleDespués de los plazos que aparecen en Play Console, es posible que se eliminen de Google Play todas las apps que contengan vulnerabilidades de seguridad no resueltas.

Acción necesaria​

  1. Accede a tu cuenta de Play Console y desplázate a la sección "Alertas" para ver qué apps están afectadas, así como los plazos para resolver los problemas.
  2. Actualiza las apps afectadas y corrige la vulnerabilidad.
  3. Envía las versiones actualizadas de las apps afectadas.

Una vez que las hayas reenviado, revisaremos tu app nuevamente. Este proceso puede demorar varias horas. Si la app pasa la revisión y se publica sin problemas, no se requiere ninguna otra acción. Si la app no pasa la revisión, no se publicará la nueva versión, y recibirás una notificación por correo electrónico.

Detalles adicionales

Las implementaciones de query, update y delete en ContentProviders exportados pueden ser vulnerables a la inyección de SQL si envían información no segura en instrucciones de SQL, ya que una app maliciosa podría diseñarse para acceder a datos privados o dañar el contenido de una base de datos. Puedes solucionar el problema de las siguientes maneras:

Si no es necesario exponer un ContentProvider en otras apps, haz lo siguiente:

Si es necesario exponer el ContentProvider afectado en otras apps, haz lo siguiente:

  • Para evitar la inyección de SQL en SQLiteDatabase.query, usa el modo strict con un projection map. Este modo brinda protección contra las cláusulas de selección maliciosa y el mapa de proyecciones protege de las cláusulas de proyección maliciosas. Debes usar ambas funciones para garantizar la seguridad de tus consultas.
  • Para evitar la inyección de SQL en SQLiteDatabase.update y SQLiteDatabase.delete, emplea una cláusula de selección que use "?" como parámetro para reemplazar y separar un conjunto independiente de argumentos de selección. La cláusula de selección no debe construirse a partir de entradas que no sean de confianza.

Estamos aquí para ayudarte

Si tienes preguntas técnicas sobre la vulnerabilidad, publícalas en Stack Overflow con la etiqueta "android-security". Si tienes dudas sobre los pasos que debes seguir para resolver este problema, comunícate con nuestro equipo de asistencia para desarrolladores.