Resumen

Las herramientas MCP del paquete claude-faf-mcp aceptan un argumento path controlado por el llamador y lo resuelven (expansión de ~ más path.resolve()) directamente en una operación de lectura o escritura sobre el sistema de archivos, sin confinarlo a un directorio de proyecto de confianza. Una ruta absoluta o una secuencia de traversal ../ se resuelve y se utiliza tal cual, de modo que el proceso servidor puede ser inducido a leer y, mediante las herramientas de archivo, a escribir ficheros fuera del contexto previsto del proyecto .faf. El único límite restante son los permisos del sistema operativo.

Herramientas afectadas

El punto de control compartido getProjectPath() (que alimenta las herramientas .faf) y las herramientas de propósito general faf_read y faf_write resolvían una ruta proporcionada por el llamador directamente en una operación de lectura o escritura sin ningún confinamiento real (solo una lista de denegación). Una ruta absoluta seguía alcanzando secretos del directorio home, y faf_write podía escribir fuera del proyecto.

Impacto

Un cliente MCP, o un LLM con inyección de prompt a través de contenido controlado por un atacante (una página web, un README, un ticket o un archivo .faf), puede leer cualquier fichero que el proceso servidor tenga permiso de leer. Entre los objetivos más sensibles se incluyen:

  • Claves SSH: ~/.ssh/id_rsa
  • Credenciales cloud: ~/.aws/credentials
  • Archivos de entorno: .env
  • Código fuente del proyecto
  • Archivos del sistema: /etc/passwd

Además, faf_write puede escribir fuera del directorio del proyecto, lo que abre la puerta a modificaciones no autorizadas de ficheros críticos.

Esta vulnerabilidad constituye una primitiva de divulgación de información sensible (CWE-200) que excede con creces el ámbito declarado del contexto de proyecto .faf. El servidor opera sobre stdio, por lo que la lectura o escritura se alcanza mediante una llamada a herramienta manipulada, por ejemplo un agente con inyección de prompt que procesa contenido controlado por el atacante.

Parches

El problema queda corregido en la versión 5.7.2, que confina cada path proporcionado por el llamador antes de cualquier acceso al sistema de archivos, mediante el módulo safe-path.ts. Los cambios principales son los siguientes:

  • Las lecturas quedan restringidas a los ficheros de contexto .faf y .fafm, de modo que los ficheros fuera de ese contexto (secretos incluidos) son rechazados independientemente del directorio.
  • Las operaciones generales de archivo (faf_read y faf_write) quedan confinadas a la raíz del proyecto (directorio de trabajo actual más el directorio temporal del sistema; se puede ampliar mediante la variable FAF_ALLOWED_ROOTS).
  • Las rutas se canonizan a través de enlaces simbólicos, cerrando el vector de bypass por symlink. Las rutas absolutas y las secuencias de escape ../ son rechazadas. La función callTool() incorpora una guardia central PATH-DENIED.

Para actualizar, ejecutar:

bash
npm install -g claude-faf-mcp@5.7.2

También está disponible la instalación mediante el archivo .mcpb con un solo clic.

Mitigaciones temporales

Si no es posible actualizar de inmediato, se recomienda ejecutar el servidor únicamente contra proyectos locales de confianza y configurar la variable FAF_ALLOWED_ROOTS (disponible en las versiones parcheadas) apuntando a un único directorio de proyecto, estableciendo así un límite de directorio estricto.

Créditos

Vulnerabilidad identificada por los propios mantenedores durante una auditoría de servidores relacionados, motivada por la divulgación coordinada de una clase de problema equivalente en grok-faf-mcp por parte de Zhihao Zhang (Worcester Polytechnic Institute).