Ingeniería inversa de un patinete eléctrico y reescritura del firmware en Rust

Fuentes: Reverse engineering my e-scooter and rewriting the firmware in rust

Un aficionado a la electrónica narra el proceso de ingeniería inversa de su patinete eléctrico Egret GT, un vehículo de alta gama con pantalla LCD de 320x480 que muestra velocidad, modo de conducción, nivel de batería y autonomía. La investigación comenzó tras descubrir que mantener pulsado el botón de bajada durante el encendido activaba un modo de actualización de firmware y que, saliendo de ese menú, el patinete funcionaba sin solicitar el PIN, un detalle de seguridad que le resultaba preocupante.

El primer análisis se centró en la aplicación móvil vinculada al vehículo. La app permite desbloquear el patinete a distancia, modificar ajustes y consultar la batería. Al estudiar los controladores Bluetooth del programa, el autor identificó que el patinete admite actualizaciones de firmware por Bluetooth sobre tres componentes (pantalla, controlador y panel de botones) y que transmite al fabricante métricas no mostradas al usuario, como tiempo por modo de conducción, temperatura del dispositivo, corriente del motor, voltaje de la batería e historial de carga, datos asociados al identificador del vehículo sin aviso explícito en la app. También constató que el número de bastidor (VIN) lo asigna la propia aplicación al conectarse, lo que abre la puerta a suplantar el modelo del patinete en el sistema del fabricante, aunque al probarlo no logró saltarse el límite de velocidad.

Después, la investigación se desplazó al puerto USB-C de la pantalla, presentado por el fabricante como un simple cargador para móviles. Con una placa de ruptura USB-C y un osciloscopio, el autor descubrió que dos pines del conector se utilizaban en realidad como bus CAN, un uso no conforme con el estándar. Para monitorizar el tráfico construyó un registrador basado en un ESP32-C6, un transceiver SN65HVD230 y un controlador MCP2515. Con esa herramienta capturó los mensajes durante el arranque y, comparando los datos mientras conducía, identificó las tramas responsables del acelerador, el modo de conducción y la velocidad del motor. La documentación describe, entre otros, los identificadores 0x300 (modo de conducción, luces y contador en modo peatón) y 0x306 (posición del acelerador, intermitentes y límite de velocidad, este último efectivo solo en la versión GTS). El proyecto, que se complementa con una herramienta de visualización construida con la biblioteca egui, sienta las bases para reescribir el firmware del patinete en Rust.