nRF52, Amiibo, Espruino, 电压毛刺攻击 与 Apple Find My

date
May 17, 2024
slug
nrf52-amiibo-voltage-glitch-and-apple-find-my
status
Published
tags
nRF52
Amiibo
Hardware
summary
前段时间随海运包裹买了一个 Amiloop, 拆开发现芯片是 nRF52832. 惊叹国产设备把成本压到极限, 一个17块钱的设备就能搞定蓝牙和NFC的功能. 进一步的探索发现很多有趣的事情, 这个小设备不仅可以模拟 Amiibo, 还可以烧录 Espruino 固件作为 传感器 / 蓝牙Beacon / 模拟 AirTag, 甚至可以通过 Apple Find My 网络进行离线数据上报.
type
Post
前段时间随海运包裹寄了一个 Amiloop 用来打塞尔达, 收到拆开发现芯片是 nRF52832. 震惊国产设备把成本压到极限, 一个17块钱的设备就能搞定蓝牙和NFC的功能.
进一步的探索发现很多有趣的事情, 这个小设备不仅可以模拟 Amiibo, 还可以烧录 Espruino 作为 传感器 / 蓝牙Beacon / 模拟 AirTag, 甚至可以通过 Apple Find My 网络进行离线数据上报.

模拟 Amiiibo

之前因为家人着迷于动物森友会, 经常要用 Amiibo 邀请小动物到岛上. 研究市面上的模拟 Amiibo 的方案, 大概包括以下几种.
  • NTAG 215 Amiibo 的本质是一个 NTAG 215 标签, 淘宝上很多印刷好的卡片可以直接用, 也有空白卡片可以使用手机 TagMo 写入数据, 成本大概0.5元/张. 缺点就是卡片只能写入一次, 需要管理一堆实体卡片.
  • NFC 协议 通过 NFC 模拟 Amiibo, 除了上面提到十几块钱的 Amiloop / AmiiboLink 之外还有几百元的 N2 Elite 和 PowerTag 等. 甚至还有使用 3DS 模拟的方案 HubSteven/3ds_ir. 基本逻辑就是通过电脑/手机连接设备, 写入需要的 Amiibo 数据, 通过 NFC 模拟收发数据. 这样可以做到无限刷写, 目前看来最好用的方案.
  • 蓝牙 协议 因为 Switch 的 NFC 模块是集成在手柄中的, 所以通过蓝牙模拟手柄冒充正常手柄发送 Amiibo 的数据. 包括使用树莓派模拟 Joy-Con 的 mart1nro/joycontrol, 但可惜因为开源协议的问题移除这部分支持#80, 使用需要自己revert代码. 同样还有使用ESP32 模拟手柄的 EasyMCU_ESP32, 固件代码没有开源. 作者有几篇关于 Joycon 模拟很好的文章 ESP32模拟JoyCon和Pro, 兼容AmiiboAmiibo Fake. 还有使用 Android手机 模拟蓝牙手柄的方案, 但是只能特定的机型才能实现. 这种方式缺点是操作有些麻烦, 因为每次用都要像连接手柄一样操作.

Espruino

在这篇帖子 AmiiboLink / AmiLoop 中发现 nRF52 可以刷 espruino.
与 Arduino 不同, 这个项目实现了一个js解释器, 用网页作为IDE Espruino.com IDE, 通过浏览器 Web Bluetooth 连接设备. 开发过程中甚至不需要插数据线, 整体门槛比 Arduino 还要低. 甚至有自己的”应用商店”. 其中有几个好玩的示例 通过检测电力表的led闪烁计算用电量 Smart Meter 和 模拟 AirTag 的 apps/openhaystack
AmiLoop 可以作为 Puck.js https://www.puck-js.com/ 使用烧录espruino固件. 根据 DanTheMan827 提供的 配置 , 使用 Github Action 可以方便的编译固件.
下面是我编译好的固件

固件备份与烧录

AmiLoop 和 AmiiboLink 硬件一致, 固件可以通刷, 但是控制切换 Amiibo的 App 不能通用.
目前原厂固件有 v3 v4两个版本, v4固件会启用 nRF 的芯片保护 APPPROTECT, 导致无法通过 swd 调试以及 dump 数据. 但是可以通过命令全擦除或者电压毛刺攻击来解除锁定.
https://imgur.com/a/amiloop-board-K8Wp6Rp
因为 bootloader 不兼容, 需要使用 SWD 烧录, DAPLink / CMSIS-DAP 配置文件如下
OpenOCD / telnet 备份/烧录/解锁的步骤如下

