Как мы загружали банковскую карту из iPhone в брелок / Хабр

Банковские карты

Чипы NFC используются не только в мобильных устройствах в режиме эмуляции карты, но и в самих пластиковых картах, для возможности бесконтактной оплаты, и еще в других распространенных устройствах с возможностью эмуляции вашей карты, типа кольца или браслета со встроенным чипом NFC.Как мы загружали банковскую карту из iPhone в брелок / Хабр
Рис. 15. Этапы прохождения платжной транзакции.

В случае использования контактной карты, в ее чип зашивается платежное приложение банка-эмитента, которое через платежную систему взаимодействует с банком-эквайером продавца при проведении платежной транзакции, и персональные платежные данные клиента банка, на чье имя выпущена карта. Данные хранятся в зашифрованном криптоключами виде и защищены от перезаписи или изменения.

В работе бесконтактной карты добавляется NFC модуль, который обеспечивает бесконтактное соединение со считывателем банковских карт.

Что же происходит в случае эмулирования карты мобильным телефоном. Чтобы не записывать на чип SE в мобильном устройстве платежные приложения всех банковских карт, которыми пользуется владелец устройства, которые к тому же надо персонализировать, т.е. передать данные о выпущенных картах и хранить их в защищенном виде, была сформулирована роль TSM (Trusted Service Manager), который объединяет с одной стороны поставщиков услуг (Service Provider TSM), а с другой стороны чипы Secure Element (Secure Element Issuer TSM).

TSM — Trusted Service Manager — уникальный посредник, который владеет ключами. Это аппаратно-программный комплекс, предоставляющий технологические отношения между операторами связи и поставщиками услуг.
Как мы загружали банковскую карту из iPhone в брелок / Хабр
Рис. 16. Trusted Service Manager или TSM – доверенный поставщик услуг. Выполняет защищенную загрузку и менеджмент контента защищенного элемента (SE) для транспортных приложений, магазинов, мобильных операторов, банковских приложений, конфиденциальные данные держателя карты.Ключевые услуги доверенной третьей стороны включают защищенную загрузку и менеджмент контента элемента безопасности, выполняемый при взаимодействии с провайдерами мобильных сервисов. Это могут быть банки, транспортные компании, поставщики и агрегаторы услуг. Удаленное управление приложениями, обычно выполняемое с использованием технологий беспроводной сотовой связи (over-the-air, OTA), включает установку и персонализацию приложений в элементе безопасности мобильного телефона, а также дальнейшее обслуживание установленных приложений на всем протяжении их жизненного цикла, равно как и сервисную поддержку. Подробнее о TSM здесь. Однако эта технология платежей все равно требовала присутствия физического защищенного элемента на мобильном устройстве. Что давало определенные ограничения, например, если производитель мобильного устройства не включил SE в свою платформу, в этом случае, требовалось менять SIM-карту на карту с поддержкой SE у мобильного оператора.

В 2021 году Дугом Йегером и Тедом Фифельски, основателями SimplyTapp, Inc. был придуман термин «эмуляция хост-карты» (Host Card Emulation ), который описывал возможность открытия канала связи между терминалом бесконтактных платежей и удаленным размещенным защищенным элементом, содержащим финансовые данные, данные платежной карты, позволяющие проводить финансовые операции в терминале торговой точки. Они внедрили эту новую технологию в операционной системе Android, начиная с версии 4.4. HCE требует, чтобы протокол NFC направлялся в основную операционную систему мобильного устройства, а не в локальную микросхему защищенного аппаратного элемента (SE). Итак, начиная с версии Android 4.4 KitKat управление платежными операциями взял на себя не физический элемент, а API, точнее Google Pay API. Эмуляция карты неотделима от понятия «токенизация», потому что это следующая ступень защиты платежных данных в виртуальном мире после TSM, который выдавал ключи. Токен — это ссылка (то есть идентификатор), которая сопоставляется с конфиденциальными данными через систему токенизации. Сопоставление исходных данных с токеном использует методы, которые делают невозможным обратное преобразование токенов в исходные данные вне системы токенизации, например, с использованием токенов, созданных при помощи случайных чисел. Т.е. вместо номера вашей карты API хранит токен, полученный от банка-эмитента, который бесполезен в том виде, в котором он хранится. Даже если его узнают третьи лица, воспользоваться им будет невозможно.
Как мы загружали банковскую карту из iPhone в брелок / Хабр

