GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

GHSA-CC2G-GQ8C-R332

Vulnerability from github – Published: 2026-08-19 19:15 – Updated: 2026-08-19 19:15
VLAI
Summary
grok-faf-mcp has an arbitrary local file read via unconfined `path` argument in FAF tools
Details

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 / .fafm context 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 with FAF_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).

Show details on source website

{
  "affected": [
    {
      "database_specific": {
        "last_known_affected_version_range": "\u003c= 1.5.2"
      },
      "package": {
        "ecosystem": "npm",
        "name": "grok-faf-mcp"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.5.3"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [],
  "database_specific": {
    "cwe_ids": [
      "CWE-200",
      "CWE-22",
      "CWE-73"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-08-19T19:15:01Z",
    "nvd_published_at": null,
    "severity": "HIGH"
  },
  "details": "### Summary\nSeveral `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.\n\n### Affected tools\n`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 \u2014 confirming the read.\n\n### Impact\nAn MCP client \u2014 or an LLM prompt-injected via attacker-controlled content (a web page, README, ticket, or `.faf`) into issuing a tool call \u2014 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).\n\n### Patches\nFixed in **1.5.3** by confining every caller-supplied `path` before any filesystem access (`safe-path.ts`):\n- Reads are restricted to `.faf` / `.fafm` context files, so non-context files (secrets) are refused regardless of directory.\n- General file ops (`faf_read` / `faf_write`) are confined to the project root (cwd + system temp; override with `FAF_ALLOWED_ROOTS`).\n- Paths are canonicalized through symlinks (closing the symlink bypass); absolute paths and `../` escapes are rejected.\n\nUpgrade: `npm install -g grok-faf-mcp@1.5.3` (or `bunx grok-faf-mcp`).\n\n### Workarounds\nIf 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.\n\n### Credits\nDiscovered and responsibly reported via coordinated disclosure by **Zhihao Zhang** (Worcester Polytechnic Institute).",
  "id": "GHSA-cc2g-gq8c-r332",
  "modified": "2026-08-19T19:15:02Z",
  "published": "2026-08-19T19:15:01Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/Wolfe-Jam/grok-faf-mcp/security/advisories/GHSA-cc2g-gq8c-r332"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/Wolfe-Jam/grok-faf-mcp"
    },
    {
      "type": "WEB",
      "url": "https://github.com/Wolfe-Jam/grok-faf-mcp/releases/tag/v1.5.3"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "grok-faf-mcp has an arbitrary local file read via unconfined `path` argument in FAF tools"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…