CVE-2026-35214
Budibase: Path traversal in plugin file upload enables arbitrary directory deletion and file write
Budibase is an open-source low-code platform. Prior to version 3.33.4, the plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access. This issue has been patched in version 3.33.4.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- High
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- High
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
8.7
Budibase: Path traversal in plugin file upload enables arbitrary directory deletion and file write
Budibase is an open-source low-code platform. Prior to version 3.33.4, the plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access. This issue has been patched in version 3.33.4.
- Record
CVE-2026-35214- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-18793
8.7
Budibase is an open-source low-code platform. Prior to version 3.33.4, the plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access. This issue has been patched in version 3.33.4.
- Record
EUVD-2026-18793- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-2wfh-rcwf-wh23
8.7
Budibase: Path traversal in plugin file upload enables arbitrary directory deletion and file write
Summary
The plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access.
Severity
- Attack Vector: Network — exploitable via the plugin upload HTTP API
- Attack Complexity: Low — no special conditions; a single crafted multipart request suffices
- Privileges Required: High — requires Global Builder role (
GLOBAL_BUILDERpermission) - User Interaction: None
- Scope: Changed — the plugin upload feature is scoped to a temp directory, but the traversal escapes to the host filesystem
- Confidentiality Impact: None — the vulnerability enables deletion and writing, not reading
- Integrity Impact: High — attacker can delete arbitrary directories and write arbitrary files via tarball extraction
- Availability Impact: High — recursive deletion of application or system directories causes denial of service
Severity Rationale
Despite the real filesystem impact, severity is bounded by the requirement for Global Builder privileges (PR:H), which is the highest non-admin role in Budibase. In self-hosted deployments the Global Builder may already have server access, further reducing practical impact. In cloud/multi-tenant deployments the impact is more significant as it could affect the host infrastructure.
Affected Component
packages/server/src/api/controllers/plugin/file.ts—fileUpload()(line 15)packages/server/src/utilities/fileSystem/filesystem.ts—createTempFolder()(lines 78-91)
Description
Unsanitized filename flows into filesystem operations
In packages/server/src/api/controllers/plugin/file.ts, the uploaded file's name is used directly after stripping the .tar.gz suffix:
// packages/server/src/api/controllers/plugin/file.ts:8-19
export async function fileUpload(file: KoaFile) {
if (!file.name || !file.path) {
throw new Error("File is not valid - cannot upload.")
}
if (!file.name.endsWith(".tar.gz")) {
throw new Error("Plugin must be compressed into a gzipped tarball.")
}
const path = createTempFolder(file.name.split(".tar.gz")[0])
await extractTarball(file.path, path)
return await getPluginMetadata(path)
}
The file.name originates from the Content-Disposition header's filename field in the multipart upload, parsed by formidable (via koa-body 4.2.0). Formidable does not sanitize path traversal sequences from filenames.
The createTempFolder function in packages/server/src/utilities/fileSystem/filesystem.ts uses path.join() which resolves ../ sequences, then performs destructive filesystem operations:
// packages/server/src/utilities/fileSystem/filesystem.ts:78-91
export const createTempFolder = (item: string) => {
const path = join(budibaseTempDir(), item)
try {
// remove old tmp directories automatically - don't combine
if (fs.existsSync(path)) {
fs.rmSync(path, { recursive: true, force: true })
}
fs.mkdirSync(path)
} catch (err: any) {
throw new Error(`Path cannot be created: ${err.message}`)
}
return path
}
The budibaseTempDir() returns /tmp/.budibase (from packages/backend-core/src/objectStore/utils.ts:33). With a filename like ../../etc/target.tar.gz, path.join("/tmp/.budibase", "../../etc/target") resolves to /etc/target.
Inconsistent defenses confirm the gap
The codebase is aware of the risk in similar paths:
- Safe path in
utils.ts: ThedownloadUnzipTarballfunction (for NPM/GitHub/URL plugin sources) generates a random name server-side:// packages/server/src/api/controllers/plugin/index.ts:68 const name =…
- Record
GHSA-2wfh-rcwf-wh23- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
8.7
Budibase is an open-source low-code platform. Prior to version 3.33.4, the plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access. This issue has been patched in version 3.33.4.
- Record
CVE-2026-35214- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
8.7
Budibase: Path traversal in plugin file upload enables arbitrary directory deletion and file write
Budibase is an open-source low-code platform. Prior to version 3.33.4, the plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access. This issue has been patched in version 3.33.4.
- Record
CVE-2026-35214- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVGHSA-2wfh-rcwf-wh23
8.7
Budibase: Path traversal in plugin file upload enables arbitrary directory deletion and file write
Summary
The plugin file upload endpoint (POST /api/plugin/upload) passes the user-supplied filename directly to createTempFolder() without sanitizing path traversal sequences. An attacker with Global Builder privileges can craft a multipart upload with a filename containing ../ to delete arbitrary directories via rmSync and write arbitrary files via tarball extraction to any filesystem path the Node.js process can access.
Severity
- Attack Vector: Network — exploitable via the plugin upload HTTP API
- Attack Complexity: Low — no special conditions; a single crafted multipart request suffices
- Privileges Required: High — requires Global Builder role (
GLOBAL_BUILDERpermission) - User Interaction: None
- Scope: Changed — the plugin upload feature is scoped to a temp directory, but the traversal escapes to the host filesystem
- Confidentiality Impact: None — the vulnerability enables deletion and writing, not reading
- Integrity Impact: High — attacker can delete arbitrary directories and write arbitrary files via tarball extraction
- Availability Impact: High — recursive deletion of application or system directories causes denial of service
Severity Rationale
Despite the real filesystem impact, severity is bounded by the requirement for Global Builder privileges (PR:H), which is the highest non-admin role in Budibase. In self-hosted deployments the Global Builder may already have server access, further reducing practical impact. In cloud/multi-tenant deployments the impact is more significant as it could affect the host infrastructure.
Affected Component
packages/server/src/api/controllers/plugin/file.ts—fileUpload()(line 15)packages/server/src/utilities/fileSystem/filesystem.ts—createTempFolder()(lines 78-91)
Description
Unsanitized filename flows into filesystem operations
In packages/server/src/api/controllers/plugin/file.ts, the uploaded file's name is used directly after stripping the .tar.gz suffix:
// packages/server/src/api/controllers/plugin/file.ts:8-19
export async function fileUpload(file: KoaFile) {
if (!file.name || !file.path) {
throw new Error("File is not valid - cannot upload.")
}
if (!file.name.endsWith(".tar.gz")) {
throw new Error("Plugin must be compressed into a gzipped tarball.")
}
const path = createTempFolder(file.name.split(".tar.gz")[0])
await extractTarball(file.path, path)
return await getPluginMetadata(path)
}
The file.name originates from the Content-Disposition header's filename field in the multipart upload, parsed by formidable (via koa-body 4.2.0). Formidable does not sanitize path traversal sequences from filenames.
The createTempFolder function in packages/server/src/utilities/fileSystem/filesystem.ts uses path.join() which resolves ../ sequences, then performs destructive filesystem operations:
// packages/server/src/utilities/fileSystem/filesystem.ts:78-91
export const createTempFolder = (item: string) => {
const path = join(budibaseTempDir(), item)
try {
// remove old tmp directories automatically - don't combine
if (fs.existsSync(path)) {
fs.rmSync(path, { recursive: true, force: true })
}
fs.mkdirSync(path)
} catch (err: any) {
throw new Error(`Path cannot be created: ${err.message}`)
}
return path
}
The budibaseTempDir() returns /tmp/.budibase (from packages/backend-core/src/objectStore/utils.ts:33). With a filename like ../../etc/target.tar.gz, path.join("/tmp/.budibase", "../../etc/target") resolves to /etc/target.
Inconsistent defenses confirm the gap
The codebase is aware of the risk in similar paths:
- Safe path in
utils.ts: ThedownloadUnzipTarballfunction (for NPM/GitHub/URL plugin sources) generates a random name server-side:// packages/server/src/api/controllers/plugin/index.ts:68 const name =…
- Record
GHSA-2wfh-rcwf-wh23- CVSS 3.1
- 8.7 High
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:N/I:H/A:H - Weakness
- CWE-22
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
@budibase/servernpm |
before 3.33.4 | 3.33.4 |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-35214 is a high vulnerability (CVSS 8.7) in Budibase, published April 3, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.56%, the 47th percentile. Fixed in @budibase/server 3.33.4.
References
github.com/Budibase/budibase/security/advisories/GHSA-2wfh-rcwf-wh23
github.com/Budibase/budibase/pull/18240
github.com/Budibase/budibase/commit/6344d06d703660fd05995e61d581593c2349c879
github.com/Budibase/budibase/releases/tag/3.33.4
nvd.nist.gov/vuln/detail/CVE-2026-35214
github.com/advisories/GHSA-2wfh-rcwf-wh23
github.com/CVEProject/cvelistV5/tree/main/cves/2026/35xxx/CVE-2026-35214.json
github.com/Budibase/budibase
Left out here: the rest of 2 source descriptions. The JSON record has them.