Рис. 17. Токенизация.Когда вы вводите номер карты в мобильное приложение, обеспечивающее возможность мобльных платежей, например, номер карты 4111 1111 1111 1234, удаленный поставщик токенов (remote token service server) возвращает вместо номера карты токен вида 4281 **** **** 2819, который хранится в мобильном устройстве.

Токенизация при использовании Google Pay:

  1. Когда пользователь добавляет в Google Pay свою кредитную или дебетовую карту, приложение запрашивает у банка-эмитента токен. Затем Google Pay шифрует токенизированную карту, и она становится доступна для оплаты.
  2. При оплате клиент прикладывает свое мобильное устройство к терминалу или нажимает соответствующую кнопку в приложении. Google Pay отправляет токен и криптограмму, которая действует как одноразовый код. Платежная система проверяет криптограмму и соотносит токен с номером карты клиента.
  3. Для завершения транзакции ваш банк-эквайер и банк-эмитент покупателя используют данные клиента и расшифрованную информацию о его платеже

При этом:

Беспроводные метки nfc

Как мы загружали банковскую карту из iPhone в брелок / Хабр

Читайте ещё про NFC:  Как расплачиваться телефоном в магазине от Сбербанка ПОЛНАЯ ИНСТРУКЦИЯ

Технический прогресс не стоит на месте, появляющиеся новые технологии со временем дешевеют и становятся доступны практически всем желающим. Как пример можно привести мобильные телефоны. Середина 80-ых — начало 90-ых были переносные таксофоны с ручками или кирпичи стоимостью несколько тысяч $, конец 90-ых — большого размера трубки, с торчащими антеннами со стоимостью от 100$ Такую же аналогию можно провести с NFC метками, используемыми в учетных целях.

В идеальном варианте и оборудование и расходники (метки) могут ничего не стоить при условии, что у работника имеется смартфон с поддержкой NFC и сам работник не против его использования. Ну и, конечно же, удалось раздобыть необходимое количество использованных билетов. На Ali стоимость от 6 рублей с лишним за метку.

Как мы загружали банковскую карту из iPhone в брелок / Хабр

Основные затраты по внедрению описанной технологии это только время программиста.
В задачи программиста входит реализовать в мобильном приложении требуемую вашим учетом логику инвентаризации и или складского учета, а также реализовать обмен данными с основной учетной базой данных.

Для обмена можно использовать http или web сервисы, ботов телеграмм или иное месенджероподобное решение.

Описанное нигде не подглядывал, видел когда-то статью про запись пароля wifi на билет, а также имел опыт работы с ТСД (штрих.кодами rdp на винмобайл), огромным и дорогим, на мой взгляд неудобным. С тех пор было желание повторить что-то подобное на более удобном смартфоне.

Группы из 4 байтов называются страницами. Первые несколько страниц, как правило заняты служебной информацией, на одном из скриншотов можно увидеть ID метки NFC на первых двух страницах.

Как мы загружали банковскую карту из iPhone в брелок / Хабр

Кроме ID также может содержаться информация о заблокированных readonly байтах. А также масса другой информации все зависит от типа метки и поддерживаемых возможностей. Также служебная информация может быть записана в конце метки на последних страницах. Более подробно описанное можно увидеть программе для чтения меток, например TagInfo.

Как мы загружали банковскую карту из iPhone в брелок / Хабр

Рекомендуется записывать данные с 8 страницы для пустых — купленных меток.

Для билетов рекомендуется записывать с 16 страницы. Длина имени справочника не должна превышать 60 символов, в случае использования билета.

Некоторые билеты, как правило проездные на много поездок, имеют всего 20 страниц, с учетом блокированных служебных записать на такой билет не получиться.

Данная разработка позволит быстро интегрировать в ваше мобильное приложение функционал чтения записи NFC.a меток.

Возможные варианты использования:
Складской учет номенклатуры, упаковок, ячеек, мест хранения.
Учет ОС, МБП: шкафов, столов, компьютеров.
Мобильный пропускной пункт.
И так далее.

Исходники приложения доступны по ссылке https://github.com/PloAl/RfIdTool

