Repository navigation
integrity-blob: move the Azure backend to object_store (RUSTSEC-2026-0275) - #55
Merged
captjt merged 2 commits intoOct 28, 2026
Conversation
…0275) azure_core 0.21, which azure_storage / azure_storage_blobs 0.21 bring in, logs each request's authorization header at debug and trace level. The legacy SDK is unsupported upstream, so the fix is to move off it. AzureBlob now uses object_store's MicrosoftAzureBuilder with the same account-key auth, so callers and the FFI are unchanged. A missing blob still maps to None, and puts still store a text/plain block blob. object_store's 30s whole-request timeout is disabled so large blobs behave as before; its connect timeout and retries are kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
captjt
deleted the
mic-84-replace-the-legacy-azure-sdk-in-integrity-blob-azure_core
branch
October 28, 2026 18:03
Merged
captjt
added a commit
that referenced
this pull request
Oct 28, 2026
Release prep for `v0.0.20`, following CONTRIBUTING.md. - **CHANGELOG:** the `Unreleased` entries move to `## [0.0.20] - 2026-10-28`. Since `v0.0.19` that is #55: the `blob-azure` backend moves from the legacy Azure SDK to `object_store`, clearing RUSTSEC-2026-0275 (MIC-84). `Unreleased` stays at the top, empty. The comparison links are advanced: `[Unreleased]` compares `v0.0.20...main`, and `[0.0.20]` compares `v0.0.19...v0.0.20`. - **Version:** `[workspace.package].version` moves from `0.0.19` to `0.0.20`. `Cargo.lock` changes only the 12 workspace crates' versions. The FFI ABI version (0.5.0) is a separate contract and is unchanged; #55 didn't change the ABI. These pass on Rust 1.94.1: - `./scripts/check-changelog.sh v0.0.20` - `just fmt-check`, `just lint`, `just test` (90 passed) - `cargo check --locked -p integrity-ffi --features blob-all,signer-all` **After merging:** tag the merge commit on `main` and push the tag. That starts the native FFI release workflow, which checks for the `## [0.0.20]` heading and then builds and publishes the artifacts. ```bash git tag v0.0.20 <merge-commit> git push origin v0.0.20 ``` Then Guardian's `services/integrity-service` bumps its integrity tag to `v0.0.20`, and `cargo deny check advisories` should no longer report RUSTSEC-2026-0275 (MIC-84 step 3). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.
Fixes MIC-84.
blob-azurewas built on the legacy Azure SDK (azure_storage/azure_storage_blobs0.21). Itsazure_core0.21 logs each request'sauthorizationheader, a replayable Shared Key signature, at debug and trace level (RUSTSEC-2026-0275). The legacy SDK is unsupported, and Microsoft closed the upstream issue as not planned, so the fix is to move off it.Change
integrity-blob/src/blob_store/azure_blob.rsnow usesobject_store0.14 (Apache Arrow, MIT/Apache-2.0) and itsMicrosoftAzureBuilder, as MIC-84 recommends.AzureBlob::new(account, key, container)and the FFI'sig_blob_store_azure_blob_neware unchanged, and auth is still the storage account key. No FFI ABI or header change.Ok(None)fromgetandfalsefromexists.putwrites a block blob with content typetext/plain, overwriting any existing blob. Other errors are logged atwarnand returned.object_storelimits each whole request to 30s by default. The legacy SDK had no such limit, and a large blob could exceed it, soinitdisables that limit.object_store's 5s connect timeout and its retries on 5xx, 429 and timeouts stay on (up to 10 retries, at most 3 minutes).init. Before, the first request failed.Cargo.lockdropsazure_storage,azure_storage_blobs,azure_svc_blobstorageandRustyXML. It addsobject_store0.14.2 and a few small crates (rand0.10,getrandom0.4,base640.23,itertools0.15,quick-xml0.31 → 0.41).reqwest0.13 was already in the tree.Logging check (MIC-84's "verify before switching")
object_store's only log lines areinfo-level retry messages (status code, backoff, transport error). It never logs request headers and doesn't turn on reqwest'sconnection_verbose.Debugprints only the account and container.Still on
azure_core0.21signer-akv(integrity-signer:azure_identityandazure_security_keyvault0.21) still depends onazure_core0.21, soazure_corestays in this repo'sCargo.lock. Withblob-azure,blob-s3,blob-gcs, the set Guardian's integrity-service enables,cargo tree -i azure_corefinds nothing. Movingsigner-akvoff the legacy SDK is separate work.Testing
Against Azurite 3.35.0. I ran the same harness on
mainand on this branch, with each copy ofAzureBlobpointed at the emulator for the test only, and trace logging on for every crate:main(azure_storage 0.21)None/falseNone/falsetrue/"Hello World"true/"Hello World"text/plaintext/plaininitSharedKeysignatures in the logsOn this branch, the only log lines containing "authorization" are Azurite's 403 body ("Make sure the value of the Authorization header is formed correctly").
Locally on Rust 1.94.1:
just fmt-check(also clean under nightly rustfmt forintegrity-blob)just lint,just lint-docs,just test,just build(--all-features)cargo check --locked -p integrity-ffi --features blob-all,signer-allcargo clippy -p integrity-blob --no-default-features --features blob-azure --all-targets -- -Dwarnings.just lintuses default features, so it doesn't compile this backend.Not run:
object_storeonly applies to non-wasm targets, and CI runs that check.cargo clippy -p integrity-blob --features blob-all --all-targetsfails onmaintoo: thes3.rstests use#[tokio::test], buttokioisn't a dev-dependency.After merge
MIC-84 steps 2 and 3: cut an integrity release, bump the tag in Guardian's
services/integrity-service, and confirmcargo deny check advisoriesno longer reports RUSTSEC-2026-0275. Deployments that ran the Azure backend with debug or trace logging for the Azure crates should treat those logs as holding credentials and rotate the storage account key.🤖 Generated with Claude Code