
Herramienta de evaluación de seguridad no destructiva para CVE-2026-73296, que verifica los límites de autenticación en servidores HTTP MCP móviles expuestos (puertos 8020/8021) para detectar posibles accesos no autorizados a dispositivos Android.
UFO-Vuln 💥
El acceso no autenticado a Mobile MCP puede exponer los datos de la pantalla de Android y proporcionar capacidades de control remoto de la interfaz de usuario a través de ADB.
Este repositorio está destinado únicamente a investigación de seguridad autorizada, validación de vulnerabilidades, pruebas defensivas y entornos de laboratorio controlados.
El verificador incluido está diseñado para realizar comprobaciones no destructivas del límite de autenticación.
No:
CVE: CVE-2026-73296
Producto: Microsoft UFO
Componente: Servidores HTTP Mobile MCP
Gravedad: Crítica
CVSS v3.1: 9.4
Versiones afectadas: <= v3.0.7
Versiones parcheadas oficialmente: Ninguna listada por el aviso de Microsoft UFO en el momento de esta documentación.
CWE:
La vulnerabilidad afecta a los servidores de recopilación de datos y acción Mobile MCP de UFO cuando se exponen a través de una red sin la autenticación adecuada.
El aviso oficial identifica la implementación vulnerable como:```text ufo/client/mcp/http_servers/mobile_mcp_server.py
Los servicios afectados exponen interfaces MCP HTTP Streamable que pueden interactuar con un dispositivo Android conectado mediante ADB.
Si los servicios son accesibles de forma remota y no se aplica autenticación, un cliente de red no autenticado podría acceder a información sensible del dispositivo e invocar funcionalidad de control de la interfaz de usuario de Android.
---
# 🎯 Resumen Ejecutivo
Microsoft UFO es un framework de agentes de IA diseñado para la automatización inteligente y la orquestación de múltiples dispositivos.
Su funcionalidad Mobile MCP proporciona servidores MCP para interactuar con dispositivos Android a través de ADB.
La configuración vulnerable expone dos servicios de red importantes:
| Servicio | Puerto | Función |
| --------------------------- | -------: | ---------------------------------- |
| Mobile Data Collection MCP | `8020` | Información de Android y datos de pantalla |
| Mobile Action MCP | `8021` | Interacción y control de Android |
En las versiones afectadas, los servidores Mobile MCP podían crearse sin un proveedor de autenticación ni una comprobación de autorización a nivel de solicitud.
En consecuencia:```text
Remote Client
│
│ HTTP / MCP
▼
┌──────────────────────┐
│ Mobile MCP Server │
│ │
│ Authentication: │
└──────────┬───────────┘
│
▼
ADB Interface
│
▼
Android Device
La frontera de seguridad entre el cliente de red remoto y la funcionalidad respaldada por ADB está, por tanto, insuficientemente protegida.
9.4 CRITICAL
Vector:```py
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L
La vulnerabilidad es particularmente significativa porque la explotación no requiere inherentemente:
El aviso oficial indica que un cliente de red capaz de alcanzar el servicio expuesto puede inicializar una sesión MCP e invocar sus herramientas sin presentar una credencial.
Según el aviso de seguridad oficial de Microsoft UFO:```py Affected: <= v3.0.7
Patched: None listed
El repositorio oficial actualmente lista `3.0.7` como una versión publicada.
> **Importante:** No afirmes que `3.0.8` es una versión oficialmente parcheada a menos que Microsoft publique esa información. El aviso de seguridad oficial actualmente no lista ninguna versión parcheada.
---
# 🏗️ Arquitectura Vulnerable
La funcionalidad vulnerable está implementada en:```py
ufo/client/mcp/http_servers/mobile_mcp_server.py
Funciones importantes identificadas por el aviso oficial incluyen:
create_mobile_data_collection_server capture_screenshot get_ui_tree get_device_info get_mobile_app_target_info get_app_window_controls_target_info
### Acciones Móviles```py
create_mobile_action_server
tap
swipe
type_text
launch_app
press_key
click_control
Los dos servicios HTTP están asociados con:```py TCP/8020 TCP/8021
El aviso identifica específicamente estos servicios como los servidores MCP de recopilación de datos móviles y acción.
---
# 🔬 Causa raíz
El problema de seguridad fundamental es:```py
Powerful functionality
+
Network exposure
+
Missing authentication
=
Unauthorized access
En la implementación afectada, los servidores FastMCP de Mobile MCP se construyeron sin un proveedor de autenticación ni una aplicación equivalente de autorización a nivel de solicitud.
Conceptualmente:```python mcp = FastMCP( "Mobile MCP Server", host=host, port=port, )
El problema no es simplemente la existencia de MCP.
El problema es que una interfaz accesible por red expone operaciones sensibles para la seguridad sin exigir que quien la invoca establezca una identidad autenticada.
---
# 🔗 Flujo de ataque
Una cadena de ataque simplificada se ve así:```py
┌───────────────────┐
│ Unauthenticated │
│ Network Client │
└─────────┬─────────┘
│
│ HTTP
▼
┌─────────────────────────┐
│ Mobile MCP :8020/:8021 │
│ │
│ Authentication missing │
└───────────┬─────────────┘
│
│ MCP Tool
▼
┌─────────────────────────┐
│ Mobile MCP Tool │
└───────────┬─────────────┘
│
│ ADB operation
▼
┌─────────────────────────┐
│ Android Device / ADB │
└─────────────────────────┘
La transición de seguridad importante es:```py Unauthenticated network request ↓ MCP functionality ↓ ADB-backed action ↓ Android device
---
# 📡 Servicios Expuestos
## Puerto 8020 — Recopilación de Datos
El servidor de recopilación de datos puede exponer funcionalidad asociada con:```py
capture_screenshot
get_ui_tree
get_device_info
get_mobile_app_target_info
get_app_window_controls_target_info
La información potencialmente expuesta incluye:
Esto crea un riesgo significativo de confidencialidad.
El servidor de acciones expone funcionalidad asociada con:```text tap swipe type_text launch_app press_key click_control
Estas operaciones pueden proporcionar a un llamador remoto capacidades de interacción con la interfaz de usuario de Android.
Dependiendo del estado del dispositivo y de las aplicaciones accesibles, esto puede permitir potencialmente:```text
Remote input
↓
UI navigation
↓
Application interaction
↓
Device-state modification
El aviso oficial describe específicamente estas capacidades como acciones de UI de Android inyectables de forma remota.
El acceso no autorizado a la información de pantalla y UI puede potencialmente exponer:
El impacto exacto depende del dispositivo Android y de las aplicaciones accesibles a través del entorno ADB conectado.
Las acciones móviles no autorizadas pueden permitir a un atacante:```text Tap Swipe Type text Press keys Launch applications Click UI controls
Esto puede potencialmente modificar el estado de la aplicación o interactuar con flujos de trabajo que se ejecutan en el dispositivo.
---
# 💥 Impacto en la Disponibilidad
Las acciones automatizadas repetidas podrían:
* Interrumpir la automatización
* Cambiar de aplicación
* Navegar fuera de los flujos de trabajo
* Desencadenar acciones de interfaz de usuario inesperadas
* Interferir con entornos de prueba
* Alterar una sesión de automatización de Android
La evaluación CVSS asigna un **impacto bajo en la disponibilidad**, mientras que la confidencialidad y la integridad se califican como **altas**.
---
# 🧪 Detección Segura
Este repositorio incluye:```text
cve-2026-73296.py
El verificador está diseñado intencionalmente como una herramienta de evaluación de seguridad no destructiva.
Comprueba:```text TCP reachability ↓ HTTP response ↓ Authentication boundary ↓ SAFE / VULNERABLE / UNKNOWN
No traduce **no** invoca las herramientas de Mobile MCP.
---
# 🟢 SEGURO
Un resultado `SAFE` significa que el endpoint HTTP probado devolvió una barrera de autenticación/autorización, como por ejemplo:```text
HTTP 401
HTTP 403
Ejemplo:```text [SAFE] Port 8020: authentication/authorization barrier detected
---
# 🔴 VULNERABLE
Un resultado `VULNERABLE` significa que el endpoint HTTP probado respondió correctamente sin presentar un desafío de autenticación.
Ejemplo:```text
[VULNERABLE] Port 8021:
HTTP endpoint responded without an authentication challenge
Esto debe tratarse como una exposición potencial que requiere confirmación.
Un resultado UNKNOWN significa que el verificador no pudo determinar de manera fiable el estado de autenticación.
Ejemplos:```text TCP unreachable TLS error HTTP timeout Unexpected HTTP response Redirect
`UNKNOWN` no debe interpretarse ni como seguro ni como vulnerable.
---
# ⚠️ Limitaciones de detección
Este verificador intencionalmente **no** afirma demostrar la explotación.
Un resultado verde significa:
> Se observó protección de autenticación en el límite HTTP probado.
No demuestra matemáticamente que toda la implementación de UFO sea segura.
Del mismo modo, un resultado rojo indica:
> El endpoint probado respondió sin un desafío de autenticación.
Debe correlacionarse con:
* Versión de UFO
* Configuración de implementación
* Exposición de red
* Configuración de MCP
* Proxies inversos
* Configuración de TLS
* Reglas de firewall
* Conectividad ADB
---
# 🚀 Uso
Clone el repositorio:```bash
git clone https://github.com/0xBlackash/CVE-2026-73296.git
cd CVE-2026-73296
Instala la dependencia:```bash python3 -m pip install requests
Sintaxis comprobada:```bash
python3 -m py_compile cve-2026-73296.py
Ejecuta contra un sistema de prueba autorizado:```bash python3 cve-2026-73296.py 127.0.0.1
Ejemplo de objetivo de laboratorio:```bash
python3 cve-2026-73296.py 192.168.56.10
Para HTTPS con un certificado de laboratorio/autofirmado:```bash python3 cve-2026-73296.py https://192.168.56.10 --no-verify-tls
---
# 🖥️ Ejemplo de Salida
### Endpoint Protegido```py
════════════════════════════════════════════════════════
SECURITY ASSESSMENT
────────────────────────────────────────────────────────
SAFE : 2
VULNERABLE : 0
UNKNOWN : 0
✓ AUTHENTICATION CHECK PASSED
════════════════════════════════════════════════════════ SECURITY ASSESSMENT ────────────────────────────────────────────────────────
SAFE : 0 VULNERABLE : 2 UNKNOWN : 0
⚠ POTENTIAL CVE-2026-73296 EXPOSURE
→ TCP/8020 responded without an authentication challenge. → TCP/8021 responded without an authentication challenge.
<img width="1523" height="789" alt="CVE-2026-73296" src="https://assets.kitploit.com/production/public/readmes/54023/5754c6ba111148250c8f3067db1c7dfbb9cb85e4910f2afe13443f7906926573/def8f2a924188fdd01d3ef2b3880c3bc22bef0c251f9b13d24ac458f2143f3eb-display-v1.webp" />
---
# 🧬 Modelo de origen a destino
La vulnerabilidad puede entenderse como un fallo de seguridad de origen a destino:```py
SOURCE
│
│ Unauthenticated network request
▼
MCP HTTP Server
│
│ Missing authentication/authorization
▼
MCP Tool
│
▼
ADB-backed operation
│
▼
ANDROID DEVICE
La frontera de seguridad prevista debería ser, en cambio:```py Network Request │ ▼ Authentication │ ├──── INVALID ────► REJECT │ ▼ Authorization │ ├──── DENIED ─────► REJECT │ ▼ MCP Tool │ ▼ ADB
---
# 🔐 Remediación Recomendada
La remediación principal es imponer la autenticación en el límite del transporte HTTP de Mobile MCP.
Arquitectura de seguridad recomendada:```py
┌──────────────────┐
│ Authorized MCP │
│ Client │
└────────┬─────────┘
│
Bearer Token
│
▼
┌──────────────────┐
│ Authentication │
│ Middleware │
└────────┬─────────┘
│
Authorized?
/ \
NO YES
│ │
▼ ▼
REJECT MCP Tool
│
▼
ADB
El aviso oficial recomienda un diseño de autenticación basado en:```py UFO_MCP_API_KEY
El modelo de seguridad debe garantizar:
1. Se requiere un secreto de alta entropía.
2. El servidor falla de forma segura si falta la credencial.
3. Las credenciales de portador no válidas son rechazadas.
4. La autenticación ocurre antes de la ejecución de la herramienta.
5. Las credenciales no se exponen como parámetros de herramienta visibles para el LLM.
6. La comparación de credenciales debe usar comparación en tiempo constante.
7. Los despliegues remotos deben usar transporte cifrado.
8. Localhost debe seguir siendo el valor predeterminado cuando sea posible.
---
# 🌐 Exposición de red
Evita exponer:```py
0.0.0.0:8020
0.0.0.0:8021
directamente a redes no confiables.
Prefiera:```py 127.0.0.1
para implementaciones solo locales.
Para acceso remoto legítimo, considere:```py
Client
│
▼
TLS / Private Tunnel
│
▼
Authenticated Reverse Proxy
│
▼
UFO MCP
│
▼
ADB
Posibles controles de seguridad incluyen:
Un conjunto adecuado de pruebas de regresión de seguridad debería verificar:
Request ↓ No Authorization header ↓ REJECT ↓ ADB not reached
The `-p` flag is used to specify the port number, and the `-t` flag is used to specify the target IP address. The `-m` flag is used to specify the mode, which can be either `tcp` or `udp`. The `-s` flag is used to specify the source IP address, and the `-d` flag is used to specify the destination IP address. The `-r` flag is used to specify the rate of packets per second, and the `-c` flag is used to specify the number of packets to send. The `-h` flag is used to display the help menu.```py
PASS
Bearer: invalid-token ↓ REJECT ↓ ADB not reached
pip install kitploit-tool
git clone https://github.com/example/kitploit-tool.git
cd kitploit-tool
pip install -r requirements.txt
python setup.py install
kitploit-tool --target example.com
Escaneo básico con salida detallada:
kitploit-tool --target example.com --verbose
Guardar los resultados en un archivo:
kitploit-tool --target example.com --output results.txt
El archivo de configuración se encuentra en ~/.kitploit/config.yaml. Puedes modificar la configuración por defecto según tus necesidades:
# Configuración por defecto
threads: 10
timeout: 30
user_agent: "Kitploit-Tool/1.0"
from kitploit_tool import Scanner
# Inicializar el escáner
scanner = Scanner(target="example.com")
# Ejecutar el escaneo
results = scanner.run()
from kitploit_tool import Scanner, KitploitError
try:
scanner = Scanner(target="example.com")
results = scanner.run()
except KitploitError as e:
print(f"Error: {e}")
¡Las contribuciones son bienvenidas! Por favor, sigue estos pasos:
git checkout -b feature/mejora)git commit -am 'Añadir nueva funcionalidad')git push origin feature/mejora)Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.
PASS
```
### Prueba 3 — Credencial válida```py
Bearer: valid-token
↓
ACCEPT
↓
MCP Tool
↓
ADB
```
Esperado:
- **`--expected`**: Define el valor esperado para la comparación. Si no se proporciona, se utiliza el valor de `--value`.
- **`--operator`**: Especifica el operador de comparación. Los valores válidos son `eq`, `ne`, `gt`, `ge`, `lt`, `le`. El valor predeterminado es `eq`.
- **`--value`**: El valor real a comparar contra el valor esperado.
- **`--type`**: El tipo de datos de los valores. Los valores válidos son `string`, `int`, `float`, `bool`. El valor predeterminado es `string`.
- **`--case-sensitive`**: Si se establece, la comparación de cadenas distingue entre mayúsculas y minúsculas. El valor predeterminado es `false`.
- **`--invert`**: Si se establece, el resultado de la comparación se invierte. El valor predeterminado es `false`.
- **`--on-fail`**: La acción a realizar cuando la comparación falla. Los valores válidos son `exit`, `warn`, `ignore`. El valor predeterminado es `exit`.
- **`--on-success`**: La acción a realizar cuando la comparación tiene éxito. Los valores válidos son `exit`, `warn`, `ignore`. El valor predeterminado es `ignore`.
- **`--timeout`**: El tiempo máximo en segundos para esperar a que se complete la comparación. El valor predeterminado es `30`.
- **`--retry`**: El número de veces para reintentar la comparación si falla. El valor predeterminado es `0`.
- **`--retry-delay`**: El retraso en segundos entre reintentos. El valor predeterminado es `1`.
- **`--description`**: Una descripción legible por humanos de la comparación. Se utiliza en los informes de salida.
- **`--tag`**: Una etiqueta para agrupar comparaciones relacionadas. Se utiliza en los informes de salida.
- **`--json`**: Si se establece, la salida se formatea como JSON.
- **`--verbose`**: Si se establece, se muestra información de depuración detallada.
- **`--quiet`**: Si se establece, se suprime toda la salida excepto los errores.
- **`--no-color`**: Si se establece, se desactiva la salida de color.
- **`--help`**: Muestra el mensaje de ayuda y sale.
- **`--version`**: Muestra la información de versión y sale.```py
PASS
```
### Prueba 4 — Falta el secreto del servidor```py
UFO_MCP_API_KEY = missing
```
## Chunk 91 de 125
### 3.2.2.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1```py
Server fails closed
```
### Test 5 — Marcador de posición de credenciales
Las variables de entorno no resueltas no deberían convertirse accidentalmente en credenciales de autenticación.
Esperado:```py
Client initialization fails
```
---
# 🛡️ Defensa en profundidad
La autenticación por sí sola no debe considerarse suficiente.
Controles recomendados:
---```py
Internet
│
X
│
Firewall/VPN
│
▼
TLS / Proxy
│
▼
API Authentication
│
▼
Authorization
│
▼
MCP Server
│
▼
ADB
│
▼
Android Device
```
---
# 🔎 Detección y Monitoreo
Los equipos de seguridad deben monitorear accesos inesperados a:```text
TCP/8020
TCP/8021
```
Busca lo siguiente:
* Direcciones IP de origen inesperadas
* Solicitudes sin cabeceras de autorización
* Fallos de autenticación repetidos
* Sesiones MCP inusuales
* Solicitudes de capturas de pantalla inesperadas
* Llamadas repetidas de interacción con la interfaz de usuario
* Lanzamientos de aplicaciones inesperados
* Actividad ADB sospechosa
Telemetría de red útil:```text
source_ip
destination_ip
destination_port
timestamp
HTTP_method
HTTP_status
user_agent
authorization_present
request_frequency
```
---
# 📋 Lista de Verificación de Respuesta a Incidentes
Si se descubre una instancia vulnerable expuesta:
### 1. Restringir el acceso a la red
Limite inmediatamente el acceso a:```text
8020
8021
```
### 2. Desconecta los dispositivos Android innecesarios
Si el servicio no es necesario, desconecta el dispositivo ADB asociado.
### 3. Investiga los registros
Busca:```text
Unknown source IPs
Unexpected MCP sessions
Unexpected device interactions
Unexpected application launches
```
### 4. Rotar credenciales
Si los secretos de autenticación pueden haber sido expuestos:```text
Generate a new high-entropy API key
```
### 5. Revisar el estado del dispositivo
Compruebe:
* Aplicaciones lanzadas recientemente
* Estado modificado de las aplicaciones
* Mensajes/entradas inesperados
* Actividad sospechosa en la interfaz de usuario
### 6. Actualizar o aplicar las directrices de seguridad del proveedor
Siga el último aviso de seguridad de Microsoft UFO y la información de versiones.
### 7. Volver a probar
Ejecute el verificador seguro de nuevo después de la corrección.
---
# 🧰 Metodología de investigación
Este proyecto sigue una metodología defensiva de validación de vulnerabilidades:```py
1. Identify vulnerable component
↓
2. Determine network attack surface
↓
3. Identify missing security boundary
↓
4. Map exposed capabilities
↓
5. Build non-destructive detection
↓
6. Validate authentication behavior
↓
7. Document impact
↓
8. Apply remediation
↓
9. Regression test
```
---
# 📂 Estructura del Repositorio
Estructura de proyecto recomendada:```py
CVE-2026-73296/
│
├── README.md
│
├── poc/
│ └── cve-2026-73296.py
│
├── docs/
│ ├── technical-analysis.md
│ ├── remediation.md
│ └── detection.md
│
├── screenshots/
│ ├── safe.png
│ └── vulnerable.png
│
├── tests/
│ └── README.md
│
├── LICENSE
└── .gitignore
```
---
# 🧠 Lecciones Clave de Seguridad
## 1. MCP Es un Límite de Seguridad
Los servidores MCP no deben tratarse como utilidades locales inofensivas cuando exponen operaciones potentes a través de una red.
---
## 2. ADB Amplifica el Impacto
Un endpoint MCP conectado a ADB puede convertirse en un puente entre:```text
Network
↓
Agent protocol
↓
ADB
↓
Android
```
Los requisitos de seguridad, por lo tanto, deben cubrir toda la cadena.
---
## 3. Los valores predeterminados de localhost importan
Un servicio vinculado a:```text
127.0.0.1
```
tiene un perfil de exposición fundamentalmente diferente de:```text
0.0.0.0
```
La vinculación de red debe, por tanto, tratarse como una configuración de seguridad.
---
## 4. La autenticación debe ocurrir antes del sumidero
El invariante crítico es:```text
UNTRUSTED REQUEST
↓
AUTHENTICATION
↓
AUTHORIZATION
↓
MCP TOOL
↓
ADB
```
Nunca:```text
UNTRUSTED REQUEST
↓
MCP TOOL
↓
ADB
```
---
# 📊 Resumen de Vulnerabilidad
| Propiedad | Valor |
| ------------------------ | ---------------------- |
| CVE | CVE-2026-73296 |
| Producto | Microsoft UFO |
| Componente | Mobile MCP |
| Severidad | Crítica |
| CVSS | 9.4 |
| Vector de Ataque | Red |
| Complejidad | Baja |
| Privilegios | Ninguno |
| Interacción del Usuario | Ninguna |
| Confidencialidad | Alta |
| Integridad | Alta |
| Disponibilidad | Baja |
| CWE-306 | Autenticación Ausente |
| CWE-862 | Autorización Ausente |
| Data MCP | TCP/8020 |
| Action MCP | TCP/8021 |
| Afectado | ≤ v3.0.7 |
| Versión oficial parcheada| Ninguna listada |
---
# 🏁 Conclusión
CVE-2026-73296 demuestra el riesgo de seguridad que se crea cuando interfaces de automatización de agentes potentes se exponen a través de una red sin un límite adecuado de autenticación y autorización.
La arquitectura vulnerable de Mobile MCP crea una ruta desde:```text
Unauthenticated Network Client
↓
MCP Server
↓
MCP Tools
↓
ADB
↓
Android Device
```
El impacto resultante puede incluir tanto **pérdida de confidencialidad**, a través de la información de pantalla/interfaz/dispositivo, como **impacto en la integridad**, mediante la interacción remota con la interfaz de Android.
Los controles defensivos más importantes son:```text
Authentication
Authorization
TLS
Network isolation
Least privilege
Secure defaults
Continuous monitoring
Regression testing
```
---
# 📚 Referencias
* Aviso de seguridad de Microsoft UFO — CVE-2026-73296 / GHSA-24fq-m9rr-g3mm
* Repositorio de Microsoft UFO
* Historial de versiones de Microsoft UFO
* CWE-306 — Autenticación faltante para funciones críticas
* CWE-862 — Autorización faltante
* CVSS v3.1
Repositorio oficial de Microsoft UFO:
https://github.com/microsoft/UFO
Aviso de seguridad oficial:
https://github.com/microsoft/UFO/security/advisories/GHSA-24fq-m9rr-g3mm
---
# ⚖️ Uso responsable
Este proyecto se proporciona para:
* Pruebas de penetración autorizadas
* Investigación de seguridad
* Entornos CTF
* Validación de vulnerabilidades
* Ingeniería defensiva
* Educación en seguridad
* Desarrollo de detección
No pruebe sistemas o dispositivos sin autorización explícita.
El verificador seguro evita intencionalmente ejecutar las capacidades vulnerables de Mobile MCP contra dispositivos Android reales.
---
<p align="center">
**CVE-2026-73296 • Microsoft UFO • Investigación de seguridad de Mobile MCP**
</p>
| Métrica | Valor |
|---|
| Vector de ataque | Red |
| Complejidad de ataque | Baja |
| Privilegios requeridos | Ninguno |
| Interacción del usuario | Ninguna |
| Alcance | Sin cambios |
| Confidencialidad | Alta |
| Integridad | Alta |
| Disponibilidad | Baja |
| Opción | Descripción |
|---|
--target | Especifica el dominio o la dirección IP de destino |
--verbose | Habilita la salida detallada |
--output | Especifica el archivo de salida para los resultados |
--threads | Define el número de hilos a utilizar (por defecto: 10) |
--timeout | Establece el tiempo de espera de la conexión en segundos (por defecto: 30) |