Skip to content

fix(deps): clear the security audit advisories - #555

Merged
itzlambda merged 1 commit into
mainfrom
fix/dependency-advisories
Aug 24, 2026
Merged

fix(deps): clear the security audit advisories#555
itzlambda merged 1 commit into
mainfrom
fix/dependency-advisories

Conversation

@itzlambda

Copy link
Copy Markdown
Contributor

security-audit and test-python-sdk are failing on every open PR, not just one — 519, 553 and 554 all show the same two red jobs on dependencies none of them touch. Four advisories, handled three ways.

Bumped, with a fix at least 14 days old

Crate From → To Age Advisory
webbrowser 0.8.15 → 1.2.4 19d RUSTSEC-2026-0257 / GHSA-2ph8-5cr8-hr33
lru 0.16.3 → 0.18.2 20d RUSTSEC-2026-0253
ruint 1.17.2 → 1.20.0 24d RUSTSEC-2026-0220
pip 26.1.2 → 26.2.1 19d PYSEC-2026-3721

webbrowser also gains the hardened feature, which the advisory recommends: it rejects non-HTTP(S) URLs before they reach the OS handler, closing the argument-injection class described there. Both call sites open an https URL — the Auth0 authorize page (auth/oauth_flow.rs) and the Stripe checkout_url (handlers/fund/card.rs). The second is the one that matters, since that URL arrives in an API response rather than being built locally.

The 14-day floor is a deliberate soak period: it avoids adopting a release fresh enough that a compromised or broken publish has not yet been noticed. Every transitive crate pulled in by these bumps was checked against it too — the oldest is objc2-foundation at 323 days, the youngest simd_cesu8 at 41.

The exception: h2 at 4 days

h2 0.4.130.4.17, which is 4 days old and breaks the rule above.

No version satisfies both constraints. The fix landed in 0.4.16 seven days ago, and every release since is newer still. Waiting until 2026-08-31 would leave CI red for a week.

0.4.16 is also the wrong target even though it is the nominal fix. From the changelog:

0.4.19 (Aug 24)  Improve default (auto) small DATA frame budget
0.4.18 (Aug 20)  Add data_frame_budget(n) to client and server builders
0.4.17 (Aug 19)  Fix limiting of excessive small DATA frames to ignore EOS frames
0.4.16 (Aug 17)  Fix limiting excessive amount of small DATA frames   <- the CVE fix

0.4.17 is a fix to the fix: 0.4.16's new limiter counted end-of-stream frames it should not have, so it rejects legitimate traffic. Shipping 0.4.16 would trade a DoS vector for a correctness bug in our own HTTP/2 stack.

0.4.18 and 0.4.19 are budget-heuristic refinements — a new tunable, then a retuned default — and still visibly settling, so 0.4.17 is the conservative pick: the oldest version that is both patched and correct.

Since the rule was bent, provenance was checked rather than assumed:

  • repository is hyperium/h2, 764M downloads
  • owners are Carl Lerche, Sean McArthur and Oliver Gould — no unexpected publishers
  • the fix commit (193833e8, "limit excessive amount of small DATA frames") is seanmonstar's own, and he cut the release
  • the large deletion count in the diff is a regenerated HPACK lookup table, from the 8-bit decoding optimisation in the same release

One thing to watch after this lands: the limiter caps small DATA frames, and validator telemetry streams over tonic. If a budget is ever too tight, long-lived streaming is where it would show.

Ignored: h2 0.3.27

RUSTSEC-2026-0258 also matches h2 0.3.27, and no bump can fix that one. The advisory's fix is on the 0.4 line; 0.3 has had no release since 0.3.27 in July 2025.

It reaches us only through hyper 0.14.32, which is pulled by axum 0.6, tonic 0.10, kube-client 0.88 and reqwest 0.11 — the same stack the rustls-webpki entries directly above it in deny.toml are already ignored for, and scheduled for removal in the 0.27.0 subnet cleanup. Resolving it properly means a hyper 0.14 → 1.x migration across four frameworks.

The ignore is by advisory id because crate = "..." entries apply only to yanked crates, not vulnerabilities. That is safe here: the advisory is defined as fixed in >=0.4.16, so it can never mask the 0.4.17 pinned in this same change — only the unfixable 0.3.x path.

One incidental fix

The lru bump quietly moved aws-sdk-s3 from 1.120.0 down to 1.119.0. That was caught and restored. Worth knowing cargo update --precise can shift unrelated crates.

