Sunday 6 August 2017

Supersu 2 66 Binäre Optionen


SuperSU APK SuperSU ist das Superuser Access Management Tool der Zukunft. SuperSU benötigt ein verwurzeltes Gerät. SuperSU ermöglicht die erweiterte Verwaltung von Superuser-Zugriffsrechten für alle Apps auf Ihrem Gerät, die root benötigen. SuperSU wurde von Grund auf gebaut, um einer Reihe von Problemen mit anderen Superuser Access Management Tools entgegenzuwirken. Features: 8211 Superuser-Zugriffsaufforderung 8211 Superuser-Zugriffsprotokollierung 8211 Superuser-Zugriffsbenachrichtigung 8211 Per-App-Benachrichtigungskonfiguration 8211 Temporäre Unroot 8211 Deep Process Detection (keine weiteren Unbekannten) 8211 Arbeitet in Recovery (nicht mehr segfaulting) 8211 Funktioniert, wenn Android isn39t richtig gestartet 8211 Arbeitet mit Nicht-Standard-Shell-Standorten 8211 Immer läuft im Ghost-Modus 8211 Wake on prompt 8211 Konvertieren auf System-App 8211 Komplette Unroot 8211 Backup-Skript zu überleben CyanogenMod nightlies 8211 Icon wählbar von 5 Optionen unsichtbar 8211 Theme auswählbar aus 4 Optionen 8211 Start von Dialer: 1234 oder 7873778 (SUPERSU) HINWEIS: Nicht alle Handys nehmen beide Codes. Bei einigen Handys musst du Single anstelle von Double verwenden. Die Pro-Version bietet zusätzlich: 8211 OTA-Überlebensmodus (keine Garantien) 8211 Vollfarbkodierte Befehlsinhaltsprotokollierung (Inputoutputerror) 8211 Pro-App-Logging-Konfiguration 8211 Per-App-Benutzer-Override 8211 Grantdeny Root zu einer App für eine bestimmte Zeitspanne 8211 PIN-Schutz 8211 Per-App-PIN-Schutz 8211 Anpassen des Auto-Deny-Countdowns SUPERUSER Dies soll Superuser (falls installiert) ersetzen, verwenden Sie entweder das eine oder das andere. Du kannst sie nicht kombinieren. Aussagen, dass diese Pausen Superuser sind daher völlig unsinnig. HINWEIS: EIN SPEZIELLE VERFAHREN IST FÜR DIE UNINSTALLATION BENÖTIGT. WENN SIE NICHT DIE APP MÖGEN, NICHT GERADE UNINSTALLIEREN SIE IHNEN WERDEN SIE WURZELN. Superuser Access Management läuft durch eine so genannte quotsu binaryquot. Es kann nur einer von ihnen zu einer Zeit geben. Also, wenn Sie SuperSU installieren, wird Ihre bisherige Superuser Access Management Lösung nicht mehr funktionieren. Also, wenn du zurückschalten willst: (1) Öffne diese Anwendung und suche nach einer Option, um sie zu installieren, um das Quoten-Binärnot zu installieren. (2) Bestätigen Sie root-use apps verwenden die Superuser-Lösung, die Sie wollen. (3) SuperSU deinstallieren IN-APP KÄUFE Diese sind völlig optional und eher Spenden. Sie entriegeln keine Funktionalität. Kontaktieren Sie uns: Website. Supersu Forum: forum. supersu Facebook: facebookSuperSU-1024576694301637 What8217s Neuer Benutzerhandbuch Installationsanleitung verbessert Kompatibel mit der neuesten Version von TWRP (benutzerdefinierte Wiederherstellung) FBE-Erkennung auf SU-Kernel verbessert Kompatibel mit Google Pixel Amp Pixel XL, sowie mehrere Marken mit dem Android 7.1 Systemversion installiert Sicherheit Log Agent hinzugefügt Samsung KNOX Erkennung SU Kernel aktualisiert (Kraft seclabel) Datenschutzerklärung hinzugefügtSuperSU -, Root-. SuperSU ROOT SuperSU, Wurzel. SuperSU,,,. : - - - - - - - - Android - - - - - -, CM - - -: 1234 oder 7873778 (SUPERSU):. . Pro: - OTA quotsurvival modequot () - () - - - - PIN - - PIN - SUPERUSER Superuser (),. . , Superuser. Aufrechtzuerhalten. APP,. , -. Quot. . SuperSU,. : (1),, quot. (2),,,,. (3) SuperSU IN-APP . : Supersu: forum. supersu Facebook: facebookSuperSU-1024576694301637 SuperSUFUKING SHIT BINARY, NEUES BINARY. KingoRoot RULES KingRoot - DAS IST PROGRAMM IST VOLLSTÄNDIG. 4,, 1000 , 20,,. : Baidu Root, KingRoot, Framaroot. ))) Wurzelprüfer))). . 1. Einleitung Seit ich SuperSU angefangen habe, habe ich viele Implementierungsprobleme eingeleitet. Probleme mit meinem eigenen Code in SuperSU, undokumentierte Kuriositäten in Android und Probleme in anderen Völkern Apps, die Wurzel erfordern. Im Laufe der Zeit habe ich eine Menge von Apps Quellcodes (oder umgekehrt die Binärdateien), um herauszufinden, die Wurzel der Probleme, und arbeitete mit verschiedenen App-Autoren (von der unbekannten zu den berühmten), um sie zu beheben. Aufgrund dieser Bemühungen hat sich herausgestellt, dass die meisten Einfrieren und Crashs im Zusammenhang mit su access - sowohl mit SuperSU als auch Superuser - aus zwei Kernproblemen stammen: wie su heißt und wenn su genannt wird. Diese Fälle sind nicht so einfach, wie sie klingen können. Ich wurde von einer Reihe von Entwicklern gebeten, diesen Leitfaden zu schreiben, um Richtlinien und weitere Informationen darüber zu geben, wie man all diese Probleme bekommt - und das ist es, was du liest. Da dies für alle Root-Apps wichtig ist, habe ich auch Adam ChainsDD Shanks (Autor von Superuser) gefragt, um dieses Dokument zu überprüfen, was er getan hat. Ich erwarte nicht, dass dies das letzte Wort in der Sache ist, oder dass die Code-Beispiele perfekt sein werden. Ich hoffe, dieses Dokument und der Code wird Ihnen die Einblicke benötigt, und im Allgemeinen ein guter Anfang sein. - Jorrit Chainfire Jongma, Autor von SuperSU 2. Code: libsuperuser Es gibt Quellcode, der dieses Dokument begleitet, in Form von libsuperuser GitHub (ein Bibliotheksprojekt mit wiederverwendbarem Code, um su zu nennen) und libsuperuserexample GitHub (ein Beispielprojekt mit dieser Bibliothek und Demonstriert einige Techniken, um su im Hintergrund anzurufen). Das Ziel dieser beiden Projekte ist speziell nicht, um eine perfekte Bibliothek Catering für Ihre Wurzel brauchen. Das Ziel ist es, Techniken zu demonstrieren, die du in deiner Root-App wiederverwenden möchtest, die bei häufigen Problemen umgehen, in so wenig Code wie möglich. Fortgeschrittene Techniken wie zum Beispiel die Aufrechterhaltung einer Hintergrund-Su-Session und die Verwendung dieser Sitzung, wenn nötig, sind nicht von diesem Artikel abgedeckt, um es einfach zu halten. Die Bibliothek enthält jedoch die Shell. Interactive-Klasse, um das zu machen. Der Code ist kurz, ich würde Ihnen raten, einfach die Quelle für beide Projekte zu lesen. Bitte beachten Sie, dass sich diese Bibliothek im Debug-Modus (unsigned APK) etwas anders verhält und zusätzliche Protokolle und Ausnahmen bietet. Einige Versionen des ADTs setzen den Debug-Modus nicht korrekt ein, wenn Sie die endgültige APK signieren und exportieren. Sie sollten auf jeden Fall überprüfen, dass Ihre exportierten APKs noch nicht alle Shell-Anrufe protokollieren, bevor sie sie veröffentlichen 3. So rufen Sie su 3.1 auf. Häufige Fallstricke Runtime. exec () und ProcessBuilder Es ist verlockend, Runtime. getRuntime () zu verwenden. Exec (su - c Befehl). Aber Sie sollten sich bewusst sein, dass Befehl ein einzelner Parameter sein sollte, und kann daher zitieren. Leider zitiert sowohl der Befehlsparameter als auch die Übergabe der paramater als separate Variablen an Runtime. exec () oder ProcessBuilder nicht konsequent über alle Android-Versionen hinweg, und so sollte dieses Konstrukt vollständig vermieden werden. Es ist nicht unmöglich, dies richtig zu machen - aber es gibt ein hohes Risiko von Problemen. Ausgeben eines Skripts für su zu laufen Als ein Workaround auf die oben genannten, haben verschiedene Root-App-Autoren zum Schreiben von Skripten und dann aufrufen su-c Patthoscript, um alle Befehle auszuführen. Dies vermeidet potenzielle Parameterübergabeprobleme, aber Sie erstellen eine nicht benötigte temporäre Datei und verlangen, dass Ihr beschreibbarer Pfad kein Leerzeichen enthält. Und während das letztere für den Augenblick wahr ist, ist es eine schlechte Idee, davon abzuhängen. Es können auch SELinux-bezogene Probleme mit dieser Methode (siehe SELinux Abschnitt unten). Schnelle sukzessive su Anrufe Der su-Aufruf ist eine teure Operation, und in der Regel beinhaltet ein bisschen Code ausgeführt werden, sowie IO durchgeführt wird. Es ist gute Praxis sowie gut für die Leistung, um Ihre Befehle zusammen so viel wie möglich zu batch. Starten Sie so wenige su-Prozesse wie Sie können, und führen Sie so viele Befehle pro Prozess wie möglich. Viele su Anrufe während der apps Lebenszyklus Einige Apps müssen eine Menge von Anrufen während der Anwendungen Lebenszyklus machen, aber cant Batch diese Befehle zusammen. In solch einem Fall sollten Sie in Erwägung ziehen, eine interaktive Su-Shell zu starten und sie lebendig neben Ihrer App zu halten, so dass Sie die Befehle an sie nach Bedarf bringen können. Dies könnte positive Auswirkungen auf die Leistung und Reaktionsfähigkeit Ihrer Anwendung haben. Hardcoded Checks Die Rights Management Anwendung ist nicht immer systemappSuperuser. apk. Der Paketname ist auch keine Konstante. Der su binarys location ist nicht immer systemxbinsu. Viele apps haben hartcoded checks wie diese zu finden su. Das ist eine schlechte Idee und völlig unzuverlässig. Angenommen, die su binary akzeptiert Parameter Nicht alle su Binaries unterstützen alle Parameter. Schlimmer noch, es gibt eine gute Chance, dass die Binärdatei eine interaktive Shell startet, anstatt einen Fehler zu erzeugen, wenn ein unbekannter Parameter vorhanden ist (der Parameter - v, um die Version zu überprüfen, ist ein gutes Beispiel dafür). Wenn du das nicht antizipierst, könnte dein Prozess niemals die Kontrolle über den Aufruf zurückerobern und könnte stecken bleiben. 3.2 Making the call Eine gängige Methode, um su aufzurufen, die die oben genannten bekannten Probleme vermeidet, ist die Erstellung eines interaktiven Shell - und Piping-Befehls. Dies geschieht durch den Aufruf von Runtime. getRuntime (). Exec (su). Und Abrufen von Ein - und Ausgabeströmen aus dem zurückgegebenen Prozessobjekt. Dies ist ein ziemlich geradliniges Stück Code, aber inklusive der Debug-Logs und prüft es ein bisschen lang, um hier zu reproduzieren. Der Kerncode befindet sich hier: libsuperuser. Shell. java GitHub Shell. run () ist ein generischer Aufruf zum Ausführen von Shell-Code, die folgenden spezifischeren (statischen) Utility-Funktionen sind die, die Sie wahrscheinlich am Ende mit: Die SH-Varianten werden für eine Nicht-Root-Shell verwendet, wo die SU-Varianten sind Für eine Root-Shell verwendet. Diese Anrufe geben ein ListltStringgt zurück, das die Ausgabe der Shell-Befehle enthält. Wenn es keine Ausgabe gab, ist die Liste leer, aber nicht null. Das Ergebnis ist nur null, falls ein Fehler aufgetreten ist, kann ein Zugriff verweigert werden. Diese blockieren Anrufe. Beachten Sie, dass bei der Debug-Kompilierung alle Shell-STDINSTDOUTSTDERR protokolliert werden, und diese Anrufe werden (absichtlich) Ihre App abstürzen, wenn sie aus dem Haupt-Thread aufgerufen werden. Der Grund dafür wird in Abschnitt 4 besprochen. 3.3. Überprüfung auf su-Verfügbarkeit Es gibt viele Möglichkeiten, um zu überprüfen, ob der Superuser-Zugriff verfügbar ist oder nicht. Die beiden beliebtesten Methoden sind entweder versuchen, die Existenz der su Binär-oder Superuser-Paket zu erkennen, oder tatsächlich versuchen, laufen und sehen, was passiert. Ich bevorzuge die letztere Methode, wie das Laufen ist, was du bist, egal woher es ist und wenn du es weißt, wie man es findet - solange das System tut. Als weiteren Test führen Sie den Befehl id aus, der die IDs des aktuellen Benutzers und der Gruppe ausdruckt, so dass Sie die Ausgabe verwenden können, um zu bestätigen, ob die Shell, die Sie gestartet haben, auch wirklich Root-Rechte hat (die Ausgabe enthält uid0). Ein Problem mit dem Befehl id ist, dass es von einer externen Binärdatei abhängt, die vorhanden sein muss Ich bin noch nie in die Situation gegangen, in der es nicht war, aber um sicher zu sein, dass wir auch einen Echo-Befehl ausgeben, den wir überprüfen, so dass, wenn der ID-Befehl nicht verfügbar ist, wir immer noch wissen können, ob eine Shell überhaupt ausgeführt wurde. Im letzteren Fall gehen wir davon aus, dass die Shell auch Root-Privilegien hat - wenn dies am Ende falsch ist, hat der Benutzer schlechtere Probleme als Ihre App nicht Root-Zugriff. Wenn du in diesem entfernten Fall eines falsch verwurzelten Gerätes absolut sicher sein möchtest, müsstest du auch eine eigene native Binärdatei mitbringen, um den Check durchzuführen. Natürlich, wenn Sie native Binärdateien sowieso enthalten, ist es sicherlich geraten, sie zu überprüfen, ob sie tatsächlich als root laufen, bevor sie etwas anderes machen. Libsuperuser Shell. java GitHub bietet die folgende (statische) Utility-Funktion, die diesen Test für Sie durchführt: Dies ist ein Sperrruf. 3.4 Checking für su-Version Während dies ist nicht etwas, was die meisten Root-Apps zu tun haben, und nicht alle su Binaries sogar dies zu unterstützen, könnte dies etwas, was Sie tun möchten. Beide (neuere) Superuser su Binärdateien sowie SuperSU su binaries unterstützen die Parameter - v (für Anzeige) und - V (für interne Vergleich), um die Versionsnummer zu überprüfen. Wie oben erwähnt, ist ein potentielles Problem, dass eine su-Binärdatei, die diese Parameter nicht unterstützt, stattdessen eine interaktive Shell starten kann. Ein Work-around für diese ist zu Pipe Ausfahrt zum su-Prozess, dies wird sicherzustellen, Ihre App wird die Kontrolle zurück von su. Libsuperuser Shell. java GitHub bietet die folgende (statische) Utility-Funktion, die diese Versionsnummern abruft (für die su binary, nicht das GUI-Paket) oder gibt null zurück, wenn nicht: Dies ist ein Sperrruf. 3.5 Mount-Namespaces Wenn SuperSU-Versionen 1.50 und höher im Daemon-Modus laufen (Android 4.3 und seltene ältere Android-OEM-Versionen mit SELinux setzen auf Durchsetzung), erhält jeder Prozess su Shell einen isolierten Mount-Namespace. Dies bedeutet, dass die in einer Su-Shell angewendeten Halterungen möglicherweise nicht für andere Prozesse sichtbar sind, außer (die meisten anderen Su-Shells, die von demselben übergeordneten Prozess gestartet wurden (Ihre App). SuperSU in diesem Fall versucht auch, die sdcards Halterungen und benutzerspezifische Halterungen zur su-Shell zur Verfügung zu stellen, die hoffentlich Ihre Arbeit erleichtert. Eines der Merkmale dieser Mount-Namespace-Isolation ist, dass es verhindert, dass Apps von jedem Besatzungsstopps stören, so dass Race-Bedingungen zwischen zwei Apps, die versuchen, die gleiche Mount zu manipulieren (Switching-System zwischen read-only und read-write wiederholt, zum Beispiel) nicht auftreten können , Und alle Arbeiten wie der App-Entwickler erwartet. Android selbst hat ähnliche Port-Namespace-Isolation für Apps aus Version 4.2 angeboten. SuperSU-Versionen 1.93 und höher unterstützen die --Mount-Master-Option, die (wenn sie im Daemon-Modus läuft) Ihre App mit einer speziellen Su-Shell verbindet, wobei die Mount-Befehle auf alle Prozesse angewendet werden. Wenn Sie einen Mount öffentlich anwenden müssen, verwenden Sie diese Option. 4. Aufruf von su 4.1. Wann soll man nicht anrufen Der Hauptfaden rufen Sie nicht su an, wenn Sie auf dem Hauptanwendungs-Thread laufen. Die Nummer Eins Grund für friert und stürzt ab, wenn Apps den Root-Zugriff anfordern, dass su aus dem Haupt-Thread aufgerufen wird. Du solltest den su-Befehl als gleichbedeutend mit einem blockierenden IO-Aufruf betrachten, wie z. B. Datenträger oder Netzwerkzugriff. Diese sollten nicht aus dem Haupt-Thread getan werden - in der Tat, auf neuere Android-Versionen, die Durchführung von Netzwerk-IO in der Haupt-Thread wird (absichtlich) Absturz Ihrer App, und im strengen Modus der Bildschirm blinkt rot, wenn Sie alle Festplatte IO auf Der Hauptfaden, um dich vor deinem Fehler zu warnen Blocking IO-Aufrufe auf dem Haupt-Thread sind schlecht, weil es völlig abhängig von externen Faktoren ist, wie lange der Anruf dauert. Der Anruf kann 100 Millisekunden, 30 Sekunden oder eine Stunde dauern. Auch wenn du denkst, dass ein kleiner IO-Befehl niemals mehr als ein paar Millisekunden dauern solltest, dann solltest du es immer noch nicht aus dem Haupt-Thread machen - du machst eine Garantie, die du nicht liefern kannst und vermutlich die Reaktionsfähigkeit deiner App reduziert. Wenn der Hauptanwendungs-Thread für diese seit mehr als ein paar Sekunden blockiert, wird vom System ein antwortansprechender (ANR) - Abschlag generiert. Weil der su-Aufruf ziemlich viel garantiert ist, um IO selbst zu blockieren und vielleicht sogar seine GUI zu zeigen und auf User-Input zu warten, kannst du keine Annahmen darüber machen, wie lange es dauern wird, bis der Anruf zurückkehrt, und so solltest du es niemals geben Nennen Sie es aus dem Haupt-Thread. Ich habe oft Beschwerden von SuperSU-Nutzern über den Countdown-Timer in der Root-Access-Anforderung Popup, die (zum Zeitpunkt dieses Schreibens) standardmäßig aktiviert ist, und wird automatisch verweigern Root-Zugriff nach einer Reihe von Sekunden. Der einzige Grund, warum dieser Timer gebaut wurde, ist, weil viel zu viele Root-Apps su aus dem Haupt-Thread aufrufen, und wenn das Popup nicht ausstehen würde und der Benutzer den Root-Zugriff nicht relativ schnell erteilen oder verweigern würde, würde die App, die Su-Zugriff angefordert hatte, abstürzen Mit einem ANR. Der Timer hilft, die Chancen des Geschehens zu reduzieren (aber nicht zu eliminieren), aber es ist nur die Behandlung von Symptomen, die Probleme nicht lösen. Eine Notiz auf einem Blocking-Aufruf Die meisten Möglichkeiten, um einen neuen Prozess zu starten, sind eigentlich nicht blockierend, und der untergeordnete Prozess läuft in einem anderen Thread. Allerdings nennen die meisten Beispiel - und Bibliotheks-Code Process. waitFor oder readwrite aus den Projekten STDIN, STDOUT oder STDERR Stream. All diese Möglichkeiten verwandeln den Code, der su in Blockiercode anruft und auf den su-Prozess wartet. Obwohl es tatsächlich möglich ist, su in einer nicht-blockierenden Art und Weise aus dem Haupt-Thread aufrufen, aber es ist einfach, Fehler zu machen, die Art und Weise, und es ist oft einfacher, einen einzigen Codeblock zu erstellen, der das Aufrufen von su (wie die Probe Shell. XX. run Code zur Verfügung gestellt) und führen Sie einfach aus einem anderen Thread. Es gibt jedoch Situationen, in denen das Aufrufen von su in einer nicht-blockierenden Weise ist eigentlich bevorzugt (wie halten eine su-Sitzung offen im Hintergrund und kontinuierlich lesen und schreiben von ihm). Der Beispielcode stellt die Shell. Interactive-Klasse zur Verfügung, die auf diese Weise aus dem Hauptfaden, Warteschlangenbefehlen und Empfangen von Rückrufen verwendet werden kann, aber wie diese Klasse zu verwenden ist nicht durch diesen Artikel dokumentiert (lesen Sie die Inline-Dokumentation im Quellcode stattdessen ), Um die Dinge einfach zu halten. BroadcastReceivers Die meiste Zeit BroadcastReceiver s läuft auf dem Haupt-Thread (etwas oft übersehen), und damit keine Blockierung IO Anrufe wie su sollte gemacht werden. Abgesehen von der Ausführung auf dem Haupt-Thread, kann der su-Aufruf selbst möglicherweise eine Absicht zur Kommunikation mit der GUI senden. Dies stellt ein Problem dar, weil die letztgenannte Sendung auf die vorherige Sendung warten kann, die es nicht tun wird, bis die onReceive-Methode abschließt, was wiederum darauf wartet, dass der Aufruf abgeschlossen ist. Dies führt zu einer ANR. Services Wie bei BroadcastReceiver sachen viele Entwickler zunächst, dass ein Basis-Service auch auf dem Haupt-Thread ausgeführt wird und somit auch anfällig für ANRs ist. Das heißt, es sei denn, Sie verwenden eine spezielle Service-Unterklasse (wie IntentService), die einen Hintergrund-Thread verwendet oder einen Hintergrund-Thread zum Service selbst hinzugefügt hat. 4.2. Ermitteln des Hauptfadens Erkennung, ob Ihr Code auf dem Hauptfaden läuft, wird in der Regel wie folgt durchgeführt: Vielleicht haben Sie diesen Code im Shell. run () Aufruf in libsuperuser bemerkt. Shell. java GitHub Wenn es erkannt wird, dass Sie auf dem Hauptthread laufen und das Android-Projekt im Debug-Modus kompiliert wird (BuildConfig. DEBUG true), wird eine Ausnahme ausgelöst und Ihre Anwendung wird abstürzen. Hoffentlich wird dies Sie davon überzeugen, versuchen Sie, Ihre Shell-Code in einem Hintergrund-Thread - und nicht zu entfernen, die Überprüfung 4.3. Verwenden von AsyncTask Die AsyncTask-Klasse wird häufig verwendet, um eine schnelle und einfache Hintergrundverarbeitung für relativ kurze Operationen durchzuführen. Sie können sicher von der AsyncTask s doInBackground Methode anrufen. Hier ist ein Beispiel für eine minimale Implementierung innerhalb einer Aktivität. Natürlich können Sie in der Regel einige Code vor und nach der Hintergrund-Task ausgeführt werden, wie das Anzeigen und Ausblenden eines ProgressDialog so dass der Benutzer weiß, dass eine Hintergrundaktion durchgeführt wird, und die GUI kann nicht verwendet werden, bis diese Aktion abgeschlossen ist: libsuperuserexample. MainActivity. java GitHub enthält ein grundlegendes Beispiel. Bitte beachten Sie, dass nichts perfekt ist und AsyncTask auch einige Probleme hat. Zum Beispiel wird die AsyncTask ausgeführt, bis es fertig ist, auch wenn die Besitzaktivität geschlossen ist, es sei denn, Sie rufen die AsyncTask-Abbruchmethode auf und behandeln diese in Ihrer doInBackground-Methode (indem Sie den abgebrochenen Zustand regelmäßig überprüfen und sicherstellen, dass die Methode unterbrechbar ist ). Beispielsweise kann der Benutzer, der das Gerät dreht, dazu führen, dass Ihre Aktivität geschlossen und neu erstellt wird, wodurch die AsyncTask neu gestartet wird, während die alte noch läuft. Das sind keine unüberwindlichen Probleme, aber wie bei jedem Werkzeug, das du benutzt, musst du wissen, wann, wie und wann du es nicht benutzt 4.4 Mit IntentService Während AsyncTask ist eine sehr nützliche Klasse, die Sie zweifellos oft beschäftigen, manchmal ist es einfach nicht das richtige Werkzeug für den Job. Zum Beispiel können Sie nicht direkt eine AsyncTask von einem BroadcastReceiver verwenden. Denn sobald die onReceive-Methode abgeschlossen ist, kann Ihr Prozess keine aktiven Komponenten mehr haben und kann daher getötet werden. Die richtige Sache für jede Blockierung IO - einschließlich su Anrufe zu tun - von einem BroadcastReceiver startet einen Service und läuft den Code von dort aus. Allerdings läuft ein Standard-Service tatsächlich auch auf dem Haupt-Thread, es sei denn, Sie machen die zusätzliche Arbeit, um Code in einem Hintergrund-Thread laufen. Die IntentService-Klasse ist jedoch eine einfach zu bedienende Service-Subklasse, die speziell für die Ausführung von Aufgaben (ausgedrückt durch Intent s) in einem Hintergrund-Thread entwickelt wurde und sich automatisch stoppt, wenn es nicht mehr funktioniert. Perfekt für Feuer-und-vergessen Stil Aufgaben. Viele Apps verwenden einen BOOTCOMPLETED BroadcastReceiver, um eine Verarbeitung nach dem Booten des Gerätes ohne Benutzerinteraktion durchzuführen - ein perfekter Fall für IntentService. Ihre AndroidManifest. xml-Datei wird damit beginnen, so etwas auszusehen, mit einem öffentlichen (exportierten) BroadcastReceiver und einem privaten (nicht exportierten) IntentService. Als nächstes erstellen wir einen sehr einfachen IntentService in BackgroundIntentService. java. Alles, was jetzt übrig ist, ist, diesen Hintergrunddienst von Ihrem BroadcastReceiver zu starten. In BootCompleteReceiver. java. Das ist alles da ist es - sobald du weißt, wie, es ist unglaublich einfach. Natürlich führt dieser IntentService nur eine einzige Aktion durch und nimmt keine Parameter an: libsuperuserexample. BackgroundIntentService. java GitHub enthält ein aufwendigeres Beispiel. Anstatt in deinem BroadcastReceiver auf dem Haupt-Thread zu laufen, läuft dein Code nun sicher in einem Hintergrund-Thread, ohne einen ANR-Crash zu riskieren. Es gibt aber einen kleinen Haken. Viele apps senden Toast s von ihrem BroadcastReceiver s - das ist ein bisschen schwieriger von einem Hintergrund-Thread wegen einiger kleiner Bugs im Android-Framework zu tun. Siehe libsuperuser. Application. java GitHub für einen Workaround. 5. SELinux SEAndroid 5.1. Einleitung SELinux ist kurz für NSA Security-Enhanced Linux. Und bietet eine feinkörnige Zugangskontrolle über die Grenzen der uidgid-basierten Zugangskontrolle hinaus. SEAndroid ist sein Android-Port, den dieser Artikel auch als SELinux bezeichnet. Es wird in einem von zwei Modi verwendet: permissive Modus, in dem Richtlinienverstöße protokolliert werden, aber keine Aktion ergriffen wird, und erzwingen Modus, in dem Politikverletzungen verhindert werden. SELinux ist auf Lager Android seit 4.3 (API Level 18, JELLYBEANMR2) im permissiven Modus und wurde in den Durchführungsmodus in Android 4.4 (API Level 19, KITKAT) umgestellt. Sie sollten jedoch nicht von diesen API-Levels abhängen, um SELinux Präsenz oder Modus zu erkennen, da es sogar noch einige 4.2 () Firmwares in der Wildnis gibt, mit SELinux eingebaut und auf Durchsetzung gesetzt. Und der viel häufiger Fall von 4.4 Firmwares, die im permissiven Modus laufen. 5.2. Was bedeutet das für dich Als Root-App-Entwickler musst du lernen, mit SELinux umzugehen. Sie müssen nicht wissen, alle Ins und Outs von diesem sehr komplexen System und die Richtlinien von Lager sowie OEM-benutzerdefinierte Builds verwendet, aber je nach Art der Root-App, die Sie machen, müssen Sie möglicherweise einige zusätzliche Zeit zu verbringen Testen auf verschiedenen Firmware und Geräten, um die Dinge zuverlässig zu machen. Um es noch schlimmer zu machen, ist SELinux ein bewegendes Ziel, wobei die Richtlinien zwischen Android-Versionen und sogar OEMs wechseln - die Richtlinien auf (z. B.) ein Samsung-Gerät kann sich deutlich von den Richtlinien auf einem Nexus-Gerät unterscheiden. Wenn SELinux auf den zulässigen Modus eingestellt ist, gibt es relativ wenig zu sorgen, aber wenn es auf die Durchsetzung gesetzt ist. Der Teil Ihrer App, der als root läuft, kann in alle möglichen unerwarteten Einschränkungen laufen. SuperSU-Versionen 2.11 und neuere aktiv Patch SELinux-Richtlinien von Android 4.4 an, Umgehung einer großen Anzahl von Problemen eine Root-App würde sonst in ein durchsetzendes System laufen. Von SuperSU-Versionen 2.23 an, bei weitem die meisten Fälle, die du für einen speziellen Code schreiben musst, werden von den neuesten Policy-Patches abgedeckt. Dennoch ist es gut, den Rest dieses Abschnitts zu lesen, so dass Sie wissen, wie es funktioniert, wenn Sie in einen speziellen Fall laufen. Beachten Sie, dass verschiedene benutzerdefinierte Kernel und Firmwares SELinux zurück zu permissive für Android 4.4 und neuer wechseln. Dies deaktiviert alle neuen Sicherheitsmerkmale, die SELinux bringt, anstatt nur die Bereiche zu entspannen, die wir unbedingt brauchen, um unsere Apps zu nutzen. Es ist selten für eine Root-App, weitere Patches auf die aktuelle SELinux-Richtlinie zu verlangen, jenseits dessen, was SuperSU bereits für dich tut, aber wenn es nötig ist, wird dafür eine API bereitgestellt. Es ist natürlich bis zu dem Benutzer zu entscheiden, ob SELinux permissive oder nicht sein sollte, aber es ist sicherlich gute Praxis, um sicherzustellen, dass Ihre Apps auf einem durchsetzenden System arbeiten. Es gibt eine Menge Erwähnung von verschiedenen SuperSU Versionen. Dies ist nur für Vollständigkeitssache aufgeführt, da viele Details zwischen dem ersten Release Android 4.4 Release und dem ersten Retail Android 5.0 Release geändert wurden. Android 5.0 Benutzer sollten als Version 2.23 oder neuer ausgeführt werden. 5.3. SELinux zu erkennen Während es wahrscheinlich weise ist, um sicherzustellen, dass Ihr Code läuft unabhängig von SELinux Präsenz oder Modus, manchmal müssen Sie erkennen, ob SELinux vorhanden ist und auf Durchsetzung gesetzt. Dies kann in der Regel durch das Lesen von sysfsselinuxenforce erfolgen. Das ist eine Welt lesbare Datei. 5.4 Kontexte 5.4.1. Grundlagen Der aktuelle SELinux-Kontext legt fest, welche Sicherheitsrichtlinien für Ihren Prozess gelten. Der höchste usermode-Kontext ist in der Regel u: r: init: s0. Im Gegensatz zu dem, was Sie erwarten können, bedeutet dies nicht unbedingt, dass dieser Kontext Zugang zu allem hat. Einige gemeinsame Kontexte, mit denen du in Kontakt kommen kannst: u: r: init: s0 - Höchste init usermode kontext u: r: initshell: s0 - Shell startete von init u: r: shell: s0 - Unpriviliged shell (wie eine adb shell ) U: r: systemserver: s0 - systemserver U: r: system: s0 auf einigen firmwares u: r: systemapp: s0 - System apps u: r: platformapp: s0 - System apps u: r: untrustedapp: s0 - Drittanbieter: r: supersu: s0 - SuperSU S eigenen Kontext, v2.79-SR1 auf Android 7.0 4 bis 9 kann mit SuperSU s - cn - Kontext Option verwendet werden. Mit v2.60 auf Android 5.0 können alle Kontexte mit dieser Option umgeschaltet werden. Die Standardrichtlinien, aus denen diese Kontexte bestehen, finden Sie unter externalsepolicy in Ihrem Android-Quellbaum. Beachten Sie, dass OEMs dazu neigen, diese Richtlinien zu ändern, und diese Richtlinien ändern zwischen Android-Version. Um die Kompatibilität zu gewährleisten, sollte Ihre App bei allen API-Revisionen getestet werden, und wenn möglich auf Flaggschiff-Geräten von allen großen OEMs - wenn Sie dies nicht selbst tun können, hängen Sie von Ihren Core-Benutzern ab. 5.4.2. Init vs initshell vs shell vs supersu Auf Firmwares, die SELinux verwenden, wird su in der Regel als Proxy zu einem von init begonnenen Daemon implementiert. Es ist wichtig zu beachten, dass su-Shells als u: r: init: s0 laufen können. U: r: initshell: s0 oder u: r: supersu: s0. SuperSU selbst sollte immer als u: r: init: s0 oder u: r: supersu: s0 wenn SELinux auf die Durchsetzung gesetzt ist. Aber nicht alle Superuser-Shells. Es gibt verschiedene Möglichkeiten, um Kontexte zu wechseln, für diesen konkreten Fall Umschaltung von u: r: init: s0 zu u: r: initshell: s0 kann durch das Starten eines zweiten sh durchgeführt werden (achten Sie darauf, mksh nicht zu verwenden, da es veraltet ist) . Wenn du einen Befehl hast, der als u: r: initshell: s0 ausgeführt werden muss. Wickle einfach den Befehl in sh - c ein. Befehl. . Um sicherzustellen, dass es tut. Adb verwendet die u: r: shell: s0 context, die sehr unterschiedliche politiken hat. Sei vorsichtig, sie nicht zu verwirren 5.4.3. Warum Switch-Kontexte Sie fragen sich vielleicht, warum - wenn bereits als init-Kontext ausgeführt wurde, als Root-Benutzer und mit SuperSU aktiv patching SELinux-Richtlinien - müssen wir noch Kontexte wechseln Wenn auf einem erzwungenen System mit SuperSU laufen Sie den su-Befehl, Du kommst ja in einer völlig uneingeschränkten Schale. Abgesehen von Lowlevel Manipulationen, die durch den Bootloader und TrustZone (verschiedene Geschichten insgesamt) eingeschränkt sind, gibt es nichts, was man in dieser Shell nicht machen kann. Android als Ganzes ist ein komplexes System, das eine Reihe von Prozessen umfasst, die als unterschiedliche Benutzer und unterschiedliche Kontexte laufen. Die SELinux-Richtlinie definiert die Regeln für Übergänge und Kommunikation zwischen all diesen. Nur weil es keine Einschränkungen für unsere Schale gibt, bedeutet das nicht, dass keine Beschränkungen für andere Prozesse gelten, mit denen wir umgehen müssen. SELinux-Richtlinien sind nicht bidirektional, also auch wenn wir mit anderen Prozessen reden können, können diese beschränkten Prozesse nicht in der Lage sein, mit uns zu sprechen. Die Lösung ist, uns zu verkleiden, damit diese Prozesse mit uns sprechen können: Umschalten von Kontexten. Natürlich konnten wir auch diese anderen Prozesse von ihren SELinux-Ketten befreien, aber die Niederlassung dieser Strecke wird schließlich endgültig alle Sicherheitsvorteile, die SELinux bringen kann, völlig verneinen. Die Linie muss irgendwo gezogen werden, und für SuperSU ist die Linie auf der Grundlage der Notwendigkeit gezeichnet worden. Es ist nicht nötig, SELinux-Richtlinien für diese Befehle weiter zu entspannen und damit die SELinux-Richtlinien nicht weiter zu entspannen, auch wenn es für die Root-App-Entwickler eine leichte Unannehmlichkeit gibt. 5.4.4. So wechseln Sie Kontexte Es gibt mehrere Möglichkeiten, um Kontexte zu wechseln. Manchmal führt die Ausführung einer bestimmten Binärdatei automatisch einen Schalter aus (wie von u: r: init: s0 zu u: r: initshell: s0 durch Ausführen von sh von init). Die meiste Zeit müssen Sie eine explizite Form der Kontextumschaltung machen. Der Befehl runcon (verfügbar in der Toolbox seit Auswahl von Android 4.1) führt einen Befehl als das bereitgestellte Kontextargument aus, vorausgesetzt, dass Sie diesen Kontextübergang zulassen dürfen. Der Run-as-Befehl (verfügbar ab Android 2.2.3) wird in ähnlicher Weise ein bestimmtes (Nicht-System-) Paket und seinen Kontext nachahmen. Leider können diese beiden Befehle in der Regel nicht davon abhängen, da sie nur unter sehr spezifischen Umständen arbeiten und somit die SuperSU-Versionen 1.90 und höher den - cn - oder --context-Parameter unterstützen, um Ihre su-Anrufe in einem bestimmten Kontext auszuführen. Siehe die Shell. SU. Shell () Aufruf in libsuperuser. Shell. java GitHub auf, wie man einen interaktiven Shell-Befehl mit dieser Syntax zu konstruieren. Im Moment, nur SuperSU unterstützt dies, aber (bitte lass es mich wissen, wenn sich diese Situation ändert, wie ich es erwarte). SuperSU-Versionen 1.97 und höher sind für Android 4.4 Kompatibilität dieser Funktion erforderlich. Der u: r: systemserver: s0. U: r: systemapp: s0. U: r: platformapp: s0. Und u: r: untrustedapp: s0 Kontexte werden derzeit ab v1.97 unterstützt und v2.00 fügt u: r: shell: s0 ands u: r: recovery: s0 (falls vorhanden). Mein Rat ist, die untrustedapp Variante zu benutzen, wo immer möglich, da es das am wenigsten privilegierte ist und das wahrscheinlichste, um langfristig zu bleiben. Wenn Sie Probleme haben, versuchen Sie die Systemapp-Variante. Beachten Sie, dass die Systemserver-Variante bereits nicht auf allen Geräten da draussen funktioniert, also verwenden Sie es nur, wenn Sie unbedingt brauchen und es gut testen. Bitte beachten Sie, dass die Option - cn - context so ausgelegt ist, dass sie unabhängig von Plattformversion und Status arbeitet. Ist SELinux nicht vorhanden oder auf zulässig eingestellt. Der Befehl wird einfach als der u: r: init: s0-Kontext ausgeführt. 5.4.5. Wann man Kontexte umwandelt Kontextumschaltung ist ein komplizierter Prozess, und ich empfehle, es sparsam zu benutzen. Nicht nur gibt es eine Reihe von Prozessen, die Eingabe - und Ausgabe-Handhabung erfolgt auch anders als andere Befehle, die durch su ausgeführt werden. Seien Sie nicht überrascht, wenn Sie eine Adb-Shell zum Testen verwenden, wenn Ihre Terminal-Eingabeaufforderung verschwindet - der Kontext, den Sie gerade umgeschaltet haben, unterstützt keinen Terminalzugriff als Beispiel. Sie müssen herausfinden, für was genau funktioniert nicht wie die u: r: init: s0 Kontext und erfordert einen Kontext wechseln, gibt es keine Liste der problematischen Befehle. Traditionell sollten alle Befehle, die Java-basierten Code starten, jedoch als einer der App-Kontexte ausgeführt werden, obwohl viele von ihnen funktionieren, ohne dies zu tun. Als ein (seltsames) Beispiel können wir die interne SD-Karte abwischen, das Paket com. example. app deinstallieren und den Dalvik-Cache abwischen. Die folgenden Befehle würden alle zu einer su-Shell geleitet und damit als root laufen: Interessante Bits zu diesem Beispiel: su wird wieder von einer su-Shell aufgerufen, um das Risiko zu minimieren, in Beschränkungen für die anderen Befehle zu laufen, und ein Kontext-Schalter ist nur Getan, wenn nötig U: r: systemapp: s0 wird anstelle von u verwendet: r: untrustedapp: s0 da letzterer darf nicht erlaubt sein, eine App zu deinstallieren. Der Eingangsstrom der Kontextumschaltung su-Shell wird aus Devnull geleitet. Um zu verhindern, dass dieser Befehl alle Daten im Eingabestrom verschlingt (aufgrund der IO, die mehrere Prozesse durchquert) und damit das Wischen des Datadalvik-Cache verhindert wird. Dies ist nur bei ausgewählten Umständen erforderlich: Wenn Sie Befehle an die su-Shell übergeben, und Sie den nächsten Befehl senden, bevor Sie auf das Ergebnis des vorherigen Befehls warten. Anmerkung: Dieses spezifische Beispiel ist eigentlich nicht mehr von SuperSU ab Version 2.23 relevant, da der pm-Befehl nun aus dem u: r: init: s0-Kontext arbeitet, aber es zeigt immer noch, wie genau man Befehle als einen anderen Kontext ausführen kann, falls nötig entstehen. 5.4.6. Dateisystem - und Socket-Kontexte Vorherige Erwähnungen der Kontextumschaltung haben Prozesse angewendet. Dateisystemobjekte und Steckdosen haben aber auch einen SELinux-Kontext. Im Falle des Dateisystems können diese jederzeit mit dem Toolbox chcon-Befehl einfach geändert werden. Sockets sind jedoch eine andere Sache - ihr Kontext kann so ziemlich nur gesetzt werden, wenn die Sockel erstellt wird. Zum Beispiel, wenn Sie Ihren eigenen Dämon-Service schreiben, kann es der Fall sein, dass Sie zwischen zwei Kontexten kommunizieren, die normalerweise nicht auf alle Sockets zugreifen können. Sie könnten den Dämon aus einem anderen Kontext starten, aber das kann zu anderen Problemen führen. Eine weitere Möglichkeit besteht darin, den Kontext des Sockets auf etwas zu ändern, das beide Prozesse verwenden können. Dies kann über procfs erfolgen, wie unten aufgeführt. Setzen Sie den Kontext kurz vor dem Erstellen des Sockets und legen Sie ihn danach zurück. 5.4.7. Direkte Kontextmanipulation Sie können verschiedene SELinux-Kontexte für Ihren Prozess direkt über procfs manipulieren. Siehe procselfattr. Ebenso können globale SELinux-Einstellungen über sysfs zugänglich sein. Sysfsselinux Bei weitem die meisten Root-App-Entwickler sollten niemals auf diese manuell zugreifen müssen. 5.5 Richtlinien 5.5.1. Das supolicy Werkzeug Das supolicy Werkzeug kommt mit SuperSU Versionen 2.11 und läuft auf 4.4 und neuere Firmwares. Seine Hauptanwendung ist es, die aktuelle SELinux-Richtlinie zu ändern, obwohl sie auch andere Funktionalitäten bereitstellt (die außerhalb des Umfangs dieses Dokuments liegen). SuperSU führt das supolicy-Tool aus, wenn der Daemon zum Booten gestartet wird. Danach läuft es alle ausführbaren Dateien in su. d. Und ruft setprop supolicy. loaded 1. Die supolicy Befehle --live Parameter patches die aktuelle SELinux Politik mit den Kernpatches für SuperSU. Und alle zusätzlichen Änderungen, die Sie auf der Befehlszeile hinzufügen. Patching und Nachladen SELinux-Richtlinien ist ein sehr teurer Anruf und sollte so wenig wie möglich durchgeführt werden. Verfolgen Sie, wenn Sie Ihre Patches mit einem statischen Boolean ausgeführt werden, wird empfohlen, da das seinen Zustand zwischen App-Starts behalten wird, solange Android Ihre App nicht vollständig aus dem Speicher löscht. The --live parameter takes as many policy statements (explained further below) as you can throw at it, as long as you do not exceed the maximum command line length - which is guaranteed to be gt 4096 bytes. Each policy statement needs to be within a single parameter, though, so you need to wrap them in quotes. You may separate multiple policy statements inside the quotes with a semicolon or simply use multiple quoted parameters. Dividing the patches into multiple supolicy calls is possible, but due to the expensive nature of the call, should not be done unless you have a very good reason to. Once the call returns, the policies are active. It should further be noted that having to patch policies is extremely rare. Ninetynine out of a hundred times you can accomplish what you want to do without patching any policies, so please thoroughly investigate if you need to patch policies at all. There has been some debate whether or not policy patching needs a special popup or notice in SuperSU . This is not happening because there is nothing special about patching policies. Any process running as root in the u:r:init:s0 context can do it, so if an app has been granted root, they could use their own code to patch the policies rather than using the supolicy tool, and the end user still wouldnt know about it. As a compromise, the supolicy tool does log all policy patches to the Android logs (logcat). 5.5.2. Default patches Aside from various small policy patches that open various communication paths between the su processes, the major changes to the stock policy supolicy makes is making init . initshell (v2.22), and recovery permissive . The logic behind this is that aside from su and the init and recovery processes themselves, nothing should be running as these contexts, so were not making anything else more exploitable than it already was (contrary to turning the entire system permissive ). If youre wondering why were not using the AOSP-standard su context, that is because it is filtered out on many retail firmwares. Starting v2.79-SR1 on Android 7.0, instead of the modifications listed above, everything related to SuperSU runs in its own supersu context instead. The init context is only modified enough to let the daemon switch to the supersu context as needed. 5.5.3. Use caution Relaxing security measures in theory always opens up a hole somewhere. The severity of such a hole must be carefully considered before making any changes - it is quite easy to open up major holes. As a rule of thumb, if youre adding allow policies with an app class as either source or target class, youre very likely to be doing something you shouldnt, and you should tread carefully. 5.5.4. Audits On most firmwares, if you try to do something that is blocked by SELinux, an audit message appears either in dmesg . logcat . or a log file somewhere on data. You can use these to track down policies you may need to patch, or at least to get hints where your apps problems lie. Note that audit messages are also produced for permissive contexts, even though nothing is really blocked. If something is not working as expected in your root app, audit messages are the first thing you should check. A typical audit message may look like this (example from StickMount ): The sdcard process, with source context u:r:sdcardd:s0 does not have the getattr permission (of class dir ) on an object ( datamedia0usbStoragesda1 ) with the u:objectr:unlabeled:s0 context. The four variables you need to read in this line are: source class: sdcardd (scontext. ) target class: unlabeled (tcontext. ) permission class: dir (tclass. ) permission: getattr ( ) 5.5.5. Allow The above example is from StickMount . a root app that allows you to mount USB sticks to a subdirectory of your internal storage. All internal storage reads and writes from 3rd party apps go through the sdcard daemon process, that runs in the sdcardd context. Most mounts are uneventful, as when you mount storage, you can tell the system which security label (context) to use for the files. However, if a filesystem is not supported by the kernel itself (in this case, exFAT on a Nexus 9), the filesystem needs to be mounted via FUSE, which may not support setting a security label. And thus, the files show up as unlabeled . which the sdcardd context is not allowed to touch. When we try to access the mounted directory with a file explorer, the audit message stated above is generated. What we want to do now is craft an allow policy statement that will fix this issue. We can do so without too much risk, as unlabeled files are not supposed to exist anywhere else on the system, and only sdcard runs as the sdcardd context (its not like were patching untrustedapp . which should generally be avoided). Allow policy statements take these form (if youre familiar with. te source policy files, its very similar): source-class . target-class . and permission (so not permission-class ) can be collections, as denoted by curly brackets: This is expanded to: In our example case, the allow statement becomes: And it can be applied like this: Trying again to access our mounted directory with a file explorer, results in the following audit message: Another missing permission ( read ) of the same class ( dir ), so we update our policy statement to: We can continue this process for some time, and well end up with a list of policies we need to patch. In this case, you might just want to add all permissions of class dir (and as you would later discover, file as well). But how do you find these You can go through the externalsepolicy folder in your AOSP source tree, which lists them all, or you can use the supolicy --dumpav command, which lists all current policies, and steal the permissions from there. In the end, these are the policies being applied by StickMount . 5.5.6. Other policy statements The other policy statements supported by supolicy at this time are: All parameters may be collections, aside from the permission-class parameter. The permission parameter may be to select all (v2.79-SR1). It is highly unlikely you will ever need any statement other than allow for anything other than testing purposes. That being said, should you come up with a valid reason to use any of these, then it is still advised to only use the statements that relax security ( allow . permissive . attradd ) rather than further enforce it ( deny . enforcing . attrdel ). With the latter, you may inadvertently break other root apps running on the device. If you are reading from the externalsepolicy folder of your AOSP tree, it is also worth noting that neverallow rules are a compile-time thing and these do not show up in the policy files. SELinux denies by default, and only allow s what you explicitly state should be allowed. Many of the source statements use collections that are ultimately expanded to a large set of rules. The neverallow statement just makes sure that if a certain allow statement exists, it is removed. The neverallow statement is not stored or applied in the resulting policy file. Theres no need to counter these other than allow ing whatever your app needs. 6. Embedding 6.1. Files All the files you need are in the latest SuperSU flashable ZIP. The latest stable build can always be retrieved from my server. for the latest beta release you need to check the beta thread in the SuperSU forums. The installation script inside the ZIP is META-INFcomgoogleandroidupdate-binary . This is not a binary as the name suggests, but a shell script, and the standard update ZIPs updater-script file is just a dummy. This script has comments which document which files go where on which API level, and what their file permissions, ownerhips, and security labels must be. If you have done this exactly right, SuperSU will not complain when you open the app after booting. 6.2. Custom ROMs It is non-trivial to include SuperSU exactly right on your own. It is therefore often easiest to include the latest SuperSU ZIP inside your own flashable ZIP, and chain its installation. Adding the latest SuperSU zip as supersusupersu. zip in your ROMs ZIP and appending the folowing lines to the end of your updater-script will do just that: An example ZIP can be downloaded here. which installs SuperSU v2.30 from inside the ZIP, tested with TWRP 2.8.2.1 on a Nexus 9 running Android 5.0. Additionally, you should see the section about the supolicy tool. as it describes which properties are set and which scripts are called after SuperSU is done patching policies, and root calls are from the unrestricted init context. 6.3. Exploits Over the past years, many exploits have installed SuperSU as their means of persistent root. Often the exploit leaves the system in an unstable state, and a proper and lengthy installation may not be possible. The APK can fix a partial install as long as basic root works. At the time of this writing, that means at least these files need to be present, and for the right architecture and amount of bits for the firmware (see the ZIP script for permissions and API levels): systemxbinsu systemxbindaemonsu systemxbinsupolicy systemlib(64)libsupol. so Furthermore, daemonsu --auto-daemon needs to be launched somehow on boot. This is generally done via install-recovery. sh . 99SuperSUDaemon . or hijacking appprocess(3264) . Alternatively, you can include the ZIP and run SuperSUs installation script. For this to work, at the time of this writing, the following commands need to be available on the PATH: Additionally, sh needs test support ( square brackets work in if statements). Aside from unzip . all of these should be present on a fully booted 4.3 Android device. If not, you can provide a (SELinux capable) toolbox or busybox and symlink these commands somewhere on the PATH. Last but not least, tmp should be writable. If all of these dependencies are met, you can install the ZIP as follows: Due to the script trying things in various ways to support different systems and recovery versions, it will throw errors at you regardless of if the installation is succesfull or not. Just ignore those, reboot, and see if the SuperSU GUI complains when you open it. X. Updates X.1. Gobbling On December 17 2012, libsuperuser GitHub has been updated with Gobblers to consume STDOUT and STDERR. These are nothing more than background threads that consume STDOUT and STDERR output as fast as possible. The exact how and why is a long story (if interested, read When Runtime. exec() wont JavaWorld ), but this avoids potential deadlocks when excess output occurs on STDOUT or STDERR. If you are using my library please make sure you are running the latest version. If youre not running my library it may be wise to read the linked article and see if there is a problem with your code. X.2. Full content logging SuperSU has a feature to log all su command content. While this works fine for most apps, some apps can run into unexpected problems when this feature is used. One example is terminal emulators - these will not show the command prompt if a su shell is started. SuperSU v0.97 (released November 29 2012) and newer support a way to let SuperSU know your app does not function well with full content logging enabled. If you use this method, SuperSU will not enable full content logging for your app if SuperSU has only been configured to log by default . If the user goes into app-specific configuration, the user can still enable full content logging for your app manually . The user will in that case be presented with a warning. To let SuperSU know your app is not fully compatible with full content logging, add the following to an Activity . Service . or BroadcastReceiver . Adding it to a single Activity . Service . or BroadcastReceiver . is enough to get the entire package excluded from full content logging. There is no need to add it multiple times. Please note that I will not tolerate abuse of this feature. Full content logging is there for the end-user, and it should not be disabled this way without good reason. I may resort to blacklisting your package from root access altogether if you purposely abuse this. As far as I know, since SuperSU v1.39 (released July 3 2013), there are no longer any issues with full content logging and certain apps. As such, this section may be obsolete. X.3. Parameters for su SuperSU originally took its parameter parsing from ChainsDDs Superusers su binary. On January 11 2012 modifications regarding parameter parsing were pushed to ChainsDDs GitHub fc7479fab2 GitHub. SuperSU has virtually identical updated parameter parsing from v1.00 . While this does allow for some interesting constructs in calling su . you must be aware that not all constructs possible with the original parameter parsing will be interpreted in the same way with the new parameter parsing. I would also like to point out specifically that (1) the command to execute, following the - c or --command parameter, should be a single parameter . (2) that parameter is not even supported by all su variants available in the wild, and (3) the most reliable way to execute commands as root still remains starting su as a shell and piping commands and output. Some su variants on some devices do not support anything else than being started as an interactive shell. Exact parameter parsing of the more functional su binaries differs by author and by version, sometimes very subtly. The older the version of Android your app can run on, the higher the chance of running into an exotic or incompatible su binary. Youd be surprised what your app can run into in the wild. As such, in my personal opinion, it is always wisest and most compatible to simply run su as an interactive shell and pipe commands and output. If you must deviate from this, you should at least thoroughly test your app with (1) the most recent Superuser, (2) a Superuser (and binary) from 2011, (3) SuperSU v0.99 or older, and (4) SuperSU v1.00 or newer. X.4. ACCESSSUPERUSER permission DEPRECATED Due to changes in Android 5.0 Lollipop, this permission has been deprecated and is completely ignored from SuperSU v2.30 onwards From SuperSU version 1.20 and onwards, the android. permission. ACCESSSUPERUSER permission is declared by SuperSU. All root apps should from now on declare this permission in their AndroidManifest. xml . If this permission is not present, SuperSU will present a warning in its superuser request popup (this is configurable in SuperSU settings). At the time of this writing this permission is not enforced, but it is expected that sometime in the future it will be, and apps requesting root that do not have this permission set will be silently denied. If this permission is declared, the user will be able to see in the app permissions list that the app requests superuser access. X.5. Tapjacking protection and overlays SuperSU v2.04 has introduced tapjacking protection to the superuser access prompt. This protection is used in many security-related dialogs in Android. What it comes down to is that the popup will not react to input of it is obscured by any other activity, view, overlay, etc. This prevents a malicious app from displaying a touch-transparent image on top of the popup that would for example switch around the accept and deny buttons. There are however some legitimate uses for overlays, a common use for them is to adjust display colors. An app displaying such overlays should hide the overlay when the SuperSU popup becomes visible, and show it again. To facilitate this, SuperSU will send a broadcast to apps that have previously been granted root access . So an app like this should indeed disable its overlays and request root access when it is first launchedconfigured, even if it does not require root The following BroadcastReceiver can be used to receive information on when to hide overlays. See libsuperuser. HideOverlaysReceiver. java GitHub for a base class explaining the details. Starting v2.22, after supolicy is called to patch SELinux policies, all executables in the systemsu. d and susu. d are executed. Both the directories and the containing scripts and binaries should be chmod 0700 . Some firmwares have a similar feature in system(etc)init. d . though execution of those scripts is both kernel-dependent and they may run before the SELinux policies are patched andor su is available. Starting v2.76, these scripts are executed before zygote is started, and are thus in time for most bind-mount purposes, unless the scripts run too long. These are the guarantees made for su. d . All SELinux patching is complete before su. d scripts are executed All scripts inside su. d are executed in alphabetical order (0-9a-z) Scripts are run serially. The next one in order is not started until the previous one has finished. Boot does not proceed until all scripts have been executed unless your boot image does not support exec (very rare) unless scripts run longer than the timeout (4 seconds originially, 60 seconds since v2.78-SR1) As the scripts are run serially, if your script does not need to delay the boot process, the script itself should make sure its actions are run asynchronously. For example: This example is for systemless root, which should use subinsush as shell interpreter. The () parenthesis cause a sub-process to be created that runs the commands inside them. The amp ampersand following the closing parenthesis causes this sub-process to run asynchronously. This allows all the other scripts in su. d to continue running and for boot to continue. echo done will be called after 5 minutes, at which time Android has probably long been up and running.

No comments:

Post a Comment