mirror of
https://github.com/ruvnet/RuView
synced 2026-08-11 20:41:44 +00:00
c63b26034b
From a fan-out deep-research run (20 primary sources, 25 claims 3-vote verified, 24 confirmed / 1 refuted): - New docs/research/privacy-shield/09-sota-update-2026.md: cited, evidence-classed SOTA update + prioritized VEIL improvement backlog. - ADR-288 gains a "2025-2026 evidence update" section: broader threat (BFId 99.5%/N=197; LeakyBeam through-wall vitals @20m; WiKI-Eve/SThief keystrokes; BFIAttack BFI->CSI reconstruction), VEIL's family independently validated (LeakyBeam per-packet unitary 89.7->51%; PrivISAC RIS 93->30%), BeamDancer (IEEE TWC 2024) as compliance precedent, shield-security-is-CLAIMED honesty, and the unfilled governance gap. Do NOT cite BeamDancer's refuted >96% PDR. - Roadmap §3.1: answers "does this need custom WiFi firmware?" — yes; ESP32 is an attacker/sensor node only (closed blob, CSI read only), the protector needs openwifi / Nexmon / vendor firmware; keyed-reversible needs both ends + key. Docs only. All VEIL numbers remain SYNTHETIC/L0; no code or claims upgraded. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01WEXNqzs7UsfNFBcP5yW21p
232 lines
13 KiB
Markdown
232 lines
13 KiB
Markdown
# ADR-288: VEIL — a compliant-waveform privacy shield against unauthorized WiFi sensing
|
||
|
||
| Field | Value |
|
||
|-------|-------|
|
||
| **Status** | Proposed — implemented (P1 reference model) |
|
||
| **Date** | 2026-08-09 |
|
||
| **Deciders** | ruv |
|
||
| **Codename** | **VEIL** — Verifiable Emission-shaping for Identity-Leakage prevention |
|
||
| **Codebase target** | new leaf crate `v2/crates/wifi-densepose-privshield` |
|
||
| **Parent** | ADR-118 (BFLD — the detection layer VEIL is the countermeasure to), ADR-282 (mandatory L0–L5 evidence ladder) |
|
||
| **Relates to** | ADR-120/121 (BFLD privacy class + identity-risk scoring — the trigger source), ADR-141 (privacy control plane / runtime attestation — the audit consumer), ADR-280 (active sensing / governed actuation — VEIL is a defensive sensing action), ADR-185 §13 (`wifi-densepose-aether` — the pure-compute leaf pattern this crate follows) |
|
||
| **Research bundle** | [`docs/research/privacy-shield/`](../research/privacy-shield/) (9 files) |
|
||
| **Tracking issue** | TBD |
|
||
|
||
## 0. PROOF discipline
|
||
|
||
Every defense number this crate produces is **SYNTHETIC / evidence level L0**
|
||
(ADR-282): generated by the crate's own model (`identity::Channel`), attacked by
|
||
the crate's own classifier (`attacker::NearestCentroidAttacker`), and scored
|
||
against its own known labels. Nothing here has been validated against real WiFi
|
||
silicon, and the crate contains no radio integration and cannot emit RF. External
|
||
attack/defense results cited from the literature (BFId, LeakyBeam, DySPAN-2026,
|
||
IRShield, FCC statutes) are **EXTERNAL** evidence and labelled MEASURED/CLAIMED in
|
||
the research bundle. The single measured claim about *our own behavior* is the
|
||
pinned deterministic witness in `proof.rs`.
|
||
|
||
## 1. Context
|
||
|
||
### 1.1 The gap
|
||
|
||
IEEE 802.11ac/ax beamforming feedback (BFI) — the compressed Givens-rotation
|
||
angle matrices (φ/ψ) a client sends the AP — is transmitted **unencrypted on the
|
||
management plane**. Any device in monitor mode can capture it for every station
|
||
at once, no network access, and the target need carry no device. The literature
|
||
establishes the severity: **BFId** (ACM CCS 2025) re-identifies individuals from
|
||
BFI; **LeakyBeam** (NDSS 2025) detects occupancy through walls at 20 m from BFI;
|
||
**BeamSense** recognizes activities at up to 99.28%. IEEE Std **802.11bf-2025**
|
||
(published 26 Sep 2025) standardizes the sensing measurement/feedback surface
|
||
these attacks abuse — and a 2023 proposal for a BFI secure-transmission mechanism
|
||
(802.11-23/0782) was **withdrawn**, so the standard shipped with no privacy
|
||
protections.
|
||
|
||
RuView already has a *detection* layer for this: **BFLD** (ADR-118/121) measures
|
||
the identity-leakage of each frame and gates what leaves the node. But BFLD
|
||
protects *RuView's own outputs*; it does nothing about a **third-party sniffer**
|
||
capturing the room's plaintext BFI off the air. There is no RuView component, and
|
||
per our market survey no shipping product anywhere, that prevents that.
|
||
|
||
### 1.2 Constraint: compliant waveform controls, never jamming
|
||
|
||
The defense must preserve normal communications and must not interfere with any
|
||
other station. Jamming (47 U.S.C. §333/§302a) is defined by *adding energy to
|
||
interfere with others' transmissions*. Any acceptable control must shape only the
|
||
node's **own** standards-conformant emission.
|
||
|
||
### 1.3 The separability insight
|
||
|
||
Identity leaks through the *fine* cross-subcarrier phase structure of a
|
||
beamforming report; data throughput rides the *dominant* beam direction. These
|
||
are (mostly) separable subspaces — so a transform confined to the fine subspace
|
||
can wreck re-identification while sparing the beam the link depends on. DySPAN-2026
|
||
independently MEASURED that shaping fine-resolution feedback is near-free in
|
||
throughput, corroborating the insight.
|
||
|
||
## 2. Decision
|
||
|
||
Ship **`wifi-densepose-privshield`** (VEIL) as a standalone pure-compute leaf
|
||
crate (the `wifi-densepose-aether`/`nvsim` pattern: dependency-free, deterministic,
|
||
WASM-ready, zero coupling to any radio or ingestion path), implementing:
|
||
|
||
1. **A SYNTHETIC two-subspace BFI model** (`identity.rs`): each identity owns a
|
||
stable fine-block signature; sessions add environmental nuisance; the comm
|
||
block is identity-free and carries throughput.
|
||
2. **The protector** (`protector.rs`): compliant waveform controls, primarily a
|
||
**per-session keyed orthogonal rotation of the fine subspace, composed from
|
||
extra Givens rotations** — the report's native primitive. Plus feedback
|
||
quantization/dither, sounding-cadence randomization, and a `SensingDetector`
|
||
that engages the shield only when sensing activity is observed.
|
||
3. **The adversary** (`attacker.rs`): a passive nearest-centroid re-identifier
|
||
modeling the BFId threat, with selectable Euclidean/Cosine metrics.
|
||
4. **A throughput model** (`throughput.rs`):
|
||
`(1 − sounding − feedback_airtime) · C(SNR·(1−ρ))/C(SNR)`, where the residual
|
||
`ρ` falls with feedback bits and the feedback airtime rises with them — giving
|
||
a genuine interior throughput optimum in feedback resolution.
|
||
5. **A compliance audit** (`compliance.rs`): the rotation is orthogonal ⇒
|
||
energy-preserving ⇒ adds no interfering energy ⇒ **not jamming**, turned into a
|
||
checked `ComplianceReport` (energy ratio ≈ 1.0).
|
||
6. **The experiment** (`experiment.rs`): runs the attacker against unprotected and
|
||
protected traffic and reports both accuracies vs. chance, plus throughput and
|
||
compliance, with a single `passed()` verdict.
|
||
7. **The hyper-optimizer** (`optimize.rs`): derives the shipped shield config
|
||
rather than hand-picking it — the throughput-optimal feedback resolution and
|
||
the minimum rotation-mixing budget that collapses re-ID robustly (across both
|
||
attacker metrics and N∈{16,32}), plus a Pareto frontier.
|
||
8. **A deterministic proof** (`proof.rs`): a pinned FNV-1a witness over the
|
||
reference experiment (the `nvsim`/`verify.py` discipline).
|
||
|
||
### 2.1 Why the keyed Givens rotation
|
||
|
||
It is simultaneously **orthogonal** (energy-preserving ⇒ compliant),
|
||
**key-reversible** (the associated AP shares the session key and recovers the true
|
||
precoder ⇒ throughput preserved), and **fresh per session** (a sniffer sees a new
|
||
random rotation of the signature each session and cannot average it back ⇒ the
|
||
enrollment attack collapses; over unknown rotations the signature carries no
|
||
stable discriminative information ⇒ re-ID → chance). It is the shared-secret
|
||
precoding idea (cf. MIMOCrypt) specialized to the identity-bearing subspace.
|
||
|
||
### 2.2 Measured behavior (SYNTHETIC / L0)
|
||
|
||
Reference experiment at the hyper-optimized operating point (§opt), default
|
||
scene, N=16 identities, `cargo test`:
|
||
|
||
| Metric | Shield off | Shield on |
|
||
|---|---|---|
|
||
| Passive re-ID accuracy | 100.0% | **4.7%** (chance 6.25%) |
|
||
| Link throughput ratio | 100% | **97.6%** |
|
||
| Emission energy ratio | — | **1.000000** (compliant) |
|
||
|
||
All 35 unit/proof tests + doctest pass; the crate builds for
|
||
`wasm32-unknown-unknown` and is clippy-clean.
|
||
|
||
### opt. Hyper-optimization (`optimize.rs`)
|
||
|
||
The shipped shield config is the optimizer's output, not a guess, and
|
||
`ShieldConfig::default()` is asserted equal to it:
|
||
|
||
- **Feedback resolution = 5 bits.** Throughput has an interior optimum in
|
||
feedback bits (residual falls, feedback airtime rises); the unconstrained
|
||
optimum is 3 bits (matching DySPAN-2026), and 5 is the throughput-best value in
|
||
the spec-allowed 802.11 {5,7,9} set.
|
||
- **Givens passes = 96.** The proven minimum for robust collapse — across both
|
||
attacker metrics *and* N∈{16,32} — is **48**; the shipped 96 is a free 2×
|
||
privacy margin, since the keyed rotation is derived from the shared secret and
|
||
never signaled (extra passes cost compute, not airtime). The original
|
||
hand-picked 112 was 2.3× over-provisioned.
|
||
|
||
Net vs. the original hand-picked (112 passes / 7 bits): the optimum is strictly
|
||
better on **both** privacy (re-ID 0.047 vs 0.078) and throughput (0.976 vs 0.974),
|
||
and is now verified rather than assumed. See
|
||
`docs/research/privacy-shield/08-optimization.md`.
|
||
|
||
### harness. Native terminal harness + TUI (`src/bin/veil.rs`)
|
||
|
||
A custom, dependency-free binary (`veil`) ships with the crate — the in-repo,
|
||
native counterpart to the npm metaharness (ADR-289). It drives the same public
|
||
API the tests use, as an interactive ANSI dashboard plus scriptable subcommands
|
||
(`report`, `sweep`, `optimize`, `adaptive <N>`, `proof`, `doctor`, `tui`).
|
||
Std-only (no `crossterm`/`ratatui`): the TUI is a command-driven redraw loop, so
|
||
it runs in any terminal, pipe, or CI and keeps the crate a pure leaf. It reports
|
||
only SYNTHETIC/L0 numbers and never relabels them. The wasm leaf story is
|
||
unchanged (validated with `--lib`; the bin is native-only).
|
||
|
||
### sota. 2025–2026 evidence update (verified)
|
||
|
||
A cited, adversarially-verified SOTA sweep
|
||
(`docs/research/privacy-shield/09-sota-update-2026.md`) refines the threat and
|
||
positioning. Load-bearing points for this ADR:
|
||
|
||
- **Threat is broader and cheaper than §1.1 stated.** A passive, keyless,
|
||
single-antenna sniffer at ~20 m and *through walls* can identify people
|
||
(BFId, 99.5%/N=197, `MEASURED`), read **breathing** from stationary occupants
|
||
and **keystrokes/PINs** (LeakyBeam / WiKI-Eve / SThief, `MEASURED`), and —
|
||
decisively — **reconstruct full CSI from the sniffed BFI** (BFIAttack,
|
||
≥93% single-antenna, `MEASURED`). VEIL's obfuscation must therefore degrade
|
||
*reconstructed-CSI* utility, not merely raw-BFI feature noise; because VEIL's
|
||
rotation is a **secret orthogonal** transform, the attacker has no key and no
|
||
closed-form to invert — this is now a claim to **test**, not assume.
|
||
- **VEIL's family is independently validated.** AP-side per-packet random
|
||
unitary on the LTF (LeakyBeam defense, 89.7%→~51%, `MEASURED`) and RIS
|
||
obfuscation (PrivISAC, 93%→~30%, robust to a retrained multi-location
|
||
attacker, `MEASURED`) confirm standard-permitted beamforming-surface
|
||
obfuscation works; DP-Givens quantization (`SYNTHETIC`) offers a formal ε knob.
|
||
- **Compliance precedent.** BeamDancer (IEEE TWC 2024, `MEASURED`) argues
|
||
native-beamforming obfuscation is 802.11-compliant while jamming/geofencing
|
||
are not — cite it as precedent. (Its ">96% PDR" figure was **refuted** in
|
||
verification; do not cite it.)
|
||
- **Security honesty.** Obfuscation shields have published counter-attacks
|
||
("Defeating CSI obfuscation", SnoopFi), so VEIL's own shield security is
|
||
`CLAIMED`, not proven-secure, until it withstands learned de-obfuscation.
|
||
- **Governance gap.** No claim on 802.11bf-2025 privacy provisions survived
|
||
verification; that pillar remains an open question, not an asserted fact.
|
||
|
||
The derived, prioritized improvement backlog lives in the SOTA-update file (§4).
|
||
|
||
## 3. What this explicitly is NOT
|
||
|
||
- **Not a radio driver.** No RF frontend, no transmit path, no
|
||
`wifi-densepose-hardware` coupling. VEIL cannot emit and cannot jam.
|
||
- **Not a defense against the associated AP.** That party holds the session key by
|
||
construction (threat class A3); protecting against a malicious AP is BFLD's
|
||
detection/privacy-class problem (ADR-118/141), not this shield's.
|
||
- **Not a full motion-obfuscation claim.** A fixed per-session rotation does not
|
||
hide coarse within-session motion; identity *re-ID* is the guaranteed target,
|
||
motion is partial/future work.
|
||
- **Not a real-hardware performance claim.** All defense numbers are SYNTHETIC/L0
|
||
until a two-node capture with a boot/runtime-log witness exists (CLAUDE.md
|
||
hardware rule; roadmap P5).
|
||
- **Not RF denial or camera-grade anything.**
|
||
|
||
## 4. Simplifications (honesty boundary)
|
||
|
||
- The two-subspace split is an abstraction; on real radios comm and identity
|
||
information are only *approximately* separable, so the real throughput cost of
|
||
fully hiding identity may exceed the model's ~2%. DySPAN-2026's MEASURED curve
|
||
bounds it as *small* at fine resolution, not zero.
|
||
- The attacker is nearest-centroid. The collapse argument is classifier-independent
|
||
(it is about the marginalized signal), but P2/P5 must confirm a learned attacker
|
||
also collapses.
|
||
- The crate's PRNG is SplitMix64 — deterministic and WASM-safe but **not
|
||
cryptographic**; a deployment derives the rotation key from the negotiated link
|
||
secret, never from this PRNG.
|
||
|
||
## 5. Consequences
|
||
|
||
- RuView gains the *countermeasure* half of its RF-privacy story: BFLD detects
|
||
leakage, VEIL acts on it — a defensible, standards-anchored, gap-filling
|
||
position (see `docs/research/privacy-shield/06-market-and-buyers.md`).
|
||
- The compliance audit gives regulators/auditors a machine-checkable "not jamming"
|
||
artifact that composes with ADR-141 attestation.
|
||
- Future integration (BFLD `identity_risk` → `SensingDetector`, ADR-280 governed
|
||
actuation, firmware feedback shaping, two-node hardware measurement) is staged in
|
||
the research bundle roadmap and deliberately deferred so the model validates in
|
||
isolation first.
|
||
|
||
## 6. Validation
|
||
|
||
```bash
|
||
cargo test -p wifi-densepose-privshield --no-default-features
|
||
cargo build -p wifi-densepose-privshield --target wasm32-unknown-unknown
|
||
cargo clippy -p wifi-densepose-privshield --all-targets
|
||
```
|