# 对抗性独立验证报告 **验证者**:verifier(task-4) **时间**:2026-10-07 17:35 起 **验证对象**:commit `facb156` + 工作区未提交改动 **方法**:全部结论都由**自己动手打真接口/跑真代码**得出,不复述任何人的自述。 每个发现都附可复现命令。额外做了**变异测试**来验证测试本身可不可信。 --- ## 零、结论速览 | # | 严重度 | 问题 | 状态 | |---|---|---|---| | 1 | 🔴 **严重** | TTL 清理 + 关掉「允许新设备接入」= 设备**永久锁死**,重启也救不回来 | 已复现 | | 2 | 🔴 **高** | 管理页 JS 语法错误 → 整段 script 不执行 → **所有按钮失效** | 已复现 | | 3 | 🔴 **高** | `--relay` / `--relay-status` 命令行**崩溃 / 永远报失败** | 已复现 | | 4 | 🟡 中 | `deploy.sh --prefix` **沙箱泄漏**,会动真实系统(含重启线上服务) | 已取证 | | 5 | 🟡 中 | `test_net_tune.py` 断言**过时**,和实现故意反转的决策矛盾,永久假失败 | 已确认 | | 6 | 🟡 中 | `test_admin_device_control.py` 的注释描述了它**并不验证**的规则(变异测试证明) | 已证明 | | 7 | 🟢 低 | `deviceId` 接受控制字符(`\x00`、`\r\n`),可伪造日志行 | 已确认 | | 8 | 🟢 低 | `enable_relay()` 第二次调用返回 `True` 谎报成功(当前无调用方触发,潜伏) | 已确认 | | 9 | ⚪ 提示 | 打包 EXE 过期(16:17 构建,源文件 17:10~17:42 有改动),e2e 失败是这个原因 | 已确认 | **验证过但没问题的攻击面**:见第四节。 --- ## 一、🔴 严重:TTL 清理 + 开关 = 设备永久锁死 ### 复现 ```bash python _tests/test_verify_ttl_lockout.py ``` ### 证据 ``` ═══ 复现:管理员关掉「允许新设备接入」,电脑隔夜再开机 ═══ [PASS] ① 电脑首次登记成功 [PASS] ② 管理员关掉「允许新设备接入」 [PASS] ③ 电脑当场重连仍然可以(开关只挡新设备) … 电脑关机了。等 4 秒模拟"隔夜"(真实是 6 小时) [PASS] ④ 中转把超时设备清掉了(设计中如此) 磁盘 relay_state.json 里还有这台设备的码绑定: True 内存里 codeCount=0 [FAIL] ⑤ 电脑第二天开机 —— 应该能连上 —— {'ok': False, 'blocked': True, 'error': '中转站当前不接受新设备接入'} ═══ 追问:重启中转能不能救回来? ═══ 重启后磁盘里这台设备的码绑定: True 重启后内存 codeCount=0 [FAIL] ⑥ 重启中转后电脑能连上 —— {'ok': False, 'blocked': True, ...} ``` ### 机制 三处代码叠加: 1. `relay.py:479` —— 判断"是不是老设备"用的是**活跃设备表**: ```python known_device = device_id in self.devices ``` 2. `relay.py:765-786` —— `snapshot()` 把超过 `DEVICE_TTL`(6 小时)的设备 从 `self.devices` **和** `self.codes` 里一起删掉。 3. 于是设备回来时 `known_device = False`,撞上 `relay.py:480`: ```python if not known_device and not self.allow_new: return {"ok": False, "blocked": True, ...} ``` **为什么重启也救不回来(关键)**: `snapshot()` 清 `codes` 时**没有调 `_save()`**,所以磁盘上还留着绑定。 重启后 `_load()` 把 `codes` 恢复了 —— 但紧接着第一次 `snapshot()` 又把它 当孤儿清掉(owner 不在 `devices` 里)。**自己把自己 perpetuat 住了。** ### 影响 * 触发条件**极常见**:用户下班关机、第二天开机,间隔必然超过 6 小时。 * **永久性**:不重启中转、不换 deviceId 都绕不过去。唯一的出路是 管理员**全局重新打开开关**。 * **最糟的是管理员不知道要放开谁** —— 那台设备已经被清出管理页列表了, 页面上根本看不到它。 ### 建议修法 判断依据要和"码绑定"解耦,且不能被超时清理抹掉。可选: * **方案 A(推荐)**:`register()` 里把"是否老设备"改成 ```python known_device = (device_id in self.devices or device_id in self.codes.values()) ``` —— `codes` 里的绑定同样被清的话不解决问题,所以要配合方案 B。 * **方案 B(推荐)**:`relay_state.json` 里**单独存一份"曾经登记过的 deviceId"** (`knownDevices`),**超时清理时不动它**。这才是"已登记过"的准确语义 —— 它讲的是"历史上被允许过",不是"此刻在线"。 * 无论选哪个,`snapshot()` 清 `codes` 后**应该调 `_save()`**, 否则磁盘和内存会长期不一致。 --- ## 二、🔴 高:管理页 JS 语法错误 → 所有按钮失效 ### 复现 ```bash python _tests/test_admin_js.py # 官方 3d 阶段,会 FAIL python _tests/test_verify_js_syntax.py # 我写的精确取证 ``` ### 证据 渲染出来的 `