Samstag, 29. August 2009

Das Root'en meines Samsung Galaxy

Pünktlich zum Wochenende habe ich mich dazu entschlossen, mein Samsung Galaxy nun endlich mal zu rooten. Die Motivation dafür war einerseits um mich mit WPA2-Enterprise WLAN Netzen zu verbinden und andererseits weil ich halt nun mal gerne root auf meinen Geräten bin ;-)

In etlichen Foren und Blogs findet man ja inzwischen auch schon diverse Anleitungen dazu wie's geht und nachfolgend habe ich mal kurz zusammengefasst, was dazu notwendig ist.

Vorab, ich übernehme keine Garantie auf alles was da jetzt steht bzw. die verlinkten Downloads. Wenn jemand sein Gerät brickt oder Daten verliert, ist er selber schuld. Und das rooten sollte meines Erachtens nur von Leuten durchgeführt werden, die wissen was sie tun und denen klar ist, was das für Auswirkungen aus das Handy hat!

1. USB-Verbindung zum Galaxy herstellen
Da ich hauptsächlich unter Linux (Gentoo) arbeite ist als erstes einmal eine funktionierende Debugging USB-Verbindung zum Galaxy herzustellen.

Die dazu notwendigen Schritte sind für die HTC Phones im Android Developer Guide auf http://developer.android.com/guide/developing/device.html erklärt.

Theoretisch klingt das einfach, nur praktisch hat man aber das Problem, dass sich das Galaxy mit einer anderen USB VendorId meldet. Wenn man das Galaxy per USB an einem Linux-Rechner ansteckt und lsusb eingibt sieht man folgendes:

Bus 001 Device 002: ID 04e8:6640 Samsung Electronics Co., Ltd

Auf der Android Seite ist aber die VendorId 0bb4 angeführt, die muss man für das Samsung also durch 04e8 ersetzen. Ist ja aber auch klar, weil Samsung gegenüber HTC ja ein anderer Hersteller ist.

Man muß also in /etc/udev/rules.d/51-android.rules folgendes eintragen:
SUBSYSTEM=="usb|usb_device",SYSFS{idVendor}=="04e8",MODE="0666"

Das im Developer Guide nachfolgend angeführte chmod a+rx /etc/udev/rules.d/50-android.rules ist zumindest bei mir unter Gentoo Linux nicht notwendig, da ist nämlich keine einzige udev-rule als ausführbar gesetzt.
BTW: Es ist auch ein kleiner Tippfehler im Developer Guide, weil einmal wird auf das 51-android.rules und dann wieder auf das 50-android.rules verwiesen.

Die udev Regel ist nun richtig gesetzt, im Samsung Galaxy muss man dann noch unter "Einstellungen->Anwendungen->Entwicklung" das USB-Debugging aktivieren und man kann das Galaxy anstecken.

Als nächstes sollte man testweise mit adb (Android Debug Bridge - ein Tool aus dem Software Development Kit von Android) eine Verbindung zum Galaxy aufmachen. Das adb findet man im SDK im Unterverzeichnis tools.
Bei mir folgte dann aber gleich die nüchterne Erkenntnis, dass ein adb devices nur die folgende leere Liste zurückliefert:

* daemon not running. starting it now *
* daemon started successfully *
List of devices attached

Tja, der Haken an der Sache ist, dass es im aktuellen SDK (1.5_r3) die Samsung VendorId noch nicht in die Liste der von adb unterstützen Vendoren geschafft hat. Das sieht man im Source-Repository auf http://android.git.kernel.org/?p=platform/system/core.git;a=history;f=adb/usb_vendors.c;hb=HEAD

Man könnte sich nun den aktuellen Sourcecode mit der bereits eingepflegten Samsung VendorId runterladen und sich das adb selber compilieren oder man verwendet bequemerweise das adb von http://floe.butterbrot.org/external/adb.gz , welches bereits das Samsung Galaxy unterstützt.

Sicherheitshalber macht nach dem Download noch ein md5sum adb.gz , das liefert 82727d3eb69452c50421f9f7196d5cf4 adb.gz zurück.
Danach ein gunzip adb.gz; chmod 755 adb und einen eventuell laufenden adb server prozess mit adb kill-server beenden.

Ein adb devices liefert nun folgendes zurück:
* daemon not running. starting it now *
* daemon started successfully *
List of devices attached
I7500bWHpbWGwO2 device

Teil 1 wäre nun geschafft, wir haben eine funktionierende USB Debugging Verbindung zum Galaxy.

2. Neues Recovery Image für den root-Zugriff flashen
Als nächstes muss ein spezielles Recovery Image geflasht werden, mit dem wir dann das Filesystem des Galaxy mounten können um darin die Änderungen für's rooten einzuspielen.

Dazu benötigt man das fastboot utility von HTC, welches auch mit dem Samsung Galaxy funktioniert. Den Download dazu findet man auf http://www.htc.com/www/support/android/adp.html

Weiters wird das Recovery Image von
http://www.receptorblog.com/wordpress/full-backuprestore-for-samsung-galaxy-with-nandroid/ benötigt. Einfach downloaden und unzippen.