Приложение является «служебным» и не имеет основной activity, также нет в меню приложений android. Запуск происходит из других приложений, туда же передаются считанные данные или передаются данные для записи в метку.

Ниже на картинке видна, полупрозрачная область «Запись метки NFC» это единственная activity приложения.

Как мы загружали банковскую карту из iPhone в брелок / Хабр

Пример использование в android приложении:

protected void nfcStart(boolean read, String readedId) {
    
    if (read)) {
        Intent intent = new Intent("com.ploal.rfidtool.NFCREAD");
        intent.putExtra("IdLabel", readedId); //множественное чтение, предыдущий id метки 
    }
    else{
        Intent intent = new Intent("com.ploal.rfidtool.NFCWRITE");
        intent.putExtra("PageNumber", PageNumber); //глоб. переменная номер страницы 
        intent.putExtra("WriteString", WriteString); //глоб. переменная текст для записи
    }
    startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (null != data) {
        String event = data.getStringExtra("event");
        String uid = data.getStringExtra("uid");
        String result = data.getStringExtra("result");
        String text = data.getStringExtra("text");
        String[] techArr = data.getStringArrayExtra("tech");
        //обработка полученных данных ...
    }
}

Пример использование в мобильном приложении(клиенте) 1с:

&НаКлиенте
Процедура ЗапускПриложенияNFC(Чтение=Истина,ПрочитанныйID="")
    ЗПМУ = Новый ЗапускПриложенияМобильногоУстройства();
        
    Если Чтение Тогда
        ЗПМУ.Действие = "com.ploal.rfidtool.NFCREAD";
        ЗПМУ.ДополнительныеДанные.Добавить("IdLabel",ПрочитанныйID);
    Иначе
        ЗПМУ.Действие = "com.ploal.rfidtool.NFCWRITE";
        ЗПМУ.ДополнительныеДанные.Добавить("PageNumber","" НомерСтраницы);
        ЗПМУ.ДополнительныеДанные.Добавить("WriteString",ТекстЗаписи);
    КонецЕсли;
    
    Если ЗПМУ.ПоддерживаетсяЗапуск() Тогда
        ЗПМУ.Запустить(Истина);	
        Событие = "";
        Для Каждого Стр Из ЗПМУ.ДополнительныеДанные Цикл
            Если Стр.Ключ = "event" Тогда
                Событие = Стр.Значение;
            ИначеЕсли Стр.Ключ = "uid" Тогда
                УИД = Стр.Значение;	
            ИначеЕсли Стр.Ключ = "result" Тогда
                Результат = Стр.Значение; //HEX строка
            ИначеЕсли Стр.Ключ = "text" Тогда
                Текст = Стр.Значение;	
            ИначеЕсли Стр.Ключ = "tech" Тогда
                Техлист = Стр.Значение;	
            КонецЕсли;
        КонецЦикла;
        //обработка полученных данных ...
    КонецЕсли;	
КонецПроцедуры 

Копируем ключ от домофона miifare телефоном mct

Продолжаем тему постов про rfid.

Когда нибудь напишу объёмный пост, где постараюсь систематизировать знания. Там будет много теории и практической информации. А пока встречайте мини пост про приложение MIFARE Classic Tool. В недавнем посте про сниффер, случился такой диалог в комментариях.
Копировальщик mifare 1k / сниффер

Товарищ @2ch.ru купил штуку под названием arc122 для считывания и записи mifare. И по ошибке подумал, что оно считало зашифрованный ключ. На скрине в переписке я показал ему, что домофонный ключ был без защиты. Ключ Б всех секторов стоит дефолтный FFFFFFFFFFFF. А значит, чтобы прочитать метку, достаточно иметь телефон с NFC на андроид. Записать тоже можно, но нужна болванка, я называю их MCT, в честь приложения. Не путать с classic и zero.
Герой этого поста – приложение, которым я читаю и пишу основную массу ключей.

Читайте ещё про NFC:  Как пользоваться банкоматом Сбербанка

READ – чтение меток. Там мы можем выбрать какие читать сектора и какие ключи для этого использовать.
Extended-std.keys это расширенный список стандартных ключей. Std.keys короткий список. Если ключ прочитан, на экране отображается его содержимое , либо полностью, либо частично. Мы можем добавить свои библиотеки или ключи от конкретной метки в другом меню, а здесь выбрать нужный список.