电压毛刺攻击 ( Voltage Glitch )

对于启用 APPPROTECT 后的 nRF52, 默认无法使用 SWD 进行调试或者 dump 数据. 而电压毛刺攻击是在恰好的时机改变芯片的供电, 使得芯片跳过一部分判断逻辑.
油管上 Joe Grand 的视频讲述了使用电压毛刺攻击冷钱包恢复价值 200万$ BTC 的故事. 中间有大Hacker 忘记接地的搞笑错误, 最后有老婆孩子为他的成功一起开心的庆祝. 想起来小时候老爹教我用电烙铁焊收音机, 小朋友有一个动手能力爆棚的老爹真的是件很幸福的事情.
Video preview
 
对于 nRF52 atc1441 提供了一个更廉价的方式 ESP32_nRF52_SWD, 仅使用 ESP32 和一个 MOS开关进行电压毛刺攻击, 甚至还有网页可以调整 glich 的时间间隔. 当然为了提高攻击成功率, 需要移除掉两个电容. 还记得小的时候玩红白机, 夏天傍晚电压低的时候, 游戏机出了错乱的马赛克, 误打误撞绕过了重装机兵里的一个关卡.
notion image

Apple Find My 和 OpenHaystack

前面提到 Espruino 可以模拟 AirTag, 使用 OpenHaystack 获取数据. 之前在海运包裹里放了国产平替的 AirTag AIYATO, 可以”实时”追踪包裹的位置. 平替的价格也是出奇的便宜, 只要20块钱. 当然因为没有超宽带技术, 没有办法精确定位. 对于钱包和宠物, 还是直接用 AirTag 比较好.

Find My 原理

OpenHaystack 项目中有关于 Find My 网络的工作流程: AirTag 广播公钥 → 附近的 iPhone 接收到广播 → iPhone 把 GPS 位置用公钥加密,以及公钥 HASH 上传到Apple服务器 → AirTag主人的手机使用私钥解密位置数据.
https://github.com/seemoo-lab/openhaystack
为了防止重放攻击和通过广播被追踪的问题, AirTag 会定时轮替公钥. 公钥轮替是与时间相关的, 设备掉电时钟丢失之后会使用 SECONDARY KEY, 当时钟同步之后会根据 PRIMARY KEY轮替. 实际测试 AirTag 也不会一直发送位置上报的广播, 只有离开主人一定时间后才会发送. 因为公钥轮替以及只会上传公钥的hash的数据, 所以除非 Apple 抛弃旧设备开发新协议, 否则很难屏蔽 OpenHeystack.

发送自定义数据

根据这套机制还可以发送自定义数据, 这样就可以在没有网络的地方放置一个感器发送数据. dakhnod/FakeTag 实现了一个信箱收信提醒的传感器.
https://github.com/dakhnod/FakeTag
positive-security/send-my 更粗暴/精妙, 直将 Apple 服务器作为存储, 发送端把数据的index和bit拼接成公钥, 接收端从服务器检查公钥的有无作为bit的0和1来接收消息.
https://positive.security/blog/send-my

读取数据

OpenHeystack 需要借助 Mail 插件向 Apple 服务器发送请求(与旧版 AltStore 类似), 而 Mail 插件在新版 macOS 中已经被弃用. 实测使用 malmeloo/FindMy.pyhajekj/OfflineFindRecovery 可以顺利从服务器获取到数据.
如果只是想获取 Find My 设备的位置记录可以直接使用 fjxmlzn/FindMyHistory 这个工具, 不过这个工具只能从本地读取新数据. 而从 Apple 服务器可以获取最近7天的记录.
需要注意的是, OpenHeystack 虽然使用 Apple Find My 网络, 但是设备不会出现在 Find My App 中. 你可以通过 Keychain 获取到自己绑定设备的私钥, FindMy.py/issues/4 记录了如何从 Keychain 中获取绑定设备的私钥, 以及轮替公钥的计算方式.

结尾

nRF52 功耗比 ESP32 要低一个数量级, 在电池供电的设备上优势明显.

© likaci 2013 - 2024