test: reproduce opendal 0.58's S3/ADLS credential-ignoring regressions - #112
Merged
Merged
Conversation
…ndal 0.58 Regression coverage for a real production incident: raicode's Iceberg data-loading integration always sends "s3.allow-anonymous" => "true" alongside any explicit credentials, intending it purely as a fallback for when no credentials are configured. Under the fork's old opendal (0.55), that was safe -- allow_anonymous was only consulted after trying to load a real credential, and only skipped signing if none was found. Upstream's opendal 0.58 (pulled in by the Aug 2026 iceberg-rust merge, RelationalAI/iceberg-rust#78) renamed the flag to skip_signature and changed its semantics: it's now checked first, unconditionally, before any credential is even loaded. Configured credentials are silently ignored whenever allow-anonymous is also set, so every request goes out unsigned -- which a private bucket correctly rejects with 403/AUTH_FAILED. Verified locally against this repo's own docker-compose MinIO/Polaris setup: both assertions pass against the current (0.9.2) FFI build. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
gbrgr
requested review from
hall-alex and
robertbuessow
and removed request for
robertbuessow
September 2, 2026 07:37
Regression coverage for the ADLS counterpart of the s3.allow-anonymous
incident already covered in this PR: unlike S3's opendal service (which
exposes an explicit skip_signature bypass), opendal's Azdls service has
no anonymous/unsigned mode at all -- every request goes through a
generic credential-provider chain that hard errors ("failed to load
signing credential") if no credential can be found or validated. An
empty adls.sas-token doesn't help either: it's treated as a found-but-
invalid credential, which fails the same way. So reading a genuinely
public, unauthenticated Azure container was not possible through this
stack at all.
RelationalAI/iceberg-rust#79 adds an explicit "adls.allow-anonymous"
opt-in (mirroring s3.allow-anonymous), routing to opendal's generic Http
service instead of the signed Azdls one. Verified locally against this
repo's own docker-compose infra, plus the real public Azure test
container (publicbenchmarks.dfs.core.windows.net/integration-tests,
the same one RelationalAI/raicode's own integration tests read from):
without the flag, table_open correctly fails with AUTH_FAILED; with it,
the read succeeds.
Bumps the git rev to iceberg-rust#79's branch tip for this verification;
needs a follow-up bump to the actual merge commit once that PR lands
(flagged with a TODO in Cargo.toml). Version bumped to 0.9.3 to match.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
mjschleich
approved these changes
Sep 2, 2026
PR #79 (RelationalAI/iceberg-rust) merged as 9eb8921f9; switch from the temporary WIP branch-tip rev to the real main commit.
gbrgr
enabled auto-merge (squash)
September 2, 2026 12:03
gbrgr
disabled auto-merge
September 2, 2026 12:08
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Regression coverage for two related production incidents found while
validating the RustyIceberg 0.9.2 bump in raicode
(raicode#28144).
S3:
s3.allow-anonymousignores configured credentialsraicode's Iceberg data-loading integration always sends
"s3.allow-anonymous" => "true"alongside any explicit credentials,intending it purely as a fallback for when no credentials are configured.
Under the fork's old opendal (0.55, pre
RelationalAI/iceberg-rust#78),that was safe:
allow_anonymouswas only consulted after trying to loada real credential, and only skipped signing if none was found
(
opendal-0.55.0/src/services/s3/core.rs,S3Core::load_credential).Upstream's opendal 0.58 renamed the flag to
skip_signatureand changedits semantics: it's now checked first, unconditionally, before any
credential is even loaded (
opendal-service-s3-0.58.2/src/core.rs:if self.skip_signature { return ...unsigned... }). So configuredcredentials are silently ignored whenever
allow-anonymousis also set —every request now goes out unsigned, which a private bucket correctly
rejects with
403 AccessDenied/AUTH_FAILED.Verified locally against this repo's own docker-compose MinIO: 14/14
pass, including both new assertions (allow-anonymous + valid credentials
→
AUTH_FAILED; allow-anonymous omitted with the same credentials →success).
ADLS: no anonymous-access mode existed at all
Unlike S3's opendal service, opendal's Azdls service had no anonymous/
unsigned mode: every request went through a generic credential-provider
chain that hard errors (
"failed to load signing credential") if nocredential can be found or validated. An empty
adls.sas-tokendoesn'thelp either — it's treated as a found-but-invalid credential, which
fails the same way. So reading a genuinely public, unauthenticated Azure
container wasn't possible through this stack at all.
RelationalAI/iceberg-rust#79
adds an explicit
"adls.allow-anonymous"opt-in (mirrorings3.allow-anonymous), routing to opendal's genericHttpservice(plain unauthenticated GET/HEAD) instead of the signed Azdls one.
Verified against the real public Azure test container
(
publicbenchmarks.dfs.core.windows.net/integration-tests, the sameone raicode's own integration tests read from): without the flag,
table_opencorrectly fails withAUTH_FAILED; with it, the readsucceeds. Local run: 17/17 pass in the same testset.
Status
iceberg/iceberg-catalog-restcurrently point atRelationalAI/iceberg-rust#79's branch tip for this verification —needs a follow-up bump to the actual merge commit once that PR
lands (flagged with a
TODOinCargo.toml).🤖 Generated with Claude Code