Fecha: 9 de Abril de 2026
Auditor: opencode
Versión App: 39.3.1 (Android)
Paquete: com.serviciosurbanos.misionero
Se realizó un análisis de seguridad de la aplicación móvil “Servicios Urbanos” (billetera electrónica para transporte público de Posadas, Misiones) y su infraestructura backend. El análisis incluyó:
Hallazgos totales: 8 vulnerabilidades
Estado: ✅ Sin problemas detectados
Análisis:
expo-secure-store para almacenamiento seguroVeredicto: ✅ SEGURO
Estado: ⚠️ REQUIERE REVISIÓN
Hallazgo:
"dependencies": {
"sdkVersion": "53.0.0",
"plugins": [
"expo-router",
"expo-camera",
"expo-secure-store",
"expo-notifications"
]
}
Riesgo: Las librerías Expo/React Native pueden tener vulnerabilidades conocidas.
Recomendación:
npm audit regularmenteEstado: ⚠️ PARCIALMENTE SEGURO
Hallazgos:
| Problema | Severidad | Descripción |
|---|---|---|
| Enumeración de usuarios | 🟡 Medio | Mismo mensaje para usuario inexistente y contraseña incorrecta |
| Sin rate limiting | 🟡 Medio | No hay límite de intentos de login |
| 2FA no implementado | 🟡 Medio | No se observó autenticación de dos factores |
Prueba realizada:
# Ambos retornean igual mensaje:
curl -X POST https://susabank.qa.serviciosurbanossa.com.ar/adm/public/ \
-d '{"email":"noexiste@test.com","password":"xxx"}'
# {"ok":false,"status":400,"msg":"Usuario inexistente"}
curl -X POST https://susabank.qa.serviciosurbanossa.com.ar/adm/public/ \
-d '{"email":"admin@test.com","password":"wrongpass"}'
# {"ok":false,"status":400,"msg":"Usuario inexistente"}
Recomendaciones:
Estado: ⚠️ NO PUEDE VERIFICAR SIN ACCESO AL CÓDIGO FUENTE
Nota: Para verificar si hay SQL injection o XSS, se necesita acceso al código backend (Node.js).
Recomendación: Realizar penetration testing con Burp Suite usando token de autenticación válido.
Estado: 🔴 VULNERABLE
Hallazgos:
// app.config
"android": {
"usesCleartextTraffic": true
}
Riesgo: Permite ataques Man-in-the-Middle (MITM)
Recomendación:
"android": {
"usesCleartextTraffic": false
}
// app.config
"ios": {
"NSAllowsArbitraryLoads": true,
"NSAllowsArbitraryLoadsForMedia": true,
"NSAllowsArbitraryLoadsInWebContent": true
}
Riesgo: La app puede conectar a servidores no cifrados
Recomendación:
"ios": {
"NSAllowsArbitraryLoads": false
}
# Producción: ✅ TIENE HSTS
strict-transport-security: max-age=31536000; includeSubDomains
# QA: ❌ SIN HSTS
Estado: ℹ️ INFORMATIVO
Permisos solicitados:
INTERNETACCESS_NETWORK_STATECAMERA (para escanear QR/DNI)RECORD_AUDIOUSE_BIOMETRICUSE_FINGERPRINTNota: Los permisos parecen apropiados para la funcionalidad de la app (billetera digital con pagos QR y biometría).
Estado: 🟠 VULNERABLE
Hallazgos:
"packagerOpts": {
"minify": false
}
Riesgo: El código JavaScript es fácilmente legible:
"scheme": "suprueba"
"scheme": "exp+servicios-urbanos-wallet"
Riesgo: Posible hijacking de URLs si un atacante registra el mismo scheme
Recomendación:
"packagerOpts": {
"minify": true
}
Estado: 🟠 MÚLTIPLES PROBLEMAS
Hallazgos:
Subdominios encontrados:
- consola-v2.qa.serviciosurbanossa.com.ar (Admin Panel)
- consola.qa.serviciosurbanossa.com.ar
- susabank.qa.serviciosurbanossa.com.ar
- minibus.qa.serviciosurbanossa.com.ar
- routers.qa.serviciosurbanossa.com.ar
- webview.qa.serviciosurbanossa.com.ar
- shop.qa.serviciosurbanossa.com.ar
Riesgo: Cualquier persona puede ver la estructura de la API y el código frontend
Recomendación:
*.qa.* desde internetIPs descubiertas (sin Cloudflare):
- 52.43.19.193 (AWS us-west-2) - Producción
- 15.229.220.153 (AWS sa-east-1) - QA
- 172.20.18.54 / 172.17.11.245 - Kubernetes interno
Riesgo: Infraestructura expuesta, sin protección de WAF
Recomendación: Activar Cloudflare en todos los subdominios
Estado: ✅ SEGURO
Hallazgo:
La app usa expo-secure-store que implementa:
Veredicto: ✅ Implementado correctamente
Estado: ℹ️ NO VERIFICABLE
Nota: Se requiere acceso al código backend para verificar algoritmos criptográficos.
| Endpoint | Requiere Auth | Estado |
|---|---|---|
/adm/public/ (login) |
❌ No | ✅ Seguro |
/adm/public/v1/User/... |
✅ Token | ✅ Seguro |
/voyager/api/... |
✅ Token | ⚠️ No accesible |
| Subdominio | IP | ¿Cloudflare? |
|---|---|---|
| susabank.prod | 52.43.19.193 | ❌ No |
| susabank.qa | 15.229.220.153 | ❌ No |
| consola-v2.qa | 15.229.220.153 | ❌ No |
| biometria | 13.226.244.44 | ❌ No |
| minibus | 52.43.19.193 | ❌ No |
| routers | 44.229.60.175 | ❌ No |
| whook-bind.prod | 172.20.18.54 | ❌ No |
| ID | Vulnerabilidad | Severidad | Impacto | Prioridad |
|---|---|---|---|---|
| V1 | usesCleartextTraffic: true | 🔴 Crítico | MITM | 1 |
| V2 | NSAllowsArbitraryLoads: true | 🔴 Crítico | MITM | 1 |
| V3 | QA expuesta a internet | 🟠 Alto | Info disclosure | 2 |
| V4 | Código sin minificar | 🟠 Alto | Reverse engineering | 2 |
| V5 | Enumeración de usuarios | 🟡 Medio | Fuerza bruta | 3 |
| V6 | Sin rate limiting | 🟡 Medio | Fuerza bruta | 3 |
| V7 | Sin 2FA | 🟡 Medio | Acceso no autorizado | 3 |
| V8 | IPs sin Cloudflare | 🟡 Medio | DDoS/Recon | 4 |
Deshabilitar HTTP claro
// app.config
"android": { "usesCleartextTraffic": false }
"ios": { "NSAllowsArbitraryLoads": false }
Proteger entorno QA
Habilitar minificación
"packagerOpts": { "minify": true }
Implementar rate limiting en API de login
Unificar mensajes de error de autenticación
Activar Cloudflare en todos los subdominios
Implementar 2FA para administradores
Habilitar HSTS en entorno QA
La aplicación tiene una base de seguridad razonablemente sólida pero requiere correcciones inmediatas en:
El backend requiere testing adicional con credenciales válidas para verificar vulnerabilidades de negocio (IDOR, broken access control, etc.).
Documento generado automáticamente Herramientas usadas: jadx, apktool, curl, grep, strings