redragonx/open-rnet

GitHub: redragonx/open-rnet

逆向工程电动轮椅R-Net CAN总线协议的完整研究项目,揭示安全漏洞并为残障用户提供替代控制方案。

Stars: 13 | Forks: 6

# Open R-Net [![DEFCON24](https://img.shields.io/badge/DEFCON-24-red.svg)](https://www.defcon.org/) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE) [![Discord](https://img.shields.io/badge/Discord-Join%20Server-5865F2.svg?logo=discord&logoColor=white)](https://discord.gg/mYqJSS5) ![Open R-Net - Wheelchair CAN Bus Hacking](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/60909ec4bb091030.png) **逆向工程 R-Net CAN 总线协议以提升电动轮椅的可访问性** *最初由 Stephen Chavez 和 Specter 于 2016 年 8 月在 DEFCON24 上发布* ## 这是什么? 本项目记录了用于 Permobil、Quickie 等公司制造的电动轮椅中的 R-Net CAN 总线协议,这些轮椅使用了 PG Drives Technology(现为 Curtiss-Wright)的电子设备。 **目标:** 为无法使用标准操纵杆的轮椅用户启用替代控制方法——包括 USB 操纵杆、Xbox 控制器、吸气/吹气(Sip-and-Puff)设备以及基于网络的控制。 ## 快速开始 ``` # Clone repository git clone https://github.com/redragonx/open-rnet.git cd open-rnet # 设置 CAN interface(Raspberry Pi + PiCAN2) sudo ip link set can0 up type can bitrate 125000 # Monitor bus candump can0 -L # 运行 joystick control(FollowJSM 方法) python3 contrib/can2RNET/JoyLocal.py ``` 有关完整的硬件设置说明,请参阅 **[入门指南](docs/GETTING_STARTED.md)**。 ## 文档 ### 协议 | 文档 | 描述 | |----------|-------------| | **[协议规范](docs/RNET_PROTOCOL_SPECIFICATION.md)** | 完整的逆向工程 R-Net 规范 | | **[协议指南](docs/RNET_PROTOCOL_GUIDE.md)** | 协议概述与快速参考 | | **[帧字典](reference/RNET_FRAME_DICTIONARY.md)** | 完整的帧参考(590+ 条目) | | **[快速参考](docs/QUICK_REFERENCE.md)** | 常见 CAN 操作速查表 | ### 设备协议 | 文档 | 描述 | |----------|-------------| | **[R-Net Programmer 协议](docs/RNET_PROGRAMMER_PROTOCOL.md)** | 读写设备配置内存 | | **[cJSM 显示协议](docs/CJSM_DISPLAY_PROTOCOL.md)** | 彩色 JSM 显示屏文本与模式配置 | | **[串行认证](docs/SERIAL_NUMBERS.md)** | 基于 XOR 的序列号挑战/响应 | | **[设备序列号](docs/DEVICE_SERIALS.md)** | 已知设备序列号及网络映射 | ### 安全与诊断 | 文档 | 描述 | |----------|-------------| | **[错误代码](docs/RNET_ERROR_CODES.md)** | 错误代码定义与处理 | | **[ESP 协议](docs/ESP_PROTOCOL.md)** | 电子稳定程序(ESP)协议 | | **[安全限制](docs/SAFETY_RESTRICTIONS.md)** | 安全限制与锁定行为 | | **[ICS 座椅系统](docs/ICS_SEATING_SYSTEM.md)** | ICS 座椅系统文档 | ### 固件与配置 | 文档 | 描述 | |----------|-------------| | **[固件分析](docs/FIRMWARE_DUMP_ANALYSIS.md)** | BTMouse 和 LEDJSM 固件转储分析 | | **[固件逆向工程](docs/FIRMWARE_REVERSE_ENGINEERING.md)** | HCS08 微控制器代码分析 | | **[OBP 启用指南](docs/OBP_ENABLE_GUIDE.md)** | 如何启用 On-Board Programming 模式 | | **[配置文件格式](docs/RNET_CONFIG_FILE_FORMAT.md)** | R-Net Programmer 的 .R-net 二进制文件格式 | | **[LEDJSM 配置分析](docs/LEDJSM_CONFIG_ANALYSIS.txt)** | 详细的配置结构分析 | ### 入门 | 文档 | 描述 | |----------|-------------| | **[入门指南](docs/GETTING_STARTED.md)** | 硬件设置与初始步骤 | | **[技术参考](CLAUDE.md)** | 综合技术笔记、算法和协议细节 | ## 主要特性 - **完整的协议规范** - 完整的逆向工程 R-Net CAN 总线协议 - **Python 库** - 用于 SocketCAN 通信的 `can2RNET.py` - **控制脚本** - 支持 USB 操纵杆和 Xbox 控制器 - **协议工具** - 帧解码器、认证生成器、抓包分析器 - **R-Net Programmer 工具** - 读写设备配置内存 - **配置解析器** - 解析和比较 .R-net 配置文件 - **固件分析** - HCS08 固件转储与逆向工程 - **27+ 数据包捕获** - 用于协议分析的 PCAP 文件 - **25 个配置文件** - 来自多款轮椅型号的真实 .R-net 配置 - **三种控制方法** - FollowJSM、JSMerror、EmulateJSM ## 硬件要求 **方案一:Raspberry Pi + PiCAN2**(约 115 美元) - Raspberry Pi 3/4 - PiCAN2 HAT with SMPS - R-Net 4 针连接器 **方案二:Arduino + CAN Shield**(约 75 美元) - Arduino UNO - SparkFun CAN-BUS Shield - R-Net 4 针连接器 ## R-Net 连接器引脚定义 ``` +---------+ | 1 | 2 | 1: CAN Lo |----+----| 2: CAN Hi | 3 | 4 | 3: +24VDC +---------+ 4: GND ``` ## 协议概述 R-Net 使用 **CAN 2.0B 协议,波特率为 125Kbps**,其特性包括: - 用于控制和模式选择的标准帧(11 位) - 用于数据和配置的扩展帧(29 位) - 基于 XOR 的串行认证(安全性较弱) - 10ms 的操纵杆帧定时 ``` +---------------------------------------------+ | R-Net Protocol Stack | +---------------------------------------------+ | Layer 4: Joystick, Speed, Parameters, Tones | | Layer 3: Serial Auth, Device Slot Assignment | | Layer 2: Standard (11-bit) / Extended (29-bit) Frames | | Layer 1: CAN 2.0B @ 125Kbps | +---------------------------------------------+ ``` ## 控制方法 | 方法 | 描述 | 优点 | 缺点 | |--------|-------------|------|------| | **FollowJSM** | 紧随 JSM 之后发送帧 | JSM 仍可正常工作 | 对时序要求极高 | | **JSMerror** | 触发 JSM 错误,接管控制 | 可靠性高 | 会禁用 JSM | | **EmulateJSM** | 伪造完整的 JSM 启动过程 | 无需 JSM | 需要已知序列号 | ## 实用脚本 ``` # Self-program 你的 chair(交互式) python3 tools/rnet_self_program.py # 启用 OBP 模式(引导式,安全 — 先备份) python3 tools/rnet_obp_mode.py --enable # 读取 OBP parameters python3 tools/rnet_obp_mode.py --read 0x06 0x01 # Forward Speed # Decode R-Net frames python3 tools/rnet_utils.py decode-frame 02000100#0064 # 底层 memory read/write(POP dongle 协议) python3 tools/rnet_programmer.py read 0x0000 0x100 -o dump.bin # Parse .R-net 配置文件 python3 tools/rnet_config_parser.py config.R-net --json ``` ## 项目结构 ``` open-rnet/ +-- tools/ # User-facing Python tools | +-- rnet_self_program.py # Self-programming tool (start here) | +-- rnet_programmer.py # Low-level POP protocol read/write | +-- rnet_obp_mode.py # OBP (On-Board Programming) mode tool | +-- rnet_pop_shell.py # Interactive POP protocol shell | +-- rnet_utils.py # Protocol analysis utility | +-- rnet_config_parser.py # .R-net config file parser +-- lib/ # Core CAN library | +-- can2RNET.py # SocketCAN interface functions +-- docs/ # Protocol documentation (18 files) | +-- PROGRAMMER_TOOLS_GUIDE.md # How to use the tools | +-- RNET_PROTOCOL_SPECIFICATION.md | +-- POP_PROTOCOL.md # POP protocol from DLL RE | +-- RNET_DEVICE_CATALOG.md # All device types and params | +-- ... +-- hardware/ # Firmware and setup scripts | +-- arduino_slcan/ # SLCAN firmware for Arduino | +-- scripts/ # CAN interface shell scripts +-- captures/ # 27+ R-Net packet captures +-- configs/ # Chair configuration data | +-- raw/ # .R-net files (7 chair models, 25 files) | +-- parsed/ # Extracted settings (JSON, CSV) +-- analysis/ # Reverse engineering tools | +-- firmware/ # Firmware analysis scripts | +-- protocol/ # Protocol analysis scripts +-- reference/ # Frame dictionary and references | +-- RNET_FRAME_DICTIONARY.md # 590+ frame entries +-- contrib/ # Upstream code | +-- can2RNET/ # Upstream redragonx/can2rNET +-- CLAUDE.md # Technical reference +-- LICENSE # GPLv3 ``` ## 安全警告 **电动轮椅是至关重要的医疗设备。** - 务必配备物理紧急停止开关 - 测试期间请将轮椅悬空(车轮离地) - 需有专人在旁监护 - 实施软件安全限制 - 在实际应用前进行彻底测试 ## 研究发现 ### 安全漏洞 - 所有 CAN 通信均无加密 - 基于 XOR 的认证(RTR 帧中的挑战值被忽略) - 可进行基于时序的帧欺骗 - 错误注入可实现完全控制接管 - XOR 表可从抓包或固件中提取 - 无固件签名验证(固件可被篡改) ### 已发现的协议 - 序列号挑战/响应认证算法 - 参数交换协议(0x78X/0x79X) - R-Net Programmer 读写协议(0x78F/0x793) - 配置传输协议(0x1E3X-0x1E8X) - cJSM 显示文本协议(寄存器 0x8C) - Bluetooth 模块状态帧 - 模式配置帧(0x1ECXXXXX) ### 固件 - Freescale/NXP HCS08 8 位微控制器(MC9S08DZ 系列) - Motorola S-Record 格式固件转储 - 基于 XOR 的配置加密(密钥存储在固件 0x0160 处) - 哨兵值 0x18A7 标记未初始化的配置槽 ## 贡献 发现了新内容?欢迎贡献: - 记录新的帧类型 - 分享匿名化的数据包捕获 - 改进 Python 库 - 增加对新输入设备的支持 ## 参考文献 - [DEFCON24 技术演讲](docs/presentations/canPPT.pdf) - [DEFCON24 个人故事演讲](docs/presentations/DEFCON24_chairhacking.pdf) - [can-utils](https://github.com/linux-can/can-utils) - [SocketCAN 文档](https://www.kernel.org/doc/html/latest/networking/can.html) ## 作者 - **Stephen Chavez** - [@redragonx](https://github.com/redragonx) - **Specter** ## 许可证 本项目采用 GPLv3 授权 - 详见 [LICENSE](LICENSE) 文件。 本研究仅出于教育和提升可访问性的目的提供。请负责任地使用,并始终将安全放在首位。 *"为了可访问性而黑轮椅,而非为了恶作剧。"* - DEFCON24
标签:CAN嗅探, CAN总线, DEFCON, PG Drives Technology, PiCAN2, Raspberry Pi, R-Net协议, USB游戏手柄控制, 云资产清单, 内存执行, 医疗设备安全, 协议分析, 实时处理, 嵌入式安全, 无障碍技术, 权限提升, 物联网安全, 电动轮椅, 硬件黑客, 网络控制, 车联网安全, 辅助技术, 逆向工具, 逆向工程, 防御绕过