6 votes

API privées iOS

Je suis intéressé par certains des détails techniques qui se cachent derrière les API privées d'Apple dans iOS. Je n'arrive pas à trouver un bon article sur certains de ces détails (au-delà de la façon d'appeler les fonctions de l'API privée), mais ce serait formidable si quelqu'un pouvait poster un lien si un article existe.

Plus précisément, j'ai quelques questions aléatoires :

  1. Pourquoi Apple ne supprime-t-il pas simplement les symboles d'API privés de ses bibliothèques afin que les applications tierces ne puissent pas y accéder ? Est-ce parce que les fonctions de l'API publique appellent directement les fonctions de l'API privée ?

  2. Ce site lien mentionne qu'Uber aurait utilisé une API privée (IOKit) pour accéder aux numéros de série des appareils à partir de son application. Pourquoi leur application a-t-elle eu accès à cette information en premier lieu, même si elle a appelé une fonction privée de l'espace utilisateur ? La fonction privée de IOKit a-t-elle lu le numéro de série à partir d'un appel système non documenté et non protégé (ou une autre interaction avec le noyau) ?

  3. J'ai lu qu'Apple scanne les accès aux API privées au cours de son processus d'examen des applications, mais cette analyse automatisée ne serait-elle pas assez facile à déjouer ? Apple a-t-elle l'espoir de résoudre un jour le "problème" des accès aux API privées des applications tierces ?

4voto

Rizwan Sattar Points 121
  1. Les applications d'Apple utilisant l'API privée ne seraient pas non plus en mesure de les utiliser si les symboles étaient supprimés. Après tout, l'éditeur de liens dynamiques ne connaît pas les API "privées" ou "publiques". Ce n'est pas comme si les symboles étaient marqués individuellement ; c'est juste que les en-têtes/documentation pour l'API "publique" sont publiés.

  2. Il existe plusieurs dépôts contenant des en-têtes générés pour tous les symboles des frameworks Apple. Cherchez "iOS runtime headers", "MacOS runtime headers", et des termes de recherche similaires. Dans le cas de IOKit, le framework est public sur MacOS mais considéré comme privé sur iOS. Habituellement, les frameworks partagés entre les différents OS d'Apple sont pour la plupart les mêmes (il y a des exceptions, comme le trousseau de clés et les API de sécurité ; mais ils ne sont pas tous les mêmes). largement différents). Je ne connais pas les détails de l'utilisation de IOKit par Uber ni les informations qu'il a pu extraire, mais je suppose qu'il a pu extraire les adresses MAC des interfaces réseau, ce qu'Apple a essayé d'empêcher dans d'autres API. Nous (les développeurs) utilisions les adresses MAC pour identifier un appareil spécifique et quand Apple a essayé d'empêcher cela, beaucoup d'entre nous ont cherché des moyens de l'obtenir quand même (ou un identifiant unique similaire) parce que l'approche plus soucieuse de la vie privée d'Apple interférait avec le souhait des entreprises de pouvoir obtenir ces informations. Pensez aux licences liées aux appareils, mais aussi au marketing.

  3. La détection par Apple de l'utilisation d'API privées n'est pas parfaite et il existe plusieurs façons pour les développeurs d'accéder à des API privées sans qu'Apple s'en aperçoive, tant qu'il n'y a pas de réel problème de permission (fichier/IPC) empêchant l'accès. En raison de l'obscurcissement, de la nature dynamique de l'Objective-C et de la façon dont l'éditeur de liens dynamiques fonctionne, Apple a beaucoup de mal à repérer les API privées. tous l'utilisation d'API privées si un développeur le fait intentionnellement (et le cache). Leur contrôle permet de détecter la plupart du temps des utilisations évidentes. L'une des raisons est qu'une API privée peut être appelée par public Les API d'Apple, donc détecter si l'appel d'une API privée a été fait par le développeur directement, ou si cela s'est produit indirectement par le biais des API publiques, n'est pas facile. Je doute qu'ils résolvent un jour ce problème et je doute également que cela vaille la peine d'investir beaucoup de ressources dans ce problème.

4voto

Jose Chavez Points 645

Afin d'avoir le bon contexte pour les réponses plus spécifiques à votre question, il est important de comprendre quel est le but réel des "API privées" :

Pour le comprendre, nous devons savoir ce qu'est une API (Application Programming Interface) : Une API est quelque chose qui permet au développeur d'applications d'invoquer une fonctionnalité mise en œuvre par quelqu'un d'autre. Historiquement, il y avait les programmeurs système qui créaient le système d'exploitation et les bibliothèques système, et les programmeurs d'application qui créaient l'application que les utilisateurs finaux allaient utiliser. Le lien entre eux était l'API.

