Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Filesystem symlinks leak external file metadata

Aperta Adatta ai principianti
#5,217 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
node.js, typescript
Ambito
backend, security

Direzione di ricerca

Inizia individuando l’implementazione di list_directory_with_sizes nel server del filesystem e verificando come costruisce i percorsi delle voci e legge i metadati. Controlla i test esistenti per gli elenchi di directory e i link simbolici, quindi riproduci il caso segnalato con una directory consentita che contiene un link a un file esterno. Il lavoro è completato quando l’elenco non espone più i metadati del file di destinazione e un test copre questo comportamento.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug v2
Which server?

filesystem (@modelcontextprotocol/server-filesystem)

Server version

0.6.3

How did you run the server?

Not applicable (a repository-level report)

Transport

stdio

Protocol era

Not sure

MCP client and version

n/a

Steps to reproduce
  1. Start the filesystem server with one allowed directory.
  2. Create a file outside the allowed directory and a symlink to it inside the allowed directory:
tmp="$(mktemp -d)"
mkdir "$tmp/allowed"
printf 'MCP-FILESYSTEM-SYMLINK-METADATA-MARKER\n' > "$tmp/outside-secret.txt"
ln -s "$tmp/outside-secret.txt" "$tmp/allowed/leaks-outside-size"
  1. Call the MCP tool for the allowed directory:
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_directory_with_sizes",
    "arguments": {
      "path": "/tmp/example/allowed",
      "sortBy": "name"
    }
  }
}

The vulnerable code validates only args.path, then runs fs.readdir(validPath, { withFileTypes: true }), builds entryPath = path.join(validPath, entry.name), and calls fs.stat(entryPath).

Expected behavior

Directory listings that claim to operate only inside allowed directories should not follow symlink entries to targets outside the allowed tree. The tool should use lstat, or resolve each entry and enforce the same containment check before reading target metadata.

Actual behavior

A local reproduction created an allowed directory containing a symlink to an external file. The directory-entry metadata path followed the symlink:

allowed directory=/tmp/manual_mcp_filesystem_symlink_metadata_ldkba6qc/allowed
outside target=/tmp/manual_mcp_filesystem_symlink_metadata_ldkba6qc/outside-secret.txt
symlink entry=/tmp/manual_mcp_filesystem_symlink_metadata_ldkba6qc/allowed/leaks-outside-size
os.lstat symlink size=71
os.stat followed target size=39
outside target actual size=39
formatted listing=[FILE] leaks-outside-size             39 B

The reported listing size matches the outside target file size, not the symlink entry metadata.

Before you submit
  • I searched existing issues and this is not a duplicate.
  • This is not a security vulnerability report (those go through the private advisory form).
Lingua principale
TypeScript
Stelle
91.4k
Fork
11.8k
Merge medio
7h 36m
PR unite (30g)
126

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di modelcontextprotocol/servers

Tutte le issue di modelcontextprotocol/servers

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.