Verification

cargo deny check   advisories ok, bans ok, licenses ok, sources ok
pip-audit --local  No known vulnerabilities found
uv lock --locked   satisfied (exclude-newer-span untouched)
  • cargo check --workspace --all-targets clean
  • 670 tests pass — validator 212, cli 82, sdk 376
  • cargo fmt --all --check clean
  • lru 0.16 → 0.18 is a major bump and webbrowser 0.8 → 1.2 is too; both compile and test clean, and webbrowser::open's signature is unchanged

Only four crates changed version in Cargo.lockh2, lru, ruint, webbrowser. The rest of that diff is new transitive entries.

Merge order

This touches Cargo.lock broadly, so it will conflict with anything else that moves the lock. Worth landing before 554 and 519.

cargo-deny and pip-audit both fail on main, which blocks every open PR.
Four advisories, handled three ways.

Bumped, with a fix at least 14 days old:

  webbrowser  0.8.15 -> 1.2.4   RUSTSEC-2026-0257  19 days
  lru         0.16.3 -> 0.18.2  RUSTSEC-2026-0253  20 days
  ruint       1.17.2 -> 1.20.0  RUSTSEC-2026-0220  24 days
  pip         26.1.2 -> 26.2.1  PYSEC-2026-3721    19 days

webbrowser also gains the hardened feature. It rejects non-HTTP(S)
URLs before they reach the OS handler, which closes the argument
injection class the advisory describes. Both call sites open an https
URL: the Auth0 authorize page, and the Stripe checkout URL that
arrives in an API response.

h2 is bumped to 0.4.17, which is 4 days old and breaks the 14 day
rule. This is deliberate. The fix landed in 0.4.16, seven days ago, so
no version satisfies both the advisory and the rule. 0.4.16 is also
the wrong choice: 0.4.17 corrects it to ignore end-of-stream frames,
without which the new limiter rejects valid traffic. Ownership and the
fix commit were checked against hyperium/h2.

h2 0.3.27 keeps RUSTSEC-2026-0258 and is now ignored in deny.toml. The
fix is on the 0.4 line and 0.3 has had no backport since July 2025, so
no bump resolves it. It reaches us through hyper 0.14, under the same
axum 0.6 / tonic 0.10 / kube 0.88 / reqwest 0.11 stack as the
rustls-webpki entries above it, and goes when that stack does.

Restored aws-sdk-s3 to 1.120.0, which the lru bump had quietly moved
down to 1.119.0.

cargo deny reports advisories ok, bans ok, licenses ok, sources ok.
pip-audit reports no known vulnerabilities. Workspace builds, 670 tests
pass across validator, cli and sdk.
@coderabbitai

coderabbitai Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Next included review available in 30 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 55f75135-484d-4488-a092-e7fb6da90c6c

📥 Commits

Reviewing files that changed from the base of the PR and between 1c3bb97 and 554bea0.

