Freitag, 14. Juni 2019

Rockrobo - root und gut?

Es ist einige Zeit vergangen und ich habe im Mai 2021 den Artikel leicht überarbeitet.

Der Staubsauger ist in der Cloud und mein Typ Xiaomi Mi Robot Vacuum (rockrobo.vacuum.v1) wird auch noch von höchster Instanz (CCC) genau analysiert!
Was bedeutet es einen Staubsauger mit Root Zugriff zu haben?!
Markus hat gesagt: Es ist nur der ssh Zugriff - und irgendwann geht es vielleicht nicht mehr.
WLAN Zugang ändern und danach den Token neu auslesen - ist mit dem normalen Gerät ein Graus, aber mit ssh Zugang ganz einfach!?
Tobias hat mir mit seinem Beitrag die Hemmschwelle genommen - also los und Test!
Wie so oft: Meine Beschreibung wird auch irgendwann nicht mehr aktuell sein. 
Die Grundlage steht hier https://github.com/dgiese/dustcloud

Stand Mai 2021 - gibt es einige weitere Entwicklungen und als aktuelle Quelle kann dieser Link dienen:
Das mirobo Tool gibt es auch für Windows, ich habe ursprünglich die Linux Version verwendet.
Ich habe auch Valetudo getestet und in diesem Artikel beschrieben.

Vorbereitung

  • Der Roboter muss für den Flashvorgang in der Ladestation stehen!
  • Um den Roboter ohne Token zu rooten, darf er noch nicht mit einem Wlan verbunden sein! In dem Fall braucht ein System welches man einfach mit dem initialen Wlan des Roboters verbinden kann.
  • Hat man den Token des Roboters schon braucht man eine System im vollständig geroutetem Lan. Wlan oder das gleiche Netzwerksegment sind nicht nötig. 

Software, Firmware - flashen

Man braucht das mirobo Tool und eine passende Firmware. Die Installation ist simpel:
# Software installieren
sudo apt-get update
sudo apt-get install ccrypt python3-pip dos2unix
sudo pip3 install python-miio
Hat man den Token schon (war bei mir der Fall) kann man einfach die Funktion prüfen. 
Weiter unten habe ich die Ermittlung des Token für einen "jungfräulichen" Roboter beschrieben.
#ip Adresse und token ablegen um sich Tipparbeit zu sparen
export MIROBO_IP="<ip adresse - kein name>"
export MIROBO_TOKEN="<32 stelliger token>"
#Verbindung testen 
mirobo status

Firmware

Achtung: Dieser Vorgang ist auch zur zukünftigen Aktualisierung zu verwenden, mit der Xiaomi App würde man den gerooteten Zustand zerstören und muss von vorn beginnen! 
Eventuell kann man die Host IP Adresse wegfallen lassen.
hip="<primäre host ip adresse>"
wget https://vacuumz.info/download/gen1/stock_root/root_4028.pkg
mirobo update-firmware --ip $hip root_4028.pkg
Der Flash- und Installationsvorgang dauert einige Minuten, als Abschluss bootet der Roboter neu. Das vorgegebene Passwort steht auf der Webseite mit der Firmware. Bei einem Update wird das Passwort überschrieben.
Schlägt dieser Vorgang fehl, hat man eventuell vergessen den Update Schutz (weiter unten) wieder zu entfernen.  
ssh root@rockrobo
# Nach dem ersten Login neues root passwort setzen.
passwd
Der Sauger ist weiterhin in der App und in FHEM verfügbar. Was man sich dank des Tools mirobo noch gönnen kann, ist eine deutsche Sprachdatei, das wäre aber wohl auch ohne root gegangen!? 
(Alternativ gibt es Sprachpakete auch auf der vacuumz Seite)
wget https://builder.dontvacuum.me/pkg/voice-v1/de.pkg
mirobo install-sound de.pkg

Originale Firmware patchen

