Kontrollieren Sie den Zugriff von Drittanbieter-APIs auf Android-Systemressourcen?

8

Wenn Sie in Ihrem Android-Projekt APIs von Drittanbietern importieren (Paketabhängigkeiten, generierte Bibliotheken, Quellcode usw.), gehen Sie davon aus, dass sie sich wie angekündigt verhalten werden. Der meiste Zeitcode ist nicht Open Source, er ist verschleiert oder nur kompiliert.

Gibt es eine Möglichkeit, den Zugriff dieser APIs auf wichtige Systemressourcen wie Netzwerk, Kontakte, Video und Audio, Standort zu kontrollieren?

Der beste Ansatz wäre, ihnen eine proxy für die Systemressourcen bereitzustellen. Dies hätte folgende Vorteile:

  • Tests können durch Bereitstellen von Scheindaten in den Proxies
  • durchgeführt werden
  • Ihre Anwendung muss nicht alle Berechtigungen bereitstellen, die von der API benötigt werden, wenn sie nicht erforderlich sind, und der Proxy würde zulassen, dass die API aufgrund von Berechtigungen nicht bricht, indem die erteilte Berechtigung emuliert wird
  • Filtern Sie mögliche lokal über den Benutzer erfasste Daten, die an ein API-Home-Repo gesendet werden, das für Werbung oder böswillige Absicht verwendet wird

Ich habe nicht gefunden, wie eine solche Lösung implementiert werden kann, da die vom Benutzer definierten Aktivitäten und Dienste die Dienste der APIs Dritter nicht steuern oder sogar verhindern können, dass sie direkte Aufrufe an eine öffentliche Android-Schnittstelle ausführen.

Die Lösung sollte keinen Root-Zugriff erfordern, da Sie dieses Steuerelement nicht außerhalb der Grenzen Ihrer eigenen App haben möchten.

Der Inhalt dieser Frage ist mit mehreren Fragen verbunden, die auf Besonderheiten dieser allgemeinen Frage eingehen ( Protokolldaten von Inhaltsanbietern , Netzwerkanfragen - das brachte mich dazu, über dieses Problem nachzudenken, während ich eine Antwort dafür suchte)

Hinweis : Die kurze Antwort ist nein, aber eine kann kreativ genug sein (vielleicht geht es bei nativen Hacks um dieses Problem - idk)

    
Radu Ionescu 17.02.2016, 13:40
quelle

1 Antwort

1

Erstellen Sie die Proxy-Klasse für Ihre gewünschte Android-Ressource, die Sie schützen möchten, in einem Paket namens com.myproxies (zB MediaRecorder, SensorManager, Camera, java.net.HTTPURLConnection). Im Proxy müssen Sie alle öffentlichen Methoden implementieren Die Klasse, die Sie verspotten, und Sie müssen eine Logik implementieren, die den Zugriff (Weiterleitung an die entsprechende Methode) oder die Ablehnung ermöglicht. Ein hilfreicher Schritt wäre, die Aufrufer der Methode .

  • Wenn Sie vorhaben, den Quellcode zu importieren, ändern Sie den Code, um das Paket in Ihren Proxy zu ändern (proguard kann dabei helfen).

  • Wenn Sie eine Bibliothek verwenden, erhalten Sie Jar Jar Links , ein Dienstprogramm, mit dem Sie Java-Bibliotheken einfach neu packen können und betten Sie sie in Ihre eigene Distribution ein und ändern Sie die Paketnamen intern in die einer Klasse in Ihrem Paket, die als Proxy dient.

  • Wenn Sie Maven- oder Gradle-Paketabhängigkeitsinjektionen verwenden, können Sie auch versuchen, Jar-Jar-Links zu importieren und das Paket-Refactoring zur Kompilierungszeit durchzuführen (nicht sehr sicher, ob es möglich ist).

Leider ist es sehr einfach, die API zu brechen, wie ich es selbst erlebt habe, und es ist eine Menge Handarbeit nötig.

    
Radu Ionescu 25.02.2016, 15:42
quelle