1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# cargo-deny configuration for midstream.
#
# See ADR-0014 (docs/adr/0014-supply-chain-pinning.md).
#
# Run locally: cargo deny check
# Run in CI: .github/workflows/audit.yml
#
# This file is the single source of truth for the project's supply-chain
# policy. Time-bounded ignore entries below carry an explicit expiry date
# and a follow-up issue / ADR reference; reviewers should challenge any
# ignore that drifts past its expiry.
# --------------------------------------------------------------------------
# advisories — RustSec vulnerability database checks
# --------------------------------------------------------------------------
[]
= 2
# Vulnerability advisories are denied; cargo-deny exits non-zero if any
# crate in Cargo.lock has an open advisory not listed below.
= "~/.cargo/advisory-db"
= ["https://github.com/rustsec/advisory-db"]
= "deny"
# Time-bounded ignores. Each entry MUST cite the rationale, the follow-up
# issue / ADR, and an expiry date. Reviewers reject any ignore that has
# passed its expiry without a renewed justification.
= [
# ------------------------------------------------------------------
# In-flight: rustls-webpki CRL / name-constraint CVEs.
# All four come from `rustls-webpki 0.102.8`, which is dragged in by
# the orphan `rustls = "0.22"` dep in `crates/quic-multistream/Cargo.toml`.
# PR #8 (feat/quic-tls-verification-adr0011) removes that line and
# the lockfile then unifies on rustls 0.23 + rustls-webpki 0.103.13.
# Verified via `cargo tree -i rustls-webpki:0.102.8` on this branch:
# the ONLY path is via the soon-to-be-removed rustls 0.22 dep.
# Expiry: 2026-06-13 (clear once PR #8 merges).
{ = "RUSTSEC-2026-0049", = "rustls-webpki<0.103.13; cleared by PR #8 / ADR-0011" },
{ = "RUSTSEC-2026-0098", = "rustls-webpki<0.103.13; cleared by PR #8 / ADR-0011" },
{ = "RUSTSEC-2026-0099", = "rustls-webpki<0.103.13; cleared by PR #8 / ADR-0011" },
{ = "RUSTSEC-2026-0104", = "rustls-webpki<0.103.13; cleared by PR #8 / ADR-0011" },
# ------------------------------------------------------------------
# In-flight: lru 0.12.5 IterMut unsoundness (RUSTSEC-2026-0002).
# Bumped to 0.18 by the follow-up dep-sweep PR per ADR-0014 impl
# notes. Expiry: 2026-07-13.
{ = "RUSTSEC-2026-0002", = "lru<0.18; pending workspace bump per ADR-0014" },
# ------------------------------------------------------------------
# In-flight: unmaintained transitives.
# * yaml-rust 0.4.5 (via config 0.13) — ADR-0019 (figment)
# * dotenv 0.15.0 (direct, root Cargo.toml) — ADR-0019 (dotenvy)
# * bincode 1.3.3 (via duckdb) — ADR-0002 (un-vendor hyprstream)
# * paste 1.0.15 (transitive proc-macro) — ADR-0002 chain
# * rustls-pemfile 1.0.4 (via tonic) — ADR-0002 chain
# Expiries: 2026-08-13 (quarterly review).
{ = "RUSTSEC-2024-0320", = "yaml-rust via config 0.13; ADR-0019 (figment)" },
{ = "RUSTSEC-2021-0141", = "dotenv direct; ADR-0019 (switch to dotenvy)" },
{ = "RUSTSEC-2025-0141", = "bincode via duckdb; cleared by ADR-0002" },
{ = "RUSTSEC-2025-0134", = "rustls-pemfile via tonic 0.12; cleared by ADR-0002 chain" },
{ = "RUSTSEC-2024-0436", = "paste transitive; cleared by ADR-0002 chain" },
]
# --------------------------------------------------------------------------
# licenses — accepted SPDX expressions on transitive deps
# --------------------------------------------------------------------------
[]
= 2
# Crates whose licence cannot be determined are implicitly denied by
# cargo-deny v0.16+. First-party crates MUST declare MIT OR Apache-2.0
# (enforced by review, not by deny). Transitive deps are accepted from
# this allowlist.
= [
"MIT",
"Apache-2.0",
"Apache-2.0 WITH LLVM-exception",
"BSD-2-Clause",
"BSD-3-Clause",
"ISC",
"Unicode-DFS-2016",
"Unicode-3.0",
"CC0-1.0",
"Zlib",
"MPL-2.0", # weak copyleft; acceptable on transitives
"OpenSSL", # legacy clause; only via deps that haven't migrated
]
# GPL / AGPL / SSPL are forbidden by omission from `allow` above;
# cargo-deny v0.16+ removed the explicit `deny` key and now derives
# deny semantics from "not in allowlist".
# Confidence threshold for accurately detecting the licence of crates
# that don't declare in metadata (read from LICENSE file).
= 0.93
# Explicit per-crate exceptions when the SPDX expression doesn't match
# the metadata exactly. Empty list keeps the policy honest.
= []
# --------------------------------------------------------------------------
# bans — pin specific deps; ban known footguns; enforce uniqueness
# --------------------------------------------------------------------------
[]
# Soft start: most existing duplicate-version skews come via the
# vendored `hyprstream-main/` (ADR-0002). Once that lands the count
# drops from ~27 to <5; at that point we tighten this back to "deny".
# Targeted tightening for security-critical crates (rustls, openssl-
# style) lives in the `deny` list below regardless.
= "warn"
# Workspace-internal path deps (e.g. `midstreamer-attractor = { path = "..." }`)
# don't yet carry a version constraint; cargo-deny correctly flags this
# since the resulting crates are then unpublishable. ADR-0024 (semver
# discipline) lands the per-path `version = "0.1"` annotations.
# Until then, downgrade to warn so the audit isn't a blocking false-positive
# while we work toward proper semver hygiene.
= "warn"
= true
= "all"
# Skip multi-version errors for these crates while the relevant
# remediation ADR is in flight. Each entry MUST be removable.
= [
# The duckdb -> arrow-flight chain (via vendored hyprstream-main)
# pulls arrow 53.x + arrow 54.x simultaneously. Removed by
# ADR-0002 (un-vendor hyprstream).
{ = "arrow", = "via hyprstream-main; ADR-0002" },
{ = "arrow-schema", = "via hyprstream-main; ADR-0002" },
{ = "arrow-array", = "via hyprstream-main; ADR-0002" },
{ = "arrow-buffer", = "via hyprstream-main; ADR-0002" },
{ = "arrow-data", = "via hyprstream-main; ADR-0002" },
# hyper-0.x stack via tonic 0.12 via arrow-flight via hyprstream.
{ = "hyper", = "via arrow-flight/tonic 0.12; ADR-0010" },
{ = "http", = "via arrow-flight/tonic 0.12; ADR-0010" },
{ = "http-body", = "via arrow-flight/tonic 0.12; ADR-0010" },
{ = "h2", = "via arrow-flight/tonic 0.12; ADR-0010" },
{ = "tower", = "via arrow-flight/tonic 0.12; ADR-0010" },
# Misc duplicate-version skews tracked for follow-up bumps.
{ = "base64", = "0.13 + 0.21 + 0.22 mix; pending unified bump" },
{ = "bitflags", = "1.x + 2.x; transitive only" },
{ = "hashbrown", = "multiple via arrow / serde / others" },
{ = "indexmap", = "1.x + 2.x; transitive only" },
{ = "rand", = "0.8 + 0.9 transition in flight" },
{ = "syn", = "1.x + 2.x; proc-macro transitive" },
{ = "getrandom", = "0.2 + 0.3 transition" },
{ = "socket2", = "0.5 + 0.6 transition" },
{ = "webpki-roots", = "0.26 + 1.0 mix" },
{ = "ahash", = "0.7 + 0.8 via duckdb" },
]
# Deny known footguns outright. Anyone introducing these in a PR has
# to delete the relevant entry here, which forces an ADR-grade
# conversation.
#
# NOTE on the openssl / native-tls family: those crates are present
# today via `hyprstream-main` -> `duckdb` -> `reqwest 0.11` (TLS
# backend selection). ADR-0002 (un-vendor hyprstream) eliminates the
# entire chain. Until that lands, the bans below are commented out so
# this PR's CI can pass; uncomment in the ADR-0002 implementation PR.
= [
# Once ADR-0002 lands, restore these:
# { name = "openssl", reason = "Use rustls per ADR-0011" },
# { name = "openssl-sys", reason = "Use rustls per ADR-0011" },
# { name = "native-tls", reason = "Use rustls per ADR-0011" },
#
# rustls-webpki < 0.103.13 carries RUSTSEC-2026-0049/0098/0099/0104.
# The only path to the vulnerable version on `main` today is via
# the orphan `rustls = "0.22"` dep that PR #8 removes; the
# corresponding advisory IDs are also in `advisories.ignore`
# above with the same expiry. Keep the version-pin ban so that any
# future regression re-surfaces the error immediately.
{ = "rustls-webpki", = "<0.103.13", = "RUSTSEC-2026-0049/0098/0099/0104" },
]
# --------------------------------------------------------------------------
# sources — where it's okay to fetch crates from
# --------------------------------------------------------------------------
[]
= "deny"
= "deny"
= ["https://github.com/rust-lang/crates.io-index"]
# No git sources are allowed in default builds. To introduce one, add
# the repo URL here with a comment naming the ADR that justifies it.
= []