SILO 20260903 Security Notes: SN-2026-006 through 010
Released in SILO 20260903. These fixes are part of
RELEASE.2026-09-03T00-00-00Z. See the complete release notes for the 20260806-to-20260903 upgrade boundary, components, verification evidence, and known deferrals.
This bulletin collects five related security findings from the final SILO Server review. They cover customer-provided encryption keys, client-controlled replication headers, administrative status changes, and explicit object-version deletion.
The identifiers SN-2026-006 through SN-2026-010 are fork-local security-note IDs. They are not CVEs, are not registered in a vulnerability database, and should not be represented as such. The individual CVE chronicle remains one article per CVE; this release bulletin groups findings without CVEs so operators can evaluate one upgrade boundary.
All five defects were inherited from the archived minio/minio lineage and affect every earlier SILO release. “Inherited” describes provenance, not severity.
Summary
| ID | Required attacker position | Security failure | Released behavior |
|---|---|---|---|
SN-2026-006 |
Read access to a zero-byte SSE-C object | A wrong customer key was accepted because no data block was decrypted | The object key is authenticated; wrong keys return 403 AccessDenied |
SN-2026-007 |
Read access to an SSE-C object, or a client-supplied replication marker | GetObjectAttributes returned protected metadata without authenticating the customer key |
Ordinary requests need the correct key; only an authorized replication peer uses the replica exception |
SN-2026-008 |
Any authenticated principal able to invoke the affected read/write/delete operation | Internal-looking headers granted replication-only effects without replication authorization | Exact marker plus s3:ReplicateObject or s3:ReplicateDelete is required |
SN-2026-009 |
Authenticated admin API principal holding only one status action | The enable action authorized disable, and vice versa | The requested target state selects the required admin action |
SN-2026-010 |
Authenticated S3 principal with s3:DeleteObject but not s3:DeleteObjectVersion |
A caller could permanently delete an explicit version without the AWS-required action | Explicit version deletion requires s3:DeleteObjectVersion |
No finding in this bulletin is an unauthenticated remote-code-execution claim. Each requires an authenticated identity or existing object permission, but each crosses a privilege or cryptographic boundary beyond that identity’s intended grant.
SN-2026-006: zero-byte SSE-C key authentication
Affected operations: GetObject, HeadObject, CopyObject source processing, and GetObjectAttributes for zero-byte objects encrypted with SSE-C.
Tracking: issue #82.
Fixes: b73581b05 and c4fd97d0b.
SSE-C stores a sealed object key and requires the caller to provide the customer key again on reads. Normal reads authenticate that key while preparing the encrypted stream. A zero-byte object has no payload block, and the old fast path returned before unsealing the stored object key.
Consequently, an incorrect customer key could receive a successful response. A copy or new version could also be created under a key chosen by the caller without proving knowledge of the current key. The caller still needed read access to the object; the failure was that object permission replaced the separate cryptographic proof.
The fix authenticates the key independent of payload length. Correct keys behave as before. Wrong keys fail with 403 AccessDenied, including null-version and key-rotation cases.
SN-2026-007: SSE-C GetObjectAttributes
Affected operation: GetObjectAttributes on SSE-C objects.
Tracking: issue #84.
Fixes: 474cd5801, 74c97d005, and 21870fa2e.
GetObjectAttributes exposes object size, ETag, checksums, storage class, and multipart part metadata. The inherited handler returned those attributes without authenticating the supplied SSE-C key. It also treated the presence of X-Minio-Source-Replication-Request as permission to skip key handling.
The repair separates two cases:
- an ordinary S3 caller must supply the correct SSE-C key;
- a real replication peer may use the replica path only after authentication and
s3:ReplicateObjectauthorization.
A wrong key now returns 403. A bare marker without the required key and permission cannot create the replica exception. Existing replication identities that already hold the required action keep working.
SN-2026-008: replication headers are not authority
Affected surface: object reads and writes, multipart completion, object and version deletion, Snowball extraction, Object Lock timestamps, checksum metadata, and bucket events.
Tracking: PR #101.
Primary fix range: 938603458 through 04b097fd9, followed by Snowball and rule-prefix hardening.
CVE-2026-34204 stopped ordinary PUT and COPY requests from importing a subset of replication SSE metadata. The wider audit found that many other consumers still treated header presence as proof that a request was internal replication.
Depending on the operation, a client holding ordinary read or write permission could:
- request an SSE-C ciphertext/no-decryption path without the customer key;
- preserve a supplied source ETag or modification time;
- inject source checksum, actual-size, retention, legal-hold, or replica-state metadata;
- choose replication-only delete semantics;
- suppress successful object events;
- carry trust from one Snowball archive entry into another.
The repair defines one receiver-wide authority:
- authenticate the original request in its signed form;
- require exactly one marker with the exact lowercase value
true; - authorize
s3:ReplicateObjectors3:ReplicateDeleteon the addressed resource; - derive a narrower replica-trusted state only where replica status also proves it;
- store the decision in private request context;
- strip untrusted internal headers from a clone after authentication.
The context decision is authoritative. Stripping protects older consumers but cannot itself grant trust. The clone preserves the original trailer map so streaming checksum authentication remains correct.
The detailed protocol matrix, CORS interaction, black-box replication test, and rejected alternatives are in No I/O Before Auth, No Privilege From Headers.
SN-2026-009: user and group status authorization
Affected operations: admin SetUserStatus and SetGroupStatus.
Tracking: PR #73.
Fixes: 58735ee38 and 229fe2b3c.
The inherited handlers checked admin:EnableUser or admin:EnableGroup regardless of the target state. A narrowly delegated administrator permitted to enable an identity could therefore disable it too; an identity intended to hold only the disable action could fail or be evaluated against the wrong grant.
The requested state now determines the required action:
| Target | Required action |
|---|---|
| Enable user | admin:EnableUser |
| Disable user | admin:DisableUser |
| Enable group | admin:EnableGroup |
| Disable group | admin:DisableGroup |
admin:* and the built-in consoleAdmin policy remain sufficient. Only custom least-privilege policies that accidentally relied on one action for both directions need adjustment.
SN-2026-010: explicit object-version deletion
Affected operations: DeleteObject and each DeleteObjects entry carrying an explicit versionId.
Tracking: issue #58 and PR #104.
Fix range: 75a6734e4 through d2d47a41f.
The inherited S3 path authorized explicit version deletion as ordinary s3:DeleteObject and used s3:DeleteObjectVersion only as a secondary deny check. This diverged from AWS and let a principal with ordinary delete permission permanently remove a selected historical version.
The release requires s3:DeleteObjectVersion for explicit versions. A delete without versionId continues to use s3:DeleteObject. Replication targets keep their s3:ReplicateDelete contract.
There are two policy effects:
- a principal granted only
s3:DeleteObjectcan no longer delete explicit versions; - a policy using
Allow s3:*together withDeny s3:DeleteObjectto block permanent deletion must also denys3:DeleteObjectVersion.
The multi-delete repair preserves authentication and audit context for every entry and has least-privilege tests for ordinary and replication deletes.
Operator actions
Before upgrading:
- identify policies and applications that delete explicit versions; grant or deny
s3:DeleteObjectVersionintentionally; - inspect custom admin policies for enable/disable user and group operations;
- confirm that replication service accounts have only the required
s3:ReplicateObject/s3:ReplicateDeleteactions and that ordinary application identities do not; - verify SSE-C integrations send the same customer key for GET, HEAD, attributes, and copy-source operations, including zero-byte objects;
- if an application was relying on a wrong SSE-C key returning success, treat that as a latent client defect and correct it before rollout.
After upgrading:
- exercise a wrong-key negative test and a correct-key positive test on a disposable SSE-C object;
- test one normal replication and one delete replication operation;
- test each delegated admin direction independently;
- test version deletion with a principal that has only
s3:DeleteObjectand with one that also hass3:DeleteObjectVersion; - review audit logs for unexpected denied operations instead of widening policies immediately.
Verification boundary
The fixes have focused unit, handler, authorization, streaming-trailer, Snowball, and site-replication tests. Full local acceptance on ebac0ca73 included the complete cmd race suite and six deployment shapes with 174 PASS / 0 FAIL. The final line adds one CORS state-clear fix after that run and passes targeted race, compatibility, generation, diff, and lint gates.
This bulletin does not claim that RELEASE.2026-09-03T00-00-00Z or any image/package has been published. Remote CI, Test Release, tag verification, artifact signing, checksums, attestations, and real public image pulls remain release blockers, as recorded in the pre-release review.
Residual risks outside this bulletin
- Conditional deletion is still unsupported:
DeleteObjectignoresIf-MatchandDeleteObjectsignores per-object ETag (#10). - Non-CORS policy/SSE/tag/quota deletions may not converge across site-replication peers (#77).
- The trust audit focused on known replication and SSE-C fields. New internal headers must still answer the same provenance-and-authorization question during review.
The release notes contain the full known-issue and deployment boundary.