modelcontextprotocol / modelcontextprotocol/python-sdk
DNS rebinding :* allowlist matches Host/Origin suffixes that are not ports
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 24.3k
- Forks
- 4k
- Merge medio
- 1 d 1 h
- PR fusionados (30 d)
- 31
Descripción
What happened
TransportSecurityMiddleware treats allowed_hosts / allowed_origins entries that end in :* as a prefix match: value.startswith(base + ":").
With allowed_hosts=["127.0.0.1:*"] or ["wild.example:*"], these Host values are accepted today:
127.0.0.1:8080.evilwild.example:9000.evil
The same pattern accepts Origin http://wild.example:9000.evil for http://wild.example:*.
Existing tests only cover a numeric port (wild.example:9000). They do not cover a suffix after the port.
What I expected
base:* should mean base plus a numeric port, not any string that starts with base:.
How to reproduce
On main @ 08a3bc8:
from mcp.server.transport_security import TransportSecurityMiddleware, TransportSecuritySettings
from starlette.requests import Request
settings = TransportSecuritySettings(
enable_dns_rebinding_protection=True,
allowed_hosts=["wild.example:*"],
allowed_origins=["http://wild.example:*"],
)
mw = TransportSecurityMiddleware(settings)
req = Request({"type": "http", "method": "GET", "headers": [(b"host", b"wild.example:9000.evil")]})
# validate_request returns None (accept). I expected 421.
I can send a PR that requires the suffix after base: to be digits, plus tests for the suffix cases. Happy to do that if you want it.
Written with AI assistance. I read the matcher next to tests/server/test_transport_security.py and reproduced it locally.
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza en mcp/server/transport_security.py, donde TransportSecurityMiddleware compara allowed_hosts y allowed_origins, y después lee tests/server/test_transport_security.py. Reproduce los casos de sufijo reportados y compáralos con la cobertura existente de puertos numéricos. Se considera terminado cuando los puertos numéricos siguen aceptándose, mientras que valores como wild.example:9000.evil y el Origin correspondiente se rechazan.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- security
- Tipo de issue
- Error
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Estado de actividad
- Activo
- Claridad
- Bien especificado
- Aptitud para principiantes
- 84/100