Aujourd'hui, les API existent sous de nombreuses formes différentes qui servent des objectifs différents :

  • API du système d'exploitation : Par exemple, l'utilisation d'"appels système" qui permettent aux programmeurs qui ne font pas partie du système d'exploitation (c'est-à-dire les programmes de l'espace utilisateur) d'invoquer des fonctionnalités du noyau du système d'exploitation. Sur la plupart des systèmes d'exploitation courants, il s'agit également d'une limite de sécurité (c'est-à-dire qu'il s'agit de l'endroit où les vérifications et les contrôles sont en place pour garantir que seules les fonctionnalités autorisées sont invoquées).

  • Bibliothèque système/API de cadre : Par exemple, le vendeur du système fournit un cadre pour la création d'interfaces utilisateur afin que l'ensemble du système puisse disposer d'un ensemble de widgets reconnaissables (tels que des boutons, des listes, etc.) qui sont dessinés de la même manière dans toutes les applications. Il n'y a généralement pas de limite de sécurité ici.

  • API internes de l'application : Certaines applications sont divisées en bibliothèques/frameworks et possèdent leurs propres API. Il peut s'agir, par exemple, d'une application développée par plusieurs équipes qui se répartissent leurs domaines de responsabilité par le biais de bibliothèques/frameworks. Il se peut aussi qu'une bibliothèque soit créée une fois et utilisée pour de nombreuses applications différentes alors que le développeur souhaite que le code reste séparé pour des raisons de maintenabilité. La bibliothèque peut être développée en interne ou être une bibliothèque open-source partagée par des milliers de personnes. Il n'y a généralement pas de frontière de sécurité dans ce cas.

  • API réseau / Web : Certains systèmes exposent des API par le biais de réseaux, ou plus précisément par le web. Par exemple, Amazon expose une API qui permet aux développeurs d'envoyer une photo de leur application aux serveurs d'Amazon et de recevoir en retour une version OCR (c'est-à-dire du texte extrait de la photo). Il y a généralement une limite de sécurité ici, car ces API Web nécessitent généralement une certaine forme d'authentification pour garantir le paiement ou protéger les informations privées.

Maintenant que nous connaissons les principes de base des API, il s'agit de savoir ce que signifie une "API privée" :

En fait, Apple ne fait pas référence aux "API privées" en tant que telles. Au lieu de cela, elle publie une documentation pour les développeurs qui inclut des références d'API et des fichiers d'en-tête, et elle recommande ensuite aux développeurs de n'utiliser que ces API documentées publiquement. Les soi-disant "API privées" sont en fait ce qu'Apple appelle des "API non publiques".

Il ne s'agit pas d'une invention d'Apple, mais plutôt d'API privées/publiques utilisées dans l'industrie depuis des décennies. Par exemple, historiquement, Microsoft publiait une documentation détaillée à l'intention des développeurs sur la façon d'utiliser son API Windows USER pour créer une interface utilisateur graphique avec divers contrôles, mais son produit Office avait des contrôles privés qui n'étaient disponibles que dans Office, même s'ils existaient dans une API que les développeurs tiers auraient techniquement pu utiliser.

Et nous en arrivons maintenant à l'objectif des "API privées" :

Traditionnellement, les API publiques s'accompagnent d'une promesse (parfois implicite, parfois explicite) selon laquelle ces API ne disparaîtront pas ou ne seront pas modifiées par les développeurs d'applications pendant une longue période. Un développeur pouvait utiliser une API publique et s'attendre à ce qu'elle fonctionne comme indiqué dans la documentation - et qu'elle continue à le faire lorsque le fournisseur publiait des mises à jour mineures et majeures. En général, le développeur pouvait également s'attendre à recevoir un avertissement (appelé avis de dépréciation) lorsque l'API publique qu'il utilisait allait changer ou disparaître dans les années suivantes. De même, les développeurs s'attendaient à pouvoir signaler les bogues de ces API au fournisseur.

En revanche, les API privées ne bénéficiaient pas de ces avantages. Une API privée pouvait disparaître lors d'une mise à jour du système, elle pouvait soudainement commencer à fonctionner différemment (ou pas du tout) - et les développeurs ne pouvaient pas se plaindre auprès du fournisseur des bogues ou des fonctionnalités manquantes.

C'est également de cette manière que les API publiques/privées fonctionnaient sur l'iPhone au début. La raison pour laquelle beaucoup pensent à iOS lorsque vous mentionnez les "API privées" est qu'Apple a ensuite introduit une nouvelle exigence pour la publication d'une application sur son App Store - à savoir que l'application ne doit utiliser que des API publiques. De cette façon, Apple peut mieux s'assurer qu'une application qui a fonctionné l'année dernière continuera à fonctionner l'année prochaine pour les clients qui l'ont achetée sur l'App Store.

Vous pourriez penser que la distinction entre les API "publiques" et "privées" a quelque chose à voir avec la sécurité du système. Ce n'est presque jamais le cas. Dans de nombreux cas, les API se présentent sous la forme d'un exécutable situé dans un fichier de bibliothèque/framework sur le système. Rien n'empêche techniquement le développeur de copier le code de la bibliothèque "privée" dans sa propre application, ce qui en fait une partie de son application et n'est donc plus une API. En fonction de la quantité de code copié, le développeur enfreindrait les droits de copie et éventuellement un accord de licence entre lui et le fournisseur.

En réalité, les API privées sont souvent rendues privées parce qu'elles sont toujours en train de changer. Par exemple, Apple peut avoir une API privée pour une nouvelle pièce de matériel ou un nouvel ensemble de fonctionnalités sur son appareil. À chaque version, cette API change un peu, car les développeurs d'Apple apprennent de leurs erreurs et découvrent la façon dont les utilisateurs interagissent avec leurs propres applications qui utilisent ces fonctionnalités. Plus tard, lorsque l'API a cessé de changer (autant que possible), Apple rend cette même API publique, car elle pense maintenant qu'elle est prête à être utilisée par des développeurs tiers.

Nous en venons maintenant à vos questions plus spécifiques :

  1. C'est en partie pour cette raison qu'Apple (et d'autres fournisseurs) n'élimine pas l'élément les symboles des API privées de leurs bibliothèques est principalement qu'alors ils eux-mêmes, ou les partenaires qu'ils ont autorisés à utiliser des API privées, ne pourraient ne seraient pas en mesure d'utiliser facilement ces API dans leurs applications. Apple devrait alors dupliquer toutes les bibliothèques - avoir une version pour eux-mêmes et une autre pour les non partenaires, et s'assurer que la que la bonne version soit mise à disposition dans chaque cas.

    Un moyen plus logique pour Apple de restreindre l'utilisation des API privées privée serait de changer le linker dynamique et le système de messagerie entre les objets utilisés en Objective-C et Swift afin de garantir que pour s'assurer que les applications non habilitées ne puissent pas appeler les API privées. Cependant, en plus d'ajouter beaucoup de complexité vraiment inutile, cela s'accompagnerait d'une pénalité de performance non négligeable.

    En fait, Apple n'est probablement pas si préoccupée par une développeur qui utilise une API privée - et donc ils s'en tiennent à avoir simplement une directive, en essayant de détecter les utilisations les plus évidentes pour éduquer les les plus évidentes pour éduquer les développeurs, et ensuite ne faire quelque chose publiquement qu'une API privée a été utilisée.

    Dans presque tous les cas, l'utilisation d'une API privée aurait pu être remplacée par le développeur d'applications en copiant simplement le code exécutable de la bibliothèque dans sa propre application. de la bibliothèque dans sa propre application - rendant ainsi tout le point de discorde point de discorde. La raison pour laquelle les développeurs utilisent des API privées est souvent pour pour accéder à des fonctionnalités construites par Apple qu'ils n'ont pas le temps de de recréer eux-mêmes, ou pour accéder à une fonctionnalité qu'ils espèrent seront bientôt publiques de toute façon. Il devient alors de la responsabilité du le développeur de s'assurer qu'il n'utilise cette API privée que pour certaines versions du système qui possède effectivement cette API privée - et ils risquent de voir leur application se casser avec les mises à jour du système.

  2. Concernant l'affaire Uber : Le vrai problème ici n'est pas l'utilisation d'APIs privées. C'est en fait un bug de sécurité dans le système d'exploitation qui fait que des informations privées ont été exposées à l'application. Le développeur de l'application aurait pu faire la même chose dans son code que l'API privée et il aurait pu avoir accès aux mêmes informations privées. Ce n'est pas bon.

  3. Oui, l'analyse automatisée est un jeu de "chat et de souris" - où il est généralement beaucoup plus facile pour le développeur d'applications de faire quelque chose qui obscurcit son utilisation des API privées, et beaucoup plus difficile pour Apple de construire un détecteur. Je ne pense pas que l'utilisation d'API privées soit vraiment un "problème" pour Apple.

1 votes

Merci beaucoup pour cet excellent article ! Je l'apprécie vraiment :)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X