modelcontextprotocol / modelcontextprotocol/python-sdk

check_resource_allowed treats /api/../admin as under /api

Aberta Para iniciantes
#3,464 3 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

v1 v2
Linguagem predominante
Python
Estrelas
24.3k
Forks
4k
Merge médio
1d 1h
PRs com merge (30d)
31

Descrição

What happened

check_resource_allowed pads trailing slashes and then does requested_path.startswith(configured_path). It does not collapse . / ...

On main @ 08a3bc8 these return True:

  • requested https://example.com/api/../admin vs configured https://example.com/api
  • requested https://example.com/mcp/.. vs configured https://example.com/mcp
  • requested https://example.com/api/%2e%2e/admin vs configured https://example.com/api

tests/shared/test_auth_utils.py already rejects /api123 vs /api (path-boundary). Dot-segments are not covered.

What I expected

A requested path that walks out of the configured prefix should not match. /api/foo/../v1 vs /api can still match after normalisation, because it stays under /api.

How to reproduce

from mcp.shared.auth_utils import check_resource_allowed

check_resource_allowed("https://example.com/api/../admin", "https://example.com/api")
# True today. I expected False.

I can send a PR that percent-decodes once, runs posixpath.normpath, then keeps the existing trailing-slash prefix rule. Happy to do that if you want it.

Written with AI assistance. I read auth_utils.py next to the path-boundary tests and reproduced it locally.

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece em auth_utils.py, em check_resource_allowed, e revise os casos existentes de limites de caminho em tests/shared/test_auth_utils.py. Adicione cobertura para segmentos de ponto, segmentos de ponto codificados por percentual e caminhos que permanecem sob o prefixo configurado; em seguida, execute os testes relevantes do utilitário de auth. Está concluído quando os caminhos que escapam do prefixo configurado não correspondem, enquanto os caminhos normalizados que permanecem sob ele continuam correspondendo.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
api, security
Tipo de issue
Bug
Dificuldade
2/5
Tempo estimado
1-3 horas
Status de atividade
Ativa
Clareza
Claramente especificada
Facilidade para iniciantes
82/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.