Здесь же можно сохранить его в память и отредактировать, чтобы потом не имея оригинала, делать дубликаты.
Следующий пункт WRITE – запись.

Здесь мы можем записать ключ поблочно. Либо полностью залить дамп. Можем клонировать uid – актуально для ключей домру. И ещё пара неиспользуемых мной функций. Есть хитрость, не всегда метка полностью записывается функцией запись дампа. Обычно проблемы с 0 блоком 0 сектора, где хранится uid. Эта проблема касается заготовок MCT (zero перезаписать в этом приложении не выйдет, вернее его нулевой блок нулевого сектора). В таком случае нам нужно записать поблочно информацию из нулевого блока нулевого сектора нашего дампа на нашу болванку. И все, ключ полностью идентичен. Проверим это функцией чтения. У основной массы меток, достаточно сверить 0 блок 0 сектора и 3 блок 0 сектора. Если это последние домофоны метаком, то имеет смысл обратить внимание на 14 сектор.
Следующие два пункта главного меню позволяют нам редактировать дампы и ключи. Мы можем сами создавать файлы с ключами, чтобы считать зашифрованную метку. Можем импортировать все ключи из файла с дампом. Можем делать резервные копии и импортировать дампы в другие форматы, поддерживаемые другими приложениями или proxmark3. Можем сравнить два дампа, иногда бывает очень полезно.
Допустим у нас есть метка домру , где авторизация идёт максимально тупо, по uid. Берём телефон, прикладываем сзади метку, и считываем ключ используя стандартные ключи (или не стандартные, не так много их через меня прошло). Сохраняем дамп. Берём заготовку, и делаем запись дампа. Либо просто 0 блока 0 сектора, если пароль стоит дефолтный FFF… Если при записи дампа последний не записался, то сделать это вручную. Все, ключ готов. Поздравляю, вы сэкономили 300 рублей и получили моральное удовлетворение от того, что сделали это своими руками.

Казалось бы, ситуация простая, решение тоже. Но как оказывается, люди не очень знают об этом приложении и не умеют пользоваться им. Ещё оно удобно, для проверки стандарта ключа. Если приложив метку, мы сможем считать uid функцией display tag info из настроек, то у нас mifare на частоте 13.56 МГц. Кстати, mifare тоже бывают разные, на 1k свет клином не сошелся. Возможно напишу об этом позже.
Предыдущие почты на тему rfid:
Копировальщик ключей домофона
Делаем ключ 3 в 1 (шлагбаум, домофон и калитка)
Проект компактного копировальщика ключей EM/Ibutton
Ключ от домофона EM-MARINE 2 в 1
Копировальщик mifare 1k / сниффер
Спасибо за внимание, плюсики и подписки. Мой контакт в профиле. Пишите, что ещё вам интересно касаемо темы rfid и других. Задавайте вопросы и комментируйте. Ваша активность это основной мотиватор для продолжения.

P.S. утром перечитал пост и исправил ошибки, где то дополнил. Глянул статистику и удивился. 22к просмотров. Около 1% просмотревших поставили плюсы. Около 2% сохранили пост. И около 15 человек оставили комментарии. Интересно и странно. Ну да ладно.

Обходные пути

Первое, что приходит в голову — а можно ли добавить в info.plist не AID платежного апплета, а AID Card Manager’а (Card Manager — это группа сервисов внутри операционной системы чипа, управляющих картой, которые отвечают за администрирование и безопасность), чтобы потом вручную послать ему команду SELECT с AID нужного апплета?

Здесь мы споткнулись о первый подводный камень — Core NFC не позволяет отправлять команду SELECT, содержащую AID, который не прописан в info.plist.

Хорошо, добавили A0000000041010, но и тут неудача — Core NFC не позволяет отправлять команду SELECT, содержащую платежный AID, вне зависимости от того, есть он в info.plist или нет.

Разберемся, как именно работает ограничение по идентификаторам.

В info.plist мы указали следующие AID’ы:

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

Мы установили 14 платежных апплетов с разными AID (пп. 2-11 — платежные AID-ы), и попробовали отправить Card Manager команды SELECT с каждым из этих AID.

Ответили номера 12-15.  

Получается, что ограничение накладывается именно на некий префикс AID, наличие которого и определяет, платежный это идентификатор или нет.

