PT-2026-55216 · Npm · Repomix

Publicado

2026-07-01

·

Atualizado

2026-07-01

·

CVE-2026-49988

CVSS v4.0

6.9

Média

VetorAV:L/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

attach packed output can register arbitrary .json/.txt/.md/.xml files and bypass the MCP file-read safety check

Summary

Repomix's MCP server exposes a normal file system read file tool that reads absolute paths only after running the project's secret check. However, the attach packed output plus read repomix output flow can read arbitrary local .json, .txt, .md, or .xml files without the same safety check and without verifying that the file is actually a Repomix packed output.
This is a medium-severity local MCP file-read boundary issue. The affected deployment is the documented repomix --mcp stdio server used by AI assistants. A prompt or lower-trust model action that can invoke MCP tools can use attach packed output on a local JSON/text file, receive an outputId, then call read repomix output to retrieve the full file content.

Affected target

  • Repository: yamadashy/repomix
  • Commit reviewed: adf5a12f2211a7fabf24ee11a21734adccee5143
  • Component: MCP server tools
  • Package version reviewed: repomix@1.14.0

Root cause

The file-read safety boundary is implemented per tool rather than per local-file capability. file system read file reads the file and runs runSecretLint() before returning content. attach packed output reads and registers local files through a separate path, but only checks file extension and parsing format. It does not verify a Repomix output header/schema and does not run the secret check before registering the path.

Vulnerability chain

  1. attach packed output accepts a direct file path, not only a directory.
  2. resolveOutputFilePath() allows any file whose extension matches .xml, .md, .txt, or .json.
  3. The tool reads that file with fs.readFile(outputFilePath, 'utf8').
  4. It extracts metrics, but malformed or non-Repomix JSON simply produces empty metrics rather than rejection.
  5. formatPackToolResponse() registers the original file path under a generated outputId.
  6. read repomix output resolves the outputId and returns the full file content.

Auth boundary violated

The respected boundary is the explicit local file-read guard: file system read file blocks files that fail the secret scan.
The ignored boundary is the alternate packed-output path. A caller can register a supported-extension file as an output and read it through read repomix output without passing through runSecretLint() or a packed-output validation step.

Source trace

  • src/mcp/tools/fileSystemReadFileTool.ts:72-83: direct file reads run runSecretLint() and return an error if the scan finds sensitive content.
  • src/mcp/tools/attachPackedOutputTool.ts:76-87: direct file input is accepted based only on extension.
  • src/mcp/tools/attachPackedOutputTool.ts:111-120: .json, .txt, .md, and .xml are supported formats.
  • src/mcp/tools/attachPackedOutputTool.ts:228-240: JSON parse errors return empty metrics rather than rejecting the file as non-Repomix output.
  • src/mcp/tools/attachPackedOutputTool.ts:272-308: the file is read and passed to formatPackToolResponse() without a secret check.
  • src/mcp/tools/mcpToolRuntime.ts:77-82: formatPackToolResponse() registers the provided outputFilePath and reads it.
  • src/mcp/tools/readRepomixOutputTool.ts:56-74: read repomix output reads the registered file path and returns its content.
  • README.md:984-991: the tool is documented as providing secure access to existing packed outputs.

Reproduction

run.sh:
bash
#!/usr/bin/env bash
set -euo pipefail
set +e
node run.js 2>&1 | tee transcript.txt
rc=${PIPESTATUS[0]}
set -e
printf '%s
' "$rc" > exit-code.txt
exit "$rc"
The harness creates a temporary credentials.json containing a sentinel value, follows the attach packed output path for supported-extension files, registers the file path under an output ID, and then reads it back through the read repomix output path. It also checks the source-code contrast between the guarded direct file-read tool and the unguarded attach path.
Observed transcript:
text
ATTACH TOOL SOURCE READS FILE=true
ATTACH TOOL HAS SECRETLINT CHECK=false
READ FILE TOOL HAS SECRETLINT CHECK=true
RUNTIME REGISTERS OUTPUT PATH=true
ATTACH ACCEPTS JSON EXTENSION=true
ATTACHED NON REPOMIX JSON PATH=true
SENTINEL READ BACK=true
REPOMIX ATTACH PACKED OUTPUT ARBITRARY JSON READ REPRODUCED=true

Impact

In the MCP threat model, an assistant/tool caller can read local JSON/text/Markdown/XML files through a path that bypasses the file-read tool's secret scanning. Examples include project configuration JSON, exported tokens, local tool settings, or other plaintext files with supported extensions.
This does not require shell execution or writing files. It requires MCP tool-call capability against a Repomix server running with local filesystem access.

Suggested fix

Apply the same safety boundary to all local-file read paths:
  • Require attach packed output to validate that the target file is a genuine Repomix output before registration.
  • Reject malformed/non-Repomix JSON/XML/Markdown/plain files instead of registering them with empty metrics.
  • Run the same secret check used by file system read file before registering or returning content.
  • Consider storing a content snapshot in the registry rather than registering arbitrary local paths for later reads.

Correção

Information Disclosure

Encontrou algum problema na descrição? Tem algo a acrescentar? Fique à vontade para nos escrever 👾

Enumeração de Fraquezas

Identificadores relacionados

CVE-2026-49988
GHSA-HWPP-H97W-2H3J

Produtos afetados

Repomix