CVE-2026-39360
RustFS has an authorization bypass in multipart UploadPartCopy enables cross-bucket object exfiltration
RustFS is a distributed object storage system built in Rust. Prior to alpha.90, RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload. This breaks tenant isolation in multi-user / multi-tenant deployments. This vulnerability is fixed in alpha.90.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- Low
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
5.3
RustFS has an authorization bypass in multipart UploadPartCopy enables cross-bucket object exfiltration
RustFS is a distributed object storage system built in Rust. Prior to alpha.90, RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload. This breaks tenant isolation in multi-user / multi-tenant deployments. This vulnerability is fixed in alpha.90.
- Record
CVE-2026-39360- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-862
- Updated
- 2026-11-02
EUVDEUVD-2026-19867
5.3
RustFS is a distributed object storage system built in Rust. Prior to alpha.90, RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload. This breaks tenant isolation in multi-user / multi-tenant deployments. This vulnerability is fixed in alpha.90.
- Record
EUVD-2026-19867- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-mx42-j6wv-px98
5.3
RustFS has an authorization bypass in multipart UploadPartCopy enables cross-bucket object exfiltration
RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload.
This breaks tenant isolation in multi-user / multi-tenant deployments.
Impact
Unauthorized cross-bucket / cross-tenant data exfiltration (Confidentiality: High).
An attacker with only minimal permissions on their own bucket (multipart upload + Put/Get on destination objects) can copy and retrieve objects from a victim bucket without having s3:GetObject (or equivalent) permission on the source.
In the attached PoC, the attacker successfully exfiltrates a 5MB private object and proves integrity via matching SHA256 and size.
Threat Model (Realistic)
- Victim tenant/user owns a bucket (e.g.,
victim-bucket-*) and stores private objects (e.g.,private/finance_dump.bin). - Attacker tenant/user has no permissions on the victim bucket:
- cannot
ListObjects,HeadObject,GetObject, orCopyObjectfrom the victim bucket.
- cannot
- Attacker has minimal permissions only on attacker bucket:
CreateMultipartUpload,UploadPart,UploadPartCopy,CompleteMultipartUpload,AbortMultipartUpload,- and
PutObject/GetObjectfor objects in attacker bucket.
- Despite this, attacker can exfiltrate victim objects via multipart copy.
Root Cause Analysis
The access control layer fails open for multipart copy-related operations:
File: rustfs/src/storage/access.rs
abort_multipart_upload()returnsOk(())without authorization (L435–437)complete_multipart_upload()returnsOk(())without authorization (L442–444)upload_part_copy()returnsOk(())without authorization (L1446–1448)
In contrast, copy_object() correctly enforces authorization:
- source
GetObjectauthorization (L469) - destination
PutObjectauthorization (L478)
The multipart copy implementation reads the source object directly:
File: rustfs/src/app/multipart_usecase.rs
store.get_object_reader(&src_bucket, &src_key, ...)(L959–962)
Because upload_part_copy() does not enforce source GetObject authorization, the server reads and copies victim data even when the requester lacks permission.
Affected Versions
- Tested vulnerable on:
main@c1d5106acc3480c275a52344df84633bb6dcd8f0 - Git describe:
1.0.0-alpha.86-3-gc1d5106a
The fail-open authorization behavior for UploadPartCopy was introduced in:
- Commit:
09ea11c13(pergit blameonrustfs/src/storage/access.rs:1443-1448)
Affected range (recommended wording):
- All versions from commit
09ea11c13throughc1d5106acc3480c275a52344df84633bb6dcd8f0(and likely any releases containing those commits) until a fix is applied.
Package version (Cargo metadata)
rustfscrate version in this tree: 0.0.5 (cargo metadata)
Proof of Concept (PoC) – Real Commands + Verified Results
Files
Place the PoC script at the repository root:
- PoC script:
poc_uploadpartcopy_exfil_v3.sh - Captured output:
poc_v3_output.txt - (Optional) Redacted debug log:
upload_part_copy_debug_redacted.log(Authorization/signature redacted)
Environment
RustFS running locally (Docker is simplest), listening on:
http://127.0.0.1:9000
Tools:
awscli,jq,awscurl
Steps to Reproduce
- Start RustFS (example):
docker compose -f docker-compose-simple.yml up -d
- Run the PoC and save output:
chmod +x poc_uploadpartcopy_exfil_v3.sh
./poc_uploadpartcopy_exfil_v3.sh | tee poc_v3_output.txt
Attachments
*…
- Record
GHSA-mx42-j6wv-px98- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-862
- Updated
- 2026-11-02
NVD
5.3
RustFS is a distributed object storage system built in Rust. Prior to alpha.90, RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload. This breaks tenant isolation in multi-user / multi-tenant deployments. This vulnerability is fixed in alpha.90.
- Record
CVE-2026-39360- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-862
- Updated
- 2026-11-02
OSVGHSA-mx42-j6wv-px98
5.3
RustFS has an authorization bypass in multipart UploadPartCopy enables cross-bucket object exfiltration
RustFS contains a missing authorization check in the multipart copy path (UploadPartCopy). A low-privileged user who cannot read objects from a victim bucket can still exfiltrate victim objects by copying them into an attacker-controlled multipart upload and completing the upload.
This breaks tenant isolation in multi-user / multi-tenant deployments.
Impact
Unauthorized cross-bucket / cross-tenant data exfiltration (Confidentiality: High).
An attacker with only minimal permissions on their own bucket (multipart upload + Put/Get on destination objects) can copy and retrieve objects from a victim bucket without having s3:GetObject (or equivalent) permission on the source.
In the attached PoC, the attacker successfully exfiltrates a 5MB private object and proves integrity via matching SHA256 and size.
Threat Model (Realistic)
- Victim tenant/user owns a bucket (e.g.,
victim-bucket-*) and stores private objects (e.g.,private/finance_dump.bin). - Attacker tenant/user has no permissions on the victim bucket:
- cannot
ListObjects,HeadObject,GetObject, orCopyObjectfrom the victim bucket.
- cannot
- Attacker has minimal permissions only on attacker bucket:
CreateMultipartUpload,UploadPart,UploadPartCopy,CompleteMultipartUpload,AbortMultipartUpload,- and
PutObject/GetObjectfor objects in attacker bucket.
- Despite this, attacker can exfiltrate victim objects via multipart copy.
Root Cause Analysis
The access control layer fails open for multipart copy-related operations:
File: rustfs/src/storage/access.rs
abort_multipart_upload()returnsOk(())without authorization (L435–437)complete_multipart_upload()returnsOk(())without authorization (L442–444)upload_part_copy()returnsOk(())without authorization (L1446–1448)
In contrast, copy_object() correctly enforces authorization:
- source
GetObjectauthorization (L469) - destination
PutObjectauthorization (L478)
The multipart copy implementation reads the source object directly:
File: rustfs/src/app/multipart_usecase.rs
store.get_object_reader(&src_bucket, &src_key, ...)(L959–962)
Because upload_part_copy() does not enforce source GetObject authorization, the server reads and copies victim data even when the requester lacks permission.
Affected Versions
- Tested vulnerable on:
main@c1d5106acc3480c275a52344df84633bb6dcd8f0 - Git describe:
1.0.0-alpha.86-3-gc1d5106a
The fail-open authorization behavior for UploadPartCopy was introduced in:
- Commit:
09ea11c13(pergit blameonrustfs/src/storage/access.rs:1443-1448)
Affected range (recommended wording):
- All versions from commit
09ea11c13throughc1d5106acc3480c275a52344df84633bb6dcd8f0(and likely any releases containing those commits) until a fix is applied.
Package version (Cargo metadata)
rustfscrate version in this tree: 0.0.5 (cargo metadata)
Proof of Concept (PoC) – Real Commands + Verified Results
Files
Place the PoC script at the repository root:
- PoC script:
poc_uploadpartcopy_exfil_v3.sh - Captured output:
poc_v3_output.txt - (Optional) Redacted debug log:
upload_part_copy_debug_redacted.log(Authorization/signature redacted)
Environment
RustFS running locally (Docker is simplest), listening on:
http://127.0.0.1:9000
Tools:
awscli,jq,awscurl
Steps to Reproduce
- Start RustFS (example):
docker compose -f docker-compose-simple.yml up -d
- Run the PoC and save output:
chmod +x poc_uploadpartcopy_exfil_v3.sh
./poc_uploadpartcopy_exfil_v3.sh | tee poc_v3_output.txt
Attachments
*…
- Record
GHSA-mx42-j6wv-px98- CVSS 4.0
- 5.3 Medium
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 4.3 Medium
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N - Weakness
- CWE-862
- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
rustfscrates.io |
through 0.0.2 | None known |
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-39360 is a medium vulnerability (CVSS 5.3) in Rustfs, published April 7, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.21%, the 10th percentile. No source names a fixed version.
References
Left out here: the rest of 2 source descriptions. The JSON record has them.