Danach schaltet man das Handy aus und beim Einschalten drückt man gleichzeitig die "Call" und die "Power" Tasten, das sind die beiden Tasten ganz unten und hält sie gedrückt bis nach ein paar Sekunden das Fastboot Menü erscheint.

Das neue Recovery Image flasht man dann ganz einfach mit:
fastboot flash recovery recovery_gal_msdk.img

Nach dem fertigen Flash Vorgang ist kurz die Batterie herausuzunehmen und beim Einschalten des Galaxy sind die Tasten "Leiser" + "Call" + "Power" zugleich gedrückt zu halten. Nach ein paar Sekunden gelangt man dann in das neue Recovery Menü.

Im Recovery Menü kann man nun zum Beispiel mit nandroid ein komplettes System-Backup auf die interne SD-Karte ziehen oder wieder zurückspielen. Das ist hilfreich und beruhigt, ist für's rooten aber nicht unbedingt notwendig, da wir kein neues Image einspielen oder irgendwelche bestehenden Daten löschen/verändern.

3. SU einspielen, um den Anwendungen root-Zugriff zu geben
Das Galaxy ist nun noch immer im Recovery Modus und wir können mit adb shell eine root shell am Handy öffnen und in der Shell mit mount -o rw -t yaffs2 /dev/block/mtdblock1 /system das system Filesystem einhängen.

Wenn man dann ein ls -l /system/bin/su macht wird man feststellen, dass dort keine su Anwendung installiert ist. Diese wird aber von jenen Android Applikationen benötigt, welche bestimmte Kommandos als root auszuführen wollen.

Und was ich dann jetzt als nächsten Schritt in vielen Foren/Blogs gelesen habe, hat mich "gleich mal aus den Socken g'haut".

Man findet sehr oft die naive Anleitung, einfach per "cat sh > su; chmod 4755 su" sich das su zu erstellen, indem man eine Kopie der shell macht und sie auf setuid root setzt. Die kann dann jedermann aufrufen und somit ohne Kontrolle mit root-Rechten arbeiten.

Das funktioniert zwar prinzipiell, nur würde das wohl kein Unix-Admin jemals auf seinen Rechnern machen, warum sollte ich das dann auf meinem Handy machen, wo teilweise doch sehr sensible und persönliche Daten herumliegen und durch bestimmte Aktionen auch hohe Kosten für mich entstehen können.

Mit so einem trivialen su kann nämlich jede x-beliebige Anwendung unkontrolliert root-Rechte am Handy erlangen und dann zB. mit einem "rm -fr /" das Handy Rucki Zucki wipen oder ein Root-Kit, einen Trojaner oder ähnliches installieren.

Theoretisch wäre es so ja auch möglich, dass man über eventuelle Sicherheitslücken im Browser fremden Code von präparierten Webseiten aus in das Handy einschleust.

Ich denke mal, dass viele Anwender, die ihr Handy halt als Neugierde einfach mal rooten, gar nicht wissen, welche grosse Sicherheitslücke sie da aufreissen. In Summe finde ich das schon etwas leichtsinning, solche Vorschläge zu veröffentlichen bzw. blindlings zu befolgen.

Weitaus besser ist es da, sich ein su zu installieren, dass es dem Benutzer erlaubt zu kontrollieren, welche Anwendung das su dann auch ausführen darf.

Darüber haben sich da schon einige Leute Gedanken gemacht und eine auch für das Galaxy brauchbare Anwendung findet man auf:
http://forum.xda-developers.com/attachment.php?attachmentid=211569&d=1249225060

In dem ZIP-Paket sind 2 Files (su und Superuser.apk) enthalten, die man nun einfach wie folgt auf das Samsung kopiert (Zuvor mit exit wieder aus den adb shell aussteigen).

adb push su /system/bin/
adb shell chmod 4755 /system/bin/su
adb push Superuser.apk /system/app/
adb shell sync
adb shell reboot

Das war's dann auch schon, man hat nun ein su am Samsung oben, dass den Benutzer fragt, ob er der Anwendung den Zugriff erlauben oder verweigern will.

Testen kann man das ganze dann zum Beispiel damit, dass man sich aus dem Market das Widget “OverclockWidget(need Root)” installiert und am Home-Screen plaziert. Wenn man dort nun die Frequenzen ändert, ruft das Widget das su auf und es erscheint die "Superuser permissions" Anwendung, in der man den Zugriff auf das su erlauben kann.

Fazit
Das Rooten des Samsung Galaxy geht recht einfach - aber durch die weit verbreitete und verharmloste Version des Herstellens eines su durch eine Kopie von sh ist es wahrscheinlich nur eine Frage der Zeit, bis es die erste Schadsoftware gibt, die diese Lücke ausnutzt. Und dann wird diese Lücke wahrscheinlich dem Android Betriebssystem negativ angekreidet, obwohl sie nur durch den naiven Umgang von einigen Usern mit den Root-Rechten entstanden ist.