🔒 Reporte de Seguridad - Servicios Urbanos App

Fecha: 9 de Abril de 2026
Auditor: opencode
Versión App: 39.3.1 (Android)
Paquete: com.serviciosurbanos.misionero


Resumen Ejecutivo

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ó:

  • ✅ Reverse engineering de la APK
  • ✅ Análisis de código fuente (bundle JavaScript)
  • ✅ Enumeración de subdominios
  • ✅ Pruebas de endpoints de API
  • ✅ Revisión de configuración de seguridad

Hallazgos totales: 8 vulnerabilidades

  • 🔴 Críticas: 2
  • 🟠 Altas: 3
  • 🟡 Medias: 3

Hallazgos por OWASP Mobile Top 10 (2024)

M1 - Improper Credential Usage ✅ NO VULNERABLE

Estado: ✅ Sin problemas detectados

Análisis:

  • No se encontraron API keys hardcodeadas en el bundle
  • No hay passwords o tokens embebidos
  • Usa expo-secure-store para almacenamiento seguro

Veredicto: ✅ SEGURO


M2 - Insecure Supply Chain

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:

  • Mantener Expo SDK actualizado a la última versión
  • Ejecutar npm audit regularmente
  • Revisar CVE conocidos para las dependencias

M3 - Insecure Authentication/Authorization 🟡

Estado: ⚠️ 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:

  1. Usar mensaje genérico: “Credenciales inválidas”
  2. Implementar rate limiting: máximo 5 intentos por IP
  3. Considerar implementar 2FA (TOTP o SMS)

M4 - Insufficient Input Validation

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.


M5 - Insecure Communication 🔴 CRÍTICO

Estado: 🔴 VULNERABLE

Hallazgos:

1. Tráfico HTTP permitido (Android)

// app.config
"android": {
  "usesCleartextTraffic": true
}

Riesgo: Permite ataques Man-in-the-Middle (MITM)

Recomendación:

"android": {
  "usesCleartextTraffic": false
}

2. Tráfico HTTP permitido (iOS)

// app.config
"ios": {
  "NSAllowsArbitraryLoads": true,
  "NSAllowsArbitraryLoadsForMedia": true,
  "NSAllowsArbitraryLoadsInWebContent": true
}

Riesgo: La app puede conectar a servidores no cifrados

Recomendación:

"ios": {
  "NSAllowsArbitraryLoads": false
}

3. HSTS solo en producción

# Producción: ✅ TIENE HSTS
strict-transport-security: max-age=31536000; includeSubDomains

# QA: ❌ SIN HSTS

M6 - Inadequate Privacy Controls

Estado: ℹ️ INFORMATIVO

Permisos solicitados:

  • INTERNET
  • ACCESS_NETWORK_STATE
  • CAMERA (para escanear QR/DNI)
  • RECORD_AUDIO
  • USE_BIOMETRIC
  • USE_FINGERPRINT

Nota: Los permisos parecen apropiados para la funcionalidad de la app (billetera digital con pagos QR y biometría).


M7 - Insufficient Binary Protections 🟠

Estado: 🟠 VULNERABLE

Hallazgos:

1. Código no minificado

"packagerOpts": {
  "minify": false
}

Riesgo: El código JavaScript es fácilmente legible:

  • Estructura de la app expuesta
  • Endpoints de API visibles
  • Nombres de funciones y componentes expuestos

2. Deep linking expuesto

"scheme": "suprueba"
"scheme": "exp+servicios-urbanos-wallet"

Riesgo: Posible hijacking de URLs si un atacante registra el mismo scheme

Recomendación:

"packagerOpts": {
  "minify": true
}

M8 - Security Misconfiguration 🟠

Estado: 🟠 MÚLTIPLES PROBLEMAS

Hallazgos:

1. Entornos QA expuestos a internet

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:

  • Bloquear acceso a *.qa.* desde internet
  • Usar VPN o IP whitelist
  • O usar autenticación básica

2. IPs de infraestructura expuestas

IPs 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


M9 - Insecure Data Storage ✅

Estado: ✅ SEGURO

Hallazgo: La app usa expo-secure-store que implementa:

  • iOS: Keychain
  • Android: Keystore

Veredicto: ✅ Implementado correctamente


M10 - Insufficient Cryptography

Estado: ℹ️ NO VERIFICABLE

Nota: Se requiere acceso al código backend para verificar algoritmos criptográficos.


Infraestructura Backend - Hallazgos Adicionales

Endpoints encontrados

Endpoint Requiere Auth Estado
/adm/public/ (login) ❌ No ✅ Seguro
/adm/public/v1/User/... ✅ Token ✅ Seguro
/voyager/api/... ✅ Token ⚠️ No accesible

Subdominios encontrados

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

Matriz de Riegos

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

Plan de Remediación

Inmediato (Esta semana)

  1. Deshabilitar HTTP claro

    // app.config
    "android": { "usesCleartextTraffic": false }
    "ios": { "NSAllowsArbitraryLoads": false }
    
  2. Proteger entorno QA

    • Agregar autenticación básica o
    • Bloquear con firewall o
    • Mover a red interna/VPN

Corto plazo (1-2 semanas)

  1. Habilitar minificación

    "packagerOpts": { "minify": true }
    
  2. Implementar rate limiting en API de login

  3. Unificar mensajes de error de autenticación

Mediano plazo (1 mes)

  1. Activar Cloudflare en todos los subdominios

  2. Implementar 2FA para administradores

  3. Habilitar HSTS en entorno QA


Herramientas Recomendadas para Testing

Análisis dinámico

  • Burp Suite - Proxy, fuzzing, inyecciones
  • OWASP ZAP - Escaneo automatizado
  • Frida - Runtime instrumentation

Análisis estático

  • MobSF - Análisis automático APK
  • jadx - Decompilar Java
  • Dex2Jar - Convertir DEX a JAR

Testing de API

  • Postman/Insomnia - Testing manual
  • SQLMap - Detección SQL injection
  • Nikto - Escaneo web

Conclusión

La aplicación tiene una base de seguridad razonablemente sólida pero requiere correcciones inmediatas en:

  1. Comunicación segura (tráfico HTTP permitido)
  2. Protección de entornos de desarrollo (QA expuesta)
  3. Protección del código (sin minificar)

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