Modem GPS / WWAN / LTE PinePhone
En développant un logiciel sur PinePhone, je suis tombé sur un message curieux dans
dmesg
:
[ 25.476857] modem-power serial1-0: ADB KEY is '41618099' (you can use it to unlock ADB access to the modem)
Pour le contexte, je dirai que le PinePhone dispose d'un modem Quectel EG25-G qui est responsable de la communication GPS et sans fil du PinePhone. Ce matériel est l'un des rares composants téléphoniques à code source fermé .
Quand j'ai vu ce message et la mention ADB, j'ai immédiatement pensé à Android Debug Bridge, c'est-à-dire au logiciel couramment utilisé pour communiquer avec les appareils Android. J'ai pensé: "Bien sûr, ce ne peut pas être la même BAD." Eh bien, il s'avère que c'est le cas.
Ce message est lié à un article qui détaille ce modem. Il est également associé à un utilitaire de déverrouillage qui imprime des commandes AT pour sécuriser le
adbd
modem.
$ ./qadbkey-unlock 41618099
AT+QADBKEY="WUkkFzFSXLsuRM8t"
AT+QCFG="usbcfg",0x2C7C,0x125,1,1,1,1,1,1,0
Ils peuvent être envoyés au modem en utilisant
screen
:
# screen /dev/ttyUSB2 115200
Pour une raison quelconque, mon entrée ne retournait aucune donnée, mais la session d'écran a renvoyé «OK» deux fois, indiquant qu'elle avait exécuté les commandes avec succès.
Après avoir configuré les règles
udev
et
adb
sur ma "machine hôte", c'est-à-dire sur le PinePhone, le modem a commencé à produire une sortie pour
adb devices
laquelle je pouvais envoyer au shell:
$ adb devices
List of devices attached
(no serial number) device
$ adb shell
/ #
Depuis que je
adbd
fonctionnais en tant que root, j'ai redirigé la sortie vers le shell racine. Excellent.
Il s'est avéré que le modem exécute son propre système d'exploitation, complètement indépendant du reste du système d'exploitation PinePhone. Avec les dernières mises à jour, il exécute Linux 3.18.44.
Lancement du serveur Web
Pour une raison quelconque, j'ai pensé que ce serait amusant d'exécuter mon blog sur cet appareil. Étant donné que nous travaillons avec des ressources limitées (environ 48 Mo de stockage et la même quantité de mémoire) et que mon blog ne se compose que de pages statiques, j'ai décidé que quelque chose comme nginx (aussi léger soit-il) serait un gaspillage de ressources pour mon objectif. . ...
Il m'a semblé que darkhttpd répondait bien à mes exigences . Un seul binaire, pas de dépendances externes, n'exécute que les requêtes GET et HEAD. Idéalement.
J'ai utilisé la chaîne d' outils armv7l -linux-musleabihf-cross pour croiser ce serveur pour ARMv7, et l'ai lié statiquement avec musl. Avec de l'aide
adb push
J'ai facilement réussi à transférer le fichier binaire et les ressources de mon site vers le dossier du
/usrdata
modem, sur lequel une partition de 50 Mo est montée avec la possibilité d'écrire.
Le serveur HTTP fonctionne très bien. J'ai décidé d'utiliser ADB pour ouvrir le port HTTP de mon PinePhone:
$ adb forward tcp:8080 tcp:80
Étant donné que les ports transférés par ADB ne sont liés qu'à l'interface de bouclage, je l'ai ouvert manuellement pour les connexions externes:
# 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
Ensuite, j'ai pu accéder à mon blog sur
http://pine:8080/
. Frais!
Performance?
J'ai exécuté la
iperf
redirection de port ADB pour voir les performances que j'obtenais.
$ 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
C'est environ 10 Mbps. Pas génial, pas terrible.
Le PinePhone lui-même est connecté au réseau via USB (note: pour que la connexion réseau USB fonctionne, j'ai dû retirer deux composants de la carte ). Par souci d'intérêt, j'ai également couru
iperf
pour cette connexion:
$ 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
Je m'attendais à plus, mais cela n'a pas vraiment d'importance car le goulot d'étranglement est la connexion redirigée via ADB.
Autre raisonnement
Je me suis interrogé sur la sécurité du modem. Il s'est avéré que de nombreuses équipes AT
system()
. Je soupçonne que certaines de ces commandes AT peuvent être vulnérables à l'injection de commandes, mais je n'ai pas fait plus de recherche. Cela n'a pas vraiment d'importance, car le shell racine ADB est très facile à implémenter.
À première vue, cela semble être un moyen idéal pour assurer la résilience du code malveillant. Avec un accès root à l'hôte, un code malveillant peut s'incorporer dans le modem, lui permettant de survivre à la réinstallation du système d'exploitation hôte, d'intercepter les communications ou de suivre l'emplacement de l'appareil. Les dommages sont partiellement atténués par le fait que toute interaction avec le système d'exploitation hôte se fait via USB et I2S, et uniquement lorsque le système d'exploitation hôte l'initie, de sorte que le code malveillant du modem ne pourra pas interagir directement avec le système d'exploitation hôte.
Publicité
Des serveurs épiques pour l'hébergement de sites et plus encore! VDS bon marché basé sur les derniers processeurs AMD EPYC et le stockage NVMe d'Intel pour l'hébergement de projets de toute complexité, des réseaux d'entreprise et des projets de jeu aux pages de destination et aux VPN. Vous pouvez créer votre propre configuration de serveur en quelques clics!
Abonnez-vous à notre chat sur Telegram .