Lista de verificación de seguridad de aplicaciones Flutter
Fase 0: Gobernanza, entorno y CI/CD
Aplicar puertas en CI
- Ejecutar comprobaciones estáticas (SAST) en cada PR:
flutter analyze, pruebas unitarias/UI,dart pub outdated. - Bloquear el lanzamiento (release) ante hallazgos de severidad Alta/Crítica en SAST/SCA/DAST; exigir cero errores de linter en las ramas de lanzamiento.
Manejo de secretos
- Ningún secreto en el código fuente de Dart,
pubspec.yaml, código nativo o en los registros (logs). - Usar variables de entorno (por ejemplo,
--dart-define) para inyectar configuraciones en tiempo de compilación (build-time). - Redactar secretos en las analíticas (analytics).
- Rotar claves/tokens de forma periódica y ante sospechas de fuga.
Evidencia y trazabilidad
- Archivar los informes de escaneo, el SBOM, los registros de compilación y las notas de la versión con cada artefacto.
Scanning automation
- Integrar una plataforma móvil de SAST/DAST/SCA (que soporte Flutter) en el CI/CD para que se ejecute en cada PR y pre-lanzamiento, y fallar automáticamente las comprobaciones (gates) ante problemas de severidad Alta/Crítica.
Fase 1: Modelado de amenazas, clasificación de datos e inventario
- Clasificar los datos (PII, credenciales, tokens, datos de pago) y mapear su recolección, procesamiento, almacenamiento (archivos, bases de datos seguras) y transmisión.
- Identificar los límites de confianza (trust boundaries): entorno Dart/Isolates, MethodChannels, bibliotecas nativas, plugins, APIs del backend.
- Hacer un inventario de los paquetes de terceros en
pub.dev; preferir plugins bien mantenidos, de editores verificados (verified publishers) y que sigan el principio de mínimo privilegio. - Reducir al mínimo la superficie de ataque derivada de los paquetes Dart.
Phase 2: Build and configuration hardening
Release settings
- Asegurarse de que todas las compilaciones de producción se compilen en modo release (
flutter build apk/ios --release) con AOT habilitado. - Eliminar los endpoints de desarrollo y las banderas de características (feature flags) de las compilaciones de producción.
Android specific
- Usar
minifyEnabled trueyshrinkResources trueen Gradle. - Declarar solo los permisos necesarios en
AndroidManifest.xml. - Desactivar el tráfico en texto claro (cleartext traffic) en
networkSecurityConfig.
iOS specific
- Eliminar (strip) los símbolos de depuración y el código muerto.
- Otorgar únicamente los entitlements necesarios.
- Establecer
NSAllowsArbitraryLoads = falseenInfo.plist.
Phase 3: Local storage and secure storage
Almacenamiento seguro
- Usar el plugin
flutter_secure_storage(o su equivalente) para todos los tokens, PII sensible y claves criptográficas. - Android: Asegurarse de que el plugin utilice el cifrado respaldado por Keystore (EncryptedSharedPreferences).
- iOS: Asegurarse de que el plugin utilice el Keychain con las configuraciones de accesibilidad adecuadas (por ejemplo,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly).
Files and databases
- Evitar el almacenamiento de secretos o PII sensible en texto plano dentro de
SharedPreferenceso archivos locales. - Cifrar bases de datos (por ejemplo, sqflite con SQLCipher) si almacenan información sensible.
- No registrar (log) secretos, ni siquiera de manera temporal.
Caches and derived data
- Evitar la persistencia de PII en cachés/directorios temporales.
- Purgar los cachés/directorios temporales al cerrar la sesión.
Phase 4: Privacy safeguards (UI, clipboard, screenshots)
- Ocultar la UI sensible en la vista de aplicaciones recientes (app switcher) (por ejemplo, usando el plugin
secure_applicationo código nativo para desenfocar/ocultar la pantalla). - Evitar la lectura del portapapeles en el inicio de la aplicación.
- Nunca depositar contraseñas, claves o tokens de larga duración en el portapapeles del sistema.
Phase 5: Network security and TLS/pinning
Aplicación de HTTPS/TLS
- Exigir HTTPS en todas las comunicaciones de la aplicación. El cliente HTTP predeterminado de Dart exige TLS, pero debe configurarse de tal forma que rechace los certificados inválidos.
- Nunca eludir las comprobaciones de certificados en entornos de producción (
badCertificateCallback).
Certificate pinning
- Implementar el fijado de certificados (certificate pinning) SSL/TLS (por ejemplo, comprobando el SHA-256 en el objeto
SecurityContext). - Validar la resistencia contra escenarios de ataque MITM y certificados hojas (leaf) rotados o expirados.
- Planificar la rotación segura de los pines y prever opciones de respaldo (fallbacks).
Cookies and tokens
- Evitar almacenar tokens portadores (bearer tokens) de larga duración en el dispositivo.
Fase 6: Autenticación, autorización y sesión
Flujos de autenticación
- Utilizar OAuth2/OIDC junto a PKCE para flujos públicos de autenticación (por ejemplo, mediante
flutter_appauth). - Nunca integrar secretos de cliente (client secrets) o claves API asociadas a autenticación en el código fuente de Dart.
- Preferir los componentes del navegador del sistema (Chrome Custom Tabs, SafariViewController) antes que usar una WebView integrada en la aplicación para iniciar sesión.
Tokens
- Utilizar tokens de acceso de corta duración.
- Almacenar de forma segura los tokens de actualización (refresh tokens) (por ejemplo, mediante
flutter_secure_storage). - Rotar e invalidar los tokens al cerrar la sesión, al cambiar de dispositivo o si se registran actividades sospechosas.
Autorización
- Exigir la validación de autorización en el lado del servidor; el estado de la aplicación Flutter siempre debe considerarse como no confiable (untrusted).
Phase 7: Inter‑app communication and deep links
App Links / Universal Links
- Implementar Android App Links y iOS Universal Links preferentemente por sobre el uso de esquemas de URL personalizados.
- Validar desde el código Dart el origen de todos los enlaces entrantes, así como también sus parámetros.
Custom schemes and intents
- Si es necesario usar esquemas personalizados, debe cerciorarse de someter cualquier dato y su tipo proveniente del exterior a un fuerte proceso de validación.
- Generar defensas frente al secuestro de URLs (URL hijacking) y contra métodos de desvío de navegación (open redirects).
Phase 8: Reverse engineering and tamper resilience
Code obfuscation
- Asegurarse de que el compilado en modo release en Flutter construya sobre los lenguajes nativos valiéndose de su característica AOT.
- Emplear las capacidades de compilación en Flutter para lograr la ofuscación de la información de clases o elementos en su código de negocios (
flutter build apk --obfuscate --split-debug-info=/<dir>).
Verificaciones de entorno
- Determinar la eventualidad de ejecución en entornos no permitidos o vulnerables tales como jailbreak o root mediante componentes conocidos y seguros (tales como
flutter_jailbreak_detection,freerasp). - En base a un riesgo dictaminado, establecer medidas cautelares o acciones a implementar tales como límites funcionales, anuncios directos, o su eventual cerrado preventivo.
Anti-tamper
- Asistirse en controles íntegros en los respectivos ecosistemas del sistema (uso del API Play Integrity sobre su equivalente Android, o DeviceCheck/App Attest para el ecosistema asociado de iOS) de manera tal que el servidor pueda validar remotamente al componente y dispositivo del usuario de forma asertiva.
- Todo control de cliente debe estimarse como simples y meros indicios frente al control del servidor u otro dispositivo, y nunca emplearse de facto como control fundamental.
Phase 9: Cryptography and randomness
- Usar librerías revisadas o avaladas (
cryptoopointycastle) y delegar sobre primitivas construidas en nativo conectadas a la aplicación mediante los pertinentes MethodChannels. - Realizar empleos del generador nativo proporcionado y debidamente validado (
Random.secure()). - Efectuar empleos mediante la construcción de componentes criptográficos apoyados sobre estándares confiables de industria (tales como componentes del protocolo bajo su especificación de la norma técnica AES-GCM).
- Abstraerse por completo del empleo o re-utilizaciones perjudiciales (tales como re-uso IVs, claves no pre-compartidas o generadas al unísono de modo perjudicial embebidas textualmente).
Phase 10: Permissions, notifications, and identifiers
Privacy‑related permissions
- Emplear peticiones para usos que deban realizarse limitándolos al uso concreto al que pertenezcan (petición requerida), aportando mensajes informativos con asertividad frente a lo aportado hacia su empleo en base al entorno generado.
- Ajustar lo menor posible las necesidades limitadas y su correspondiente relación base frente a dispositivos provistos dentro o fuera de ecosistemas referidos (ubicaciones de entorno general y geoposicionado, sensores gráficos, acceso general al disco de memoria de componentes o capturas acústicas ambientales y telefónicas).
Identifiers
- Emplear recursos limitados sobre la necesidad generada omitiendo vinculaciones persistentes a registros asociados sobre su control a elementos (evítese registros únicos atados a identificadores referidos y re-use elementos restablecidos limitados sobre ambientes internos u ocultos de base controlados localmente frente al ambiente).
Notificaciones
- Elimine la exposición desmesurada dentro de informaciones contenidas o visualmente limitadas correspondientes al ambiente interno que sean asociadas e interceptables sobre controles emitidos local y externamente en información base; fomente elementos internos basados al entorno a buscar de su descarga referenciada en inicio del programa sobre eventos visuales o referenciados a acciones manuales en peticiones (fetch-on-open).
Phase 11: Logging, analytics, and crash reporting
Higiene de registros
- Emplee recursos omitiendo empleos a opciones expuestas (
print()) generados y localizados a base sobre desarrollos en producción, utilice ambientes en producciones debidamente delimitados mediante condicionales (kReleaseMode/kDebugMode). - Controle implementaciones base a recursos de registro sobre PII y/u otros tipos, referenciados a información confidencial generada sobre fallos recolectados correspondientemente (eventos en analíticas o Firebase Crashlytics y Sentry).
- Gestione con sumo interés y eficacia componentes que ofuscan variables o información correspondientes (
--split-debug-info), estos deben quedar estrictamente salvaguardados al uso remoto, limitándolos al extremo para que solo resuelvan funciones mediante servidores provistos, evitando a su vez cualquier posible exportación, exposición o relación general en producción.
Phase 12: Testing, DAST, and runtime verification
Interception tests
- Compruebe mecanismos pertinentes referenciados e inducidos por intercepciones controlables (MITM), corroborando su limitación en comunicaciones basadas sobre validaciones locales provistas sobre configuraciones personalizadas referidas bajo Dart.
Pruebas de abuso de API
- Recree y evalúe situaciones referidas de uso o empleo que no corresponden a límites propuestos (Rate limiting) y genere vulnerabilidades a elementos sobre (BOLA o su versión y denominativo derivado de uso hacia bases referenciadas (IDOR)), previniendo validaciones o controles y empleos asertivos generados.
Dynamic analysis
- Desarrolle métodos basados hacia uso correspondiente generados mediante opciones de seguridad implementables evaluando información local expuesta (como DAST sobre cliente HTTP base Dart) sobre comunicaciones e interceptaciones sobre configuraciones y controles en uso erróneamente administrados de uso y ejecución generalizada a exposiciones internas u otras limitadas.
- Exporte reportes e informaciones detalladas base de pruebas DAST y evalué priorizando o generando triajes en función sobre re-test.
Phase 13: SBOM, and evidence
SBOM y dependencias
- Evalúe a modo base informaciones publicadas controlando componentes o versiones base provistas correspondientes (análisis y reporte generados sobre Dart u otros de índole componentes dependientes y/o sub-proyectos generados en recursos externos hacia
build.gradleoPodfile). - Determine la recolección, administración o creación del registro (SBOM) generados a modo base frente a proyectos provistos (Flutter/Dart).
Paquete de evidencia
- Genere evidencia e integre información provista y referida a (SAST/DAST) en reportes finales correspondientes a expedientes formados y creados sobre uso productivos de liberaciones (release).
- Adjunte su evaluación o correspondientes registros formados y relacionados a documentos formados SBOM.
Referencia rápida para profesionales
- Config: AOT compila para la liberación de uso, control y mitigación base de recursos
kReleaseModeo de validación general con uso provisto u opciones como--obfuscate. - Data: Generar uso base de manera continua u otros referenciados nativamente basados a opciones asertivas generados con componentes como (
flutter_secure_storage); descartando recursos expuestos a lecturas planas de recursos PII o similares referenciados (SharedPreferencesu SQLfite). - Network: Impóngase e impulse el manejo asertivo o controlado mediante mecanismos referenciales controlados a base HTTPS; impóngase e impulse certificados validos fijados (
SecurityContext) y limite a control interno de variables como validaciones y rechazos controlables referenciales (badCertificateCallbackfrente a su empleo general base en usos sobre producción controlada). - Auth: Privilegie componentes predeterminados basados a
flutter_appauthjunto a usos integrados sobre validaciones asociables a OAuth y/o asociables al uso mediante PKCE, desmintiendo o eliminando y privando a recursos correspondientes de poseer textualmente recursos en crudo (base secret key u análogos referenciados). - Tamper: Privilegie componentes predeterminados basados u otras herramientas base validadas localmente o externamente validando e inspeccionando escenarios comprometidos basados a Root/Jailbreak correspondientes (tales casos provistos u referidos como herramientas de DeviceCheck y atestados validados remotamente mediante el sistema Play Integrity o afín).
- Privacy: Implemente y fomente elementos en validaciones controlables a usos ocultos provistos sobre escenarios transitorios entre recursos u aplicaciones y su equivalente captura correspondiente basada a ocultaciones (snapshot u similares) limitando acciones derivadas basadas u relacionadas al recolector de copia de información (clipboard o portapapeles), generando opciones o referenciales de permisos oportunos en tiempo preciso limitable de acuerdo al caso expuesto (JIT limitadas).
- Dart/Flutter: Considere ambientes expuestos generados como recursos en base u opción referencial, evadiendo decisiones propias correspondientemente atadas al proceso general de validación externa, referenciando peticiones asertivas a uso comprobatorio; privilegie la construcción basada a un listado acotado de componentes sobre (pub.dev) con componentes estipulados y analizados correctamente.