PT-2026-83509 · Npm · Grok-Faf-Mcp
Published
2026-08-19
·
Updated
2026-08-19
CVSS v3.1
7.5
High
| Vector | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N |
Summary
Several
grok-faf-mcp MCP tools accept a caller-controlled path argument and resolve it (~ expansion + path.resolve()) straight into a filesystem read without confining it to a trusted project directory. An absolute path or ../ traversal is resolved and used as-is, so the server process can be made to read files outside the intended .faf project context. The only remaining limit is OS file permissions.Affected tools
refresh faf, faf score, faf get orchestration policy, refresh blend (and the shared getProjectPath() chokepoint feeding the .faf tools), plus the general-purpose faf read / faf write file tools (denylist-only; an absolute path still reached home-directory secrets, and faf write could write outside the project). refresh faf echoes the file contents verbatim back to the caller as "fresh DNA"; faf get orchestration policy reflects values parsed out of the attacker-chosen file and echoes the resolved absolute path — confirming the read.Impact
An MCP client — or an LLM prompt-injected via attacker-controlled content (a web page, README, ticket, or
.faf) into issuing a tool call — can read any file the server process can read: SSH keys (~/.ssh/id rsa), cloud credentials (~/.aws/credentials), .env files, source, /etc/passwd. This is a sensitive-information-disclosure (CWE-200) primitive that far exceeds the declared .faf project-context scope. The server runs over stdio, so the read is reached by a crafted tool call (e.g. a prompt-injected agent processing attacker-controlled content).Patches
Fixed in 1.5.3 by confining every caller-supplied
path before any filesystem access (safe-path.ts):- Reads are restricted to
.faf/.fafmcontext files, so non-context files (secrets) are refused regardless of directory. - General file ops (
faf read/faf write) are confined to the project root (cwd + system temp; override withFAF ALLOWED ROOTS). - Paths are canonicalized through symlinks (closing the symlink bypass); absolute paths and
../escapes are rejected.
Upgrade:
npm install -g grok-faf-mcp@1.5.3 (or bunx grok-faf-mcp).Workarounds
If you cannot upgrade immediately, run the server only against trusted local projects, and set
FAF ALLOWED ROOTS (patched versions) to a single project directory for a hard directory boundary.Credits
Discovered and responsibly reported via coordinated disclosure by Zhihao Zhang (Worcester Polytechnic Institute).
Fix
Path traversal
Information Disclosure
Found an issue in the description? Have something to add? Feel free to write us 👾
Related Identifiers
Affected Products
Grok-Faf-Mcp