⛔ Files ignored due to path filters (2)
  • Cargo.lock is excluded by !**/*.lock
  • crates/basilica-sdk-python/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (2)
  • Cargo.toml
  • deny.toml

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@covenant-talos

Copy link
Copy Markdown

Walkthrough

This PR clears four security audit advisories that are failing CI on every open PR. Three Rust crates and one Python package are bumped to patched versions (webbrowser 0.8→1.2 with the hardened feature, lru 0.16→0.18, ruint 1.17→1.20, pip 26.1→26.2), h2 is pinned to 0.4.17 as a deliberate exception to the 14-day soak rule (0.4.16's fix has a correctness regression, and older patched versions don't exist), and the unfixable h2 0.3.x advisory (RUSTSEC-2026-0258) is added to deny.toml's ignore list since it reaches the project only through the hyper 0.14 stack slated for removal in the 0.27.0 subnet cleanup. An incidental aws-sdk-s3 downgrade introduced by cargo update --precise was caught and restored.

Changes

Cohort / File(s) Change Summary
Direct dep bumpsCargo.toml lru raised to 0.18 and webbrowser raised to 1.2 with the hardened feature enabled, closing the argument-injection advisory at both call sites.
Lockfile regenerationCargo.lock Pins h2 0.4.17, lru 0.18.2, ruint 1.20.0, and webbrowser 1.2.4, plus their transitive dependencies (new ark-ff 0.6, objc2 family, jni 0.22, hashbrown 0.17, simd_cesu8, and others); restores aws-sdk-s3 to 1.120.0.
Python SDK lockcrates/basilica-sdk-python/uv.lock Bumps pip from 26.1.2 to 26.2.1 to clear PYSEC-2026-3721.
Advisory ignoredeny.toml Adds RUSTSEC-2026-0258 (h2 0.3.x unbounded empty DATA frames) to the ignore list with rationale, since the 0.3 line has no patch and is unreachable from the 0.4.17 pin.

Estimated review effort: 2/5 (mechanical dependency bumps with well-documented rationale; the only non-obvious decision is the h2 version choice, which is thoroughly explained in the PR description).

Instant overview - a deep technical review follows as a separate comment.

@covenant-talos

Copy link
Copy Markdown

PR #555: fix(deps): clear the security audit advisories

Summary

Clears four security advisories that were failing security-audit and test-python-sdk on all open PRs: bumps webbrowser 0.8.15 → 1.2.4 (with the advisory-recommended hardened feature), lru 0.16.3 → 0.18.2 (workspace dep; the aws-smithy transitive moves 0.16.3 → 0.16.4), ruint 1.17.2 → 1.20.0, pip 26.1.2 → 26.2.1, and h2 0.4.13 → 0.4.17 — the latter deliberately chosen over the nominal fix 0.4.16 because 0.4.17 fixes a regression in 0.4.16's new DATA-frame limiter. The unfixable h2 0.3.27 instance of RUSTSEC-2026-0258 (reachable only via the legacy hyper 0.14 stack: axum 0.6 / tonic 0.10 / kube 0.88 / reqwest 0.11) is ignored by advisory ID in deny.toml with a documented rationale, pending the 0.27.0 subnet cleanup. Verification reported: cargo deny, pip-audit, uv lock --locked, workspace check, 670 tests, fmt — all clean.

Architecture

No structural impact. The lock now carries two majors of h2 (0.3.27 / 0.4.17), lru (0.16.4 / 0.18.2), and jni (0.21 / 0.22), and four majors of ark-ff (0.3–0.6) — normal cargo multi-resolution, but it does enlarge the compiled surface.

Issues Found

CRITICAL Issues (Must Fix Before Merge)

None found.

HIGH Severity Issues (Advised to Fix Before Merge)

None found.

MEDIUM Severity Issues (Optional to Fix Before Merge)

None found.

LOW Severity Issues (Minor Improvements)

  1. Note that the RUSTSEC-2026-0258 ignore suppresses the advisory for every h2 in the graph, not just 0.3.27
    Security | Low | Quick win

    • Why: deny.toml gains "RUSTSEC-2026-0258" with the reasoning that "it can never match the 0.4.17 we pin in this same change." That is true only while the lock keeps a >=0.4.16 h2 0.4.x. cargo-deny ignores are advisory-scoped, not version-scoped: a future bad cargo update --precise, or a new dependency constraining h2 below 0.4.16, would be silently masked by this same ignore. Low probability, but the ignore outlives the rationale if the hyper-0.14 removal slips.
    • How: Keep the ID ignore (it is the only mechanism cargo-deny offers for vulnerabilities), but add a cheap guard while it exists — e.g. a CI assertion that cargo tree -i h2@0.4.17 (or a cargo tree | grep '^h2 v0\.4\.' version check) never shows a 0.4.x below 0.4.16 — and a note to delete the ignore in the 0.27.0 cleanup.
  2. Confirm explicitly that lru 0.16.4, retained via aws-smithy-runtime, is inside RUSTSEC-2026-0253's patched range
    Security | Low | Quick win

    • Why: The lock keeps two lru majors: the workspace dep goes to 0.18.2, but the aws-smithy package's edge moves lru 0.16.3lru 0.16.4 (Cargo.lock hunks at lines ~930 and ~4914). The description's table says only "lru 0.16.3 → 0.18.2" and never mentions the 0.16.4 move. The reported green cargo deny check implies 0.16.4 is the patched backport on the 0.16 line — worth stating, since otherwise the natural reading is that a vulnerable-line crate was left in the tree.
    • How: One line in the description: transitive lru moved 0.16.3 → 0.16.4, which is the patched release for the 0.16 line.
  3. Correct the post-merge watch item: tonic traffic rides h2 0.3.27, which received no limiter
    Operability | Low | Quick win

    • Why: The description warns that the new small-DATA-frame limiter could bite "validator telemetry [which] streams over tonic." But this PR's own deny.toml rationale states tonic 0.10 arrives via hyper 0.14 — i.e. the unpatched 0.3 line. The limiter exists only in h2 0.4.17, which the lock shows under the hyper 1.x stack (http 1.4.0, http-body 1.0.1 hunks at ~3994 and ~6690), consumed e.g. by the AWS SDK. If a budget is ever too tight, long-lived hyper-1.x transfers (S3 streaming) are where it would surface. Caveat: I cannot see the full graph; if validator telemetry also egresses over a hyper-1.x client, the note stands as written.
    • How: Repoint the watch note at the hyper-1.x consumers rather than tonic.
  4. Smoke-test the two browser-open flows on real desktops; webbrowser 1.x rewrote the platform backends
    Testing & Docs | Low | Quick win

    • Why: The lock shows the backend swap outright: objc/malloc_buf/raw-window-handle/core-foundation 0.9.4 removed, objc2/objc2-app-kit/objc2-foundation and jni 0.22.4 added (webbrowser hunk at ~10336). That is new OS-dispatch code on macOS/Windows/Linux that no unit test or CI job can exercise, and both user-facing flows — auth/oauth_flow.rs and handlers/fund/card.rs — depend on it. hardened also changes failure behavior (a non-https checkout_url now errors instead of opening), which is intended but worth observing once in a real run.
    • How: Manual smoke of basilica auth login and the fund-card flow on macOS, Windows, and Linux before the next CLI release.

Security Review

Surface swept: this diff is dependency-only, so the relevant surface is supply chain and the one behavior change.

  • Trust boundaries / input validation: Improved. webbrowser's hardened feature rejects non-HTTP(S) URLs before the OS handler — directly relevant for the Stripe checkout_url, which arrives in an API response (handlers/fund/card.rs). This closes the argument-injection class from GHSA-2ph8-5cr8-hr33 rather than merely version-bumping past it.
  • Supply chain: Strong practice. A self-imposed 14-day soak on all bumped crates and their transitives (oldest 323d, youngest 41d); the single exception (h2 0.4.17, 4 days) is justified with repository/owner/commit-level provenance checks and pinned to the oldest correct patched release rather than the newest. The uv.lock hashes and upload-time (2026-08-04) are consistent with the stated 19-day age for pip 26.2.1.
  • Advisory-ignore scope: the one weakening of the audit net — covered as Low finding 1.
  • Authn/authz, secrets, injection, crypto, DoS: no changes to auth, secret handling, or deserialization surfaces; the h2 bump is itself a DoS fix. pip bump is dev-tooling scope in the SDK venv.

Suggestions for Improvements

  • The ruint bump pulls a fourth ark-ff major (0.6.0) into the tree alongside 0.3/0.4/0.5. If the crates enabling ruint's arkworks features don't all need every version, trimming those features would shed three duplicate ark-serialize/ark-std stacks. Not for this PR necessarily — worth a follow-up look.
  • Endorse the author's merge-order note: this touches Cargo.lock broadly, so land it before fix(sdk): scale the token refresh lead to the token lifetime #554 and feat(cli): add all-sessions logout #519 to avoid lock conflicts.
  • The lru 0.16.4 retention means the "lru 0.16.3 → 0.18.2" table row undersells the change slightly (see Low finding 2).

Positive Observations

  • Exceptional change hygiene for a dependency PR: the h2 0.4.17-over-0.4.16 reasoning (fix-to-the-fix) is exactly the kind of version selection that avoids shipping a known regression.
  • The caught aws-sdk-s3 1.120.0 → 1.119.0 regression from cargo update --precise shows the lock was actually reviewed, not just regenerated.
  • The deny.toml comment is a model for advisory ignores: why it's unfixable, why ID-form is required, and when it gets removed.
  • The Cargo.toml comment on hardened documents both the threat and why the restriction is free for these call sites.
  • Old, unmaintained transitive crates (objc 0.2.7, malloc_buf, raw-window-handle 0.5.2) leave the tree as a side effect.
  • Commit standards: PR title fix(deps): clear the security audit advisories conforms to Conventional Commits; individual commit messages were not provided for review.

Recommendation and Next Steps

APPROVE — a thoroughly verified, well-documented advisory-clearing change whose only residual concerns are four low-severity documentation/operability nits that can be addressed in follow-ups or a description edit.

@itzlambda
itzlambda merged commit 0274d4a into main Aug 24, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant