PinePhone GPS / WWAN / LTEモデム
PinePhoneでソフトウェアを開発しているときに、次のような奇妙なメッセージに出くわしました
dmesg
。
[ 25.476857] modem-power serial1-0: ADB KEY is '41618099' (you can use it to unlock ADB access to the modem)
コンテキストとして、PinePhoneには、PinePhoneのGPSとワイヤレス通信を担当するQuectelEG25-Gモデムが あると言います。このハードウェアは、数少ないクローズドソースの電話コンポーネントの1つです 。
このメッセージとADBについての言及を見て、すぐにAndroid Debug Bridge、つまりAndroidデバイスとの通信に一般的に使用されるソフトウェアについて考えました。 「もちろん、これは同じADBにはなれない」と思いました 。さて、そうだとわかりました。
このメッセージは、このモデムの詳細を説明する記事に関連してい ます。また、モデムを保護するためにATコマンドを出力するアンロックユーティリティにも関連付けられてい ます
adbd
。
$ ./qadbkey-unlock 41618099
AT+QADBKEY="WUkkFzFSXLsuRM8t"
AT+QCFG="usbcfg",0x2C7C,0x125,1,1,1,1,1,1,0
それらは、以下を使用してモデムに送信できます
screen
。
# screen /dev/ttyUSB2 115200
何らかの理由で、入力でデータが返されませんでしたが、画面セッションで「OK」が2回返され、コマンドが正常に完了したことが示されました。
ルール
udev
を 設定した後
adb
、私の「ホストマシン」、つまりPinePhoneで、モデムはの出力を生成し始めました
adb devices
。これをシェルに送信できます。
$ adb devices
List of devices attached
(no serial number) device
$ adb shell
/ #
adbd
ルートとして実行していたので 、出力をルートシェルにパイプしました。優れた。
モデムは、他のPinePhoneオペレーティングシステムから完全に独立した独自のオペレーティングシステムを実行していることが判明しました。最新のアップデートでは、Linux3.18.44を実行します。
Webサーバーの起動
どういうわけか、このデバイスでブログを運営するのは楽しいだろうと思いました。私たちは限られたリソース(約48MBのストレージと同じ量のメモリ)で作業しており、私のブログは静的ページのみで構成されているため、nginxのようなもの(どんなに軽量でも)は私の目的のためにリソースの無駄になると判断しました....。 darkhttpd
は私の要件を十分に満たしているように見えました 。単一のバイナリ、外部依存関係なし、GETおよびHEADリクエストのみを実行します。理想的には。 armv7l -linux-musleabihf-crossツールチェーンを使用して このサーバーをARMv7用にクロスコンパイルし、静的にmuslにリンクしました。助けを借りて
adb push
私は自分のサイトのバイナリファイルとリソースを
/usrdata
モデムフォルダに簡単に転送することができました。モデムフォルダには 、書き込み機能を備えた50MBのパーティションがマウントされています。
HTTPサーバーはうまく機能します。ADBを使用してPinePhoneのHTTPポートを開くことにしました。
$ adb forward tcp:8080 tcp:80
ADB転送ポートはループバックインターフェイスにのみバインドされているため、外部接続用に手動で開きました。
# 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
その後、で自分のブログにアクセスできました
http://pine:8080/
。涼しい!
パフォーマンス?
私が走った
iperf
私はなっていたどのくらいのパフォーマンスを見るためにADBポートフォワーディングを。
$ 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
これは約10Mbpsです。良くない、ひどいではない。
PinePhone自体はUSB経由でネットワークに接続されています(注:USBネットワーク接続を機能させるには、ボードから2つのコンポーネントを削除する必要がありました )。興味を引くために、私
iperf
もこの接続のために走り ました:
$ 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
もっと期待していましたが、ボトルネックはADBを介してリダイレクトされる接続であるため、実際には問題ではありません。
その他の理由
モデムのセキュリティについて疑問に思いました。多くのATチームが判明しました
system()
。これらのATコマンドのいくつかはコマンドインジェクションに対して脆弱である可能性があると思いますが、私はこれ以上の調査を行っていません。 ADBルートシェルは実装が非常に簡単なので、実際には問題ではありません。
一見すると、これは悪意のあるコードの回復力を確保するための理想的な方法のように思えます。ホストへのルートアクセスにより、悪意のあるコードがモデムに埋め込まれ、ホストOSの再インストール後も存続したり、通信を傍受したり、デバイスの場所を追跡したりできます。ホストOSとのすべての対話がUSBおよびI2Sを介して行われ、ホストOSがそれを開始した場合にのみ行われるため、モデム内の悪意のあるコードがホストOSと直接対話することはできません。
広告
サイトなどをホストするためのエピックサーバー! 企業ネットワークやゲームプロジェクトからランディングページやVPNまで、あらゆる複雑なプロジェクトをホストするための、Intelの最新のAMDEPYCプロセッサとNVMeストレージに基づく安価なVDS。数回クリックするだけで、独自のサーバー構成を作成できます。 Telegramでチャットを
購読して ください。