daily.out

2013-03-13 Versteck-Spiel

Kürzlich war die App HiddenApps im iOS-App Store verfügbar. Sie hatte jedoch Features, die sie in ihrer Beschreibung verheimlichte, und flog allein deshalb schon wieder raus. Außerdem pfuschte sie am Home-Screen herum, indem sie indirekt beim Beseitigen von App-Icons half. Ferner hat sie zwar vorhandene, aber nicht auf dem Home-Screen verlinkte Apps, indirekt aufgerufen.

Ich habe mir die Features dieser App angesehen und konnte alles mit einfachen Bordmitteln reproduzieren:

iAds Opt Out

Apple erlaubt den Benutzern ein iAds-Opt-Out.

Nach dem Aufruf des Apple-Links sieht das iPhone so aus:

iAds Opt Out Screen 1

iAds Opt Out Screen 2

Mit derselben URL kann man auch wieder ein Opt-In machen. Wie man sieht, ist das alles weder geheim noch Hexerei.

Field Test

Mit der Field Test.app kann man die Stärke des Funksignals und verschiedene andere Dinge prüfen. Wenn man die App aufgerufen und über den Home-Button wieder verlassen hat, dann kann man mit einem Touch oben links auf das Empfangsstärke-Symbol zwischen der gewohnten graphischen und der numerischen Darstellung umschalten. Große negative Zahlen nahe an -100 zeigen schlechten Empfang, Werte nah an -80 hingegen guten.

Field Test Screen 3

Alles, was man tun muß, um die App aufzurufen, ist *3001#12345#* zu wählen:

Field Test Screen 1

Und schon ist man in der Field Test.app und freut sich wie Bolle, was man doch für ein Über-Hacker ist:

Field Test Screen 2

Nach meiner Erfahrung verschwindet das Umschalt-Feature nach erneutem Aufrufen derselben App. Ansonsten überlebt es sogar Neustarts.

Entwickler-Tip: Man kann nicht nur Web-URLs per Browser oder eigener App aufrufen, sondern auch Telephone-Nummern, die der Benutzer dann bestätigen muß, wenn man eine Adresse der Form tel://<Telephone-Nummer> öffnet.

iOS Diagnostics

Die ebenfalls auf jedem Gerät vorhandene, aber nicht im Home-Screen verlinkte Diagnose.app kann man auch mit Hilfe des dafür vorgesehenen URL-Schemas diags://<Ticket-Nummer> per Browser aufrufen. Die Ticket-Nummer, die man normalerweise von Apple am Telephone gesagt bekommt, ist für das Aufrufen der App optional, so daß auf einem iOS-Gerät diags: ausreicht, um dies zu bekommen:

iOS Diagnostics

Damit wären die drei "geheimen" Apps, die HiddenApps aufruft, also beschrieben inklusive, wie man sie aufruft, ohne sich "HiddenApps" zu installieren. Alles völlig normal und okay, hat aber nichts in normalen iOS-Apps zu suchen, vor allem nicht, wenn man es nicht in der Beschreibung angibt.

Apps verstecken

Um Apps zu "verstecken", benutzt HiddenApps das normale itms-Schema zum Installieren von Apps. Der Name kommt daher, weil ursprünglich im iTunes Music Store (itms) nur Musiktitel, jetzt aber auch Apps verkauft werden. Der Name ist halt geblieben. Das Deployment beschreibt Apple hier. Die Installation von iOS-Apps läuft über eine Manifest-Datei, so wie Apple das dokumentiert. Dabei muß natürlich die Signatur passen, also entweder von Apple sein (im Apple Store) oder von einem von Apple vergebenen Enterprise-Zertifikat (für Enterprise Deployment, Firmen-Store) stammen. Die Manifest-Datei dient dazu, daß iOS den Benutzer fragen kann, ob er die App so und so installieren möchte, und um beim Download ein Icon anzeigen zu können, Zusatz-Infos zu liefern, und natürlich, um die URL zum eigentlich Download zu definieren.

So eine Manifest-Datei verwendet HiddenApps jeweils pro zu versteckender App. Dabei gibt sie aber in dem Manifest keine URL an, die auf ein zu ladendes App-Archiv (.ipa) verweist, sondern auf eine Phantasie-Adresse, wodurch der Download scheitert. Als Bild, das während des Downloads angezeigt wird im Home-Screen, gibt er sein "Poof"-Bildchen an. Und als bundle-identifier, also als eindeutige Kennung für die runterzuladende oder zu aktualisierende App, gibt er eine vorhandene System-App an wie "com.apple.compass". Als bundle-version ist in dem Manifest eine hohe Zahl wie 888 zu lesen.

