Skip to content

Track RUSTSEC-2026-0258 (h2 0.3 via libsql remote) and its temporary audit exception #349

Open

Description

@jatmn

The nightly cargo audit reports RUSTSEC-2026-0258 in h2 0.3.27. Nothing upstream fixes it yet, so I'm tracking it here alongside a temporary audit exception.

Where it comes from

  • libsql 0.9.30's remote feature (Hrana over HTTP) depends on hyper 0.14 with http2 enabled, which pulls in h2 0.3.x.
  • Our own hyper 0.14 dependency doesn't enable http2, so libsql's remote feature is the only reason h2 0.3 is in the tree. The h2 0.4 copy that comes through hyper 1, reqwest and axum isn't affected.
  • We can't drop remote, because it's the remote database path in src/db.rs.

Why the risk is negligible for us

  • The advisory is a low-severity way to crash or exhaust memory by flooding an h2 connection with empty DATA frames.
  • We only use h2 as a client, and only toward the database server the operator configured.
  • src/remote_https.rs offers only http/1.1 during the TLS handshake, and a test covers that. libsql never forces HTTP/2, so the h2 code is built but never runs. We also confirmed that our hosted database endpoint works fully over HTTP/1.1.

Upstream status

Plan

  • Add a narrow audit ignore for RUSTSEC-2026-0258 only, with a written reason, plus an expiry date check in scripts/ci-preflight.sh (about 90 days out) so it can't be forgotten.
  • Keep the HTTP/1.1-only connector test, since it's what makes the exception safe.
  • When libsql ships a release whose remote path uses hyper 1 / h2 0.4, bump libsql, remove the ignore and close this issue.
  • If the exception expires with no upstream movement, scope replacing the remote client (Hrana over hyper 1 or reqwest, keeping libsql core for local) as a separate backlog item.

The rustls advisories (RUSTSEC-2026-0346 to 0349) are fixed by a separate lockfile bump, not here.

Activity

  1. jatmn commented on Oct 17, 2026

    @jatmn
    OwnerAuthor

    Backlog note: options for replacing the libsql remote client. These are deferred for now; the audit exception stays in place.

    • Only the remote (Hrana over HTTP) side pulls in hyper 0.14 and h2. The bot and API crates use libsql's local engine, which doesn't.
    • libsql isn't abandoned: 0.10.0 shipped on 2026-10-13, but the move to hyper 1 is slow (feat: Upgrade to Hyper 1.0, Tonic 0.12, and hyper-rustls 0.27 tursodatabase/libsql#2224).
    • Candidate 1 is Turso's newer remote client, turso_serverless. It uses reqwest on hyper 1 and accepts libsql:// URLs with a token. The open questions: it's young (0.1.x), it targets Turso's new engine so it hasn't been proven against our hosted libSQL database, and it may not cover everything we use (transactions, batches, retry handling).
    • Candidate 2, the fallback, is a small in-house client that speaks the Hrana protocol over plain HTTP, using hyper 1 or reqwest with rustls, so the remote side drops libsql entirely.
    • Before choosing, do a short spike: run queries and a transaction against a test database with candidate 1, map our remote database code onto its API, and estimate the size of the swap.

    I'll revisit this if libsql moves to hyper 1 or turso_serverless matures, whichever comes first.

  2. jatmn commented on Oct 17, 2026

    @jatmn
    OwnerAuthor

    Addendum from the public bunny.net docs (checked 2026-10-17):

    • The only protocol Bunny Database documents is Hrana over HTTP at POST /v2/pipeline, and that API is marked beta (SQL API).
    • The only Rust client Bunny documents is the libsql crate with Builder::new_remote (Rust page).
    • WebSocket access isn't documented, and neither is the turso sync protocol. turso_serverless hasn't been verified against Bunny.
    • Bunny runs its own fork of libSQL and makes no long-term feature-parity commitment (launch post).

    This makes the in-house /v2/pipeline client the most likely replacement, if we ever need one. It's essentially what Bunny's own TypeScript client does. The trade-offs are that we'd have to handle value encoding ourselves (integers as strings, blobs as base64), and we'd use batch/sequence requests instead of interactive transactions.

  3. jatmn commented on Oct 28, 2026

    @jatmn
    OwnerAuthor

    Work guideline

    This is a watch item only, with no code work until upstream ships a fix. The only allowed change is a dependency bump that removes h2 0.3, along with removing the audit exception. That should be a small PR with no refactoring.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions