TL;DR В статье описывается процесс создания системы контроля доступа (СКУД), в которой в качестве идентификатора могут использоваться карты Тройка, любые бесконтактные банковские карты EMV, а также телефоны с Apple Pay и Android Pay. Управление системой происходит через Telegram-бота.
Основные задачи системы
- Избавиться от лишних карт — в качестве идентификатора используется то, что уже есть у пользователя: транспортная карта, телефон или банковская карта. Какой идентификатор использовать — каждый выбирает сам. Система работает со всеми типами идентификаторов одновременно.
- Избавиться от бюро пропусков и сложных программ управления — нам надоело выдавать и забирать карты у пользователей, держать отдельные компьютеры для управления пропусками, изучать переусложненные программы.
- Управление через Telegram — заведение и удаления пользователей происходит удаленно и не требует компьютера.
Пожалуйста, не нужно больше карт!
?????????????????????????????— У вас уже есть наша карта?
?????????????????????????????— Пощадите…
Сейчас каждый хочет всучить вам свою карту: магазины, фитнес-клубы, парковки, бизнес-центры, VIP-скидки-баллы-накопления. Предлагать человеку носить с собой еще одну карту просто унизительно. А учитывая, что карты стандарта EM-Marine (125kHz), которые популярны в системах контроля доступа на территории СНГ, имеют толщину в три раза больше обычных ISO 7810 — это втройне унизительно.
Поэтому первое требование к нашей системе — никаких дополнительных карт.
?????????????????????Сравнение толщины карт Em-Marine и ISO7810
Помимо физических размеров, карты EM-Marine технологически отсталые. Такую карту можно легко клонировать с расстояния полуметра прямо из кармана прохожего.
Видео с демонстрацией: www.youtube.com/watch?v=qvIIUny4EWI
На видео показано считывание тонкой карты em4100 с расстояния 50см, толстые карты читаются с большего расстояния.
Все СКУД неудобные
Все существующие системы контроля доступа на наш взгляд слишком переусложнены и неудобны. Они требуют выпуска отдельных карт, установки программ, обучения персонала, запоминания последовательности действий с мастер-картами, и т.д.
В некоторых случаях сложные СКУД необходимы: в крупных зданиях с множеством зон доступа, турникетами, охраной, временными пропусками.
В случаях, когда контролировать доступ нужно к одной или двум дверям, такие усложнения не оправданы. Даже содержание отдельного компьютера с программой под СКУД — перебор для нас.
У нас нет отдельных сотрудников, занимающихся выпуском пропусков, нет временных пропусков и охраны. Администрирование системы должно быть настолько простым, чтобы любой новый человек мог быстро её освоить без инструкций. Так как ответственного за СКУД человека может не быть на месте, управление системой должно быть удаленным.
Карта «Тройка» как идентификатор
Карта «Тройка» — пополняемая карта для оплаты проезда на всех видах общественного транспорта Москвы. Это наиболее выгодный и удобный способ оплаты общественного транспорта и некоторых городских услуг: планетарий, каток, зоопарки, Третьяковская галерея, парковка. Поэтому «Тройка» есть у каждого москвича, который регулярно пользуется общественным транспортом. Приобрести карту можно в кассах метрополитена за ?1$.
Технически карта выполнена на базе чипа Mifare Plus, работающего в режиме SL1 — режим эмуляции Mifare Classic 1K. На обратной стороне карты находится 10-значный номер, который используется для удаленного пополнения баланса карты. Этот номер удобно использовать в качестве идентификатора в СКУД.
Номер карты «Тройка», записан в памяти карты в 32-м блоке 8-го сектора. Для чтения защищенной области памяти необходим шестибайтный ключ, который давно не является таким уж секретным.
Номер карты «Тройка» (не путать c UID чипа) хранится в защищенной памяти в блоке 32 со второго байта по младшие четыре бита седьмого байта. Для чтения этой области памяти необходим А-ключ от сектора 8. Эти ключи давно не являются секретом и легко находятся в интернете вместе с подробным описанием формата хранения данных. Так как мы не собираемся записывать никакие данные на карту, нам достаточно ключа А для чтения нужного сектора.
Таким образом, для занесения нового пропуска в базу данных достаточно визуально считать номер карты и сообщить его администратору. Это можно сделать даже удаленно.
Вопросы безопасности такого подхода рассматриваются в FAQ в конце статьи. Примеры кода для чтения номера карты Тройка с помощью Arduino есть в главе «Первый прототип».В Санкт-Петербурге существует похожая карта «Подорожник». При необходимости её можно также использовать в качестве идентификатора, одновременно с картой «Тройка».
Apple/Android Pay и банковские карты
Платежные инструменты с разными названиями работают по одному протоколу EMV
Все платежные инструменты, изображенные на картинке выше, работают по одному протоколу EMV, свободно доступному на сайте EMVco.com. Поэтому говоря «EMV-карта», мы будем подразумевать одновременно Apple Pay, Android Pay, Samsung Pay, Visa PayWave, MasterCard PayPass.
Существует заблуждение, будто POS-терминал должен отдельно поддерживать Apple/Android Pay, поэтому пользователи предпочитают искать на кассе специальную пиктограмму, чтобы быть уверенным, что их платежный инструмент поддерживается. На самом деле, почти везде, где поддерживается бесконтактная оплата, будет работать любое устройство.Бесконтактные EMV-карты (и контактные тоже) позволяют без авторизации, то есть без ввода PIN-кода, считать данные, обозначенные ниже. В последней главе мы рассмотрим, почему это достаточно безопасно.
// Имя владельца (доступно не всегда)
Cardholder Name: IVAN IVANOV
// Номер карты, выбитый на лицевой стороне
PAN: 4556 5386 2774 0649
// Срок действия
Expiry date: 08/2019
// Аналог track 1 для магнитной полосы (доступно не всегда)
Track 1: ....
// Аналог track 2 для магнитной полосы
Track 2: 4556538627740649.....
// Лог последних транзакций по карте. Включает дату, сумму операции.
// Доступен не всегда
Paylog: ...........
Некоторые карты не передают реквизиты Cardholder Name и лог транзакций, но PAN (номер карты) передается всегда. Этот номер не изменяется на протяжении всего срока действия карты.
Поэтому именно PAN мы решили использовать в качестве идентификатора для пропуска в СКУД. Для простоты и большой приватности, было решено использовать последние 10 цифр от номера карты. Таким образом, формат идентификатора получается такой же длины, как и номер карты Тройка.
В итоге, в базе данных идентификаторов мы имеем однородные записи длинной в 10 цифр, без необходимости дополнительно помечать где карта Тройка, а где EMV-карта.
Читаем EMV-карты на коленке
Читать EMV-карты можно любым NFC-ридером, поддерживающим передачу произвольных APDU-команд. Для этого не требуются промышленные сертифицированные ридеры, подойдет любой модуль для Arduino за $3
Чтобы изготовить прототип считывателя, мне потребовалось бегло изучить протокол EMV. Под спойлером — краткий разбор протокола EMV с примерами чтения на Arduino и компьютере.
- PN532 breakout board + Arduino — pn532 лучше всего подключать к Arduino по SPI. Логические уровни чипа pn532 — 3.3V, поэтому удобнее использовать Arduino pro 3.3V, чтобы избавиться от конвертера уровней. Пример кода для чтения EMV-карт есть в моем форке библиотеки Adafruit PN532, c исправлениями для чтения EMV-карт.
- PN532 breakout board + адаптер USB-TTL — плату PN532 можно подключать через UART-адаптер к компьютеру и пользоваться набором библиотек libnfc
- Любой PC/SC-совместимый ридер — такие как ACR122U, HiD Omnikey и многие другие.
- Android смартфон с NFC-модулем — бесплатная утилита Credit Card Reader позволяет читать EMV-карты телефоном. Имеет удобный лог APDU-команд и парсер ответов карты. Если заплатить 100 рублей (donate), то во вкладке Log появляется удобный парсер всех посланных APDU команд, что невероятно удобно для отладки. Программа имеет открытую библиотеку на Java.
Описанный ниже процесс не является корректной реализацией протокола EMV. Приведенные команды APDU содержат ошибки и нарушают рекомендации EMVco, из-за чего могут не работать с некоторыми картами.Приведенные APDU-команды будут одинаковыми не зависимо от выбранного оборудования. Однако в случае с PC/SC ридером не нужно заботиться о низкоуровневых командах, настраивать модуляцию и т.д.
Для изучения протокола EMV рекомендуется читать официальную документацию, которую я, к своему стыду, почти не читал.
Я буду использовать программу SmartCard Scripter, в связке с PC/SC-ридером HiD Omnikey. Программа SmartCard Scripter имеет наиболее компактный pascal-подобный синтаксис из всего что я видел. Краткое описание синтаксиса infintuary.org/scs_tut.php
Для того чтобы послать произвольную APDU команду на карту, достаточно такого когда:
// Программа для чтения UID карты
begin
APDU('FF CA 00 00 00');
end.
Начало коммуникации — команда SELECT (PPSE)
Официальное описание: EMV Contactless Specifications — PPSE and Application Management for Secure Element
Начало общения с EMV-картой всегда происходит с чтения файла PPSE (Payment System Environment) командой SELECT.
APDU-команда SELECT PPSE
'00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00'
00 A4 04 00 // команда select
0E // длина command data (14 байт)
32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 // command data 2PAY.SYS.DDF01
00 // завершающий маркер
Старт платежного приложения — SELECT AID
В ответ на SELECT PPSE карта должна вернуть FCI (File Control Information) со списком приложений, существующих на карте. Помимо платежных приложений (VISA, MasterCard, AmericanExpress) карта может содержать неплатежные приложения, используемые для других нужд.
Ответ карты VISA на SELECT PPSE
'6F 23 84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 A5 11 BF 0C 0E 61 0C 4F 07 A0 00 00 00 03 10 10 87 01 01 90 00'
Для удобства проанализируем ответ с помощью онлайн-парсера формата TVL emvlab.org/tlvutils/. Тот же ответ карты VISA, обработанный парсером:
Из всего этого нас интересует только идентификатор платежного приложения (AID). В данном случае, это значение A0000000031010, означающее Visa International.
AID помечается маркером 4F. Вторым битом после маркера следует длина данных, в нем содержащихся. Несмотря на то, что длина AID может варьироваться от 5 до 16 байт, в большинстве случаев она равна 7 байтам. Поэтому для простоты поиска AID в ответе, мы будем искать маркер 4F 07 и считать 7 байт после него как AID. Такой подход очень примитивный и может не работать в случаях, если длина AID будет другой, но для нашей задачи это не важно, так мы скорее всего никогда не столкнемся с картами, отличными от Visa и MasterCard. Поэтому наш самодельный парсер PPSE-ответа можно упростить до такой логики: если ответ начинается с 6F, заканчивается на 90 00 и содержит внутри последовательность 4F 07, ответ считается корректным.
Полный список AID: eftlab.co.uk/knowledge-base/211-emv-aid-rid-pix
Некоторые популярные AID
A0000000031010 Visa International
A0000000032020 Visa International
A0000000041010 Mastercard International
A0000000043060 Mastercard International United States Maestro (Debit)
Получив значение AID, его нужно запустить командой SELECT. В данном случае мы запускаем приложение Visa International, полученное из ответа на PPSE SELECT
APDU-команда SELECT AID
'00 A4 04 00 07 A0 00 00 00 03 10 10'
00 A4 04 00 // команда select
07 // длина command data (7 байт)
A0 00 00 00 03 10 10 // AID Visa International
Обработка PDOL (Processing Options Data Object List)
В ответ на запуск платежного приложения карта может затребовать от считывателя PDOL (Processing Options Data Object List). Это набор параметров POS-терминала — поддерживаемые протоколы и стандарты, валюта, в которой будет производиться расчет, дата, случайное число для криптографии, и так далее.
Список PDOL может различаться у разных карт. Общее число параметров PDOL — несколько десятков. Полный список параметров PDOL можно посмотреть здесь: eftlab.co.uk/index.php/site-map/knowledge-base/145-emv-nfc-tags.
Сложность состоит в том, что список PDOL у разных карт, даже выпущенных одним банком в разное время, может существенно различаться. Некоторые карты запрашивают два-три параметра, другие — десяток.
Это очень важный момент, так как некоторые карты могут отказаться работать без корректного ответа PDOL. Поэтому, для получения PAN-номера от всех карт, нам придется прикинуться настоящим POS-терминалом. Напомню, что единственной нашей целью является получения PAN-номера. Поэтому попытаемся сформировать максимально простой, но при этом корректный ответ PDOL.
Ответ карты на старт платежного приложения. Содержит запрос PDOL.
'6F 31 84 07 A0 00 00 00 03 10 10 A5 26 9F 38 18 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 BF 0C 08 9F 5A 05 60 08 40 06 43 90 00'
Пропустим этот ответ через парсер:
Видно, что значение PDOL начинается с маркера 9F38 и равно 9F66049F02069F03069F1A0295055F2A029A039C019F3704. Парсер emvlab.org не умеет парсить значения PDOL, поэтому воспользуемся программой для Android-смартфонов Credit Card Reader.
Вот тот же ответ, обработанный более умным парсером. Видно каждый параметр PDOL:
Данный парсер не скрывает байт длины после маркера, как это делает emvlab.org. Поэтому последний байт каждого маркера следует читать как длину.
Разберем запрос PDOL подробнее
9F 38 18 // Маркер начала PDOL. Длина 18 (24 байта)
9F 66 (длина 04) // Terminal Transaction Qualifiers (TTQ). Параметры платежного терминала
9F 02 (длина 06) // Сумма списания
9F 03 (длина 06) // вторая сумма
9F 1A (длина 02) // Код странцы в формате ISO3166-1
95 (длина 05) // Terminal Verification Results
5F 2A (длина 02) // Код валюты, в которой работает терминал, в формате ISO4217
9A (длина 03) // Дата в формате YYMMDD
9C (длина 01) // Тип транзакции
9F 37 (длина 04) // Случайное число для криптографии
Подробное описание всех возможных параметров PDOL можно найти в EMV Contactless Specifications Book C-1/2/3 Kernel 1/2/3 Specification.
Карта ожидает ответ на PDOL в том же порядке, в котором следуют запросы, и ровно той длины, которая указана после каждого параметра PDOL. Если сложить длину всех параметров (последний байт каждого параметра), получится 33 байта. Значит карта ожидает от считывателя PDOL длиной в 33 байта.
Так как мы не собираемся списывать с карты деньги, наша задача — сформировать самый простой из возможных ответ PDOL, который удовлетворит карту. Если наш ответ не понравится карте, она ответит кодом 6985 Conditions of use not satisfied.
Экспериментальным путем я выяснил, что почти на все запросы PDOL можно ответить нолями, кроме Terminal Transaction Qualifiers (TTQ). В случае с VISA, нам нужно убедить карту в том, что терминал соответствует спецификации VCPS 2.1.1. Для этого ответ на TTQ должен выглядеть так:
'F0 00 00 00'
Подробнее про формат TTQ здесь.
Карты MasterCard, которые мне довелось испытать, позволяли игнорировать PDOL и отдавали PAN-номер без корректного ответа на PDOL.
Вот как будет выглядеть минимальный рабочий ответ на запрошенный выше PDOL:
'80A80000238321F0000000000000000000000000000000000000000000000000000000000000000000'
80 A8 00 00 // Команда GET PROCESSING OPTIONS (GPO)
23 // длина всего запроса (35 байт)
83 // маркер PDOL-ответ
21 // длина PDOL-ответа (33 байта)
F0 00 00 00 // Terminal Transaction Qualifiers (TTQ)
00 00 00 00 00 00 // Сумма списания
00 00 00 00 00 00 // Вторая сумма
00 00 // Код страны считывателя
00 00 00 00 00 // Terminal Verification Results (TVR)
00 00 // Валюта
00 00 00 // дата
00 // тип транзакции
00 00 00 00 // Случайное число
Если наш ответ удовлетворил карту, мы получим сообщение, начинающееся с маркера 77 с кодом SW2=9000. Этот ответ может содержать нужный нам PAN-номер, а может и не содержать. (офигеть)
Поиск PAN-номера
Так как нам лень писать полную имплементацию протокола EMV, разбирать все структуры ответов и формировать корректные запросы, мы поступим глупым способом, а именно пошлем все возможные запросы и будем просто искать в ответах нужный маркер, содержащий PAN-номер.
PAN-номер может содержаться в трех местах:
- Track 2 Equivalent Data — маркер 57. Может иметь длину от 0 до 19 байт, но обычно всегда равен 13 (19 байтам). Поэтому как маркер можно использовать последовательность 57 13. Первые 8 байт всегда содержат PAN-номер.
- Application Primary Account Number (PAN) — маркер 5A. Всегда имеет длину 8 байт, поэтому можно искать как маркер последовательность 5A 08. Содержит только PAN номер.
- Track 2 Data — маркер 9F 6B" — . Длина обычно 13 байт. Содержит PAN номер и другую информацию.
APDU-команды (что они значат вообще? Хз, нужно прочитать)
'00 b2 01 1c 00'
'00 b2 01 0c 00'
'00 b2 02 0c 00'
'00 b2 01 14 00'
'00 b2 02 14 00'
'00 b2 04 14 00'
И парсим все ответы на предмет маркеров 57 13 либо 5A 08. Найденные 8 байт карты можно дополнительно чекнуть на контрольную сумму с помощью Алгоритма Луна.
Если номер валидный, берем его последние десять цифр.
В итоге наш примитивный алгоритм чтения PAN-номера можно изобразить в виде блок-схемы
Первый прототип
Было решено использовать в качестве идентификатора пользователя 10-значный номер, который будет формироваться либо из десяти последних цифр PAN-номера платежной карты, либо из номера карты «Тройка». Идентификатор должен передаваться контроллеру, который будет сверять его с хранящимися в базе данных номерами и решать, открывать дверь, или нет.
Всю работу по распознаванию карты должен выполнять считыватель, и на выходе отдавать 10-значный номер. В базе данных достаточно хранить только сами номера, без необходимости отмечать тип карты.
Так родился первый прототип считывателя на Arduino + PN532 breakout board.
Видео с демонстрацией работы прототипа: www.youtube.com/watch?v=aXNvjuRrCQk
Скетч для Arduino, показанный в видео, выложен здесь: github.com/zhovner/Adafruit-PN532, в папке examples/ApplePay_Troyka_ACS
Данный код довольно плохой, потому как не генерирует ответ PDOL, из-за чего не все EMV-карты будут успешно прочитаны. Однако он позволяет понять общую логику работы системы описанной в статье.
Считыватель Parsec
С самого начала мы не хотели городить кустарные поделки на arduino или raspberry pi, поэтому стали искать решение на базе промышленного оборудования.
Так как на рынке готовых решений не существует устройств даже примерно похожих на то, что нам было нужно, мы стали спрашивать у всех производителей СКУД, кто сможет реализовать наши извращенные фантазии в своем оборудовании.
Единственной компанией, которая стала с нами разговаривать, были Parsec.ru
В итоге они согласились реализовать наши идеи в прошивке своего считывателя PNR-P03E.
Parsec PNR-P03E позвоялет запрограммировать любой нестандартный алгоритм чтения карт
Большинство RFID-считывателей, которые доступны в продаже, поддерживают только определенный формат идентификаторов. Например Mifare, HiD iClass и т.д.
Нам же требовалось, чтобы считыватель поддерживал одновременно несколько форматов карт, и реализовывал нестандартный протокол чтения EMV-карт.
Ключевые особенности считывателя PNR-P03E
- Программируемый алгоритм чтения карт — возможность загрузки нестандартной прошивки позволяет реализовать любую логику считывания карт, в том числе одновременную поддержку карт EMV, «Тройки» и любых других. Функциональность считывателя может быть расширена обновлением прошивки.
- Поддержка различных интерфейсов подключения контроллера — считанный идентификатор передается на контроллер по любому из доступных протоколов: Wiegand от 26 до 58 бит, OSDP (RS-485, RS-232), Touch memory (I-Button) и собственный проприетарный протокол Parsec
- Отделяемый антенный модуль — плата имеет линию перфорации, позволяющую отделить антенну от основного модуля для удобства интеграции в корпус
- SDK для разработки — библиотеки с примерами кода позволяют интегрировать считыватель в свои проекты
Блок-схема, иллюстрирующая работу считывателя. При успешном считывании идентификатора, он передается на контроллер по протоколу Wiegand.
Считыватель самостоятельно определяет тип карты и выполняет считывание нужной области памяти. Если определить тип карты не удалось, считыватель игнорирует её. Прочитанная область памяти конвертируется в десятизначный идентификатор и передается на контроллер.
Контроллер БОРЕЙ
Контроллер — это устройство, на которое передается идентификатор карты от считывателя. Оно хранит базу данных идентификаторов карт и решает, кого пропускать, а кого нет, управляя замком двери.
Часто контроллеры СКУД состоят из нескольких блоков управления и компьютера с базой данных. Мы принципиально не хотели держать отдельный компьютер и искали компактное решение в виде одного устройства, которым можно управлять через API для интеграции с Telegram-ботом.
Поиск такого устройства занял больше месяца, пока я не наткнулся на старую статью на хабре «Обзор СКУД с бесплатным программным обеспечением». В комментариях пользователь rgmih упомянул, что их компания производит именно такой контроллер.
Так мы нашли контроллер БОРЕЙ от компании ИТРИУМ.
???????????????????????????Плата контроллера БОРЕЙ в настенном корпусе
Устройство работает под управлением Linux на базе ARM-процессора.
Основные достоинства устройства, которые редко можно встретить у других контроллеров:
- Полностью автономный — все функции выполняет одно устройство. Для управления не нужно дополнительных программ или отдельного компьютера. База данных хранится на SD-карте. При отключении интернета контроллер продолжит работать.
- Web интерфейс и REST API — возможность управлять контроллером через браузер и интегрировать с Telegram-ботом через API. Позволяет управлять пропусками удаленно.
- Подключение по Ethernet — устройство подключается в IP-сеть. Имеет встроенный коммутатор на 2 порта.
- Идентификаторы произвольной длины до 64 бит — возможность интегрировать контроллер с нестандартными идентификаторами разной длины. Позволяет иметь гибридную систему с идентификаторами разной длины.
В момент считывания карты, считыватель передает прочитанный идентификатор карты на контроллер по протоколу Wiegand. Контроллер ищет идентификатор в своей базе данных и решает, можно ли этому идентификатору открывать дверь или нет.
Если можно, контроллер размыкает реле магнитного замка на двери и посылает сигнал световой и звукой индикации на считыватель. Считыватель издает одобрительный писк и загорается зеленым цветом.
Если доступ запрещен, контроллер посылает сигнал индикации на считыватель, и тот горит красным цветом и пищит о том, что доступ не разрешен.
Управление контроллером
Контроллер подключается в сеть c помощью Ethernet-кабеля. Начальная настройка требует только задать IP-адрес устройства. Никакого программного обеспечения, помимо браузера, не требуется.
Учетные записи заводятся в меню «Бюро пропусков». Чтобы не вводить идентификатор карты вручную, его можно поднести к считывателю в момент создания учетной записи.
???????????????????Создание нового пропуска в веб-интерфейсе контроллера БОРЕЙ
Веб-интерфейс позволяет управлять заведением пользователей удаленно с любого устройства и следить за журналом событий, не находясь на рабочем месте. Даже если связь контроллера с интернетом пропадет, это не нарушит его работу, так как вся база данных хранится локально, а интернет нужен только для внесения изменений.
Бюро пропусков в Telegram
Чтобы каждый раз не обучать нового администратора, как пользоваться веб-интерфейсом контроллера, мы решили создать Telegram бота, через которого будет происходить добавление/удаление пропусков. Это возможно благодаря наличию в контроллере БОРЕЙ REST API.
?????????????????????????????Управление пропусками через Telegram-бота.
FAQ
В процессе работы над системой мне часто задавали одни и те же вопросы, которые наверняка возникнут и в комментариях. Я собрал самые популярные:
- Если отключится интернет, все сломается?
Нет, если у контроллера пропадет доступ в интернет, система продолжит работать, так как вся база данных хранится локально на контроллере. Без интернета нельзя будет внести изменения в конфигурацию. При этом доступ в веб-интерфейс сохранится из локальной сети. - Можно создать клон карты «Тройка» и сделать поддельный пропуск!
Да, это так. Можно подсмотреть номер карты у пользователя и создать клон. Однако для этого потребуется оборудование для записи карты (смартфон на Android c NFC тоже подойдет), знание ключей доступа к сектору и навыки работы с картами Mifare. В нашей модели угроз, такая уязвимость не является критической, так как на входе всех встречает администратор у ресепшена. Учитывая, что большинство систем контроля доступа в СНГ работают на картах EM-Marine, которые можно клонировать на расстоянии метра от человека без знаниях каких-либо ключей вообще, наша система намного более безопасна и требует от атакующего бо?льших усилий. - Вы сможете скопировать мою банковскую карту и украсть деньги.
Это очень популярное заблуждение. Протокол EMV защищен от подобных атак и бегло разбирается в главе «Читаем EMV карты на коленке». На пальцах, защита работает так: карта хранит приватный ключ подписанный банком-эмитентом, который прошивается в память на этапе выпуска карты. Банк-эмитент (который выпустил карту) хранит у себя отпечаток приватного ключа карты. Чтобы списать деньги с карты, POS-терминал передает случайную последовательность данных вместе с суммой, которую собирается списать. Карта подписывает эти данные своим ключом и отвечает POS-терминалу. Результат передается в банк-эмитент, который проверяет подпись. Так как секрет знает только карта, и он не может быть извлечен из карты, скопировать карту так, чтобы с нее можно было списывать деньги — невозможно. - Но вы можете скопировать открытые данные карты, такие как номер, срок действия и имя владельца.
Да, это возможно. Но этих данных, в большинстве случаев, недостаточно для оплаты. CVV-номер в них не содержится. Кроме того, реквизиты, полученные из Apple Pay не будут работать для оплаты в интернете. Однако эти опасения вполне справедливы, и для тех, кто не хочет использовать банковские карты, всегда есть возможность использовать карту «Тройка».
- Можно узнать номер EMV карты и подделать пропуск.
В теории да, но мне не известно доступное оборудование для эмуляции EMV карт. Существуют аппаратные эмуляторы вроде ChameleonMini, однако работают они достаточно плохо. Есть также Android Host-based Card Emulation, который в теории позволяет эмулировать любую карту на Android смартфоне. Но мне опять же не известны реально существующие реализации таких эмуляторов, позволяющие загружать произвольный дамп карты.
Спасибо всем, кто помогал мне в этом проекте:
Иллюстрации к статье — aquamine
Помощь в написании кода — ValdikSS
Написание Telegram бота — Alexey Tsverov
Разработка прошивки считывателя — компания Parsec и лично Леонид Стасенко
Помощь в настройке контроллера — компания ИТРИУМ и лично Глеб rgmih Рыбаков
Комментарии (144)
nerudo
26.03.2018 10:34+1И можно вход на работу платным быстро сделать ;)
NeuroHunter
26.03.2018 10:42+1Скорее списывать штраф с тех, кто опаздывает.
В идеальном мире, конечно, можно было бы еще и премировать тех, кто рано приходит…
zhovner Автор
26.03.2018 10:55Если вы об угрозе несанкционированного списывания денег с карты, то цена такой атаки, по моим расчетам достаточно высокая, чтобы окупить затраты. В интернете гуляет страшилка, будто мошенники прижимаются к вам в метро и списывают деньги с карты лежащей в кармане.
Мне кажется, что это маловероятная схема мошенничества. Во первых почти всегда на картах установлен лимит списания суммы без PIN кода в размере 1000 рублей. То есть атакующий должен воровать по 999 рублей каждый раз.
Во вторых, для обработки платежа нужен свой собственный эквайринг.
Нельзя просто считать данные с карты и пойти потратить их в любом магазине, так как терминал «подсаливает» запрос и карта подписывает запрос вместе со случайными данными от POS терминала. То есть обработать подписанный картой хендшейк можно только этим же терминалом.
Получается, что атакующий должен иметь договор с банком и арендовать у него платежный терминал. Если число спорных транзакций по этому терминалу будет большим, банк быстро заблокирует терминал и счет. Сомневаюсь, что до этого момент атакующий успеет вывести деньги со счета. В итоге затраты на такую атаку мне кажутся сильно бОльшими, чем возможная прибыль злоумышленника. Хотя может я что-то не знаю и заблуждаюсь.river-fall
26.03.2018 18:40это обыкновенный курьер, которому можно оплатить карточкой :)
zhovner Автор
26.03.2018 22:13Полагаю что удивление вызвал включенный экран терминала, будто он во взведенном состоянии и готов к оплате.
Taciturn
26.03.2018 18:56Во первых почти всегда на картах установлен лимит списания суммы без PIN кода в размере 1000 рублей.
Откуда такая информация? Лично покупал ИБП за 39536 рублей, без всяких пин кодов, через PayPass.kudryavy
26.03.2018 23:30Скажем так: при правильных настройках pos-терминала при любой покупке на сумму выше 1000 р должен запрашиваться пин-код для авторизации.
К сожалению, не все умеют и хотят правильно настраивать эквайринговое оборудование. С меня просили подпись при оплате покупки на сумму меньше 1000 р. Потому что так настроили криворучки из банка.
kspshnik
29.03.2018 17:15Pay[Pass|Wave] или [Apple|Android|Samsung]Pay?
Taciturn
29.03.2018 17:21PayPass, вполне физическая карта MasterCard.
kspshnik
29.03.2018 17:52Хргрмр. Я бы бояться такой банки.
Dimes
29.03.2018 18:55и зря :) пин/подпись/ничего (CVM лист) это не только настройка карты, но и терминала, большинство банков сейчас позволяют клиенту самостоятельно выставлять приоритет пин/подпись на чипе, а холивары на тему того — что же лучше длятся уже десятилетиями на профильных форумах и победителей не видно. Но если терминал например вообще не оборудован ПИН-падом, то операция все равно пойдет по подписи/без всего.
Если считаете что с ПИНом вам спится крепче — пожалуйста, пользуйтесь теми картами у которых ПИН в приоритете. Я напротив не хочу ни где и никогда палить свой ПИН потому что операции с ПИН вообще потом отбить нельзя.
talbot
28.03.2018 00:55Дело не в лимите списания. Никто так не делает: эмитент с радостью получит свои 15€ сверху за каждое представление о возврате платежа, а эквайер даже не подумает его оспаривать, так как слишком дорого будет потом арбитраж оплачивать. Для борьбы с такими атаками у всех эквайеров есть служба финмониторинга, и я ни разу не слышал, чтобы кто-то реально пытался такое провернуть.
Demon_i
26.03.2018 10:43Как осуществляется резервирование бд? Хранить её на сд-карте — так себе решение.
rgmih
26.03.2018 11:01+2На объектах, где контроллеров более одного — каждый контроллер хранит копию базы данных. И они синхронизируют все изменения между собой в реальном времени. А потому, если какой-то контроллер (или его карта) и выйдет из строя, можно восстановить базу с другого контроллера в сети. В реальности, конечно, кроме контроллеров есть ещё и «серверные» узлы, где хранятся данные.
С контроллера БОРЕЙ можно выгрузить базу данных пропусков, владельцев и пр. в виде бинарного файла. В случае данного объекта, где предполагаю, пропуска выдаются не так часто, наверное, проще всего периодически выгружать базу (например, за раз в неделю) через HTTP API и сохранять её в облако.
Вообще, наши потребители почти не сталкиваются с выходом SD-карт из строя. Мы контролируем нагрузку на SD-карту и используем Industrial SD карты со SMARTом — можно следить за износом карты. Чаще картыворуют монтажникипросто пропадают на этапе пусконаладки объекта :D
Blooderst
26.03.2018 11:01-1Поскольку вы используете открытую информацию с карт, то эту информацию чрезвычайно просто скопировать/подделать. Фактически, все ваши ключи являются скомпрометироваными и использование вашей схемы позволительно лишь в случаях ПОЛНОГО пренебрежения безопасностью. Мне кажется, этот момент должен быть явно описан и выделен в тексте, дабы не вводить людей в заблуждение.
zhovner Автор
26.03.2018 11:04Мы используем только последние 10 цифр номера карты. С этой информацией нельзя сделать ничего. Какие ключи по-вашему это компрометирует?
Blooderst
26.03.2018 11:07Это компрометирует ключ от вашей двери, поскольку эти последние 10 цифр можеть прочитать/сэмулировать любой.
zhovner Автор
26.03.2018 11:14На эти вопросы я ответил в последней главе FAQ. Тем более в случае с ApplеPay, подсмотреть номер вы не сможете. Но если вы расскажите как будете эмулировать EMV карту на примере, я буду очень признателен.
Blooderst
26.03.2018 11:22> Но если вы расскажите как будете эмулировать EMV карту на примере, я буду очень признателен.
А в чем, сосбственно, сложность?
ru.wikipedia.org/wiki/ISO/IEC_7816 + ru.wikipedia.org/wiki/ISO/IEC_14443 + www.emvco.comzhovner Автор
26.03.2018 11:24То есть для атаки на нашу систему вы разработаете собственный аппаратный эмулятор карт ISO 1443a/b? Наверное проще, все же, будет пролезть в окно.
Blooderst
26.03.2018 11:32Не обязательно аппаратный, можно программный. И совершенно не обязательно эмулировать весь функционал EMV, достаточно эмулировать одну единственную функцию, которая отдает открытые данные. 10-15 строк кода, не считая бойлерплейта.
zhovner Автор
26.03.2018 11:35Буду признателен, если вы напишите такой эмулятор. А еще, желательно, с возможностью загрузки произвольных дампов.
Кстати, android hce уже умеет эмулировать 14443A или только 14443B?Blooderst
26.03.2018 11:39> Буду признателен, если вы напишите такой эмулятор. А еще, желательно, с возможностью загрузки произвольных дампов.
Любой каприз за ваши деньги =)
bromium
27.03.2018 20:29Буду признателен, если вы напишите такой эмулятор. А еще, желательно, с возможностью загрузки произвольных дампов.
Да таких полно на гитхабе. И в доках андроида написано, как эмулировать. Отвечать правильно на запрос apdu-команд нет пробелмы особой. И дампы загружать тоже. Поэтому я скептически на Ваше решение тоже смотрю. Тут работы на полдня, вся security through obscurity — пройтись сниффером один раз, чтобы понять, какие команды запрашиваются. Да даже для дуальной Java-карты можно написать простенький апплет. Хотя тас-смартфон проще для этих целей заюзать
rgmih
26.03.2018 11:37Согласен. Безопасность — это всегда поиск грани между ценностью защищаемого объекта и стоимостью взлома. Кстати, с определённого момента всё вообще упирается в человеческий фактор. И с обычными mifare картами проще отобрать эту карту у сотрудника в тёмной подворотне. Об этом хорошо писал Брюс Шнайер в книге «Секреты и ложь. Безопасность данных в цифровом мире». Как-то так:
В 1994 году французский хакер по имени Антоний Зборальски позвонил в вашингтонский офис ФБР и представился представителем этой организации, работающим в американском посольстве в Париже. Он убедил собеседника на другом конце провода, и тот объяснил ему, как подключиться к системе телеконференции ФБР. Его звонки за последующие семь месяцев стоили ФБР 250 000 долларов.
Когда в 2000 году Кевин Митник (наверное, самый известный хакер в мире) давал показания в Конгрессе США, он говорил о манипулировании людьми: «Нападения этого рода были столь успешны, что мне редко приходилось обращаться к техническим средствам. Компании способны истратить миллионы долларов на технические средства защиты, но все это будет напрасно, если можно позвонить по телефону и убедить кого-нибудь сделать на компьютере нечто, что ослабляет защиту или открывает доступ к интересующей информации».
Blooderst
26.03.2018 11:39-3Но, если исходить из вашей логики что поскольку в большинстве случаев массовые дешевые СКУДы используют для идентификации открытый UID карты (даже если и СКУД, и карты поддерживает криптографические функции), то да, ваша система ни чем не хуже и не лучше остального гавна.
rgmih
26.03.2018 11:45Каждой задаче — своё решение. Забивать гвозди микроскопом можно. Но для этого есть молоток. Так и тут — для простого объекта, риски проникновения на который не так высоки, подойдёт уровень «массовых дешёвых СКУД». Для аэропорта или атомной станции — нет. И в данном случае задача стоит на уровне «массового дешёвого СКУД». А предложенное решение даёт преимущество: не надо заводить отдельную пластиковую карту (как в остальных «дешёвых СКУД»).
denny_dev
26.03.2018 11:49А также, исключается необходимость ставить сервер с софтом, обслуживать то и другое, и учить кого-то этим всем пользоваться.
Blooderst
26.03.2018 12:01Тут есть одно «но». Отсутствие сервера обусловлено использованием контроллера БОРЕЙ с полноценным процессором на борту, что наверняка сильно сказывается на его стоимости по сравнению с «безмозглыми» аналогами. Если у вас 1 дверь, то это идеальный вариант. А если у вас 10 или 100 дверей, то я сильно сомневаюсь в финансовой целесообразности такого решения.
denny_dev
26.03.2018 12:12Есть масса «безмозглых» аналогов, за которые просят сопоставимые, а порой и большие деньги. Как-то же они продаются? :)
Вопрос финансовой целесообразности, как правило, это всегда не только и не столько цена контроллера.
На этих контроллерах есть системы на несколько сотен дверей.
Blooderst
26.03.2018 11:46Сори за резкость, не успел отредактировать. Ничего личного, ни в коем случае не хотел вас обидеть. И спасибо за статью, оборудование мне понравилось настолько, что захотелось пощупать.
DMGarikk
26.03.2018 13:13Последние 10? тоесть бОльшую часть значимого номера карты? напомню что первые 6 цифр это вполне общедоступный BIN, последняя цифра контрольная, получается что вы игнорируете 3 цифры из значимого (12значного) номера карты
посмотрите как маскируется номер карты в банковских приложениях
Igrek_L
26.03.2018 14:50Первые шесть цифр в номере карты одинаковы у всех карт этого типа этого банка. Фактически Вы читаете и храните полный номер карты. :(
P.S. Выше уже об этом написали.zhovner Автор
26.03.2018 15:05Вот две одинаковые визы альфабанка.
Ну и допустим вы атакующий и смогли похитить нашу базу данных. Напомню, в ней нет различий между идентификаторами Тройки и EMV карт. Какие ваши дальнешие действия? Что самое ужасное вы сможете сделать с этой информацией при самом удачном для вас сценарии?Igrek_L
26.03.2018 16:08Это разные карты, на разных продуктах. С такими же точно BINами от сотен до десятков тысяч карт. Элементарный подбор всех BIN, выданных на Россию с контролем по коду восстановит номера карт, которые, кстати, в разных банках вовсе не обязаны быть разными (что будете делать если пришла не уникальная карта? В базу надеюсь двум разным людям один ID не запишите?). Есть операции, для которых одного только номера достаточно для подлимита, даже expiration date не нужен.
zhovner Автор
26.03.2018 16:19Есть операции, для которых одного только номера достаточно
И что же это за операции?DistortNeo
26.03.2018 16:24Возможно, покупка на Амазоне.
Точно уже не могу сказать, но у меня был случай, когда ни имя, ни CVV не спрашивали. Нужен ли был срок действия — не помню.symbix
28.03.2018 21:41Срок действия нужен был даже тогда, когда не было этих ваших интернетов, компьютеров было мало и они были очень большими. "Оффлайновые" покупки делались через ручной импринтер снятием слипов (такой многослойный бланк с копирками, под давлением на нем остаются реквизиты карты — именно поэтому они и выдавлены, и именно поэтому процесс выпуска карт называется embossing), а "онлайновые" (card not present) — бумажной почтой или по телефону.
Igrek_L
26.03.2018 16:39Достаточно много их. Перечислять не буду, незачем кардеров плодить и так хватает.
От них не защитится иначе как не светить номером карты налево/направо. Если уж на то пошло срок действия тоже вычисляем, особенно легко если в процессинге персонализацию ведут без гаммирования, монотонным увеличением счетчика.
Запрет хранения номеров карт в PCI DSS не просто так…zhovner Автор
26.03.2018 17:04А если номера карт хранить нельзя, как все сервисы от icloud до steam хранят реквизиты кредитки и списывают деньги самостоятельно?
Carcharodon
26.03.2018 21:11Для этого есть отдельные схемы проведения рекуррентных платежей, например, однажды прошедшая успешно транзакция может быть проведена повторно без ввода данных платежной карты, например, по идентификатору транзакции.
Также для них никто соответствия PCI DSS не отменял. Храни, но защищай одним из способов:
* шифрование
* маскирование
* токенизация
* хэшированиеsymbix
28.03.2018 21:46Про рекуррентные платежи все так. Что касается способов защиты — это применимо к номеру карты и сроку действия, а вот CVV хранить нельзя вообще ни при каких условиях.
nwalker
27.03.2018 15:55Отдельное шифрованое хранилище, в скоупе PCI DSS, половинки ключа шифрования вводятся разными людьми на старте сервиса, CVV не хранятся, банк-эквайрер одобряет для отдельных платежных сервисов оплату без CVV.
talbot
28.03.2018 00:42У iCloud и Steam обычные рекурренты (новый платёж с привязкой к старому). У Стима нет своего PCI DSS, подозреваю, у Эппл тоже, все пользуются услугами сторонних PSP.
talbot
28.03.2018 00:40В PCI DSS как раз номера можно хранить в зашифрованном виде, нельзя хранить CSC (опять же с некоторыми оговорками). Но можно хранить т. н. синонимы карт.
talbot
28.03.2018 00:47Все операции, которые антифрод эквайера посчитал безопасными. Критерии могут быть разными, вот примерный список: MCC (merchant category code) продавца, сумма, «похожесть» операции на предыдущие, история платежей с устройства, с которого совершается платёж, геопозиция, оборот продавца. Для крупных ритейлеров а-ля 6pm.com ваш chargeback на 50$ никто не заметит и спишет в чистый убыток.
DistortNeo
26.03.2018 16:06Учитывая, что первые 6 цифр — это код банка, подавляющее большинство карточек выпущено всего несколькими банками, а в числе последних 10 цифр имеется ещё и контрольная сумма, зная последние 10 цифр, вы знаете все 16 цифр с вероятностью, близкой к 100%.
Upd. Сорри, про это уже написали
talbot
27.03.2018 08:34Подобрать первые шесть цифр номера очень легко перебором и проверкой по алгоритму Луна, PAN достаточно для оплаты в некоторых магазинах.
a1ien_n3t
26.03.2018 11:16Тоже обратил внимание, что безопасность от клонирования карт в предлагаемом решении не высока. Хотя с другой стороны на российском рынке все плохо с решением которые защищены от клонирования. Чтобы найти тех производителей которые работают с mifare plus в sl3 нужно нехило времени потратить.
zhovner Автор
26.03.2018 11:21А как же HiD iClass? Вроде как это самое доступное решение из достаточно безопасных. Хотя писали что он тоже сломан, вроде бы. Сам не пользовался.
AlexGre
26.03.2018 12:26По вызову комманды GET PROCESSING OPTIONS карта инкрементирует Application Transaction Counter, который по достижению лимита 0xFFFF или 0x7FFF безвозвратно заблокирует приложение… т.е. уничтожит карту. В итоге получаем нецелевое использование платежного приложения которое уменьшает срок жизни карты.
Вцелом чтение и манипулирования PAN или TRACK в открытом виде и не в платежном терминале (и не следуя инструкциям PCI/PA-DSS) компроментирует важные платежные реквизиты владельца карты. Заодно вызывая повышенный интерес взломать данное решение.
APDU-команды (что они значат вообще? Хз, нужно прочитать)
Это комманды ReadRecord. GET PROCESSING OPTIONS в ответе возвращает AIP и AFL. ALF (Application File Locator) содержит данные о рекордах, которые находятся на карте.zhovner Автор
26.03.2018 12:42По вызову комманды GET PROCESSING OPTIONS карта инкрементирует Application Transaction Counter, который по достижению лимита 0xFFFF или 0x7FFF безвозвратно заблокирует приложение
Спасибо, не знал об этом. Впрочем, полагаю что 65 или 32 тысячи хватит всем и карта истечет раньше чем этот лимит исчерпается. Если проходить в дверь по 20 раз в сутки без выходных, получается всего 7300 проходов в год.
Вы, кстати, не знаете как часто обновляются данные в токенах ApplePay и прочих? Присходит ли это чаще чем expire date в них?Peter1010
26.03.2018 16:11В случае обновления данных пользователя, происходит перевыпуск виртуальной карты ApplePay. Если я верно понял вопрос.
Но у apple pay ещё на каждую инициализацию запроса на оплату, создается еще и сессия, которая живет около получаса.
>>Если проходить в дверь по 20 раз в сутки без выходных, получается всего 7300 проходов в год.
У андроид и эппл Срок жизни виртуального счёта дают большой, если создать его сейчас то выдадут до 2031 года :)zhovner Автор
26.03.2018 16:16В случае обновления данных пользователя, происходит перевыпуск виртуальной карты ApplePay. Если я верно понял вопрос.
Коллеги высказали предположение, что данные виртуальной карты в ApplePay может меняться чаще, чем данные привязанной карты.
у apple pay ещё на каждую инициализацию запроса на оплату, создается еще и сессия, которая живет около получаса.
О какой сессии идет речь, не понимаю?
У андроид и эппл Срок жизни виртуального счёта дают большой, если создать его сейчас то выдадут до 2031 года :)
Это так, но когда привязанная к icloud аккаунту карта истечек по expire date и будет привязана новая, то виртуальная карта тоже перевыпуститься. То есть полагаю, что эта дата не может быть больше даты истечения привязанной карты.Peter1010
26.03.2018 16:49>>не может быть больше даты истечения привязанной карты.
Это интересный вопрос. Так как привязывал карту до 19, а выдало дату счёта до 31 :)
>>О какой сессии идет речь, не понимаю?
До сканирования отпечатка доходите?
Если да. То перед тем как показать попап, устройство делает запрос на сервера Apple и создаёт платёжную сессию, далее данные передаются в iТач и отрисовывается «поп-ап» с просьбой подтвердить отпечатком.
Следовательно ещё вопрос, если нет мобильного интернета, то оно будет работать?NeuroHunter
26.03.2018 17:57Великолепно будет — взаимодействие с сервером непосредственно при платеже отсутствует.
Я так иногда спокойно часами расплачиваюсь, без телефона и без подключения к каким-либо Wi-Fi сетям.
zhovner Автор
26.03.2018 17:58То перед тем как показать попап, устройство делает запрос на сервера Apple и создаёт платёжную сессию, далее данные передаются в iТач и отрисовывается «поп-ап» с просьбой подтвердить отпечатком.
Следовательно ещё вопрос, если нет мобильного интернета, то оно будет работать?
Не понимаю откуда вы это взяли. ApplePay работает без интернета.Peter1010
26.03.2018 18:09Ух ты. Значит он лезет только если есть инет. а если нет, то есть какое то защищенное хранилище которое время от времени синхронизируется :)
Ну я писал клиент для пея… ну и ради интереса посмотрел фидлером как оно работает при оплате с телефона. могу чуть по позже скинуть адреса куда лезет :)talbot
28.03.2018 01:03Ничего не синхронизируется: Apple Pay в оффлайне генерирует криптограмму, которую и отправляет. Авторизацией является ваш отпечаток пальца, которому МастерКард (и только МастерКард) доверяет как введенному пин-коду. Про ApplePay и Visa отдельный разговор.
talbot
28.03.2018 01:05Расскажите лучше, всегда один и тот же ли номер карты вам показывает Apple Pay? Вроде там на каждую транзакцию сгенерируется новый PAN из определённого пула номеров.
zhovner Автор
28.03.2018 03:27За все время тестирования показывало один. Номер сменился только истечения карты к которой был привязан ApplePay. Помониторю этот вопрос и сообщу.
Dimes
28.03.2018 19:22не гарантированно один — токен генерируется на уровне платежной системы (визы/мастера), к нему создаются Limited Usage Keys — ограничители активности токена, которыми опять же таки управляет платежная система.
Токенов под карту можно привязать сколько хочешь, но в общем случае даже привязка старой банковской карты к новому устройству породит новый токен.
Peter1010
26.03.2018 14:27должен отдельно поддерживать Apple/Android Pay, поэтому пользователи предпочитают искать на кассе специальную пиктограмму, чтобы быть уверенным, что их платежный инструмент поддерживается.
Не без основательно. Apple/Android Pay, имеют разную структуру данных в криптоновой области :), но да, данные там одинаковые.
И еще Apple Pay ecdsa-with-SHA256 1.2.840.10045.4.3.2
Android Pay prime256v1zhovner Автор
26.03.2018 14:31Но насколько реальна ситуация, когда POS-терминал работает с PayPass/PayWave но не работает с ApplePay?
Igrek_L
26.03.2018 14:38Был у нас в банке «кампусный» проект — использование банковской карты в качестве пропуска, читательского и даже в перспективе электронной зачетки. Не взлетел. Не хотят люди свою банковскую карту прикладывать, вплоть до полного отказа от нее. Даже не смотря на то, что там был не NFC а MIFARE эмуляция полноценной 1К карты.
И это технический ВУЗ, мы лекцию читали, рассказывали о том, что прочесть эмбоссированные на карте данные в торговой точке проще чем на проходной ВУЗа, причем не очень сложно вместе с CVN.
Читать же PAN это вообще за гранью правил, платежное приложение может его и не отдавать или вовсе заблокировать карту.zhovner Автор
26.03.2018 15:08Прелесть нашей системы в возможности выбора. Хотите используйте карту которую вам выдали, хотите Тройку, хотите ApplePay.
Igrek_L
26.03.2018 16:50Проект безусловно интересный, но немного запоздал, ИМХО. Сейчас если уж ввязываться на серьезную аутентификацию то с защитой от клонирования статики NFC карт. А это прилично глубже чем просто статику прочитать, в чужое приложение не влезть со своими данными.
trapwalker
26.03.2018 16:56+1Если бы я проектировал стандарты таких вот смарт-карт, я бы сделал что-то вроде:
- Карточка — это смарт карта или смартфон
- КомплектКлючей — набор криптографических ключей для шифрования и цифровой подписи произвольных данных;
- на Карточке доступен набор изолированных Ячеек для КомплектовКлючей;
- каждая Ячейка защищена еще одним ключом (назовем его ДоменныйКлюч). не зная который, терминал не может «просить» карточку оперировать Ячейкой.
- специальный пишущий терминал способен занять ячейку, разместив или сгенерировав в ней КомплектКлючей, защищенный ДоменнымКлючом; для этого понадобится ввести pin-код Карточки или знать МастерКлюч эмитента карточки (мастер-ключ нужен для массовой прошивки карточек без ввода pin)
- чистая (не активированная) Карточка может допускать установку произвольного мастер-ключа и пин-кода;
- Терминал может «попросить» Карточку подписать, зашифровать или расшифровать что-то соответствующим ключом, к которому Терминал «знает» ДоменныйКлюч;
- каждая Ячейка может содержать дополнительный небольшой набор открытых и закрытых данных. Открытые данные доступны всем, закрытые только владельцам ДоменногоКлюча;
- ПО карточки должно поддерживать «луковое» шифрование всех запросов к своим Ячейкам, чтобы их можно было проводить в небезопасных сетях через шифрованные туннели;
Идеально, если бы в такую Карточку можно было сагрегировать себе все необходимые банковские, скидочные, бонусные и прочие смарт-карты, а также карты оплаты метро и пропуски.
С таким стандартом можно было бы иметь мастер-карту, где хранились бы зашифрованные бэкапы всех КомплектовКлючей и кучу обычных Карточек, куда слиты read-only Комплекты для операций.
Ну что, сколькиколёсный велосипед я только что «изобрёл»? Покритикуйте меняWandy
26.03.2018 17:59Добро пожаловать в мир JavaCard ;-)
zhovner Автор
26.03.2018 18:00Javacard бывает бесконтактной? А еще свою джавакарту не получится забекапить в какой-нибудь icloud и синхронизировать с новым телефоном.
bromium
27.03.2018 20:36А по-вашему банковские бесконтактные карты это что такое? Да, есть нативные реализации, но чаще грузится Java-апплет на Java-карту
talbot
28.03.2018 00:59В современных картах с чипом практически всегда (или всегда) есть Java-апплет от ПС, плюс один или более апплетов от эмитента. Например, могут быть кобрендовые карты, где вместе с апплетом эмитента стоит апплет партнёра (типа карт РосБанка для Окея).
bromium
28.03.2018 01:30Вы это мне зачем рассказываете? И не обязательно java-карты. О чем я выше написал
zhovner Автор
28.03.2018 03:29А где эти аплеты видны? Это какой-то отдельный идентификатор отличный от AID?
UDP: И еще расскажите где можно достать чистые java-карты простому смертному, еще лучше бесконтактные.Dimes
28.03.2018 19:25практически у любых производителей банковских карт можно заказать — Новакард, Алиот, Розан, Ситроникс и т.д.
zhovner Автор
28.03.2018 19:26На сколько я знаю, там везде: цена по запросу, мы вышлем вам коммерческое предложение, с физлицами не работаем, заключите договор, подпишите NDA, минимальная сумма заказа сто тыщ милионов рублей.
Dimes
28.03.2018 19:32На счет работы с физ лицами не скажу, но маленькие партии на пробу лет 7-9 назад продавали. но это карточные топы в рф, вероятно должны быть и ребята поменьше (тот же Ситроникс раньше сам ходил искал — кому бы карты свои продать)
Wandy
26.03.2018 18:06Бывает, конечно! Бесконтактные банковские карты, например. И можно забекапить. Но с поправкой: СВОЮ джавакарту. Которую вы лично преперсонализировали. И сами писали апплеты и генерировали ключи. Хотя есть такие вещи как Fidesmo и сколько лет уже находящийся на последней стадии VivoKey.
У меня проблема СКУД решена более радикально — чип-импланты ;-)
river-fall
26.03.2018 18:44Считыватели em-Marine также считывают определенные домофонные ключи (proximity). Я некоторым коллегам прописывал в системе второй ключ (от дома) по той же причине: не носить дополнительные карточки.
КартинкаCertik
26.03.2018 19:20Я давно мечтаю чтобы офисы открывались пальцем или глазом… Это так сильно дорого?
zhovner Автор
26.03.2018 19:36Биометрические СКУД-ы не такая редкость. Но они не так удобны из-за бОльшего времени считывания. Иногда отпечатки пальца считываются не с первого раза и нужно долго теребить считыватель прежде чем он успешно прочтет палец. Еще они пачкаются и их нужно регулярно протерать. Карта же считыватется всегда однозначно и быстро.
rgmih
26.03.2018 19:46Если говорить про отпечатки пальцев, то цена подобного считывателя российского производителя — примерно два-три десятка тысяч рублей (то, что я нашёл сейчас в сети). Несколько дороже, чем считыватель карт. Но на самом деле, ограничения обычно в другом. Во-первых, не уверен, что биометрия допускается как единственный фактор (точно не знаю). Во-вторых (реальная техническая проблема) — поиск по базе отпечатков намного более трудоёмкий, чем поиск по номеру карты. Каждое считывание пальца (или руки) даёт уникальную свёртку, которую надо сопоставить с образцами. Причём не по точному совпадению, а по некоторому порогу «близости». И такие алгоритмы — это совсем не O(logN).
Если пропусков в системе 100 — всё быстро. А если десять тысяч, то реальное время просто не достижимо даже на мощных контроллерах. А если ставить по мощному серверу на каждую дверь, то такой СКУД становится просто золотым.
Поэтому, биометрия всегда является вторым фактором к карте или пинкоду (по крайней мере, из нашей практики). Сначала считываем первый фактор, а потом уже просто «сверяем» отпечаток с данными в пропуске 1-к-1.
p.s.: ну и заводить биометрические пропуска — это не пластиковые карточки по паспорту выдавать. Обычно биометрию используют на объектах повышенного уровня ответственности, типа объектов транспортной безопасности (аэропорты и пр.).
lexab
27.03.2018 02:23Используем для входа в офис контроллер Smartес — разумная цена, в пределах 150$
умеет отпечатки + бесконтактные карты,
также есть ethernet и реле для исполнительного механизма замка.zhovner Автор
27.03.2018 02:24Что-то не гуглится. Можно ссылку?
lexab
27.03.2018 12:15Вот http://www.smartec-security.ru/news/biometric-reader.htm
У нас более старый, в стальном, псевдо вандалоустойчивом корпусе.
Если нужно могу в четверг фото сделать
Mofas
26.03.2018 21:08У нас в офисе такой замок — ironlogic.ru/il.nsf/htm/ru_eurolockeht
Монтируются практически в любую дверь. Программировать можно любые карточки — мы использовали карточки БЦ, которые блокируют основной вход в БЦ.
У них есть модули, которые позволяют подключить замок к сети.
Мы хотим сделать Телеграм-бота с авторизацией, который будет открывать дверь, если сотрудник забыл карточку.
А у Xiaomi есть потрясный замок тоже — Aqara ZigBee Smart Door Locka1ien_n3t
26.03.2018 21:12+1Программировать можно любые карточки — мы использовали
Ага
Чтение идентификаторов: EM-Marine, HID ProxCard II, Temic
То есть все также клонируй в любом ларьке.
Igrek_L
27.03.2018 07:54Мы хотим сделать Телеграм-бота с авторизацией, который будет открывать дверь, если сотрудник забыл карточку.
Есть такое. Бот на ESP32 (ESP8266), может управлять уймой нагрузок (в том числе управление замком). Умеет рассылать состояние. Опасность видится в том, что Телеграмм могут заблокировать, поэтому сейчас доделывается собственное приложение с авторизацией однократным паролем. Хотя для большинства небольших организаций вполне достаточно простого GSM контроллера, открывающего замок если номер телефона с которого на него позвонили прописан в базе.
rule
27.03.2018 03:09Прям очень круто решение с точки зрения UX, вот молодцы вообще.
Есть один нюанс. В РФ не актуален. Но вот в Австралии например банк несет ответственность за воровство денег. Если кто-то украл у меня деньги с карты и банк не может доказать что я был в этом виной — банк возвращает все деньги. Вернее он сначала возвращает, потом начинает расследование и потом если только находит доказательства того, что деньги уплыли по моей вине — они требуют денег назад. Технически за это платят страховые, поэтому там какие-то смежные отделы у них существуют.
Я с этим сталкивался три раза (частое вообще явление). Один раз с оффлайна украли: украли карту, перевыпустили удаленно сим-карту, сбросили пин с помощью СМС. Два раза как-то онлайн утекли данные. Но все три раза банк вернул мне все деньги. Вот если банк/страховая найдет вашу систему и узнает что пользователь добровольно туда добавил свою карту — он не будет разбираться в деталях. Просто скажет что вы сами слили данные по карте третьей стороне и используя ИХ карту не по назначению. А карта является собственностью банка и сценарии использования карты прописаны в договоре.cpcat
27.03.2018 10:32Вообще-то, в РФ это работает точно так же.
Igrek_L
27.03.2018 10:51Вообще-то, в РФ это работает точно так же.
В РФ нет Zero Liability Policy, банки НЕ возвращают деньги безусловно и сразу если холдер отказывается от операции. Вначале будет расследование — претензионный цикл, если в результате что то удастся отбить, то вернут. А если нет и клиент не VIP то скорее всего отправят в «сам виноват карту засветил». Но самое гадкое это подлимитные оффлайн операции по номеру карты. Особенно если денег на счете нет, ты попадаешь в теховер с неслабыми процентами. Подлимиты практически невозможно опротестовать а еще сложнее начисленные проценты за «пользование деньгами» сторнировать.cpcat
27.03.2018 11:53Не, у меня тоже не раз бывали и фроды, и ошибочные операции по карте (ресторан повторно списал ту же сумму спустя месяц), банк немедленно откатывал операцию, возвращал деньги, и после этого разбирался уже сам. Я не VIP, обычная зарплатная виза.
Igrek_L
27.03.2018 12:23Обычный ресторан не может повторно списать спустя месяц. У него данных карты физически, а были бы все равно у ресторанов нет права на CNP (card not present) операции. Банк-эквайер мог финдоки повторно выгрузить, такое бывает к сожалению, но в этом случае банкам немедленно отправляется уведомление «повторное представление» и они откатывают операцию. А вот если прокатная контора спустя месяц пришлет списание, там никакой автоматики не будет. Или платная дорога где нибудь в США тоже без разборок скорее всего не обойтись. Ну или банк работает себе в минус.
cpcat
27.03.2018 17:51Не знаю, кто именно там был виноват, просто пришло смс, как будто я в ресторане расплатился, и сумма была до копейки как за месяц до того. Как и с фродами, пришлось прийти пешком в банк и заполнить заявление, после чего сотрудники банка мне сказали, что дальше это их проблемы, и попрощались.
vskv
27.03.2018 16:05Подлимиты на то они и подлимиты, что их сумма меньше минимальной суммы для опротестовывания.
FlipWho
27.03.2018 10:09На карте CVC-код указывается, а не CVV.
rgmih
27.03.2018 10:19CVV2 (англ. card verification value 2) — трёхзначный код проверки подлинности карты платёжной системы Visa. Другие платёжные системы имеют схожие технологии, к примеру аналогичный защитный код для карт MasterCard носит название card validation code 2 (CVC2), защитный код для платежной системы НСПК МИР получил название card verification parameter 2 (CVP2). Наносится на полосе для подписи держателя после номера карты либо после последних 4 цифр номера карты способом индент-печати.
Цифра 2 в названии кода вызвана тем, что есть и «первый» защитный код, используемый для верификации в транзакциях с физическим использованием карты. CVV/CVC-код записывается на магнитную полосу.
Взято с https://ru.wikipedia.org/wiki/CVV2.
Таким образом, CVV или CVC — зависит от платёжной системы.
Igrek_L
27.03.2018 10:22На карте CVC-код указывается, а не CVV.
Это разные названия одного и того же у разных карточных систем.
У MasterCard CVC (Card Verification Code). У Visa CVV (Card Verification Value). И т.д. Поэтому без указания платежных систем принято указывать CVNFlipWho
27.03.2018 10:23Вот они дурачьё… Наплодили терминологии.
DMGarikk
27.03.2018 13:50потому что там все вдоль и поперек запатентовано или является торговой маркой (как например PayPass, PayWave, PayExpress, QuickPass и еще не помню как у JCB называется и у МИР тоже какаято своя будет
для потребителя одно и тоже, однако называются по разному
также у них могут быть разные механизмы обработки в процессинге, и называть их одинаково это вносить лишнюю путаницу
eiennohito
27.03.2018 14:28С NFC точки зрения Фелика (NFC-F, проприетарный стандарт от Сони) довольно крутая штука имхо. Там на одной карте может висеть большое количество сервисов, причём каждый со своей аутентификацией. Поддерживается яблофонами начиная с 7 и андродиами с непонятно каких времён, правда железка (секюрный юнит) на андроидах есть только в японских моделях, увы. С секюрным юнитом не нужно не включать телефон, ни разблокировать его.
Правда для доступа к сдк/закрытой части документации нужно дружить с Сони.
shweper
28.03.2018 16:00Вы уже реализовали свою идею или она всё ещё в доработке? Очень понравилась ваша идея, хотелось бы реализовать её в своей компании. Ваш поставщик писал для вас ПО индивидуально?
zhovner Автор
28.03.2018 16:01Система состоит из нескольких компонентов разных компаний. Прошивку для считывателя писала комания Parsec совместно с нами.
ohm
По итогу дискуссий с Павлом я пришел к такому выводу: в системе предлагается использовать платежные инструменты для совершения не платежных операций. Лично мне кажется, что это формирует неправильную пользовательскую привычку. Не смотря на то, что такое практикуется банками в некоторых случаях, например для открывания дверей в помещения с круглосуточными банкоматами для защиты от бездомных, все же это антипаттерн который не должен получить массового распространения.
Очевидно, что отдельные карты вскоре отомрут и будут полностью заменены телефоном. Но для этого должна быть разработана система, позволяющая загружать в телефону произвольные идентификаторы. Эдакая ключница для хранения приватных ключей. На практике это может выглядеть так:
Кассир: У вас уже есть наша бонусная карта?
Покупатель: Нет, давайте оформим.
Кассир: Тогда приложите телефон к считывателю.
И в этот момент в телефон загружается подписанный магазином ключ и сертификат. И в момент идентификации покупателю достаточно приложить телефон снова. Ключи могут хранится в телефоне подобно U2F токенам и синхронизировать между устройствами через какой-нибудь iCloud. В момент считывания терминал посылает отпечаток сертификата магазина, и если в памяти есть ключ подписанный этим сертификатом, то телефон отвечает подписанных хендшейком. Управление картами происходит через встроенное в ОС приложение. Картинки и описание карт загружаются автоматически по интернету из метаданных сертификата. Полагаю, что подобная система должна скоро появится.
А так отличный проект, удачи.
zhovner Автор
Отчасти согласен. На устройствах Android сейчас можно эмулировать карты с помощью HCE (Host-based Card Emulation) и многие производители СКУД предлагают свои приложения для эмуляции карты-пропуска. Однако это не очень удобно, потому что нужно каждый раз запускать приложение и ждать его полного запуска, чтобы открыть дверь. Это непростительно долго когда проходишь по десять раз в день туда-сюда. А в случае с ApplePay достаточно достать из кармана заблокированный телефон, положить палец на кнопку считывания отпечатка пальца и поднести к считывателю. Даже не требуется разблокировать телефон. С AppleWatch это сделать так же просто.
Согласен насчет универсальной системы хранения токенов в телефоне. Такая система бы решила множество проблем.
fallenworld
В связи со всеобщем увлечением использования телефонов с NFC как карт, хотелось бы напомнить 2 основных преимущества карты:
1. карта не может разрядиться
2. не все телефоны поддерживают NFC
zhovner Автор
Существует очень крутая технология о которой почти никто не знает потому что она не имеет коммерческого названия. Суть ее в том, что SIM-карта используется как secure element через NFC модуль телефона. Работает это по протоколу SWP (Single Wire Protocol, не путать с 1-Wire). Так вот оно работает даже с выключенным телефоном!
Я, например, оплачиваю общественный транспорт с баланса мобильного телефона прикладывая телефон к турникету, то есть с того же счета с которого плачу за мобильную связь. Для этого нужна SIM-карта с поддержкой NFC и телефон поддерживающий эту технологию.
К сожалению, из-за того что эта технология не имеет нормального названия, ее нельзя найти в описании функций телефона. И работает только на android телефонах.
achekalin
Как получить такую симку? Просто любопытно.
Однако смысла в ней мало: симка — это про мобильную связь.
Платить за метро или автобус со счета мобильного оператора — вот это настоящий антипаттерн! Операторы, конечно, рады, но они, на минутку, мне продают совсем другие услуги (связи), и пытаются (чего я не просто не просил их делать, а, наоборот, прошу не делать) стать посредником в передаче моих денег, переданных им на временное хранение, сторонним организациям, даже список которых сотовый оператор не может предоставить. Я бы сказал, что там ребятам доверять еще и оплату других моих трат — очень легкомысленно.
zhovner Автор
Перевыпустить в офисе обслуживания оператора. Сказать «хочу симку с NFC». Правда в мелких салон часто небывает таких симок и нужно искать более крупный. В москве услуга называется Мобильный билет и поддерживается всеми операторами большой тройки: МТС, Мегафон, Билайн.
vindy123
Есть (или был?) и другой вариант как минимум у Мегафона и МТС — комплект из симки и антенны на шлейфе. Вставляется в любой бабушкофон, если место под крышкой позволяет. Никто не знает, можно ли до сих пор таким разжиться?
www.megafon.ru/download/~ural/dogovora/instrukcia.pdf
zhovner Автор
У меня есть пару штук этих антенн, могу поделиться если нужно. На сколько мне известно, купить их уже нельзя. Правда работают они не очень хорошо — в автобусах срабатывают идеально а в метро иногда «ошибка чтения». Может и в метро более строгие тайминги, не знаю.
zhovner Автор
Вышлю такую антенну тому, кто напишет статью про сим-карты с NFC и Single Wire Protocol. Эта штука устанавливается как прокладка к сим-карте и позволяет к ней обращаться по NFC на телефонах где нет NFC модуля. Вообще можно прилепить антенну к сим-карте и запитать 3.3V и будет работать вообще без телефона.
zhovner Автор
Устройство называется gemalto n-flex v2.2 и оно достаточно редкое. Раньше МТС продавал его для сим-карт с банковской картой внутри. Сейчас его не достать в продаже. В устройстве есть маленький безкорпусный NFC чип залитый компаундом. Доступны какие-то контакты, назначения который выяснить мне удалось. Ни UART ни JTAG я там не нашел, хотя я туповат и может у кого-то получится это лучше.
a1ien_n3t
Скорее всего его их там и нету. Там все те меже APDU команды шлются как на обычную симкарту/чип банковской карты. По одно проводному интерфейсу.
LeonSt
Грамотно написанное для Андроида приложение эмуляции карты всегда наготове, так что никаких дополнительных манипуляций не требуется, а вот банковскую карту паролем или отпечатком всегда надо активировать.
bromium
Неправда, разарбатывал несколько HCE-приложений. Прелесть в том, что само приложение запускать не нужно. Достаточно, чтобы телефон был включен (не с погасшим экраном).
zhovner Автор
Не понимаю как это работает. Вот у меня есть приложение Кошелек с картой Тинькофф внутри. Чтобы включить эмулирование карты нужно зайти в приложение и нажать оплатить. Или в момент поднесения телефона к ридеру появляется попап с выбором какое из HCE приложений запустить?
MarSoft
Как правило, в настройках системы (Беспроводные сети -> Дополнительно -> NFC -> Бесконтактной оплата) можно выбрать приложение по умолчанию.
Ну и плюс в некоторых случаях нужное приложение запустится само, видимо, через intent filter — например, если приложить к телефону билет метро, откроется Яндекс.Метро в режиме чтения билета. У меня по крайней мере так.
rgmih
В целом, согласен с тем, что использование платежных инструментов для доступа — антипаттерн. Но если это решение, с которым согласны обе стороны (владелец объекта и посетитель) — то почему бы и нет. Если же это объект, доступ куда может получить посетитель «со стороны» (например, через процедуру оформления разового пропуска в терминале самообслуживания), то склонять такого посетителя к использованию банковской карты — точно не вариант.
Вы затронули больную тему с кучей «бонусных» карт всех возможных магазинов. Видел, что некоторое распространение получили мобильные приложения, которые позволяют вносить штрихкоды с таких карт, после чего предъявлять их в магазинах с телефона. В принципе, можно решать задачу доступа аналогичным образом, подключая к контроллеру оптический считыватель штрихкодов, QR-кодов и пр. Вполне рабочее решение. Особенно для разового доступа. И можно не ждать появления «правильной» технологии.
Конечно, для постоянного доступа главное, чтобы код не «сфотографировал» злоумышленник с экрана телефона. Но если есть такой доступ к телефону, думаю, у владельца телефона будут другие проблемы. Впрочем, можно пофантазировать с тем, чтобы код выдавался на телефон по геолокации при входе сотрудника в офис или что-то подобное.
zhovner Автор
Разумеется использование платежных карт не является у нас вариантом по-умолчанию. Это добровольный и сознательный выбор пользователя, которому более удобно прикладывать часы или телефон. В недоверенной среде я бы и сам не стал совать везде свою банковскую карту.
vagran
Можно ведь по принципу одноразового пароля. То есть QR код на экране генерируется на основании текущего времени и приватного ключа.
rgmih
Кстати, отличная идея!
Если предположить использование такой схемы в каком-нибудь рабочем офисе, то главное тогда привязать ключ к конкретному телефону (например, к фиксированному серийнику или типа того), чтобы нельзя было его легко скопировать. Дело даже не в безопасности, а в том, что СКУД часто используется для учёта рабочего времени. И возможность копирования тогда позволяет «попросить Васю отметиться за меня». Хотя «авторизация по смартфону» и такой «обман», наверное, плохо коррелируют.
kinjalik
А если взять типичную 2FA-авторизацию по типу гугл-аутентификатора, и вместо циферного кода выдавать QR-код с этим циферным кодом?
zhovner Автор
Представьте сколько тогда будет занимать времени открытие двери. Остановиться, разблокировать телефон, запустить программу, сгенерировать пин, поднести экран к ридеру. Уверен что после пары раз вы возненавидели бы такую систему.
kinjalik
А вариант использовать мини-джек/Джек с небольшим чипом памяти, внутри которого ключ, и получать этот ключ через контроллер возможен?
trapwalker
Зачем изобретать i-button, если уже есть смарт-карты?