AegisCabinet-Zero开发记录

Heart Lv462

这次物联网技术与安全的大作业,我最后做的是 AegisCabinet-Zero,一套校园智能外卖柜的攻防仿真。选外卖柜主要是因为这个场景离学校生活很近,取件码、柜门、边缘设备和后台服务刚好能串起一条完整链路,不用为了讲安全问题硬造一个很远的背景。

项目地址:AegisCabinet-Zero

最开始的想法其实很普通:做一个 4×4 的柜子矩阵,输入正确取件码就开门,再加几个攻击按钮展示风险。真开始写以后发现,如果攻击只负责弹一句“攻击成功”,防护只负责弹一句“已拦截”,那整个东西还是一张会动的 PPT。后面我给自己定的要求是,每次攻击都得有输入、有报文、有校验过程,最后还要真的改变格口状态、风险分数和审计日志,这才慢慢变成现在这套系统。

整个项目最后保留了普通外卖柜和零知识功能外卖柜两条流程。它们共用同一个格口、同一组演示取件码和同一套攻击入口,切换模式以后再做同一个实验,差别会直接落在报文和结果上。普通柜会把明文取件码送进比较函数,零知识柜则只提交公开的证明数据。这样做比单独摆两张流程图直观很多,尤其是时间侧信道和重放攻击,只有把两边的输入放在一起看,防护到底挡住了什么才说得清。

认证部分用了一个教学规模的 Schnorr 零知识证明。终端根据格口和取件码派生私钥 x,后台只保存对应公钥 y = g^x。每次认证重新生成随机数 r 和承诺 X = g^r,收到挑战 c 后计算响应 s = r + cx mod q,后台检查 g^s 是否等于 X × y^c。这块第一次写通的时候只是“等式能对上”,后面才补了 nonce、时间戳、格口绑定和证明摘要缓存。否则一段数学上成立的旧证明,放回系统里照样可能被重复利用。

这里还有一个容易讲过头的地方:项目里的群参数很小,只是为了让课堂上能看到完整计算过程,不是生产级密码参数。我没有把它包装成可以直接部署的方案,页面底部也明确写了真实系统应该换成熟曲线、密码库、硬件密钥保护和 TLS。仿真能说明认证资产为什么不必包含明文,但不能因为页面上出现了“零知识”三个字,就把真实工程里剩下的密钥管理和设备身份问题全部省掉。

时间侧信道是我前后改得最多的一段。普通模式故意保留逐位比较,前缀每多匹配一位就增加一点处理时间,攻击端对每个候选数字重复采样,再按平均时延挑出下一位。刚开始单次测量抖得很厉害,有时候明明逻辑没错,曲线却看不出规律,后来加了重复测量、最小值和最大值记录,也把匹配前缀单独画出来,才让演示稳定下来。切到零知识模式后,攻击端拿不到明文逐位比较接口,普通字符串比较也改成常量时间方式,曲线会接近水平,日志里会标出攻击停在了哪一层,而不是笼统地说“安全”。

重放攻击一开始只做了时间戳过期,写完以后自己试了一下,发现这个解释太单薄。旧报文除了过期,还可能拿去开另一个格口,也可能在时间窗内连续发送,所以后面把检查拆成了时间窗、nonce、摘要缓存、设备编号和目标格口绑定几步。普通柜允许展示同柜旧报文缺少防重放时会发生什么,但跨柜报文不能为了演示效果就让 A1 的请求打开 A4,这条边界我专门收紧了。现在页面会把攻击报文和当前正确报文并排放出来,哪一个字段不同、在哪一步拒绝都能直接看到。

固件溢出部分没有去伪造一个真正的二进制漏洞,而是定义了一套简单报文:magic、版本、声明长度、payload、Stack Canary 和 CRC。普通模式跳过关键检查,超长 payload 会继续进入处理流程;安全模式先看长度,再检查 Canary 和 CRC,只要守护字节被覆盖就让目标格口进入安全自锁。这个模拟当然代替不了真实 C 固件里的栈溢出利用,但它至少把“载荷进入设备以后发生了什么”讲完整了,也能和前面的认证攻击区分开,不至于所有安全问题最后都变成一个错误弹窗。

界面用 Streamlit 做,主要原因是 Python 里的协议和攻击逻辑写完就能直接接到页面上,不需要再维护一套前后端通信。代价也很明显,Streamlit 每次交互都会重新执行脚本,柜门状态、攻击样本、已使用证明和审计记录如果没放进 session_state,点一下按钮就会丢。后面我把会话记录做成不可变数据类,把日志和采样放进有长度上限的 deque,重放摘要单独用集合保存,所有按钮只改状态,渲染函数再统一读取。代码最后虽然还是一个三千多行的单文件,但状态从哪里来、一次攻击会改哪些东西已经比最初清楚很多。

视觉上我一开始只做了 16 个方块,后来才补成数字孪生格口:青色是锁定,绿色是验证通过,红色是攻击后的自锁,旁边再放信道熵值、业务正确率、防护拦截率和风险分数。真正让页面有用的不是这些颜色,而是下面四个透明面板。时延采样、重放报文、固件 payload 和步骤日志都能展开看,最上面的结果和最下面的证据能对得上。做报告截图的时候也省了很多解释,不需要另外画一套和程序无关的示意图。

做到最后我最满意的不是某一个攻击按钮,而是正常取件、攻击、格口状态和审计记录终于连成了一个闭环。输错码只是拒绝,正确证明会开门,攻击被识别后会自锁,手动关闭柜门又能回到初始状态。这个区别看起来很细,但它让系统不再是三个互不相干的小实验。

项目目前仍然是纯软件仿真,没有真实电控锁、传感器和消息总线,Schnorr 参数、时延和固件内存也都是为了教学做的可观察模型。如果以后继续往下做,我更想接一个 ESP32 或树莓派,把柜门状态、固件签名验证和后台审计真正跑在设备链路上。现在这个版本先把问题讲清楚:物联网安全不是给登录接口换一种算法,而是认证、报文、设备固件和异常处置必须一起闭环。

  • Title: AegisCabinet-Zero开发记录
  • Author: Heart
  • Created at : 2026-07-15 21:30:00
  • Updated at : 2026-07-15 21:31:38
  • Link: https://yhalo-wyh.github.io/2026/07/15/AegisCabinet-Zero开发记录/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
AegisCabinet-Zero开发记录