Módem PinePhone GPS / WWAN / LTE
Mientras desarrollaba software en PinePhone, encontré un mensaje curioso en
dmesg
:
[ 25.476857] modem-power serial1-0: ADB KEY is '41618099' (you can use it to unlock ADB access to the modem)
Para el contexto, diré que el PinePhone tiene un módem Quectel EG25-G que se encarga del GPS y la comunicación inalámbrica del PinePhone. Este hardware es uno de los pocos componentes telefónicos de código cerrado .
Cuando vi este mensaje y la mención de ADB, inmediatamente pensé en Android Debug Bridge, es decir, el software que se usa comúnmente para comunicarse con dispositivos Android. Pensé: "Por supuesto, este no puede ser el mismo ADB". Bueno, resulta que lo es.
Este mensaje está relacionado con un artículo que detalla este módem. También está asociado con una utilidad de desbloqueo que imprime comandos AT para asegurar el
adbd
módem.
$ ./qadbkey-unlock 41618099
AT+QADBKEY="WUkkFzFSXLsuRM8t"
AT+QCFG="usbcfg",0x2C7C,0x125,1,1,1,1,1,1,0
Se pueden enviar al módem mediante
screen
:
# screen /dev/ttyUSB2 115200
Por alguna razón, mi entrada no devolvía ningún dato, pero la sesión de pantalla devolvió "OK" dos veces, lo que indica que completó los comandos correctamente.
Después de configurar las reglas
udev
y
adb
en mi "máquina host", es decir, en el PinePhone, el módem comenzó a producir una salida para la
adb devices
que podía enviar al shell:
$ adb devices
List of devices attached
(no serial number) device
$ adb shell
/ #
Como
adbd
estaba ejecutando como root, canalicé la salida al shell de root. Excelente.
Resultó que el módem ejecuta su propio sistema operativo, completamente independiente del resto del sistema operativo PinePhone. Con las últimas actualizaciones, ejecuta Linux 3.18.44.
Lanzamiento del servidor web
Por alguna razón, pensé que sería divertido ejecutar mi blog en este dispositivo. Como estamos trabajando con recursos limitados (alrededor de 48 MB de almacenamiento y la misma cantidad de memoria), y mi blog consta solo de páginas estáticas, decidí que algo como nginx (sin importar cuán liviano sea) sería una pérdida de recursos para mi propósito. ...
Me pareció que darkhttpd cumplía bien con mis requisitos . Binario único, sin dependencias externas, solo ejecuta solicitudes GET y HEAD. Idealmente.
Usé la cadena de herramientas armv7l -linux-musleabihf-cross para compilar este servidor para ARMv7 y lo vinculé estáticamente con musl. Con ayuda
adb push
Logré fácilmente transferir el archivo binario y los recursos de mi sitio a la carpeta del
/usrdata
módem, en la que se monta una partición de 50 MB con la capacidad de escribir.
El servidor HTTP funciona muy bien. Decidí usar ADB para abrir el puerto HTTP para mi PinePhone:
$ adb forward tcp:8080 tcp:80
Dado que los puertos reenviados por ADB están vinculados solo a la interfaz de loopback, lo abrí manualmente para conexiones externas:
# sysctl -w net.ipv4.conf.all.route_localnet=1
# iptables -t nat -I PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 127.0.0.1:8080
Luego pude acceder a mi blog en
http://pine:8080/
. ¡Fresco!
¿Actuación?
Me encontré con
iperf
el reenvío de puertos ADB para ver cuánto rendimiento que estaba recibiendo.
$ iperf -c localhost
------------------------------------------------------------
Client connecting to localhost, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 44230 connected with 127.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.6 sec 14.4 MBytes 11.4 Mbits/sec
Eso es aproximadamente 10 Mbps. No genial, no terrible.
El propio PinePhone está conectado a la red a través de USB (nota: para que la conexión de red USB funcione, tuve que quitar dos componentes de la placa ). Por el bien del interés, también busqué
iperf
esta conexión:
$ iperf -c 10.15.19.82
------------------------------------------------------------
Client connecting to 10.15.19.82, TCP port 5001
TCP window size: 136 KByte (default)
------------------------------------------------------------
[ 3] local 10.15.19.100 port 58672 connected with 10.15.19.82 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.4 sec 25.8 MBytes 20.7 Mbits/sec
Esperaba más, pero realmente no importa porque el cuello de botella es la conexión que se redirige a través de ADB.
Otro razonamiento
Me pregunté sobre la seguridad del módem. Resultó que muchos equipos de AT
system()
. Sospecho que algunos de estos comandos AT pueden ser vulnerables a la inyección de comandos, pero no he investigado más. Realmente no importa, ya que el shell raíz de ADB es muy fácil de implementar.
A primera vista, esta parece una forma ideal de garantizar la resistencia del código malicioso. Con acceso de root al host, el código malicioso puede incrustarse en el módem, lo que le permite sobrevivir a la reinstalación del sistema operativo del host, interceptar las comunicaciones o rastrear la ubicación del dispositivo. El daño se mitiga parcialmente por el hecho de que toda la interacción con el sistema operativo host se realiza a través de USB e I2S, y solo cuando el sistema operativo host lo inicia, por lo que el código malicioso en el módem no podrá interactuar directamente con el sistema operativo host.
Publicidad
¡Servidores épicos para alojar sitios y más! VDS económicos basados en los últimos procesadores AMD EPYC y almacenamiento NVMe de Intel para alojar proyectos de cualquier complejidad, desde redes corporativas y proyectos de juegos hasta páginas de destino y VPN. ¡Puede crear su propia configuración de servidor en un par de clics!
Suscríbete a nuestro chat en Telegram .