穿墙感知的伦理红线:当技术能“看见”隔壁,开源还该不该继续
穿墙感知的伦理红线:当技术能“看见”隔壁,开源还该不该继续
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
一台 9 美元的 ESP32,加上仓库里几千行 Rust,就能在不安装任何摄像头的前提下,判断隔壁房间有没有人、有几个人、呼吸频率是多少,甚至给出一个粗略的骨架姿态。这正是 RuView(WiFi DensePose)在中文技术社区被反复转述的形象——「隔墙观火」「路由器变雷达」「零隐私监控」。
而当“看见”这件事不再需要镜头、不再需要被感知者携带任何设备、甚至不再需要对方知情时,争论就不再是技术问题。真正值得回答的是三个更硬的问题:它到底能看到什么精度?这些数据在法律上算什么?一个以 MIT/Apache-2.0 发布的开源项目,还能用什么手段约束自己的用途?
本文不谈愿景,只对照仓库里的代码、ADR 和证据等级,把这三件事拆开。
一、能力边界:穿墙拿到的不是“画面”,而是极低带宽的统计量
社区传播中最容易失真的部分,是把 WiFi 感知类比成“没有镜头的摄像头”。这句话在物理上是错的。WiFi 感知的输入是信道状态信息(CSI):每个子载波上的幅度与相位,被人体反射、散射、遮挡后产生的扰动。它没有成像平面,只有多径信道的时变统计。
仓库对这条边界的表述相对克制。README 的能力表把穿墙感知标为:
🧱 Through-wall sensing | Fresnel-zone geometry + multipath modeling | Up to ~5 m, signal-dependent
即“最远约 5 米,且高度依赖信号条件”。这个数字背后是菲涅尔区几何:人体要落在收发链路的有效菲涅尔区内,扰动才能被解析出来;穿过承重墙后信噪比骤降,多径混叠加剧,能恢复的信息量随距离迅速塌缩。同一位 README 还给出了横向容量的物理上限——每个 AP 约区分 3–5 人(56 子载波),多 AP 线性叠加,而不是无限扩展。
姿态这条线更能说明“能力边界”意味着什么。仓库把模型分成三类,并且明确写在 README 的「Model weights: what's real, what's not」一节:
| 能力 | 真实状态 | 仓库给出的数字 |
|---|---|---|
在-device 姿态模型pose_v1.safetensors | 首版、弱 | PCK@20 = 3.0%,PCK@50 = 18.5%,低于 ADR-079 的 ≥35% 目标 |
| MM-Fi 公开基准姿态模型 | 已发布、可复现 | torso-PCK@20 = 82.69%(ensemble 83.59%) |
| 存在检测头 | 已发布 | 82.3% held-out temporal-triplet 准确率 |
注意第三行后面那句括号:早期的“100% presence”是在单类别录音上测的,已被撤回。这条撤回记录写在 README.md 与 PROOF.md 里,而不是被悄悄改掉。
所以“穿墙能拿到什么级别的人体信息”,诚实的回答是分层的:
- 房间级:有人/无人、人数(启发式,非验证过的多人估计器)、活动强度;
- 生命体征级:呼吸 6–30 BPM、心率 40–120 BPM,靠 0.1–0.5 Hz / 0.8–2.0 Hz 带通加过零计数,且在单人居、通过质量门时才发布;
- 姿态级:17 关键点,但在设备端模型上目前只是“学到了粗结构”,远端关节接近随机;
- 身份级:这是唯一一条被项目用测试明确否定的能力,下一节展开。
换句话说,穿墙能稳定拿到的是“这间屋子里有生命活动”的低带宽证据。它足以支撑照明、HVAC、跌倒告警、灾害搜救这类判断,但不足以还原“他在做什么动作”的高保真描述——后者正是舆论最容易夸大的部分。
二、真正的红线不在“看见动作”,而在“认出是谁”
如果只停留在人数与呼吸,WiFi 感知的伦理争议大致等同于一个更灵敏的 PIR 传感器。让它跨过红线的,是身份可链接性:同一套信号,能不能在不同时间、不同地点,指向同一个具体的人。
这条线上有三层证据,值得分开看。
第一层,学术界已经证明攻击可行。仓库的隐私防护研究包 docs/research/privacy-shield/01-sota-survey.md 汇总了三条 MEASURED 结论:BFId(KIT,ACM CCS 2025)仅凭波束成形反馈(BFI)即可重识别个体;LeakyBeam(NDSS 2025)在 20 米、穿墙条件下用明文 BFI 做占用检测,TPR 82.7% / TNR 96.7%;BeamSense 用商品 802.11ac 设备做活动识别,最高 99.28%。
关键的制度事实是:BFI 在管理面明文传输,任何处于监听模式的设备都能一次性抓到所有 station 的反馈,无需接入网络,被感知者也不携带任何设备。而 IEEE 802.11bf-2025 把这套测量/反馈面标准化了,2023 年提出的一项 BFI 安全传输机制(802.11-23/0782)被撤回,标准最终没有附带隐私保护。
第二层,项目自己试图做“身份”,然后被自己的测试否掉了。RuView 有一条名为 Soul Signature 的研究线(docs/research/soul/),用七路电磁观测量融合成一个身份向量。它的进展不是“成功了”,而是被量化地证伪了一半——PROOF.md 里这条断言是 MEASURED 级别:
在仅使用心跳 + 呼吸信道的条件下,两个人不可分(gap ≈ 0.0005)。测试名:
cardiac_alone_cannot_separate_identity_matches_audit。
同时v2/crates/wifi-densepose-bfld/src/lib.rs的模块注释也把结论写死在文档里:命名身份(named identity)仍然是>pub trait LocalSink: Sink {} // MIN_CLASS = Raw(0) 接受 0,1,2,3 pub trait NetworkSink: Sink {} // MIN_CLASS = Derived(1) 拒绝 0 pub trait MatterSink: NetworkSink {} // MIN_CLASS = Anonymous(2) 拒绝 0,1
运行时由check_class::<S>()兜底,任何试图把 class 0(原始 BFI 矩阵)发到网络 sink 的调用都会拿到BfldError::PrivacyViolation。而 MQTT 路由层又独立做了一次过滤:render_events在class_byte < Anonymous时直接返回空 vec,identity_risk只在恰好class 2 时发布,class 3 内部算但不发(v2/crates/wifi-densepose-bfld/src/mqtt_topics.rs)。两层而不是一层,是因为“策略散落在多处”恰恰是事故的温床。
2)用类型系统禁掉序列化。身份嵌入是最敏感的对象。v2/crates/wifi-densepose-bfld/src/embedding.rs 的做法是:IdentityEmbedding不实现Serialize、不实现Clone、不实现Copy,用static_assertions的assert_not_impl_any!把这些缺失变成会被 CI 检出的断言;Drop时用 0.0 覆写缓冲,Debug只输出 L2 范数与长度。文件头的注释把话说得很直白:这样未来某个 PR 就无法“顺手”给它加一个 derive 把数据漏出去。
3)隐私降级是单向的。PrivacyGate::demote()只允许 class 数值增大(信息量减少),且没有promote。理由写在 privacy_gate.rs 的模块文档里:一旦某段 payload 被 zeroize,原始字节就不可恢复——所以“提升”在语义上不可能实现。demote内部用black_box护住清零循环,防止死存储消除把安全操作优化掉。
4)跨站点关联在密码学上不可能,而不是“被禁止”。签名哈希用 BLAKE3 的 keyed 模式:v2/crates/wifi-densepose-bfld/src/signature_hasher.rs 里rf_signature_hash = BLAKE3-keyed(site_salt, day_epoch ‖ features),site_salt是每节点 32 字节随机密钥、永不外传,day_epoch = unix_secs / 86400每天翻转。结果是:同一人在 A 栋与 B 栋产生不相关哈希,任何人(包括运营方、包括攻破单个节点的攻击者)都没有可用的密钥去桥接两个站点。ADR-120 对此的措辞是“比策略式的‘不要共享’更强,因为桥接算不出来”。
5)策略本身可被审计。命名模式与动作之上还有一条 BLAKE3 哈希链:privacy_mode.rs 中的PrivacyAttestationProof把(prev_hash ‖ mode ‖ action_bits ‖ class)串成链,每次模式切换追加一笔。这意味着“这台设备过去三天到底跑在哪个隐私等级”是可验证的,而不是只能听运维口述。
除此之外,还有一条容易被忽视的“负向治理”:把没做到的事写进仓库。PROOF.md 把每条主张分成MEASURED(本机可复现)、CLAIMED(有出处但未在本仓库复现)、DATA-GATED / HARDWARE-GATED,并专门列出一节 “What we do NOT claim”,其中包括命名身份未达成、Edge skill 的癫痫/武器/情绪检测精度 UNVALIDATED、802.11bf OTA 一致性无商用芯片可测。docs/adr/ADR-160-edge-skill-library-honest-labeling.md 记录了一次具体的纠偏:五个med_*模块把临床检测写成了既成事实,处理方式不是“把能力做出来”,而是“把标签改成真的”——加免责声明、软化命名、加 feature gate,并配一条测试a1_med_modules_have_clinical_disclaimer让声明本身也受 CI 保护。
这套东西不能阻止恶意者 fork 后去掉所有 gate。但它改变了一件更重要的事:默认值。默认部署是 class 2(匿名,只发聚合感知),默认 MQTT 不出 class < 2 的帧,默认--privacy-mode会把心率、呼吸率、姿态从 REST、MQTT、Matter、WebSocket 与录制中一并剥离(姿态端点直接返回403,code: "privacy_mode"),默认/api/field只放行 P1/P2 事件、P0 与 P3–P5 永远留在边缘。绝大多数部署不会改默认值——这就是工程治理真正起作用的地方。
五、对手侧的防护:把“不干扰”做成可机器验证的性质
前面所有机制防的都是“自己的数据外泄”。但 WiFi 感知的伦理问题有一半在对面:别人拿被动嗅探器监听你的房间,你怎么办?
RuView 生态里对应的是 WiFi Veil(wifi-veil/README.md),一个独立的隐私防火墙 crate。它的思路建立在一个可分离性观察上:压缩波束成形报告里,主波束方向承载吞吐,细粒度的跨子载波相位结构承载身份。二者(大体)落在可分离的子空间里,所以对细子空间施加一个每会话新鲜、由密钥派生的正交旋转(复用报告本身就在用的 Givens 旋转原语),就能破坏跨会话的身份链接,而合法接收方用共享密钥瞬间逆变换、链路几乎不受影响。
关键的工程细节是合规性怎么被“证明”。wifi-veil/src/compliance.rs 把“这不是干扰”从承诺变成了一条被检查的属性:
input_energy = ‖report_before‖² output_energy = ‖report_after‖² energy_ratio = output_energy / input_energy # 正交变换 ≈ 1.0 is_compliant = energy_conserving ∧ ¬adds_interfering_energy因为变换是正交的,能量严格守恒(参考实验中比值 1.000000),不向任何他人的信号之上叠加能量——按 47 U.S.C. §333 / §302a 的定义,这不构成干扰。这个区分不是文字游戏:干扰(jamming)在法律上以“意图 + 对第三方链路的实际影响”为构成要件,而 VEIL 只整形自己的、符合标准的发射。研究文档 docs/research/privacy-shield/02-threat-model.md 甚至显式列出了它不做的事:不隐藏对已关联 AP 的身份、不是射频压制、不能单独击败会话内动作检测、未经硬件验证。
参考实验的账面数字是:被动重识别从 100% 掉到 4.7%(随机基线 6.25%),链路吞吐保留 97.6%。但必须带上那个标签——全部为 SYNTHETIC / L0,由 crate 自己的模型生成、自己的分类器攻击、自己的标签打分,cargo test可复现,尚未在任何真实射频上测量。ADR-288 与 wifi-veil/CONTRIBUTING.md 把这条纪律写成不可协商的规则:任何数字必须标注SYNTHETIC/CLAIMED/MEASURED,没有真实硬件日志就不许升格。
这张控制台截图里的环形散点,正好可视化了“身份塌缩”:防护关闭时同一人的多次采集会聚成一簇,防护开启后每会话旋转不同,聚类退化为随机分布。它还标了PROTECTED状态与AUTO/ON/OFF切换——把“防偷窥”做成一个可以随时关掉、也可以自动触发的开关,本身就是一种产品层面的伦理表态。
六、给开发者的四条自律建议
把上面的机制抽象出来,任何做环境感知(WiFi、UWB、毫米波、甚至纯视觉)的团队都能直接抄。每条都对应仓库里一处可查的实现。
第一条:先定义“谁不在房间里”。隐私设计的第一性问题不是“用户同不同意”,而是“非用户怎么办”。室友、访客、护工、隔壁的住户,他们没有安装你的设备,也没有签署任何东西。RuView 的答案是双 ID 空间:默认 class 2 下,未注册的路人只有一个每天翻转的rf_signature_hash,无法跨天、跨站点关联;只有显式进入CareWithConsent模式,才允许产生长生命周期的person_id。默认值应该保护那个没有发言权的人。
第二条:不要把隐私写成文档,写进类型与门。“我们不会上传原始数据”是一句话,NetworkSink::MIN_CLASS = Derived是一条编译期 + 运行时的门。前者会随人员流动失效,后者会在 CI 里失败。同理,失败要 fail-closed:ADR-346 记录了一次真实事故——四个节点的固件在presence=false时仍然报出n_persons=3,修法不是“调阈值”,而是规定 presence 为假时人数必须清零,服务端对旧固件重复同一不变式并附上person_count_valid=false。互相矛盾的证据比缺失的证据更危险,因为它会污染空房基线与训练标签。
第三条:把“没做到”留在仓库里,并且让它可执行。三级证据标签(MEASURED / CLAIMED / GATED)+ 一份公开的撤回记录,是抵抗“AI slop”指控最有效的东西。docs/proof-of-capabilities.md 甚至逐条复述了外界最尖锐的批评——“AI 生成的门面”“假 CSI 数据”“没有训练好的模型却编造指标”——然后区分哪些批评成立、哪些属于把模拟模式误判为造假。一个项目愿意把自己的失败也提交进 git,比任何宣传都更能建立信任。更进一步,让免责声明本身带上测试:a1_med_modules_have_clinical_disclaimer保证没人能在后续重构中悄悄删掉那句“not a medical device”。
第四条:明确写下“我们永远不做”,并且给出决策矩阵。伦理声明如果只是“我们向善”,等于没说。有说服力的是可执行的能力清单。docs/adr/ADR-091-stand-off-radar-tier-research.md 给出一张 Build / Research / Skip 矩阵:77 GHz 商用低功率已有覆盖;77 GHz 超 §95.M 上限永久跳过(无法作为开源固件发布,个人实验许可不可转授);140 GHz 相干只做仿真器、不做固件(ECCN 6A008 风险真实存在);220/380 GHz 硬件永久跳过。同一份文档把“不做定向追踪/目标获取”写成项目线的一部分,并承认这些研究本身就在把开源生态推向更接近监控能力的方向。
这份矩阵的价值在于它大部分结论是“不做”。一个项目的伦理可信度,往往不取决于它做了什么,而取决于它在有能力做的时候明确拒绝了什么。
结语:该不该继续,取决于默认值与证据,而不是代码是否存在
回到标题的问题。穿墙感知的物理不会因为不开源而消失:BFI 明文传输是标准层面的事实,802.11bf-2025 已把测量面标准化且未附隐私保护,被动嗅探器不可探测。把代码藏起来,只会让能力集中在少数不公开讨论伦理的人手里。
真正决定风险高低的,是三个可以被工程化的变量:
- 默认值:默认发聚合还是发原始?默认匿名还是默认具名?默认本地还是默认上云?
- 证据等级:每个数字能不能被第三方在自己的机器上复现?失败与撤回有没有被记录?
- 拒绝清单:有没有明确写下“即使能做也不做”,并且用构建系统的 feature gate、导出管制评估、能力矩阵把它钉住?
RuView 在这三件事上并不完美——它的 README 一边说“无摄像头所以绕开 GDPR/HIPAA 影像规则”,一边在集成文档里承认“不构成任何合规认证”,这种表述张力本身就该被批评。但它至少提供了罕见的样本:把身份识别能力用测试证伪、把隐私等级做成类型系统、把“不构成干扰”做成能量守恒断言、把没做到的事列成表格,还把“永久跳过”的雷达频段写进 ADR。
开源的伦理不在于发布与否,而在于发布时把边界一起发布。当一项技术能“看见”隔壁,唯一负责任的做法不是关灯,而是把灯的开关、亮度上限和“这盏灯照不到哪里”的说明书,一起放进仓库。
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考