Comment nous avons chargé une carte bancaire d'un iPhone dans un porte-clés



Chaque année, de plus en plus d'entreprises s'intéressent aux projets liés à l'Internet des objets ( IoT ). 



Dans cet article, je parlerai de la plate-forme IoT que nous avons créée, de la façon de charger des cartes bancaires dans des appareils portables, d'explorer les capacités du framework Core NFC iOS et du possible schéma de fraude utilisant des smartphones avec NFC.



L'article peut être utile pour les chefs de produit, les technologues, les développeurs iOS, les ingénieurs QA qui sont engagés dans les paiements mobiles, ainsi que toute personne intéressée par la technologie fintech pour élargir leurs horizons.



Bonjour, Habr!



Je m'appelle Maxim. Je fais du développement industriel depuis 2005. Je travaille dans Wallet depuis 2013 et depuis 2015, j'aide les activités de l'entreprise à développer de nouveaux services fintech en tant que chef de division.



Chez Wallet, notre équipe a lancé de nombreux produits innovants. Il s'agit de l'une des premières cartes bancaires entièrement virtuelles au monde dans un smartphone avec possibilité de paiement sans contact (un an avant le lancement d'Apple Pay en Russie et bien avant le lancement de l'Apple Card), et la première carte de transport , et la première carte fan , et la première carte campus dans un smartphone. ...



L'année dernière, avec Mastercard, nous avons lancé le service Wallet PayEst le seul service au monde qui, contrairement à ses homologues, fonctionne quel que soit le fabricant du smartphone ou le système d'exploitation. Par exemple, Pay Wallet fonctionne sur les smartphones Huawei qui ne disposent pas des services Google.



Remerciements



Kolya Ashanin , qui m'a motivé à écrire l'article et m'a aidé lors de sa préparation en vue de sa publication.



Sasha Pryimak, qui, sous ma supervision, a effectué les recherches décrites dans l'article.



Merci également pour votre participation et votre soutien:

Katya Turkina, Anton Davydov, Lesha Ershov, Dasha Alekseenko.



Plateforme IoT



En ce moment, mon équipe et moi travaillons sur le lancement d'une plate-forme Internet des objets qui sera en mesure de compléter et d'étendre l'expérience existante d'utilisation du service Payant et d'introduire le paiement (et d'autres services d'identification) dans les choses que nous transportons habituellement avec nous - les soi-disant appareils portables. 



L'Internet des objets est un concept d'objets physiques familiers équipés de technologies pour interagir avec l'environnement extérieur ou entre eux. 



Dans ce concept, les cas d'utilisation familiers des objets sont reconstruits grâce à l'automatisation.



Les montres intelligentes, les bracelets de fitness, les bagues, les porte-clés sont un exemple d'appareils portables.



Si auparavant une personne portait une bague à cause de la beauté ou du symbolisme, maintenant, dans le concept de l'Internet des objets, la bague sert d'instrument de paiement, de passe de contrôle d'accès, télécommande pour d'autres appareils intelligents, etc. Ainsi, de nouveaux cas d'utilisation pratiques apparaissent pour la chose familière.



Les choses intelligentes sont désormais une tendance mondiale. Ceci est démontré par les données statistiques collectées par diverses agences mondiales (voir les liens à la fin de l'article). 



Dans cet article, je souhaite utiliser l'exemple de notre recherche dans le développement d'une plate-forme IoT pour vous indiquer les tâches avec lesquelles la direction fintech de l'application Wallet travaille, les problèmes auxquels nous sommes confrontés et comment nous utilisons les technologies éprouvées de l'industrie de la carte pour créer de nouveaux produits.



Pour commencer, je décrirai brièvement et en termes simples les technologies sur lesquelles repose notre plateforme. Si vous souhaitez en savoir plus sur ces technologies, il y aura des liens à la fin de l'article. 



  1. , Secure Element — , 5-20 . , -, , - , . , SIM-, . ( ).



    , — . , .
  2. GlobalPlatform Card Specification — , .
  3. TSM  (Trusted Service Manager) — . .
  4. EMV — ( ), . , - , , .


Voici les principaux scénarios d'interaction d'un smartphone avec l'appareil lui-même, que nous mettons dans notre plateforme (dans tous les scénarios, l'utilisateur contrôle l'appareil portable via l'interface de l'application mobile sur le smartphone): 



Le premier scénario est l'interaction avec des appareils portables actifs. Les appareils actifs sont des appareils portables qui ont leur propre batterie (par exemple, une batterie). En règle générale, la chose a son propre système d'exploitation et il existe un module BLE pour la communication avec un smartphone. Le fabricant de l'appareil fournit un SDK et des clés d'accès pour interagir avec l'élément de sécurité. 



C'est ainsi que fonctionnent toutes les smartwatches et bracelets de fitness avec fonction de paiement sans contact. Tout est simple et clair - nous prenons et faisons. 



Le deuxième scénario est plus intéressantEst l'interaction avec les appareils portables passifs. Les appareils portables sont appelés appareils passifs qui n'ont pas leur propre batterie. Ces appareils sont alimentés par un champ magnétique externe dans lequel ils doivent être placés. Il peut s'agir du champ électromagnétique d'un lecteur de terminal sans contact ou de l'antenne NFC d'un smartphone. Ainsi, les cartes bancaires sans contact peuvent être appelées en toute sécurité des appareils portables passifs. 



Le problème est que vous devez charger votre carte bancaire dans un appareil portable passif à partir d'une application sur votre smartphone.



Nous cassons (conditionnellement) ce scénario en fonction du type de smartphone:



  1. Tous les smartphones sans NFC
  2. Smartphone Android avec NFC
  3. iPhone avec NFC


Pour le premier type, nous utiliserons un lecteur externe situé dans des terminaux de personnalisation spéciaux. En bref, le terminal de personnalisation et l'application mobile du smartphone sont connectés au même backend qui synchronise les deux clients. Le jeton est chargé via le terminal de personnalisation et l'utilisateur voit le résultat dans l'interface de l'application mobile.



La mise en œuvre du terminal de personnalisation peut être différente: il peut s'agir du smartphone du même utilisateur connecté à un lecteur de carte à puce externe via BLE ou USB, ou bien il peut s'agir d'un appareil externe autonome (un ordinateur à part entière avec un lecteur connecté, un logiciel d'accès et de contrôle Internet) ...



Pour le deuxième type (Android avec NFC), l'implémentation est claire. Dans ce cas, le smartphone peut être utilisé comme terminal, alimenter l'appareil passif à partir de l'antenne NFC et y charger un jeton de carte bancaire.



Dans notre étude, je décrirai en détail comment nous avons travaillé sur le troisième type de smartphones (iPhones avec NFC). En tant qu'appareils portables, nous avons utilisé des porte-clés d' ISBC , le partenaire avec lequel nous lançons le pilote.



But de l'étude



Pouvons-nous permettre à l' utilisateur du portefeuille iOS de charger sa carte bancaire dans un appareil portable en l'attachant à l'iPhone?



C'est à dire:



  1. L'utilisateur dans l' application "Wallet" saisit les données de sa carte bancaire
  2. L'utilisateur appuie un appareil portable contre l'arrière d'un iPhone
  3. La carte bancaire est chargée dans l'appareil portable


Ainsi, la tâche technique est de déterminer s'il est possible de charger une carte bancaire dans un élément de sécurité externe (Secure Element) à l'aide d'un iPhone classique et de son antenne NFC , via le protocole ISO / CEI 7816 (T = CL). 



Des tâches supplémentaires:



  1. Obtenez ATR (Answer To Reset) de la puce sans la retirer du lecteur
  2. Obtenez l'UID (Unique Identifier) ​​de la puce