Жаль, но этот способ отпадает.

Второй способ персонализации, предусмотренный GlobalPlatform, это команда INSTALL [for personalization].

Она отправляется в Card Manager и содержит AID апплета, который нужно персонализировать.

После этого можно отправлять команды STORE DATA в Card Manager, а он будет пересылать их в целевое приложение.

Но есть одно ограничение. Для того, чтобы апплет поддерживал такой способ персонализации, он должен реализовывать интерфейс org.globalplatform.Application.

Card Manager, на команду INSTALL [for personalization] с Mastercard Credit/Debit (Global) AID, который был присвоен апплету M/Chip Advance от NXP, отвечал ошибкой «6985» (Conditions of use not satisfied),

а значит надо проверить, реализует ли он интерфейс Application.

Для этого мы написали простое приложение-пустышку, реализующее этот интерфейс. Как и ожидалось, на INSTALL [for personalization] оно ответило «9000».

Но когда Application был убран из интерфейсов, реализуемых приложением, оно стало отвечать на эту команду «6985», как и в случае с апплетом M/Chip Advance.

Следовательно, проблема именно в том, что приложение NXP не реализует необходимый для такого способа персонализации интерфейс. Этот способ тоже отпадает.

Установление соединения

Именно здесь речь пойдет о фичах фреймворка

, добавленных в iOS 13.

Кстати, в iOS 14 никаких существенных изменений относительно предмета статьи не случилось, поэтому все описанное актуально и для нее.

Итак, в тринадцатой версии яблочной ОС стало возможным не только считывать данные с NFC меток, как это было в iOS 12 (но не раньше iOS 11, до нее взаимодействие по NFC было возможно только в рамках Apple Pay), но и записывать их, а также общаться  на языке APDU-команд с любым чипом, который соответствует одному из следующих стандартов:

Для этого в

были добавлены два новых класса:

Первый используется для взаимодействия с NDEF метками, а второй — для всего остального, соответственно.

В нашем случае это чип, поддерживающий спецификацию GlobalPlatform Card Specification 2.2.1 и стандарт ISO/IEC 7816, значит, будем использовать второй класс.

В документации написано, что нужно сделать (помимо написания кода, конечно), чтобы начать общение с чипом по ISO 7816:


Но ниже есть вот такое интересное ограничение:

ImportantCore NFC doesn’t support payment-related Application IDs.Как раз его мы и хотим «пощупать», узнав, что конкретно оно означает.

Добавляем строку, например «Allow NFC connection» для ключа NFCReaderUsageDescription в файле info.plist. С любым другим значением этого ключа тоже работает. 

[Здесь в колонке слева не сам ключ, а его описание, XCode прячет формальные названия]

Дальше, если мы хотим взаимодействовать с чипом, как с устройством стандарта ISO/IEC 7816, то в значении ключа com.apple.developer.nfc.readersession.iso7816.select-identifiers укажем список ID всех апплетов (Application Identifier или AID), с которым будет взаимодействовать приложение.


Здесь стоит пояснить, что эти идентификаторы — не просто случайный набор символов.

Это шестнадцатеричные (hex) строки, содержащие информацию о приложении, которому они присвоены.

AID’ы могут быть длиной от 5 до 16 байт (два символа в строке = один байт). Они состоят из двух частей, первая определяет провайдера приложения (для Mastercard это «A000000004»), вторая говорит, какой именно это продукт данного провайдера (для продукта с именем «Mastercard» это «1010», а, например, для Maestro это «3060»).

Кроме того, иногда в AID требуется поместить дополнительную информацию, например, если на чипе находятся два одинаковых приложения от одного провайдера, но для разных банков. Для этого существует поддержка Long AID (или Extended AID). До тех пор, пока длина AID не превышает 16 байт, в него можно записывать все, что угодно. Например, мы взяли Mastercard AID и в конце дописали к нему «TEST», итог: «A0000000041010BB5445535401».

Единственный AID, который выбивается из списка — «325041592E5359532E444446303101». На самом деле это обычная (только в hex-формате), что называется, plain-text строка «2PAY.SYS.DDF01». Это AID PPSE, который платежным апплетом, как таковым, не является. Он лишь содержит данные окружения, необходимые платежным приложениям.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector