Resumen
Varias herramientas MCP del paquete grok-faf-mcp aceptan un argumento path controlado por el llamante y lo resuelven (expansión de ~ más path.resolve()) directamente en una operación de lectura del sistema de archivos, sin confinarlo a un directorio de proyecto confiable. 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 archivos fuera del contexto de proyecto .faf previsto. El único límite restante son los permisos del sistema operativo.
Herramientas afectadas
Las herramientas afectadas son: refresh_faf, faf_score, faf_get_orchestration_policy, refresh_blend (y el punto de control compartido getProjectPath() que alimenta las herramientas .faf), además de las herramientas de propósito general faf_read y faf_write (que solo implementan una lista de denegación). Una ruta absoluta sigue alcanzando secretos del directorio home, y faf_write podría escribir fuera del proyecto.
La herramienta refresh_faf devuelve el contenido del archivo literalmente al llamante como "fresh DNA". La herramienta faf_get_orchestration_policy refleja los valores analizados del archivo elegido por el atacante y devuelve la ruta absoluta resuelta, confirmando la lectura.
Impacto
Un cliente MCP, o un LLM cuyo prompt haya sido inyectado mediante contenido controlado por el atacante (una página web, un README, un ticket o un archivo .faf) para emitir una llamada a herramienta, puede leer cualquier archivo que el proceso servidor tenga permiso de leer. Esto incluye claves SSH (~/.ssh/id_rsa), credenciales cloud (~/.aws/credentials), archivos .env, código fuente y /etc/passwd.
Esta vulnerabilidad constituye una primitiva de divulgación de información sensible (CWE-200) que excede ampliamente el alcance declarado del contexto de proyecto .faf. El servidor opera sobre stdio, por lo que la lectura se alcanza mediante una llamada a herramienta manipulada, por ejemplo a través de un agente con prompt inyectado que procesa contenido controlado por el atacante.
Parches
El problema fue corregido en la versión 1.5.3 mediante el confinamiento de cada path suministrado por el llamante antes de cualquier acceso al sistema de archivos, implementado en safe-path.ts. Los cambios son los siguientes:
- Las lecturas quedan restringidas a archivos de contexto
.fafy.fafm, de modo que los archivos que no sean de contexto (secretos) son rechazados independientemente del directorio. - Las operaciones generales de archivo (
faf_readyfaf_write) quedan confinadas a la raíz del proyecto (directorio de trabajo actual más directorio temporal del sistema; se puede ampliar con la variableFAF_ALLOWED_ROOTS). - Las rutas se canonizan a través de enlaces simbólicos (cerrando el bypass por symlink); las rutas absolutas y los escapes con
../son rechazados.
Para actualizar, ejecutar:
npm install -g grok-faf-mcp@1.5.3
O alternativamente:
bunx grok-faf-mcp
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 versiones parcheadas) apuntando a un único directorio de proyecto para establecer un límite de directorio estricto.
Créditos
Vulnerabilidad descubierta y reportada de forma responsable mediante divulgación coordinada por Zhihao Zhang (Worcester Polytechnic Institute).