Wie man sieht, ist auch all das weder ein Hack noch eine undokumentierte Funktion, sondern normal. Im Prinzip passiert hier eine Aktualisierung einer App, die jedoch bewußt zum Scheitern verurteilt ist. Das Icon ist dann schon da, die App aber noch nicht, und die kann man dann vom Home-Screen entfernen. Ein Enterprise-Zertifikat braucht er auch nicht, weil ja gar keine App runtergeladen wird, die damit signiert sein müßte. Es ist tatsächlich nur eine Info-Datei zu einem Download, der nicht existiert. Das Szenario inklusive solch nicht-funktionierender Downloads bei Tipfehlern im Manifest kennt jeder, der schon einmal einen In-House-App-Store gebaut hat.

Dieses Vorgehen hat nichts gemeinsam mit anderen Methoden, über die ich schon früher geschrieben habe.

AdSheet

Die AdSheet.app, die man normalerweise nicht sieht, ist für iAds zuständig. AdSheet.app läuft offenbar immer dann im Hintergrund, wenn eine App iAds darstellen möchte. Hier geht HiddenApps laut Berichten Dritter analog zum Verstecken vor und benutzt wieder einen toten Download.

In meinen Tests konnte ich mit den entsprechenden Manifest-Dateien diverse Apps vom Home-Screen verbannen, allerdings funktionierte dies gegen AdSheet erst nach mehreren Versuchen. Zum Überprüfen habe ich FallDawn! verwendet, ein Spiel, das oben im Screen zuverlässig iAd-Werbung verwendet. Die Werbung war dann tatsächlich nicht mehr zu sehen. Der Trick besteht auch hier darin, einen nicht-funktionierenden Download über eine Manifest-Datei anzustoßen, die den Bundle-Identifier der Ziel-App (AdSheet) verwendet.

Allerdings sind auch die Apps, die iAds verwenden, in der Regel ziemlich cool und man sollte den Entwicklern ihre Einnahme wirklich gönnen.

Fernsteuerung

Nachdem Apple die App aus dem Store geworfen hat, beschwerten sich User, die sie schon installiert hatten, per Twitter beim Autor, daß die bösen Funktionen plötzlich auch verschwunden waren, und die App sich wieder so verhielt, wie Apple sie beim Test gesehen haben muß. Er antwortete darauf, daß er das wegen Apple deaktivieren mußte.

Damit düfte klar sein, wie die App durch den Review kam: Sie hatte alle Funktionen fest einprogrammiert, aber zeigt die "bösen" Funktionen nur, wenn der Autor auf seinem Webserver eine Info bereitstellt, die der App signalisiert, daß sie die übrigen Funktionen zeigen soll. Die App fragt also mutmaßlich bei jedem Start seinen Webserver nach dieser Info und zeigt oder versteckt die entsprechenden Buttons abhängig davon, was sie in der Info liest.

Folglich hat er auf seinem Webserver das Go zur Anzeige der restlichen Buttons erst gegeben, als die App im Store erschienen war. Und nun, nachdem Apple seinen Entwickler-Account gesperrt und ihn in dieser Sache kontaktiert hat, war er wohl gezwungen, das Go auf seinem Server wieder in ein No-Go zu ändern. Bei Apple nennt man das übrigens eine App mit einem "server driven interface", was in einem gewissen Rahmen erlaubt ist, um viele kleine Updates zu vermeiden. Man darf allerdings keine zusätzlichen Features damit nachrüsten.

Fazit

HiddenApps verwendet keine geheimen Tricks, sondern macht sich einen Seiteneffekt von gescheiterten Installationen / Updates zunutze, um Apps zu verstecken oder zu deaktivieren. Man kann das mit Hilfe von MobileSafari und einer passenden HTML-Seite und einer passenden Manifest-Datei auf einem Webserver nachbauen.

Ferner nutzt HiddenApps bekannte URL-Schemata, um nicht direkt aufrufbare versteckte Apps indirekt zu starten. Das bekommt man mit einer kreativen Eingabe in MobileSafari oder der Phone.app auch manuell hin.

Valid XHTML 1.0!

Besucherzähler


Latest Update: 11. September 2015 at 19:49h (german time)
Link: osx.realmacmark.de/blog/osx_blog_2013-03-a.php