Dieser Teil der Beschreibung ist 2021 nicht neu getestet, ich verwende jetzt die fertige Firmware.
Was hier eigentlich passiert ist keine Magie: die Originale Firmware wird entpackt/entschlüsselt, der ssh Zugang wird freigeschaltet und anschließend wird das Firmware Paket wieder zusammengebaut und auf die Sauger geflashed. Dazu wird das Tool mirobo und ein flasher Script verwendet, man muss also selbst nicht viel tun.
Den gesamten Vorgang schreib ich mal ein einem Block mit ein paar Kommentaren. Achtung: Ich starte aus dem Login des normalen User Pi, ohne sudo su!
# ssh Key erzeugen, File bestätigen, Frage nach passphrase zweimal bestätigen (keine Passphrase!)
ssh-keygen -t rsa -b 4096 -C "RockRobo"
#Arbeitspfad erzeugen
mkdir dc && cd dc
#nur die drei Dateien laden und nicht das ganze Repository
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/flasher.py
wget https://raw.githubusercontent.com/dgiese/dustcloud/master/devices/xiaomi.vacuum/firmwarebuilder/adbd
# den Key ins Verzeichnis kopieren
cp ~/.ssh/id_rsa.pub .
Ab diesem Schritt muss man den Vorgang für jede zukünftige Firmware wiederholen.
Die alten Links funktionieren zum Teil nicht mehr. Mal hier schauen 
https://builder.dontvacuum.me/pkg    
#Bei mir ging dieser Link
wget https://cdn.awsde0.fds.api.mi-img.com/updpkg/v11_003468.fullos.pkg
#oder der
#wget https://dustbuilder.xvm.mit.edu/pkg/v1/3.3.9_003468/v11_003468.fullos.pkg
#Image erzeugen - der Vorgang läuft ein Weilchen...
sudo bash ./imagebuilder.sh -f v11_003468.fullos.pkg  -k id_rsa.pub -t Europe/Berlin
#Wenn alles Fehlerfrei lief kann man jetzt das Image flashen:
sudo python3 flasher.py -a IP-Adresse -t 32-Stellen -f output/v11_003468.fullos.pkg
Jetzt wird der Staubsauger automatisch neu starten und meldet sich mit seiner Melodie zurück. Danach kann man sich per ssh einloggen. Das geht beim ersten Mal nur mit dem Account (und dem Key) der das Kommando ssh-keygen (siehe oben) ausgeführt hat!

Was geht jetzt mit "root"?

  • ssh Login
  • Wlan Konfiguration ohne Reset
  • Token auslesen.
  • direkt auf dem Roboter Software installieren
  • Den Rockrobo aus der Cloud aussperren
  • die Karten sichern ...
printf $(cat /mnt/data/miio/device.token) | xxd -p
Wlan ohne reset ändern. Der Token bleibt dabei erhalten!
Der Inhalt der Datei wifi.conf entspricht ein bisschen dem Inhalt der Datei wpa_supplicant.conf. Quelle Ich arbeite gern mit nano, vi ist vorhanden und braucht nicht installiert zu werden.
apt-get update
apt-get install nano
nano /mnt/data/miio/wifi.conf
reboot
Damit man nicht mit der App ein update durchführt, kann man zur Sicherheit die Updates erstmal verhindern.
mv /usr/bin/ccrypt /usr/bin/ccrypt_
touch /usr/bin/ccrypt
chmod +x /usr/bin/ccrypt
Will man wie oben beschrieben die Firmware aktualisieren, muss man den Schutz vorher wieder aufheben.
rm /usr/bin/ccrypt_
mv /usr/bin/ccrypt_ /usr/bin/ccrypt

Kleines Zwischenspiel mit Folgen

Mir ist aus keiner der Beschreibungen im Internet so richtig klar geworden wie es "weitergeht"!
Was ist mit neuer Firmware? Es gibt eine Liste getesteter Firmware, aber welche ist gut, aktuell, neu?
Die Mi Home App hat mir ein Update angeboten, die Flole App hat andere Updates angeboten, was bedeutet denn fullos.pkg oder app.pkg? Das Update der Mi Home App (v11_003476.app.pkg) war nur 29 MB groß. Die Aufbereitung mit dem imagebuilder schlug fehl. Die Versionsnummer hatte einen "Sprung" 3.5.0 statt 3.3.9 - was soll man tun?
Ich war so mutig, habe die Updates wieder aktiviert und versucht: Damit war mein Root Zugang weg. Und nun? Es bleibt nur Factory Reset!
Es gibt drei Arten von Reset (neben einfach aus und wieder einschalten)
  1. WiFi Reset: beide Tasten auf der Oberseite (Home und Ein/Aus) drücken und Nachricht abwarten. Danach ist WiFi gelöscht und man kann den Sauger mit der Mi Home App neu anlernen.
  2. Reset: Taster unter dem Deckel mit Stift o.ä. drücken. Danach wird das System neu gestartet und WiFi ist gelöscht.
  3. Factory Reset: Home drücken und halten, Reset Taster mit Stift/Büroklammer drücken, Home weiterhin halten bis die Nachricht für Factory Reset ertönt. Danach ist softwaretechnisch der Auslieferungszustand erreicht. Die Logs über Verbrauch usw. scheinen erhalten zu bleiben.
Diesen Tipp habe ich gefunden aber nicht getestet: Man kann auch das Factory Image analysieren und rooten.

Rooten nach dem Auspacken/Factory Reset

Das ist eigentlich zu empfehlen, damit kommt man unkompliziert an den Token und kann das Wlan leicht verwalten. Das Anlernen an die App (falls man das will) macht man erst nach dem rooten.
Dafür braucht man jetzt einen Linux Rechner, den man mit dem offenen Wlan des Rockrobo verbinden kann. Und irgendwo stand: man darf kein zweites Netzwerkinterface haben. Also hab ich einfach Monitor und Tastatur an meinen schon vorbereiteten Raspberry Zero angesteckt.

Achtung! Der Rockrobo hat im AP Mode nicht all zuviel Leistung! Zum Flashen muss der Linux Rechner und der Roboter im gleichen Raum im Umkreis weniger Meter und in der Ladestation stehen!

Ich bin gewohnt Wlanverbindungen über die Datei /etc/wpa_supplicant/wpa_supplicant.conf einzurichten. Nach kurzem Test war klar: Geht universell und auch ohne WPA. Man muss die exakte ssid mit dem Befehl sudo iwlist scan scannen und dann die Datei so abändern.
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="rockrobo-vacuum-v1_miapF0C8"
        key_mgmt=NONE
}
Ich musste den Raspberry neu starten um die Verbindung mit dem offenen Wlan herzustellen.
In diesem Stadium gibt der Rockrobo seinen Token einfach so her. Der Befehl zum Test:
mirobo discover --handshake true
Auch der Flash Befehl geht etwas "einfacher" (der oben gezeigte mirobo Befehl sollte auch funktionieren):
sudo python3 flasher.py -f output/v11_003468.fullos.pkg
Nach dem Neustart und erfolgreichem ssh Login kann man entweder den Rockrobo direkt mit dem Wlan verbinden oder falls man die Mi Home App nutzen will, den Rockrobo mit der App einrichten.

Ein paar Zusatzinfos 

Ich habe auch mal probiert den Token (steht in /mnt/data/miio/device.token) selbst zu setzen, weil man vielleicht zu faul ist den in FHEM zu ändern. Dafür muss man ihn ins interne Format wandeln.
echo "44446e74695a4445713547644a79444d" |xxd -r -p
Man kann auch das interne root Passwort auslesen. 
Ich habe die Richtigkeit von diesem Code nicht überprüft.
perl -e 'print(join("", (map { chr(ord($_) ^ 0x37) } split(//, $ARGV[0]))), "\n");' `cat /mnt/default/vinda`

Für die Zukunft

Keine Updates über irgend eine App!
Auf der Webseite schauen welche Firmware getestet ist!
Eventuell Valetudo RE installieren oder neue Firmware flashen.

Keine Kommentare:

Kommentar veröffentlichen