Deploy autonomous AI agents that reason, exploit, and validate complex vulnerability chains — not another scanner, an agentic system that thinks like a senior pentester.
CVE-2026-39360 is a low severity vulnerability with a CVSS score of 0.0. No known public exploits at this time.
Very low probability of exploitation
EPSS predicts the probability of exploitation in the next 30 days based on real-world threat data, complementing CVSS severity scores with actual risk assessment.
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.
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.
victim-bucket-*) and stores private objects (e.g., private/finance_dump.bin).ListObjects, HeadObject, GetObject, or CopyObject from the victim bucket.CreateMultipartUpload, UploadPart, UploadPartCopy, CompleteMultipartUpload, AbortMultipartUpload,PutObject/GetObject for objects in attacker bucket.The access control layer fails open for multipart copy-related operations:
File: rustfs/src/storage/access.rs
abort_multipart_upload() returns without authorization (L435–437)Please cite this page when referencing data from Strobes VI. Proper attribution helps support our vulnerability intelligence research.
Ok(())complete_multipart_upload() returns Ok(()) without authorization (L442–444)upload_part_copy() returns Ok(()) without authorization (L1446–1448)In contrast, copy_object() correctly enforces authorization:
GetObject authorization (L469)PutObject authorization (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.
main @ c1d5106acc3480c275a52344df84633bb6dcd8f01.0.0-alpha.86-3-gc1d5106aThe fail-open authorization behavior for UploadPartCopy was introduced in:
09ea11c13 (per git blame on rustfs/src/storage/access.rs:1443-1448)Affected range (recommended wording):
09ea11c13 through c1d5106acc3480c275a52344df84633bb6dcd8f0 (and likely any releases containing those commits) until a fix is applied.rustfs crate version in this tree: 0.0.5 (cargo metadata)Place the PoC script at the repository root:
poc_uploadpartcopy_exfil_v3.shpoc_v3_output.txtupload_part_copy_debug_redacted.log (Authorization/signature redacted)RustFS running locally (Docker is simplest), listening on:
http://127.0.0.1:9000Tools:
awscli, jq, awscurldocker compose -f docker-compose-simple.yml up -d
chmod +x poc_uploadpartcopy_exfil_v3.sh
./poc_uploadpartcopy_exfil_v3.sh | tee poc_v3_output.txt
Attacker operations against victim bucket should be denied:
ListObjects -> AccessDeniedHeadObject -> AccessDeniedGetObject -> AccessDeniedCopyObject -> AccessDeniedUploadPartCopy from victim -> attacker multipart should also be denied.
UploadPartCopy succeeds, and attacker retrieves the copied object from attacker bucket.Victim uploads a private object:
5,242,880 bytesfda018db1da9d8f4c1b287c75943384a3b4ede391ec156039b6d94e17d6ad68fAttacker exfiltrates it via multipart copy:
5,242,880 bytesfda018db1da9d8f4c1b287c75943384a3b4ede391ec156039b6d94e17d6ad68fProof:
The debug log shows a successful request with:
PUT/<attacker-bucket>/<dst-key>?partNumber=1&uploadId=...x-amz-copy-source: <victim-bucket>/private/finance_dump.binHTTP/1.1 200 with <CopyPartResult><ETag>...</ETag>...</CopyPartResult>Implement authorization checks equivalent to copy_object() for multipart copy paths:
upload_part_copy:
GetObject authorization on x-amz-copy-sourcePutObject authorization on the target objectcopy_object() on the source.complete_multipart_upload:
PutObject authorizationabort_multipart_upload:
PutObject as a safe boundary)