Ces données peuvent être utiles car elles sont souvent utilisées pour identifier la puce dans les systèmes des fournisseurs de services et diversifier les clés des données sensibles des applications de la puce.



Ce que nous avons:



  • iPhone 8 avec iOS 13.5
  • Test de l'appareil portable - porte-clés ISBC avec puce JCOP 3 EMV P60 intégrée et applets chargées de NXP :

    PPSE et une applet qui implémente le M / Chip Advance - Paiement de spécification de carte et stockage de données v1.1;
  • clés de la puce du domaine de sécurité de l'émetteur.


Décision



Au début, nous décomposerons la tâche principale, à savoir, nous déterminerons les étapes nécessaires pour transformer un porte-clés complètement ordinaire (enfin, presque) en un moyen de paiement à part entière:



  1. Établir une connexion entre la puce et le module NFC de l'iPhone
  2. Installation des applets Mastercard M / Chip Advance et PPSE sur la puce
  3. Personnaliser les applets 


Établir une connexion



C'est ici que nous parlerons des fonctionnalités du framework Core NFC ajouté dans iOS 13.

Soit dit en passant, dans iOS 14, aucun changement significatif n'est intervenu concernant le sujet de l'article, donc tout ce qui est décrit est pertinent pour elle.



Ainsi, dans la treizième version du système d'exploitation Apple, il est devenu possible non seulement de lire les données des balises NFC , comme c'était le cas dans iOS 12 (mais pas avant iOS 11, avant lui, l'interaction via NFC n'était possible que dans Apple Pay), mais aussi de les écrire, et communiquez également dans le langage de commande APDU avec toute puce conforme à l'une des normes suivantes:





Pour ce faire , deux nouvelles classes ont été ajoutées à Core NFC : NFCNDEFReaderSession et NFCTagReaderSession .



Le premier est utilisé pour interagir avec les balises NDEF, et le second est utilisé pour tout le reste , respectivement.



Dans notre cas, il s'agit d'une puce qui prend en charge la spécification de carte GlobalPlatform 2.2.1 et la norme ISO / IEC 7816 , ce qui signifie que nous utiliserons la deuxième classe.



