⚠️ ACTUALIZACIÓN CRÍTICA 13/08/2025 - SOLUCIONES IMPLEMENTADAS Y NUEVA VULNERABILIDAD ANV:✅❌ SOLUCIÓN MEF CON PROBLEMA OPERACIONAL:
- MEF: Vulnerabilidad eliminada mediante remoción del endpoint de autocompletado
- Consecuencia: Todos los formularios MEF que dependían del autocompletado ahora están rotos
- Estado: Seguro pero no funcional - usuarios deben ingresar datos manualmente
- Impacto: Pérdida de conveniencia y eficiencia en trámites gubernamentales
✅❌ SOLUCIÓN AIN CON PROBLEMA OPERACIONAL:
- AIN: Vulnerabilidad corregida mediante remoción del endpoint de autocompletado
- Consecuencia: La agenda de la aplicación dejó de funcionar por ausencia del autocompletado
- Estado: Seguro pero no funcional - usuarios no pueden usar la funcionalidad de agenda
- Impacto: Pérdida de funcionalidad crítica en la agenda de citas y trámites
🆘 NUEVA VULNERABILIDAD CRÍTICA DETECTADA:
- ANV: Aplicación móvil oficial expone nombres completos, apellidos y fecha de nacimiento por autocompletado de cédula
- La app está disponible en Apple Store y Google Play Store para todos los ciudadanos
- Cualquier persona puede descargar la aplicación y acceder a datos personales de otros ciudadanos
- Sin autenticación: La aplicación no requiere verificación de identidad para mostrar datos sensibles
- Contexto sensible: Exposición de datos en trámites de vivienda social
🚨 ESTADO ACTUAL DE VULNERABILIDADES GUBERNAMENTALES:
- MEF: ✅ VULNERABILIDAD SOLUCIONADA - Endpoint removido, pero ❌ FORMULARIOS ROTOS - Autocompletado no funciona
- AIN: ✅ VULNERABILIDAD SOLUCIONADA - Endpoint removido, pero ❌ AGENDA ROTA - Funcionalidad de agenda no funciona
- ANV: NUEVA - Aplicación móvil oficial expone información personal completa sin autenticación
- Impacto operacional: Remoción de endpoints MEF y AIN rompió funcionalidad de autocompletado en formularios gubernamentales
- Sin verificación de identidad: ANV no verifica si el trámite se realiza para uno mismo o para terceros
- Crisis operacional: MEF y AIN ahora seguros pero no funcionales, ANV funcional pero vulnerable
📊 Estado crítico: Soluciones de seguridad MEF y AIN causaron crisis operacional en formularios gubernamentales.
📅 ACTUALIZACIÓN DE SEGURIDAD 07/08/2025:
⚠️ VULNERABILIDAD MEF RESURGIÓ: La vulnerabilidad en el formulario https://www.tramitesenlinea.mef.gub.uy/Apia/portal/tramite.jsp?id=2629 volvió a resurgir. El sistema de autenticación implementado no verifica correctamente la autenticación y permite el acceso anónimo exponiendo:
- Fecha de nacimiento completa
- Nombre completo de cualquier ciudadano
⚠️ VULNERABILIDAD AIN CORREGIDA: La vulnerabilidad en el formulario https://tramites.ain.gub.uy fue corregida mediante la remoción del endpoint de autocompletado, pero esto comprometió la funcionalidad de la agenda:
- Primer nombre del titular ya no se expone
- Primer apellido del titular ya no se expone
- Agenda de la aplicación dejó de funcionar por ausencia del autocompletado
� PROBLEMA DE SEGURIDAD CRÍTICO:
- El sistema permite autocompletar datos personales sensibles con solo ingresar una cédula
- No valida si el usuario está autenticado correctamente con el gobierno
- No verifica si el trámite se realiza para uno mismo o para terceros
- Expone información personal sin autorización adecuada
✅ MEJORAS TÉCNICAS IMPLEMENTADAS:
- ✅ Extracción de datos mejorada: Soporte para el nuevo formato de formularios AIN_FRM_GRAL_DATOS_PERSONALES
- ✅ Información adicional: Tipo de documento, país emisor, y componentes individuales de nombres y apellidos
- ✅ Manejo de errores optimizado: Mensajes más descriptivos y manejo específico por tipo de error
- ✅ Validación mejorada: Verificación de formato de cédula antes del procesamiento
- ✅ Compatibilidad dual: Funciona con formatos antiguos y nuevos de formularios gubernamentales
- ✅ Logging mejorado: Mayor detalle en los logs para debugging y monitoreo
📊 ESTADO ACTUAL DE SERVICIOS GUBERNAMENTALES:
- ✅❌ Formulario MEF SOLUCIONADO PERO ROTO: Vulnerabilidad eliminada mediante remoción del endpoint, pero formularios no funcionan
- ✅❌ Formulario AIN SOLUCIONADO PERO ROTO: Vulnerabilidad eliminada mediante remoción del endpoint, pero agenda no funciona
- ❌ Formularios de Lotería inoperativos: Todos los formularios que requieren cédula permanecen fuera de servicio desde 31/07/2025
- 🆘 Aplicación ANV VULNERABILIDAD CRÍTICA: App móvil oficial expone nombres, apellidos y fecha de nacimiento por autocompletado
📊 Estado crítico: Soluciones MEF y AIN crearon crisis operacional - formularios seguros pero inutilizables. ANV mantiene vulnerabilidad activa.
Ver reporte completo actualizado para detalles técnicos.
Este proyecto surge del análisis de seguridad en sistemas públicos debido a:
🔍 Ausencia de programas de recompensas por reportes de seguridad en entidades públicas
🔍 Falta de canales formales para reportar vulnerabilidades en sistemas gubernamentales
🔍 Necesidad de transparencia en el estado de la ciberseguridad pública
🔍 Importancia de la educación ciudadana sobre protección de datos personales🎯 Objetivo: Informar sobre el estado de los sistemas informáticos públicos y promover mejores prácticas de seguridad en el manejo de información ciudadana.
📋 Este proyecto contribuye a:
- Generar conciencia sobre la importancia de la ciberseguridad pública
- Documentar el estado actual de los sistemas gubernamentales
- Promover la transparencia en la gestión de sistemas públicos
- Educar sobre buenas prácticas de protección de datos
Consulte el 📄 Reporte de Vulnerabilidades para información técnica detallada.
Una API RESTful construida con TypeScript y Express siguiendo los principios SOLID para validar cédulas de identidad uruguayas y consultar información a través del formulario oficial del MEF (Ministerio de Economía y Finanzas).
- Tipo de documento: Identifica si es Cédula de Identidad, Pasaporte u Otro
- País emisor: Detecta el país que emitió el documento (Uruguay, Argentina, etc.)
- Componentes individuales: Extrae primer nombre, segundo nombre, primer apellido, segundo apellido por separado
- Compatibilidad dual: Funciona con formatos antiguos y nuevos de formularios
- Validación previa: Verifica formato de cédula antes del procesamiento
- Manejo de errores optimizado: Mensajes específicos por tipo de error
- Logging avanzado: Mayor detalle para debugging y monitoreo
- Performance mejorado: Tiempos de procesamiento optimizados
- Configuración validada: Verificación automática de configuración del servicio
{ "success": true, "data": { "persona": { "nombre": "EDELMA", "apellido": "de SOUZA", "cedula": "14115499", "tipoDocumento": "Cédula de Identidad", "paisEmisor": "URUGUAY", "primerNombre": "EDELMA", "primerApellido": "de SOUZA", "processingTime": 1250, "hasSession": true } } }¡Esta funcionalidad también está disponible como paquete npm!
# Instalar el paquete npm install ci-validation # Uso básico import { validateCIAndQuery } from 'ci-validation'; const result = await validateCIAndQuery('19119365'); console.log(result); // Output (solo validación local - servicios gubernamentales con vulnerabilidades): // { // "success": true, // "data": { // "ci": "19119365", // "isValid": true, // "normalizedCi": "19119365", // "info": "Validación local únicamente - Servicios gubernamentales presentan vulnerabilidades desde 07/08/2025" // } // }🔗 Enlaces del paquete:
- npm: https://www.npmjs.com/package/ci-validation
- Documentación completa: NPM_README.md
- Guía de publicación: NPM_PUBLISHING.md
- 📦 Paquete NPM: Disponible como librería independiente para proyectos TypeScript/JavaScript
- 🔧 CLI incluido: Herramienta de línea de comandos para validación rápida
- Validación de CI: Valida el formato y dígito verificador de cédulas uruguayas
- Consulta de datos: Obtiene información oficial a través del formulario del MEF
- Arquitectura SOLID: Implementa los 5 principios SOLID para código mantenible
- TypeScript: Tipado estático para mayor robustez
- Express.js: Framework web rápido y minimalista
- Middlewares de seguridad: CORS, Helmet, Rate Limiting
- Listo para Vercel: Configuración optimizada para deployment
CiValidator: Solo se encarga de validar cédulasCiService: Solo maneja las consultas a la API externaCiController: Solo maneja las peticiones HTTP
- Interfaces extensibles para validadores y servicios
- Nuevos tipos de validación pueden agregarse sin modificar código existente
- Las implementaciones de interfaces pueden intercambiarse sin afectar el funcionamiento
- Interfaces específicas y pequeñas
- No hay dependencias en métodos no utilizados
- Dependencias por inyección de dependencias
- Código de alto nivel no depende de implementaciones concretas
# Instalar la librería npm install ci-validation # Uso básico import { validateCI, validateCIAndQuery } from 'ci-validation'; // Validación simple console.log(validateCI('19119365')); // true // Validación con consulta (servicios gubernamentales con disponibilidad limitada) const result = await validateCIAndQuery('19119365'); console.log(result);# Instalar globalmente para usar desde línea de comandos npm install -g ci-validation ```bash # Usar el CLI ci-validate 19119365 ci-validate 19119365 --query # Consulta a servicios gubernamentales (disponibilidad limitada)# Clonar repositorio git clone <url-del-repo> cd ci-validation-api # Instalar dependencias npm install # Modo desarrollo npm run dev # Construir para producción npm run build # Iniciar en producción npm startVerifica el estado de la API
Respuesta:
{ "status": "ok", "timestamp": "2025-07-30T12:00:00.000Z" }Valida una cédula de identidad uruguaya
Request Body:
{ "ci": "19119365" }Respuesta exitosa:
{ "success": true, "data": { "ci": "19119365", "isValid": true, "info": "Información obtenida del formulario oficial del MEF..." } }Respuesta con error:
{ "success": false, "error": "Cédula inválida: formato incorrecto" }Consulta información específica de SMI (Sociedad de Medicina del Interior) por cédula
Request Body:
{ "ci": "19119365" }También disponible como GET:
GET /api/ci/smi?ci=19119365Respuesta exitosa (usuario registrado):
{ "success": true, "data": { "success": true, "hasUser": true, "member": { "ci": "19119365", "status": "registered", "executionTime": 1250, "userData": { "perID": "12345", "perCI": "19119365", "perMail": "user@email.com", "domicTel": "099123456", "isValidUser": true } } }, "timestamp": "2025-08-13T12:00:00.000Z", "executionTime": { "total": 1300, "validation": 5, "query": 1250 } }Respuesta exitosa (usuario no registrado):
{ "success": true, "data": { "success": true, "hasUser": false, "error": "Usuario no registrado en SMI" }, "timestamp": "2025-08-13T12:00:00.000Z", "executionTime": { "total": 800, "validation": 5, "query": 750 } }Respuesta con error:
{ "success": false, "error": "Cédula inválida: formato incorrecto", "code": "INVALID_FORMAT" }Endpoint de demostración con una cédula de ejemplo
Página web interactiva para probar la API
La página de demostración incluye:
- Interfaz amigable: Formulario simple para ingresar cédulas
- Validación en tiempo real: Feedback inmediato sobre errores de formato
- Respuesta dual: Muestra tanto la respuesta JSON como un resultado amigable
- Persistencia en URL: La cédula se mantiene en la URL al recargar
- Ejemplos: Botones para probar cédulas de ejemplo
- Responsive: Funciona en dispositivos móviles y desktop
- Indicadores visuales: Animaciones y colores para success/error
Características técnicas:
- Uso de Tailwind CSS para estilos
- JavaScript vanilla para máximo rendimiento
- Font Awesome para iconos
- Manejo de errores robusto
- Validación del lado cliente antes de enviar
# Ejecutar tests npm test # Ejecutar linting npm run lint # Corregir problemas de linting npm run lint:fix- Conecta tu repositorio con Vercel
- Vercel detectará automáticamente la configuración
- Las variables de entorno se configuran en el dashboard de Vercel
El proyecto está optimizado para deployment serverless en Vercel:
- Funciones serverless: Los endpoints están en la carpeta
/api/ - Archivos estáticos: La página demo está en
/public/ - Configuración automática:
vercel.jsonmaneja el routing - Build automático: TypeScript se compila automáticamente
api/ ├── index.ts # Endpoint raíz (GET /) ├── health.ts # Health check (GET /health) ├── validate.ts # Validación (POST /api/ci/validate) ├── smi.ts # Consulta SMI (POST /api/ci/smi) └── demo.ts # Demo API (GET /api/ci/demo) public/ └── index.html # Página demo (GET /demo) - API Root:
https://ci-validation.vercel.app/ - Health Check:
https://ci-validation.vercel.app/health - Validación:
https://ci-validation.vercel.app/api/ci/validate - Demo Page:
https://ci-validation.vercel.app/demo
NODE_ENV:productionPORT: Puerto del servidor (automático en Vercel)
Para usar un proxy externo para las consultas SMI (útil cuando no se puede acceder directamente a SMI):
SMI_PROXY: URL completa del servidor proxy que tiene acceso a SMI (ej:https://xxxxxx.com)
Ejemplo de configuración en .env:
# Usar proxy externo para SMI SMI_PROXY=https://xxxx.comNota: Cuando se configura
SMI_PROXY, el servicio hará peticiones a{SMI_PROXY}/api/smi?ci=xxxen lugar de conectar directamente a SMI.
Para enrutar las peticiones HTTP a través de un servidor proxy, puedes usar cualquiera de estos métodos:
Método 1: URL completa (recomendado)
PROXY: URL completa del proxy (ej:http://179.27.158.18:80)
Método 2: Variables individuales (para compatibilidad)
PROXY_HOST: Dirección del servidor proxy (ej:proxy.empresa.com)PROXY_PORT: Puerto del proxy (ej:8080)PROXY_PROTOCOL: Protocolo del proxy (httpohttps, por defectohttp)PROXY_USERNAME: Usuario para autenticación del proxy (opcional)PROXY_PASSWORD: Contraseña para autenticación del proxy (opcional)
Ejemplos de configuración en .env:
# Método simple (recomendado) PROXY=http://179.27.158.18:80 # Con autenticación PROXY=http://usuario:contraseña@proxy.empresa.com:8080 # Método alternativo (variables individuales) PROXY_HOST=proxy.empresa.com PROXY_PORT=8080 PROXY_PROTOCOL=http PROXY_USERNAME=mi_usuario PROXY_PASSWORD=mi_contraseñaNota: El soporte de proxy está disponible para todas las consultas a servicios externos (SMI, lotería, etc.)
src/ ├── controllers/ # Controladores HTTP │ └── CiController.ts ├── services/ # Servicios de negocio │ └── CiService.ts ├── validators/ # Validadores │ └── CiValidator.ts ├── interfaces/ # Definiciones de tipos │ ├── ICiValidator.ts │ ├── ICiService.ts │ └── ApiResponse.ts ├── middleware/ # Middlewares personalizados │ └── errorHandler.ts ├── routes/ # Definición de rutas │ └── ciRoutes.ts ├── utils/ # Utilidades │ └── dependencyContainer.ts └── index.ts # Punto de entrada - CORS: Configurado para permitir requests desde dominios específicos
- Helmet: Headers de seguridad automáticos
- Rate Limiting: Límite de requests por IP
- Validación de entrada: Validación estricta de datos de entrada
La validación sigue el algoritmo oficial uruguayo:
- Verificar que tenga 7-8 dígitos
- Calcular dígito verificador usando el algoritmo oficial
- Comparar con el último dígito de la cédula
- Fork el proyecto
- Crea una rama para tu feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Si tienes permisos de publicación:
# Verificar build npm run build # Dry run npm run publish:dry # Publicar npm run publish:npm # O incrementar versión y publicar npm version patch # o minor/major npm run publish:npmVer guía completa de publicación para más detalles.
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
- 📚 Documentación del Paquete NPM - Guía completa de uso de la librería
- 🚀 Guía de Publicación NPM - Instrucciones para publicar actualizaciones
- npm Package - Página oficial del paquete
⚠️ Reporte de Vulnerabilidad de Seguridad - Información sobre la vulnerabilidad encontrada en servicios gubernamentales- 🔍 Informe Técnico de Vulnerabilidad IDOR - Análisis técnico detallado de la vulnerabilidad
- 🛡️ Política de Seguridad y VDP - Programa de Divulgación Responsable de Vulnerabilidades