
Інженер вивчив прошивку електросамоката і переписав її на Rust
Бен Сімс дослідив CAN-шину свого електросамоката Egret GT, витягнув прошивку через відкритий налагоджувальний порт і написав нову прошивку дисплея на Rust, з’ясувавши, що оновлення не мають автентифікації.
Інженер, який публікується під іменем Бен, докладно описав, як реверс-інжинірив свій електросамокат Egret GT: від Bluetooth-застосунку, що спілкується з ним, через CAN-шину, заховану в порту USB-C, до нової прошивки дисплея, написаної на Rust.
Самокат, куплений минулого року, заявляє запас ходу 100 км і має РК-дисплей 320x480, який показує швидкість, режим руху, заряд батареї та запас ходу. Проєкт почався з дрібної незручності: утримання кнопки «вниз» на клавіатурі під час увімкнення переводило самокат у режим оновлення прошивки, а вихід із цього меню повертав користувача до звичайного режиму руху без введення PIN-коду. «Я завжди пристібаю самокат добрим замком, але це все одно мене непокоїло», — пише він.
Застосунок, шина й нестандартний USB-C
Аналіз Bluetooth-обробників мобільного застосунку показав, що самокат отримує оновлення прошивки через Bluetooth, причому окремо для дисплея, контролера та панелі кнопок. Він також передає показники, яких немає ні в застосунку, ні на екрані — час у кожному режимі руху, струм двигуна, напругу батареї, історію заряджання; загальний час руху, одометр та історію зарядів надсилають виробникові й зберігають у прив’язці до ID самоката, про що в застосунку чітко не сказано.
Порт USB-C на дисплеї виробник описує як зарядний для телефонів, але після перевірки контактів осцилографом виявилося, що два з них передають CAN-шину — рішення, яке автор називає «жахливо нестандартним». З ESP32-C6, SN65HVD230 і MCP2515 він зібрав логер і описав повідомлення: 0x300 передає режим руху й фару, 0x306 — положення газу, поворотники та обмеження швидкості, 0x201 — швидкість двигуна й прапорці стану.
Розбирання, злив прошивки та відсутність автентифікації
Купивши запасні контролер і дисплей, він побачив, що маркування компонентів на контролері не стерли, знайшов порт SWD і злив прошивку через OpenOCD; аналіз у Ghidra виявив завантажувач, модуль оновлення та основний застосунок за фіксованими адресами. Дисплей відкрити було важче; на його платі — мікроконтролер AT32F415, Bluetooth-чип, зчитувач NFC і флеш-пам’ять, де зберігаються лише зображення інтерфейсу.
Процес оновлення виявився таким самим відкритим: прошивка пишеться CAN-шиною без будь-якої криптографії — блоками по 64 байти в дев’яти кадрах із перевіркою CRC-16-CCITT, причому перший блок містить лише назву файлу й довжину прошивки у вигляді тексту. Він написав прошивальник, перевірив його зі злитим образом — і все спрацювало з першого разу. «Прошивку будь-якого самоката можна змінити без автентифікації», — зауважує він.
Написати апаратний шар на Rust
AT32F415 виявився не клоном одного чипа, а сумішшю периферії STM32, тож замість фреймворку Embassy він збудував власний шар апаратної абстракції на основі форку проєкту stm32-rs і підняв годинники, таймери, АЦП, переривання GPIO, UART, CAN і RTC. Дисплеєм ST7796 керує паралельний інтерфейс mipidsi, тип Bus дозволяє записати всі 16 пінів GPIOB однією інструкцією, а визначення deku дають тим самим структурам декодувати кадри CAN і Bluetooth.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.