Inhalt
- Worum geht’s?
- Vorbereitungen
- Update Original Firmware (ADSP)
- Custom Firmware
- Original Firmware Recovery
- Modem manuell starten
Bitte beachtet den Disclaimer!
1. Worum geht’s?
Im Pinephone (Pro) ist das Modem EG25-G der Firma Quectel (angeschlossen via USB audio) verbaut.
Ende 2021 wurde eine Sicherheitslücke in der Firmware des Modems des Pinephones (Pro) entdeckt, die einen Exploit ermöglicht.
In Umlauf gebracht wurde das Spiel „Snake“ als Binärdatei, das einen systemd – Prozess startet, der das System sowie das Modem vollständig löscht.
Auf dieses Problem bin ich erst gut zwei Jahre später gestoßen. Bis dahin wußte ich lediglich, dass da ein Modem im Pinephone ist. Um welches es sich handelt und welche Version dessen Firmware hat, hat mich bis dato wenig gekümmert. Ich habe hier alle Informationen zusammengetragen und gefiltert, die ich dazu finden konnte.
Das Hauptproblem war mit der alten Firmware von Anfang an, dass das Modem im Standby-Zustand deaktiviert wird, um den Akku zu schonen und zwar so, dass häufig auch keine Anrufe oder SMS mehr durchkommen. Damit hat sich das Pinephone als Alltagsgerät etwas ins Abseits manövriert. Während ich es zu Hause gerne und viel genutzt habe, hatte ich unterwegs grundsätzlich mein Volla Phone (Ubuntu Touch) dabei und mich nicht mehr um die Problematik rund um das Modem gekümmert.
Das ändert sich nun mit der durch diesen Exploit offenbarte Sicherheitslücke, die ich trotz allem gerne auf allen meinen Pinephones schließen möchte.
Der Exploit wird in der National Vulnerability Database unter CVE-2021-31698 gelistet. Ein detailierter Bericht findet sich hier.
Dieser ermöglicht das Ausführen beliebiger Befehle auf dem Modem als „root“ durch AT-Kommandos („AT“ steht für „come to ATtention“), welche für die Steuerung eines Modems, bei GSM und vielen anderen Arten von Kommunikationshardware mit seriellem Port genutzt werden.
Die ganze Situation wird in einem Post des Hackaday Blogs beschrieben.
Betroffen sind also nur Systeme, die systemd nutzen. postmarketOS nutzt bspw. OpenRC und ist daher nicht betroffen.
Es gibt nun zwei Möglichkeiten zu verhinden, dass das Modem durch einen solchen Exploit unbrauchbar gemacht wird:
- Die aktualisierte Firmware von Quectel installieren
- Die von Biktorgj geschriebene Custom Firmware installieren
Möglichkeit 2 ist hier wohl der bessere Weg, da die Firmware nicht nur den Exploit behebt sondern weiterentwickelt wird und neue Funktionalitäten für das Modem realisiert.
Jedoch lässt sich dies nicht einfach mittels Paketmanager erledigen. Die Firmware muss manuell auf das Modem geflasht werden. Diese zwei Vorgehensweisen habe ich erfolgreich getestet und möchte sie hier beschreiben.
Dazu existiert auch ein Eintrag im Pine64 Wiki. Die Git-Repositories „the-modem-distro“ und jenes von „biktorgj“ beinhalten alle notwendigen Informationen sowie Downloads für die originale (aktualisierte) Firmware wie auch für die Custom Firmware.
Die aktuell installierte Firmware-Version lässt sich mittels folgendem Befehl abfragen:
$ echo 'AT+QGMR' | sudo atinout - /dev/ttyUSB2 -
Das Ergebnis ist eine Zeichenkette, wie diese in meinem Fall:
EG25GGBR07A08M2G_01.001.01.001
Die Nummer nach dem Unterstrich ist die eigentliche Versionsnummer und bei der 01.001.01.001 handelt es sich um jene vulnerable Version, die man aktualisieren sollte. Dabei sollten die folgenden drei Fälle unterschieden werden:
- Die originale Firmware soll aktualisiert werden
- Die originale Firmware soll durch die Custom-Firmware ersetzt werden
- Die Custom-Firmware soll durch die originale Firmware ersetzt werden
Für die Punkte 1 und 2 benötigt man das Modem-Distro-Repository
Für Punkt 3 benötigt man das Recovery-Repository
Bei beiden handelt es sich um GitHub Repositories von Biktorgj.
2. Vorbereitungen
Zunächst müssen adb (Android Debug Bridge) und fastboot auf dem Pinephone installiert werden:
Für Debian/Ubuntu basierte Distributionen:
$ sudo apt install android-tools-adb android-tools-fastboot
Für postmarketOS/Alpine basierte Distributionen:
$ apk add android-tools
Für Arch/Manjaro basierte Distributionen:
$ pacman -S android-tools
Die folgenden Anforderungen sollten tatsächlich erfüllt sein, da das Modem bei einer Unterbrechung des Aktualisierungsprozesses tatsächlich unbrauchbar werden kann.
Selbst das kann zwar rückgängig gemacht werden (dafür lieben wir das Pinephone), ist aber relativ kompliziert und erfordert, dass das Modem physisch kurzgeschlossen wird.
- Der Akku muss ausreichend geladen sein
- Das Pinephone sollte am Ladegerät angeschlossen sein
- Der Ruheszustand/Energiesparmodus sollte deaktiviert werden, da dieser den Aktualisierungsprozess unterbrechen kann
- Alle anderen Anwendungen sollten geschlossen werden
3. Update Original Firmware (ADSP)
3.1 Download
Die verfügbaren ADSP (Advanced Digital SAR/Signal Processor) Versionen lassen sich hier, bzw. hier (unter „ASDP firmware“) von der GitHub-Seite von „the-modem-distro“ herunterladen.
3.2 Flashen
Im Verzeichnis, in dem die Datei NON-HLOS.ubi liegt als root anmelden mittels:
$ sudo su
In den fastboot Modus wechseln:
$ echo -ne "AT+QFASTBOOT\r" > /dev/ttyUSB2
Dann flashen mittels:
$ fastboot flash modem NON-HLOS.ubi && fastboot reboot
Fertig!
4. Custom Firmware
4.1 Download
Die Firmware kann heruntergeladen werden
- auf der Hauptseite des Repositories nach Klick auf den kleinen Pfeil im grünen „Code“-Button -> „Download ZIP“
- auf der Releases-Seite ganz unten unter „Assets“ die package.tar.gz Datei
- indem man das Repository klont. Den Link findet man wieder auf der Hauptseite des Repositories nach Klick auf den kleinen Pfeil im grünen „Code“-Button unter „Clone“ (HTTPS-Link). Der Befehl zum Klonen (vorher in das gewünschte Verzeichnis wechseln) lautet dann:
git clone https://github.com/Biktorgj/quectel_eg25_recovery.git
4.2 Firmware flashen
Ich habe die Firmware unter dem oben angegebenen zweiten Link herunterladen (unter „Assets“ ganz unten) und die package.tar.gz Datei entpackt (vorher in gewünschtes Verzeichnis wechseln):
$ tar xzvf package.tar.gz
In diesem Ordner das Skript flashall ausführen:
$ sudo ./flashall
Das Modem (das Symbol in der Taskleiste) sollte dann verschwinden und nach spätestens 30 Sekunden zurückkommen.
Fertig!
4.3 Einstellungen
Für die Custom Firmware gibt es einige Einstellungen, die man vornehmen sollte. Diese beschreibe ich hier kurz für das Pinephone und das Pinephone Pro.
4.3.1 Pinephone
4.3.1.1 Unterbrechungen
Das Modem wird während des Betriebs oder nach dem Aufwachen aus dem Standby-Modus häufig getrennt und verbindet sich dann wieder (Modem verschwindet und erscheint einige Sekunden später wieder).
Das Problem ist, dass der Kernel hartnäckig versucht, den USB-Port, über den das Modem verbunden ist, in den Ruhezustand zu versetzen.
Dagegen hilft in der Regel, die Aktivierung des Ruhezustands im aktiven Zustand zu verhindern. Hierzu muss folgendermaßen vorgegangen werden:
Die Datei
/usr/lib/udev/rules.d/80-modem-eg25.rules
in einem Texteditor öffnen. In den folgenden Anweisungen muss der Wert von „ATTR{power/control}“ von „auto“ zu „on“ geändert werden.
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/control}="auto"
ändern zu
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/control}="on"
4.3.1.2 Lautstärke ist zu gering
Die ALSA UCM Konfigurationsdatei
/usr/share/alsa/ucm2/PinePhone/VoiceCall.conf
in einem Texteditor öffnen. Die Werte der Parameter
- AIF2 DAC Playback Volume
- AIF2 ADC Capture Volume
mit 80% oder 90% ersetzen. Bei 90% kann es zu Echos beim anderen Gesprächsteilnehmer kommen. Da dies aber nicht generell der Fall ist, muss das jeder selbst testen.
4.3.2 Pinephone Pro
4.3.1.1 Unterbrechungen
Das Modem „verschwindet“ im Ruhezustand. Um das zu verhindern die Datei
/usr/lib/udev/rules.d/80-modem-eg25.rules
in einem Texteditor öffnen. In den folgenden Anweisungen muss der Wert von „ATTR{power/persist}“ von „0“ zu „1“ geändert werden.
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/persist}="0"
ändern zu
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/persist}="1"
Anschließend muss man die Datei
/usr/share/eg25-manager/pine64,pinephone-pro.toml
in einem Texteditor öffnen und sich vergewissern, dass der Wert von „monitor_udev“ „false“ ist.
Sollte dies nicht zum gewünschten Erfolg führen, findet sich unter Punkt 2.3.1.4 noch ein Hinweis.
4.3.1.2 Doppelte Nachrichten
Bei dem Problem, dass Nachrichten doppelt erscheinen, handelt es sich um das gleiche wie beim Pinephone, nur dass es sich anders äußert.
Der USB-Port, über den das Modem verbunden ist, wird, während einer Nachrichtenübertragung, in den Ruhezustand versetzt. Dies hat zur Folge, dass der Modemmanager, während der Übertragung, eine QMI-Message verliert. In einem solchen Fall wird eine SMS nicht vom Modem gelöscht, oder sie wird zweimal empfangen, da der entsprechende Teil der Übertragungsinformation verlorengegangen ist.
Dies lässt sich relativ leicht beheben. Die Datei
/usr/lib/udev/rules.d/80-modem-eg25.rules
in einem Texteditor öffnen. In den folgenden Anweisungen muss der Wert von „ATTR{power/control}“ von „auto“ zu „on“ geändert werden.
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/control}="auto"
ändern zu
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/control}="on"
Sollte dies nicht zum gewünschten Erfolg führen, findet sich unter Punkt 2.3.1.4 noch ein Hinweis.
4.3.1.3 Mikrofon zu laut
Der Mikrofonton ist während Telefonaten zu laut, was in verzerrtem Ton und vielen Hintergrundgeräuschen resultiert. Für die Behebung die ALSA UCM Konfigurationsdatei
/usr/share/alsa/ucm2/PinePhonePro/VoiceCall.conf
in einem Texteditor öffnen und den Wert von „IN1 Boost“ von „8“ auf „3“ ändern. Eventuell muss man hier einen etwas höheren oder niedrigeren Wert einstellen, „8“ ist jedoch definitiv zu viel.
4.3.1.4 Megi Kernel
Wenn man einen Megi-Kernel (Kernel des Entwicklers „Megi“) nutzt (z.B. Arch Linux) oder einen anderen Kernel, der das Modem um die „Reset-Macke“ ergänzt und die Vorgehensweisen in den Punkten 2.3.1.1 und 2.3.1.2 somit nicht zum gewünschten Erfolg geführt haben, kann die Datei
/usr/lib/udev/rules.d/80-modem-eg25.rules
angepasst werden. Nach folgendem Inhalt
ACTION=="add", SUBSYSTEM=="usb", DRIVERS=="usb", ENV{DEVTYPE}=="usb_device", ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{power/persist}="1"
eine Zeile mit diesem Inhalt einfügen:
ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ATTR{avoid_reset_quirk}="0"
5. Original Firmware Recovery
5.1 Download
Die Firmware kann heruntergeladen werden
- auf der Hauptseite des Repositories nach Klick auf den kleinen Pfeil im grünen „Code“-Button -> „Download ZIP“
- indem man das Repository klont. Den Link findet man wieder auf der Hauptseite des Repositories nach Klick auf den kleinen Pfeil im grünen „Code“-Button unter „Clone“ (HTTPS-Link). Der Befehl zum Klonen (vorher in das gewünschte Verzeichnis wechseln) lautet dann:
git clone https://github.com/Biktorgj/quectel_eg25_recovery.git
5.2 Firmware flashen
In den entpackten Ordner wechseln und das Skript flashstock ausführen:
$ sudo ./flashstock
Fertig!
Bleibt noch der EDL (Emergency Download Mode) Modus zu erwähnen, für den Fall, dass etwas schief gelaufen ist. Dazu kann ich jedoch nicht viel sagen und verweise deshalb auf
6. Modem manuell starten
Bevor ich diese Informationen gesammelt und geordnet hatte, hatte ich bereits versucht, das Modem zu aktualisieren. Dann habe ich das Modem nach dieser Anleitung auf den neuesten Stand der originalen Firmware aktualisiert.
Ob dabei zunächst etwas schief gelaufen ist, kann ich nicht sagen. Mein Modem verlangt zwar den SIM-Pin, bleibt aber, wie mit der originalen Firmware, nach jedem Start und nach jedem Mal, wenn das Pinephone in den Ruhezustand gegangen ist, inaktiv. Führt man im Terminal den Befehl
mmcli -m any
aus, wird der Status („state“) des Modems als inaktiv („disabled“) angezeigt.
Mittels dem Befehl
mmcli -m any -e
lässt sich das Modem starten. Die Erfolgsmeldung lautet dann „successfully enabled the modem“ und der vorherige Befehl zeigt den Status („state“) des Modems auch als aktiv („registered“) an.
Dies funktioniert jedoch erst nachdem der SIM-Pin im entsprechenden Dialog eingegeben wurde.
„mmcli“ Befehle gehören zum „ModemManager“, einem über den DBus laufenden Linux-Daemon, der ein High-Level API für die Kommunikation mit mobilen Breitbandmodems bereitstellt.