La documentation indique ce que vous devez faire (en plus d'écrire du code, bien sûr) pour commencer à communiquer avec la puce conformément à la norme ISO 7816:





Mais en dessous, il y a une limitation si intéressante: nous voulons juste la "toucher", après avoir appris ce que cela signifie exactement. Ajoutez une ligne, par exemple «Autoriser la connexion NFC» pour la clé NFCReaderUsageDescription dans le fichier info.plist . Il fonctionne également avec toute autre valeur de cette clé. 



Important

Core NFC doesn't support payment-related Application IDs.













[Ici, dans la colonne de gauche, pas la clé elle-même, mais sa description, XCode cache les noms formels]



Ensuite, si nous voulons interagir avec la puce comme avec un périphérique ISO / IEC 7816 , alors dans la valeur de la clé com.apple.developer.nfc.readersession. iso7816.select-identifiers  spécifie la liste des ID de toutes les applets (Application Identifier ou AID), avec lesquels l'application interagira.                          





Il convient de préciser ici que ces identifiants ne sont pas simplement un ensemble aléatoire de caractères.

Il s'agit de chaînes hexadécimales contenant des informations sur l'application à laquelle elles sont affectées.



Les AID peuvent comprendre entre 5 et 16 octets (deux caractères par ligne = un octet). Ils se composent de deux parties, la première identifie le fournisseur de l'application (pour Mastercard, c'est «A000000004»), la seconde indique le type de produit de ce fournisseur (pour un produit nommé «Mastercard», c'est «1010», et, par exemple, pour Maestro, c'est «3060 "). 



De plus, il est parfois nécessaire de mettre des informations supplémentaires dans l'AID, par exemple, s'il y a deux applications identiques du même fournisseur sur la puce, mais pour des banques différentes. Pour cela, il existe un support pour Long AID (ou Extended AID). Tant que la longueur de l'AID ne dépasse pas 16 octets, vous pouvez y écrire n'importe quoi. Par exemple, nous avons pris Mastercard AID et à la fin nous avons ajouté "TEST", le résultat: "A0000000041010BB5445535401".



Le seul AID qui ne figure pas dans la liste est "325041592E5359532E444446303101".

En fait, c'est l'habituel (seulement au format hexadécimal), comme on dit, la chaîne de texte brut "2PAY.SYS.DDF01". Il s'agit de l'AID PPSE, qui n'est pas une applet de paiement en soi. Il ne contient que les données d'environnement requises par les applications de paiement.



Installer des applets



Pour installer des applets sur une puce, vous avez besoin d'une connexion sécurisée (Secure Channel Protocol ou SCP); nous l'avons fait dans les coulisses en utilisant un lecteur PC / SC classique et la plate-forme Cardsmobile TSM.



Cependant, même si vous n'en avez pas, vous pouvez toujours essayer d'installer votre propre applet sur une puce - uniquement virtuelle.



Vous aurez besoin de n'importe quel IDE avec le support JCOP Shell et l'émulateur JavaCard, par exemple celui-ci .



Créez un projet vide, spécifiez l'AID souhaité (par exemple, 0000000000) et exécutez.



Ensuite, nous comprenons les étapes:



  1. / card

    Obtenir ATR, envoyer SELECT sans ID pour que Card Manager soit sélectionné;





  2. auth

    , ;



  3. ls ()

    , /;





  4. install [packageAID] [appletAID] [instanceAID]

    :



    packageAID — (Module), , «0000000000»

    appletAID — (Load File), , «000000000000»

    instanceAID — , , , «A0000000041010»;





  5. ls

    , :







En fait, personnaliser une applet est très simple; il suffit d'y charger les données de paiement requises. Pour ce faire, vous devez sélectionner l'applet avec la commande SELECT par son AID, établir une connexion sécurisée et envoyer à l'applet sélectionnée la commande STORE DATA avec les données à l'intérieur.



Revenons maintenant à la liste des AID dans le fichier info.plist - pourquoi est-il nécessaire, et comment Core NFC choisit-il exactement avec quelle applet interagir?



Cela ressemble à ceci:



  1. Le programme parcourt la liste de haut en bas;
  2. Pour chaque AID, il génère et envoie une commande SELECT;
  3. L'AID de la première applet qui a répondu "9000" (l'état d'une réponse réussie, voici une liste de toutes les réponses possibles ) est écrit dans le champ initialSelectedAID d' un objet de type NFCISO7816Tag , qui est mis dans le tableau des puces détectées


@available(iOS 13.0, *)

public protocol NFCISO7816Tag : NFCNDEFTag, __NFCTag {

   /**

    * @property initialSelectedAID The Hex string of the application identifier (DF name) selected by the reader when the tag is discovered.

    *                              This will match one of the entries in the «com.apple.developer.nfc.readersession.iso7816.select-identifiers»

    *                              in the Info.plist.

    */

   @available(iOS 13.0, *)

   var initialSelectedAID: String { get }


De plus, vous pouvez sélectionner n'importe quel objet de ce type dans le tableau et utiliser la méthode sendCommand pour envoyer des commandes APDU à l' applet sélectionné.



Parlons maintenant de cette limitation:

 

Core NFC doesn't support payment-related Application IDs.


Autrement dit, Core NFC ne prend pas en charge les AID de paiement, à savoir les AID de combat avec lesquels les terminaux de paiement fonctionnent.



Bien sûr, vous pouvez ajouter un AID de paiement à la liste info.plist, mais Core NFC l'ignorera et n'enverra pas de SELECT pour cela (au fait, voici une liste de tous les AID utilisés ). C'est ainsi qu'Apple protège sa technologie Apple Pay, empêchant les développeurs tiers d'accéder à l'une des fonctions de paiement de l'iPhone (et à tout ce qui s'y rapporte).



Solutions de contournement



La première chose qui vient à l'esprit est de savoir s'il est possible d'ajouter à info.plist non pas l'AID de l'applet de paiement, mais l'AID Card Manager (Card Manager est un groupe de services à l'intérieur du système d'exploitation de la puce qui gèrent la carte, qui sont responsables de l'administration et de la sécurité), de sorte que puis lui envoyer manuellement la commande SELECT avec l'AID de l'applet souhaité?



Ici, nous sommes tombés sur le premier écueil - Core NFC ne permet pas d'envoyer une commande SELECT contenant un AID qui n'est pas enregistré dans info.plist .



D'accord, nous avons ajouté A0000000041010, mais c'est aussi un échec - Core NFC ne permet pas d'envoyer une commande SELECT contenant un AID de paiement, qu'il soit dans info.plist ou non.



Voyons comment fonctionne la restriction d'identité.



Dans info.plist, nous avons spécifié les AID suivants:



1. A000000001510000                        	- GlobalPlatform Card Manager AID
2. 325041592E5359532E444446303101      - Proximity Payment System Environment (PPSE) 
3. A0000000041010                             	- Mastercard Credit/Debit (Global)
4. A00000000401                                 	- Mastercard PayPass
5. A00000000410101213                    	- Mastercard Credit
6. A00000000410101215                    	- Mastercard Credit
7. A00000000410101214                    	-   AID                 
8. A00000000410101216                    	-   AID 
9. A0000000041010121F                    	-   AID 
10. A0000000041010BB5445535401 	        -   Long AID
11. A0000000041010BB5445535405 	        -   Long AID
12. A000000004101FBB5445535401 	        -    AID                
13. A000000004101F1213                    	-    AID                 
14. A00000000F1010                             	-    AID
15. A0000000040F                                     -    AID


Nous avons installé 14 applets de paiement avec différents AID (éléments 2 à 11 - AID de paiement) et avons essayé d'envoyer les commandes SELECT Card Manager avec chacun de ces AID.



Les numéros 12-15 ont répondu .  



Il s'avère que la restriction est imposée à un certain préfixe AID, dont la présence détermine s'il s'agit d'un identifiant de paiement ou non.



C'est dommage, mais cette méthode n'est plus valable.



La deuxième option de personnalisation fournie par GlobalPlatform est la commande INSTALL [pour la personnalisation].





Il est envoyé au Card Manager et contient l'AID de l'applet à personnaliser.



Ensuite, vous pouvez envoyer les commandes STORE DATA à Card Manager, qui les transmettra à l'application cible.



Mais il y a une limitation. Pour qu'une applet prenne en charge ce type de personnalisation, elle doit implémenter l'interface org.globalplatform.Application .



Card Manager, à la commande INSTALL [pour personnalisation] avec Mastercard Credit / Debit (Global) AID, qui a été attribué à l'applet M / Chip Advance de NXP , a répondu par l'erreur "6985" (Conditions d'utilisation non satisfaites),



ce qui signifie que vous devez vérifier si elle est implémentée s'il s'agit de l'interface de l' application .



Pour ce faire, nous avons écrit une simple application factice qui implémente cette interface. Comme prévu, il a répondu "9000" sur INSTALL [pour personnalisation].



Mais lorsque Application a été supprimée des interfaces implémentées par l'application, elle a commencé à répondre à cette commande "6985", comme dans le cas de l'applet M / Chip Advance.



Le problème est donc justement que l'application NXP n'implémente pas l'interface nécessaire à ce type de personnalisation. Cette méthode disparaît également.



Des tâches supplémentaires



  1. Obtention de l'UID de la puce

    Cela peut être fait d'une manière très simple.

    Au début d'une session NFC , le module recherche des puces dont les AID des applets sont enregistrés dans info.plist, et les ajoute à un tableau.

    Après cela, vous pouvez obtenir l'un d'entre eux à partir de là, et si son type est NFCISO7816Tag , alors il a un champ d'identifiant, qui contient l'UID de la puce.



    /**
      * @discussion The hardware UID of the tag.
    */
    var identifier: Data { get }


  2. Obtention d'une puce ATR Mais il semble que Core NFC ne puisse pas recevoir ATR , car il n'y a pas d'outils séparés pour cela dans le framework, et vous ne pouvez pas obtenir ATR en utilisant les commandes APDU .



conclusions



Quel est le résultat final?



  1. ISO/IEC 7816 ( UID), Core NFC;
  2. , Apple ;
  3. , , iPhone, , Application — ;
  4. , AID — .


En réponse à la question posée au début, pouvons-nous donner à l'utilisateur de Wallet la possibilité de charger sa carte bancaire dans le porte-clés en l'attachant à l'iPhone - non, ce n'est pas encore possible.



Dans le cadre de cette tâche, nous avons décidé d'utiliser un lecteur BLE externe pour charger un jeton de carte bancaire d'un iPhone dans un appareil portable passif.



Espérons qu'à l'avenir, Apple étendra les capacités de NFC Core pour accomplir cela et une gamme d'autres tâches de tokenisation et de paiement dans des applications tierces. Cependant, des nouvelles récentes indiquent que cela ne se produira probablement pas dans un proche avenir.



Un effet secondaire de l'étude



Au cours des travaux, un éventuel stratagème de fraude est né, qui ne peut pas être reproduit avec les smartphones Apple, mais il est tout à fait possible de le mettre en œuvre via un smartphone Android avec support NFC et technologie d'émulation de carte hôte.



L'essentiel est: 



  • le premier smartphone sera utilisé comme terminal, c'est-à-dire qu'il se connectera aux cartes bancaires et interagira avec leurs applets de paiement,
  • le deuxième smartphone - comme moyen de paiement (à la caisse, il ressemblera à un paiement régulier avec un smartphone).


Grâce à ce schéma, vous pouvez créer une chaîne de carte bancaire - smartphone - smartphone - terminal de paiement, à savoir:



  1. Le premier smartphone est attaché à n'importe quelle carte bancaire;
  2. Le second est appliqué au terminal de paiement;
  3. Le deuxième smartphone émule une carte bancaire en envoyant des commandes APDU envoyées par le terminal au premier smartphone;
  4. Le premier smartphone transmet ces commandes à la carte bancaire attachée, transmettant ses réponses au second smartphone;
  5. Le deuxième smartphone transmet les réponses reçues au terminal;
  6. Le paiement a été effectué.


Autrement dit, un fraudeur peut potentiellement mettre un smartphone dans votre poche et payer l'achat. Faites attention!



Pour éviter d'être victime d'un tel stratagème frauduleux, vous pouvez, par exemple, transférer des cartes bancaires sur votre smartphone et ne pas emporter de plastique avec vous.



Au lieu d'une conclusion



J'ai essayé d'écrire l'article dans un langage simple, sans approfondir la terminologie du sujet. J'y ai décrit l'un des projets innovants sur lesquels nous travaillons, le sujet et un peu de recherche sur les nouvelles fonctionnalités du framework iOS Core NFC.



Tout commentaire est le bienvenu: questions, critiques, commentaires, ajouts, critiques constructives.



Liens utiles



Si vous êtes intéressé par le sujet décrit dans l'article, vous trouverez ci-dessous plusieurs liens pour une étude plus détaillée:



  1. Livre de I. M. Goldovsky " Cartes à microprocesseur de banque "

  2. Concept de tokenisation de paiement EMV

  3. Articles avec analyse du marché IoT: 




All Articles