СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

H Исследование защищенности карты Тройка в черновиках

Карта тройка

Карта Тройка представляет из себя универсальный пополняемый электронный кошелек, широко используемый в системах оплаты общественного транспорта Москвы с 2013 года.

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

В ходе работы был успешно проведен реверс­-инжиниринг мобильного приложения «Мой проездной», что позволило получить доступ к памяти карты и изучить структуру хранения данных. Были найдены уязвимости, позволяющие выполнить подделку баланса, записанного на электронном кошельке карты Тройка. В результате чего стало возможным использование систем, поддерживающих карту, без оплаты.

Итогом исследования стала разработка приложения TroikaDumper, позволяющего эксплуатировать уязвимости системы электронного кошелька.

Внимание! Данные материалы представлены исключительно в ознакомительных целях. Подделка проездных билетов является уголовным преступлением и преследуется по закону.


Введение


Бесконтактные платежи становятся все более популярны. На текущий момент общественный транспорт в Москве полностью переведен на бесконтактную систему оплаты. Самым популярным платежным средством становится универсальная карта Тройка, которая активно интегрируется в различные системы помимо общественного транспорта. Картой уже можно оплатить билет в московский зоопарк, планетарий, каток, арендовать велосипед и прочее. Недавно Тройка была интегрирована в SIM-карты всех мобильных операторов города — услуга Мобильный билет. Очевидно, что распространение карты будет только увеличиваться. Транспортная сеть города обслуживает территорию с населением свыше 20 млн человек и обеспечивает перевозку более 350 млн пассажиров в месяц. В свете этого становится важным вопрос защищенности карты.

Целью данного исследования было выяснить насколько защищена карта от подделки баланса электронного кошелька, изучить принцип работы карты. Проверить защищенность инфраструктуры работающей с картой Тройка.

Карта Тройка введена в эксплуатацию в 2013 году. Представляет из себя универсальный пополняемый электронный кошелек. Согласно сайту troika.mos.ru, продано более 7 миллионов карт.

Поставщиком чипов для карты Тройка является (являлась?) компания NXP. Согласно пресс-релизу компании NXP, чипы выполнены по технологии MIFARE Plus. На данный момент сайт компании NXP более не доступен на русском языке и оригинал пресс-релиза удален.

карта тройка
  • Чип Mifare Plus в режиме совместимости с Mifare Classic (SL1)

  • Залоговая стоимость карты 50 рублей (может быть возвращена при возврате карты)

  • Срок действия карты вместе с записанными средствами — 5 лет

  • Максимальная сумма пополнения — 2500 рублей

  • Помимо электронного кошелька может хранить билеты и абонементы



Несмотря на то, что спецификация технологии Mifare Plus недоступна публично, известно что данные чипы могут работать в нескольких режимах. Карта Тройка работает в режиме совместимости с устаревшими чипами Mifare Classic (SL1). Спецификация на данную технологию доступна публично. При этом чип Mifare Plus избавлен от известных уязвимостей технологии Mifare Classic. Поэтому известные оффлайн-атаки на данный чип не применимы.

Система Описание
Московское метро Стоимость проезда 32 рубля, можно записать билеты
Наземный транспорт Троллейбус, Автобус, Трамвай.
Стоимость проезда 31 рубль.
Пригородные поезда Стоимость зависит от дальности поездки. Можно записать абонементы.
Аэроэкспресс 450 рублей
Прокат велосипедов Стоимость не уточнялась
Московский зоопарк 500 рублей
Планетарий 450 рублей
Каток в парке горького Стоимость не уточнялась


Возможные цели атаки


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

Турникеты в метро


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

Потенциальный вектор атаки: проникновение в сеть, MitM.
_
_
_
_
_
_

Валидаторы в наземном транспорте


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

Потенциальный вектор атаки: физическое извлечение прошивки и данных из памяти устройства.
_
_
_
_
_
_

Валидаторы в метро


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

Потенциальный вектор атаки: проникновение во внутреннюю сеть, эксплуатация уязвимостей операционной системы.
_
_
_
_
_

Автоматы продажи билетов метро


Автомат продажи билетов метроСлужат для продажи проездных билетов и пополнения электронного кошелька карты Тройка. Возможна оплата наличными и кредитными картами с помощью систем PayPass/PayWave.
Работают на базе x86 компьютера под управлением операционной системы Windows. В момент сбоя управляющей программы можно видеть интерфейс операционной системы и служебные программы.
Подключены к сети по технологии Ethernet, замечен UTP кабель, идущий к автомату.

Потенциальный вектор атаки: проникновение во внутреннюю сеть, эксплуатация уязвимостей операционной системы.
_

Приложения для смартфонов


В Google Play Market было найдено несколько приложений, позволяющих работать с электронным кошельком карты Тройка. Наиболее популярным по числу установок является приложение «Мой проездной», позволяющее напрямую пополнять карту с помощью смартфона с функцией NFC. Это означает, что приложение содержит данные, позволяющие производить запись в память карты.

Потенциальный вектор атаки: реверс-инжиниринг приложения.
_
_
_
_

Приложение «Мой проездной»


Из всех рассмотренных целей было решено остановиться на реверс-инжиниринге приложения «Мой проездной», как на более простом и безопасном варианте. Для этого достаточно было приобрести смартфон на платформе Android с поддержкой функции NFC. Выбор данной цели обусловлен еще и тем, что для исследования не требовалось иметь доступ к объектам общественного транспорта, и все операции по поиску уязвимостей можно было произвести не выходя из дома.

Приложение «Мой проездной» предназначено для самостоятельного пополнения карты Тройка. Работает на смартфонах с операционной системой Android и функцией NFC. Приложение бесплатное и доступно для загрузки через Google Play Market (каталог приложений Android). Так как приложение позволяет производить непосредственную запись баланса на карту, очевидно, что оно содержит ключи для чтения и записи. Далее будут описаны шаги реверс-инжиниринга приложения для получения требуемых данных.

Загрузка APK-архива

Для изучения кода необходимо получить приложение в виде установочного архива APK (Android application package). Проще всего это сделать, используя один из многочисленных онлайн-сервисов для загрузки APK, например apkpure.com. С помощью данного сервиса можно загрузить любые приложения из Google Play Market на компьютер.

image

Декомпиляция приложения

APK-файл приложения Android является архивом, внутри которого находятся файлы ресурсов, конфигурации, графика и другие мультимедиа данные, а также файл classes.dex, который является скомпилированным кодом приложения.
С помощью утилиты ibotpeaches.github.io/Apktool/ APK-файл может быть распакован. Вместе с этим файл classes.dex будет разложен на множество файлов формата *.smali.

Smali — это формат исходных текстов для Dalvik, виртуальной машины Android. Это низкоуровневый язык, язык ассемблера Dalvik. Файлы будут иметь порядковые имена вроде a.smali, b.smali, и т.д., внутри них объявления классов, методов, и инструкции виртуальной машины. Структура папок будет развернута в соответствии с названием пакетов классов.

image

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

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

Конвертация Dalvik Executable (dex) в Java Archive (jar)

Для анализа кода приложения необходимо сконвертировать .dex файлы, полученные из APK архива, в .jar файлы, которые далее могут быть декомпилированы в исходные тексты на языке Java. Это можно сделать с помощью программы dex2jar github.com/pxb1988/dex2jar. Как очевидно из названия, она конвертирует .dex файлы в формат .jar. Поскольку конвертируется только код, без ресурсов, конфигурационных и медиафайлов, .jar-файл на выходе обычно будет меньше по размеру, чем исходный APK.

image

Декомпиляция jar в исходные тексты Java

Полученные jar файлы теперь можно декомпилировать в исходные тексты языка Java.
Для этого можно использовать любой из доступных Java декомпиляторов, например JD-GUI

image

Анализ исходного кода


Полученные с помощью Java Decompiler исходные тексты могут быть загружены в любую IDE (Integrated Development Environment) для более удобного изучения. Например, Android Studio.

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

image

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

классы в коде приложения «Мой проездной»
image

Отключение проверки TLS-сертификата


Во время работы приложение «Мой проездной» устанавливает соединение с сервером bmmobile.bm.ru. Для защиты от прослушивания и модификации данных все передаваемые данные между приложением и сервером зашифрованы с помощью протокола TLS. Для проверки подлинности ключа сервера используются TLS сертификаты.

В приложение «Мой проездной» встроена проверка отпечатка сертификата для предотвращения подмены сертификата и прослушивания передаваемых данных на сетевом уровне. Так называемый Certificate Pinning.

функция проверки отпечатка TLS сертификата
image

В данной проверке явно задан SHA1 отпечаток сертификата, поэтому в случае подмены сертификата проверка не будет пройдена и соединение с сервером установлено не будет. Даже в случае выпуска сертификата от другого сертификационного центра.

цепочка сертификатов и отпечаток сертификата bmmobile.bm.ru
image

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

цикл проверки отпечатка TLS сертификатов
image

Для обхода данной проверки достаточно модифицировать условный оператор сравнения отпечатка в smali-файле, заменив if-eqz на if-neq, что означает обратное условие «не равно».
В результате проверка проходит успешно для любого сертификата, как поддельного, так и оригинального, достаточно чтобы в цепочке сертификатов присутствовал хотя бы один сертификат с отличным от заданного отпечатком.
Примечательно, что это единственная модификация кода, которая потребовалась для отключения защиты от подделки сертификата.

изменение условного оператора в цикле проверки отпечатка сертификата
image

Сборка модифицированного приложения


Чтобы применить внесенные в исходный код изменения, необходимо скомпилировать APK.
С помощью утилиты apktool можно собрать распакованный APK архив обратно.

сборка APK из исходных текстов
image

Подписание APK


APK-файлы имеют подпись, которая позволяет убедиться, что файл был корректно загружен и выпущен конкретным разработчиком. Без подписи APK-файл установить не получится, но можно использовать самоподписанный сертификат (в этом случае нужно включить опцию “установка из недоверенных источников” в настройках телефона). В результате подписи будет получен APK-файл, готовый для установки на смартфон.

создание сертификата для подписи
image

подписание APK-файла
image

Перехват трафика приложения


Перехват защищенного трафика выполняется методом проксирования SSL-подключений с подменой сертификата сервера. Для этого существуют инструменты, вроде Mitmproxy или Fiddler, позволяющие выполнять подмену сертификата и запись расшифрованных данных автоматически. В данном случае, mitmproxy запущен на сервере, к которому по WiFi подключен смартфон с установленным приложением «Мой проездной». В приложении выполнена аутентификация по PIN-коду и произведена проверка баланса на карте Тройка. Все передаваемые в этот момент данные между сервером и приложением были записаны и проанализированы.

Аутентификация


В теле запроса передается номер телефона, PIN-код и информация об устройстве.

▼ Request Headers
	Request URL:	https://bmmobile.bm.ru/bm/3.3/troyka/authenticate.do
	Method:	POST
	Accept-Encoding:  gzip, deflate
	Content-Type:     application/x-www-form-urlencoded
	Content-Length:   192
	Host:		bmmobile.bm.ru
	Connection:	Keep-Alive
	User-Agent:	Apache-HttpClient/UNAVAILABLE (java 1.4)

▼ Request Body
	username=9853828069
	password=12345
	imei=null
	uniqueDeviceId=81f4d23b3a1973da
	deviceModel=samsung+SM-G900
	timeZone=%2B3
	osType=Android
	osVersion=20
	appVersion=2.0.4
	isMobile=true
	passwordType=PIN



В ответе сервера содержится ID пользователя и сессионный ключ.

{
   "userId":"F52D771F3048AFA411AF2A42198D43C2",
   "sessionId":"3A2F134FA60F26180AF6A7ABD35A20F4",
   "errorCode":0
}


Получение ключей от карты Тройка


В запросе на чтение карты Тройка передается сессионный ключ, полученный в момент аутентификации, и серийный номер карты в формате base64.

▼ Request Headers
	Request URL:	https://bmmobile.bm.ru/bm/3.3/troyka/providers.do
	Method:	POST
	Accept-Encoding: gzip, deflate
	Content-Type:	  Content-Type: application/x-www-form-urlencoded
	Host:		bmmobile.bm.ru
	User-Agent:	Apache-HttpClient/UNAVAILABLE (java 1.4)

▼ Request Body
	sessionId=3A2F134FA60F26180AF6A7ABD35A20F4
	serial=MTIzNA==
	isMobile=true


В ответе содержатся ключи A и B от секторов 2,4,7,8 в формате base64.
Примечательно, что здесь так же присутствуют ключи B, которые используются для записи данных на карту, хотя для запроса баланса достаточно было бы ключей А, разрешающих только чтение секторов памяти.

{ "linkId":"F52D771F3048AFA411AF2A42198D43C2",
   "rpcSectors":[  
      { "number":4,
         "keys":[  
            {  "keyId":1,
               "type":"B",
               "value":"K38yU/rF"},
            {  "keyId":2,
               "type":"A",
               "value":"cwaPEYwT"}]},
      {  "number":7,
         "keys":[  
            {  "keyId":1,
               "type":"B",
               "value":"DxxjAT26"}]},
      {  "number":8,
         "keys":[  
            {  
               "keyId":1,
               "type":"B",
               "value":"41FzSUqB"}]}],
   "rpcIsDown":false,
   "cppkSectors":[  
      { "number":2,
         "keys":[  
            {  "type":"A",
               "value":"KqBe0YVv"},
            {  "type":"A",
               "value":"KrqVGfV0"}]}],
   "cppkIsDown":false,
   "errorCode":0}


Запрос баланса


После получения ключей с сервера, происходит считывание необходимых секторов памяти с карты и отправка содержимого памяти на сервер. В данном примере видны сектора 0,4,7,8.


{"sector":[  
    {"blocks":[  
        { "number":0,
          "data":"3q26usD/7hD6ytp6EEgJEQ==\n"},
        { "number":1,
          "data":"AAAAAAAAAAAAAAAAAAAAAA==\n"},
        { "number":2,
          "data":"AAAAAAAAAAAAAAAAAAAAAA==\n"}],
      "number":4,
      "keyId":1},
    { "blocks":[  
        { "number":0,
          "data":"wP7auspfgjOvA0QiPV0tzw==\n"},
        { "number":1,
          "data":"AAAAAAAAAAAAAAAAAAAAAA==\n"},
        { "number":2,
          "data":"AAAAAAAAAAAAAAAAAAAAAA==\n"}],
      "number":7,
      "keyId":1},
    { "blocks":[  
        { "number":0,
          "data":"3q26usD/7hD6ytp6EEgJEQ==\n"},
        { "number":1,
          "data":"wP7auspfgjOvA0QiPV0tzw==\n"},
        { "number":2,
          "data":"wP7auspfgjOvA0QiPV0tzw==\n"}],
      "number":8,
      "keyId":1}]}


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

 { "providerCode":"1",
        "ticketCode":"3",
        "ticketName":"Электронный кошелек",
        "ticketNo":"8553535",
        "statusCode":"0",
        "currentServices":[  
          {"name":"КОШЕЛЕК",
            "param":[  
              {"name":"Остаток",
                "value":"150.00"}],
            "type":"TRK_EK",
            "topUpType":"CASH"}],
        "availableServices":[  
          { "rpcServiceId":"2231",
            "name":"КОШЕЛЕК",
            "priceMin":"1.00",
            "priceMax":"2854.00",
            "type":"TRK_EK",
            "topUpType":"CASH"}


Итог анализа API


Из перехваченных сообщений видно, что ключи для чтения карты Тройка загружаются с сервера каждый раз во время чтения карты. Были получены ключи от секторов 2,3,4,6,7,8,15. Найдены сектора памяти, содержащие данные электронного кошелька и информацию о билетах, записанных на карте. Все эти данные получены за одну операцию считывания баланса. Платежные реквизиты в приложение добавлены не были, никаких платежных операций не производилось. Примечательно, что для операции чтения баланса с сервера загружаются одновременно A и B ключи, хотя ключи B используются для записи данных в память карты. В результате, атакующий может получить возможность записи данных на карту, выполняя только операции чтения.

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

Анализ памяти карты Тройка


Перехваченные из приложения «Мой проездной» ключи доступа к секторам карты Тройка используем для локального чтения памяти карты с помощью Android приложения MCT — Mifare Classic Tool. Приложение позволяет найти все сектора, к которым подходят перехваченные ключи, так называемый перебор по словарю.

данные в памяти карты в шестнадцатеричном формате
image

Формат данных в секторе электронного кошелька


Чтобы понять структуру хранения данных в памяти карты, была использована чистая карта, купленная в кассе, по которой не было выполнено ни одной поездки. Далее карта была пополнена 10 раз на 1 рубль через автомат. После каждого пополнения состояние памяти сохранялось. В конце все сохраненные данные были сравнены и установлено, что изменения происходят только в двух блоках 8 сектора.

дампы памяти восьмого сектора после пополнений на 1 рубль
image

Видно, что данные изменяются в первом блоке (нумерация от нуля) с 9 по 15 байт. Очевидно, что в данном месте содержится баланс электронного кошелька. Путем подбора возможных форматов хранения данных было выяснено, что значение баланса электронного кошелька хранится в области памяти от младших 4 бит 8 байта до старших 3 бит 10 байта и рассчитывается по формуле

image

Где 137B8 значение в памяти карты в шестнадцатеричном формате, а 399 сумма в рублях.
Таким образом можно рассчитать значения из предыдущей таблицы.

расчет баланса в секторе электронного кошелька
image

Номер турникета, дата и время прохода


Аналогичная методика была применена для изучения формата остальных данных в секторе. Было выполнено несколько проходов через турникеты метро и сохранено состояние памяти после каждого прохода. Проходы были выполнены с интервалом времени в 1 минуту попеременно на двух различных турникетах.

image

Путем подбора значений было установлено, что нулевой и первый байт в первом секторе хранит идентификатор последнего турникета, через который осуществлялся проход. Далее второй и третий байты содержат дату последнего прохода в виде количества дней от 1.1.1992.
Соответственно, 0x2260 = 8800, где 8800 число дней от 1.1.1992, что с учетом високосных лет приходится на дату 5 февраля 2016 и соответствует действительной дате прохода.

Время прохода записано в четвертом байте и старших четырех битах пятого байта, и кратно 30 секундам, начиная с 00:00 часов. Следовательно, расчет времени можно выполнить в два действия:

для расчета часов image

и для расчета минут image

Таким образом получим время 15:30, что соответствует действительному времени прохода.

На основе полученных сведений можно расшифровать данные представленные в предыдущей таблице

image

Каждая карта Тройка имеет уникальный серийный номер, отличный от UID. Этот номер нанесен на самой карте и используется для удаленного пополнения карты. Он хранится в нулевом блоке восьмого сектора с третьего байта по младшие четыре бита седьмого байта.

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

Запись данных на карту Тройка


Права доступа к секторам карт типа Mifare определяются битами доступа в третьем блоке каждого сектора. Биты доступа, установленные в восьмом секторе, разрешают чтение сектора ключом А и запись ключом B. Полученные из приложения «Мой проездной» ключи, позволяют выполнить запись любых данные в сектор электронного кошелька.

Атака повторного воспроизведения


В результате экспериментов было установлено, что сектор памяти, хранящий информацию о балансе электронного кошелька, содержит криптографическую подпись для подтверждения подлинности данных, так называемую имитовставку. Данный механизм служит для защиты данных от подделки. Подпись обновляется каждый раз в момент изменения баланса электронного кошелька. Это может быть операция списания при проходе через турникет, либо операция пополнения кошелька через терминал или приложение «Мой проездной».
Все устройства, работающие с балансом электронного кошелька (турникеты, терминал), проверяют достоверность подписи, и, в случае несоответствия подписи, возвращают ошибку “карта неисправна”.
Установлено, что подпись формируется на основе уникального идентификационного номера карты (UID), поэтому клонирование сектора памяти электронного кошелька из одной карты на другую с отличным UID, всегда дает недействительную подпись.

Несмотря на то, что области памяти электронного кошелька защищены с помощью имитовставки, система оказалась уязвима для атаки повторного воспроизведения.
Было сохранено состояние памяти сектора электронного кошелька до прохода через турникет, после чего выполнен проход и операция списания 31 рубля с баланса карты. После чего состояние памяти карты было возвращено к исходному состоянию. В результате, на карте была восстановлена сумма баланса до прохода через турникет. Данную операцию удалось повторить несколько раз. Из этого следует вывод, что система не защищена от подобного вида атак.

шаги атаки повторного воспроизведения
image

Для установления возможности реальной эксплуатации уязвимости было выполнено продолжительное тестирование атаки повторного воспроизведения на инфраструктуре общественного транспорта Москвы.
Первым был протестирован наземный транспорт: троллейбусы, автобусы, трамваи. Электронный кошелек был пополнен единожды на сумму 50 рублей и все проходы через турникеты были выполнены с помощью атаки повторного воспроизведения.
В течение пяти дней было совершено 57 поездок в наземном транспорте на общую сумму 1767 рублей. После чего карта была возвращена в кассу метрополитена и был получен возврат залоговой суммы в 50 рублей.

Для тестирования систем метрополитена была куплена новая карта и пополнена на 50 рублей. Все проходы через турникеты были выполнены с помощью атаки повторного воспроизведения. Было выполнено 12 поездок в течение 2 дней на общую сумму 384 рубля. На третий день карта была заблокирована на всех турникетах метро и наземного транспорта. После полного восстановления состояния памяти карты до состояния на момент приобретения, карта продолжила работать в наземном транспорте, но блокировалась при проходе в метро.
Из этого следует, что турникеты в метро имеют защиту от данного вида атак, однако срабатывает она с задержкой в несколько дней.

Обход блокировки карты


Экспериментально были найдены способы избегать блокировки карты при использовании атаки повторного воспроизведения. Основные факторы срабатывания блокировки:

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

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

  • Иногда необходимо выполнять минимальное пополнение карты, например на сумму 1 рубль



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

Приложение TroikaDumper


TroikaDumper В рамках данного исследования, для удобства эксплуатации атаки повторного воспроизведения было создано приложение TroikaDumper. Оно позволяет локально (без подключения к интернету) просматривать записанные в памяти карты данные, такие как: баланс электронного кошелька, время последнего прохода через турникет, идентификатор последнего турникета, имитовставку, серийный номер карты Тройка, идентификационный номер карты (UID).
Приложение позволяет сохранять состояние памяти и записывать его на карту.
Приложение доступно в исходных текстах github.com/gshevtsov/TroikaDumper и в скомпилированном виде TroikaDumper.apk. Для работы нужен смартфон на платформе Android с NFC модулем производства NXP.
_
_

интерфейс приложения TroikaDumper
image

Заключение


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

Относительно легко был осуществлен реверс-инжиниринг приложения «Мой проездной», что позволило обойтись без взлома физических систем транспортной инфраструктуры.

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

Итогом исследования стало написание приложения TroikaDumper, позволяющее легко эксплуатировать уязвимости в системе карты Тройка, имея смартфон с поддержкой функции NFC. Приложение просто в использовании и может быть использовано массово.

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

комментарии (336)

+73
+79 –6
MagisterLudi ,  
Вот за это я люблю Хабр
0
+11 –11
fotonstep ,  
Тема с 2008 года существует, ничего нового
+3
+4 –1
PavelMSTU ,  
Ссылку можно?
0
+6 –6
ValdikSS ,  
fotonstep прав. Может, не с 2008 года, но два года уж точно.
+10
+11 –1
PavelMSTU ,  
Я рад, что fotonstep прав. Ссылку можно?
+5
+6 –1
Akr0n ,  
+1
+4 –3
ValdikSS ,  
Ну вот на сосаче, например.
+1
PavelMSTU ,  
Спасибо!
–5
gxcreator ,  
Сосач умер
–4
Kirillko312 ,  
Сосач жив
+1
homm ,  
А ссылка жива.
+3
bromium ,  
Официально криптопротокол mifare classic был взломан в 2008 г. студентами одного голландского университета.

Поскольку криптопротокол classic называется crypto1, впоследствии была разработана энтузиастами библиотека crapto1 (игра слов — crap — г… о), которая позволяет, например, легко вытаскивать ключи из подслушанного протокола между картой и ридером.

Ссылку приводить не буду — легко гуглится.

Ну а в kali linux давно уже в поставку входят утилиты, эксплуатирующие уязвимость чипов mifare classic
+2
+3 –1
Akr0n ,  
В Хакере, вроде бы, про это несколько раз писали, про Mifare Classic. Там еще с программатором приходилось возиться, NFC не было :)
+3
fotonstep ,   * (был изменён)
Именно. Вот начало этой темы: https://xakep.ru/2009/02/06/47074/
И то, на каком-то из сайтов геймленда она появилась на полгода раньше. Сейчас уже не помню, где именно
0
+1 –1
Akr0n ,  
Да да. Но тогда все было сложно, а теперь у каждого второго смартфон с NFC…
+3
darksimpson ,  
Хм. Насколько мне известно, раньше меня этим никто не начал заниматься (по крайней мере в открытую). Если я что-то упустил тогда, было бы интересно посмотреть что. Правда.
0
dlinyj ,  
Читаю, и думаю скинуть тебе ссылку, а вон ты тут ;)
+1
darksimpson ,  
Агась )
+6
TimsTims ,  
+1
Автору просто респект и уважение
+5
+6 –1
ohm ,  
А в зоопарк можно несколько раз сходить?
+3
+4 –1
Ammonia ,  
Данная система не была протестирована, но вероятнее всего можно.
0
darksimpson ,  
В Аэроэкспрессе можно было покататься :) Теперь там онлайн проверка.
+23
Urvin ,  
Валидаторы в метро

Предположительно, работают на базе x86 компьютера и операционной системы Windows.

image

WinXP
+1
+8 –7
PavelMSTU ,  
Чиновники!..
0
+6 –6
PavelMSTU ,  
Хабраюзеры, а можно минуснуть и ответить, а не просто минутность?
Вот зачем ставить Win на такое оборудование?
+18
+19 –1
VBKesha ,   * (был изменён)
Потому что это просто. Программистов полно которые под вынь напишут. И зачем тогда с чем то ещё заморачиваться.
+2
+3 –1
zhovner ,  
Легче сертифицировать все это дело чем городить с нуля.
+1
+2 –1
VBKesha ,  
Даже там где дело не касается сертификации могут так сделать просто потому что быстрей(видел такое несколько раз) а на проект дали мало времени(потому что было 5 посредников и на передачу от одного к другому ушло 80% заложенного времени) поэтому делайте на винде.
+6
impetus ,  
… и 80% денег
0
+3 –3
western333 ,  
Потому что, себестоимость аппарата (или как его там валидатора) в автобусе 10 тыс рублей, а по бумагам он проходит 270 тыс рублей, потому как на win xp ничего программировать не надо оно все есть в инете нахаляву и остается только подкрутить, но при этом снять за это большие бабки типа разработали сами.
+1
IRainman ,  
Себестоимость прототипа этого аппарата, собранного из говна и палок на коленке 10 тыс. рублей, вы хотели сказать ;)

То что установлено это промышленное вандалоустойчивое оборудование (то что в подвижных единицах ещё и для транспорта), прошедшее испытания и сертификацию (по всем словам ранее), кроме того в сумму входит не только устройство но ещё его установка и куча сопутствующей работы рядом, вроде прокладки коммуникаций, косметическая работа после и пр…
+3
leotsarev ,  

А какие есть причины не ставить? Сэкономить пару сотен баксов на лицензии?
Знаете сколько станков и прочей индустриальной хрени написано по принципу «контроллер на ARM, управляющий компьютер на Винде»?
В чем проблема?

+1
Ogi ,  
анекдот_про_самолёт_на_Винде.txt
–1
Asen ,   * (был изменён)
У многих нынче этот вопрос в голове. И причем он касается далеко не только систем обслуживания. Понятно, что надежная ИС — это фундамент надежности всей системы в дальнейшем, но всемжепофиг

Часто ответ даже еще проще: никто даже не думает о том, что есть что-то другое(не WinXP)…
0
istem ,  
Поправьте, если ошибаюсь. Криптоустройства должны иметь лицензию для использования в коммерческих целях. Да и сами устройства и программное обеспечение должны соответствовать требованиям всяких разных ФЗ и ФСБ. Винда обладает и тем и другим и третьим. Насчёт других операционных систем сказать не могу.
+2
IRainman ,  
Там не просто Win, а, в данном случае, Windows XP Embedded POSReady, т. е. специальная редакция, которая как раз и предназначена для такого оборудования.

Ставят потому что хорошая поддержка со стороны железа (драйвера), адекватная поддержка со стороны самих MS, а также кучи организаций, которые эти решения внедряют и поддерживают, ну и конечно же море уже написанного и хорошо работающего ПО. В общем, если коротко: развитая экосистема вокруг ОС.
+2
Ammonia ,  
Согласен, не вижу никакой проблемы в использовании Windows на таких устройствах.
+1
x893 ,  
А не пробовали в такую карту делать копии?
github.com/emsec/ChameleonMini
+1
darksimpson ,  
Хамелеон в текущей итерации очень плохо работает, увы. Ждем новую итерацию.
+12
+13 –1
Loxmatiymamont ,  
А вы с разработчиками связвались, по поводу
>>исправления найденных уязвимостей необходимо усовершенствование формата хранения данных в памяти карты и обновление программного обеспечения всех систем, работающих с картой.
+69
Ammonia ,  
Да. Никого это не заинтересовало.
+16
Loxmatiymamont ,  
Круто. Тогда с нетерпением жду разбор питерского подорожника.
+1
darksimpson ,  
А вот там разработчиков это очень интересует, вплоть до разборок по поводу и без.
0
monah_tuk ,  

Вот проводишь такие исследования, а ведь рапортовать потом страшно: а вдруг вместо "спасибо", повестка в суд придёт? Ведь, по факту, на некоторую сумму нагрели же.

+4
NikMelnikov ,  
Да, подорожник интересно было бы
+36
+37 –1
saboteur_kiev ,  
О том, что вы пытались связаться с разработчиками и их ответ, что им это неинтересно — стоило бы добавить в статью, можно даже в самое начало, чтобы руководство этих разработчиков сразу бы это видело.
+9
+10 –1
complynx ,  
Поддерживаю.
Чтобы у читателя не складывалось впечатление, что автор просто сделал утилиту для незаконного прохода, ибо у меня сложилось именно такое представление.
Я бы хотел видеть, что была не только проведена работа, но сперва уведомлены подверженные атаке члены, и только после их отказа от устранения неисправностей, желательно с отчётом о том, что они сказали, открытые примеры эксплойтов.
+1
+2 –1
zetta ,  
ви так говорите, как будто это что-то плохое…
+1
+3 –2
darksimpson ,  
Нет, не так. Вот так: «Вы так говорите, как будто это что-то изменит или чему-то поможет...»
+4
saboteur_kiev ,  
Это не обязательно плохое. Но я очень огорчусь, если автора статьи пострадает от известно кого. И вдобавок таких статей на Хабре больше не появится из-за подобных случаев.
+8
+9 –1
maxp ,   * (был изменён)
Судя по количеству плюсов у подобных постов у хабрааудитории наивность довольно велика.

Ребята, поймите простую вещь — разработчикам не заказывали _абслютно защищенную систему_.
Для них достаточно просто обеспечить невозможность массовой коммерческой эксплуатации уязвимостей. Понимаете разницу?

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

А пока умные мальчики поковырявшись неделю бесплатно ходят в зоопарк или планетарий это никого не волнует.
+3
+4 –1
Ohar ,  
обеспечить невозможность массовой коммерческой эксплуатации уязвимостей. Понимаете разницу?
приложение TroikaDumper… позволяет сохранять состояние памяти и записывать его на карту

Нет, не понимаем. А вы понимаете?
0
+1 –1
maxp ,  
Хорошо, опишите тогда возможный сценарий зарабатывания заметных денег на этом.

Ключевые моменты:
— деньги нельзя получить из системы, их можно только сэкономить,
— онлайновый дабл-спенд пресекается на раз-два, причем, с перспективой маскишоу и последствиями,
— офлайновый дабл-спенд ограничен временем (5 дней, если не ошибаюсь) и он все-равно виден в логах по результатам дня
— пользовательское телефонное приложение ломается всегда по определению, но сделать в очередном релизе привязку по номеру телефона не так уж сложно.
+2
Ohar ,  
Заработать деньги на это нельзя, даже если бы никакой защиты вообще не стояло.
Можно было бы только сэкономить и ждать маски-шоу.
Но вот экономить может неограниченное число пассажиров.
–2
maxp ,  
Это только в теории.

На практике фродовое приложение моментом выкинут из стора, как только это понадобится. На официальное приложение можно напустить обфускатор и оно перестанет ломаться одним if'ом. Ради чего потом кому-то надо будет тратить немало времени, чтобы сломать его? Только ради любви к искусству трудиться более одного раза обычно лень.

Это я все к тому, что разработчикам системы все эти вещи известны лучше, чем нам всем вместе взятым, а риски давно известны и оценены.
+1
ctacka ,  
И риск получения ключей, конечно, оценен дешевле, чем обфусцирование кода клиентского приложения?
Хочется верить, конечно, что взяв за основу уязвимый протокол разработчики оценивали риски и выбрали его осознанно
0
maxp ,  
Тут как бы вариантов особо нет — андроидное приложение разбирается всегда. Просто цель разработчиков сделать эти работы экономически невыгодными.
0
dobergroup ,  
>> онлайновый дабл-спенд пресекается на раз-два, причем, с перспективой маскишоу и последствиями,

Почему?
0
maxp ,  
Что почему?

Почему управляющая система способна заносить карту в стоплист по определенному событию или условию?

Или почему энергичный телесюжет с нарезкой из камер наблюдения, полицейских машин и преступников в наручниках уменьшает убытки от фрода на порядок лучше многих сугубо технических решений?
0
dobergroup ,  
Может я туплю, но не сильно вижу возможность формализировать такие условия.

А спрашивал я да, про маски-шоу: Вы предпологаете борьбу скорее с конечными пользователями?
0
maxp ,  
Ну в смысле, если существуют воры, то с ними вполне можно бороться :)
Тем более, когда факт и умысел налицо.
0
lamoss ,  
Факт и умысел ещё доказать надо. Если стоять за турникетами и каждому за полцены поездки накидывать — тогда да. А если я дома себе возвращаю потраченные деньги — то какой факт может быть? Вот моя тройка, вот я ей пользуюсь. Пользуюсь ей как указано в правилах пользования. А что там считывается или нет — откуда мне знать?
0
Ghool ,  
Вопрос в том, что уже есть неофициальный дампер, не требующий привязки к телефонному номеру.
И что бы он перестал действовать — надо менять структуру, в том числе все карты, которые на руках.
Некоторые продаются на год.
То есть как минимум, год это будет действовать.
0
SGwar ,  
«Проблема абсолютно точно не в “железе”. Судя по описанию того, как происходил взлом, “дыра” находится в программном приложении, с помощью которого удалось получить доступ к информации, которой обменивается карта и система прохода, а также к памяти карты. Это не наша сфера ответственности, связь карты с турникетом работает, к нам вопросов нет», — подчеркнул Дианов.
news.mail.ru/society/25925519/?frommail=1
+1
darksimpson ,  
Насчет «железа» (как комбинации собственно железа и его эмбеддед софта), вы видимо, не знаете всей печали и глубины. Описанная проблема, может быть и не в железе (и то явно, а не косвенно). Но существует и масса других проблем, гораздо более печальных.
+16
+20 –4
silvansky ,  

Во-первых, статья крутая, спасибо! =)


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

–10
+8 –18
darkAlert ,  
зачем это делать? Он разве обязан? Ему за это платят?
+14
+16 –2
silvansky ,  

Как минимум чтобы себя обезопасить. Приложение, если наберёт какое-то количество пользователей, привлечёт к себе внимание правоохранительных органов и статья всегда найдётся. Если же получится сразу договориться с руководством метрополитена, то этого можно будет с большой вероятностью избежать. Так что тут дело не только в этике, но и в моём беспокойстве за судьбу автора. Всё же реально в статье описывается метод бесплатного проезда в московском транспорте. И убытки могут быть вполне реальными.

+1
KindDragon ,  

Я с вами в целом согласен, но боюсь если он даже предварительно сообщил об этом в руководство Метрополитена — ничем его не обезопасит. Так как он опубликовал до устранения уязвимости.

+6
bromzh ,  
зачем это делать?

Как минимум, чтобы за мошенничество не посадили.

+14
Frag ,  
Если вы придёте куда-то и официально заявите, что украли пару тысяч рублей из платёжной системы, то это не снимет с вас ответственности.
Наоборот, это будет по сути явкой с повинной.
+3
bluetooth ,  
Уголовно наказуемое действие, разве нет?
+2
Light_Metal ,  
Причем полный букет статей из раздела «преступления в сфере компьютерной безопасности»…

Исследование достойное, заслуживает внимания.
Но приложение, выложенное в общий доступ, мне кажется, лишнее.
0
+1 –1
Bioman85 ,  
У вас уже покупка билетов стало уголовно наказуемым? Едва ли под это найдется статья, ну подошел человек к турникету, ну открыл, развернулся и пошел обратно.Какая из этого материальная выгода? Да и вообще, если посмотреть, автор не похож на человека, который потратил на это две недели просто для того, чтобы на метро бесплатно покататься.Статья хорошая, мне понравилось.
+1
Viacheslav01 ,  
Реверс инжиниринг, внесение в приложение деструктивных изменений, предоставление неограниченному кругу лиц инструмента вносящего изменнения в работу программно аппаратного комплекса с целью мошейничества. Боюсь правоохранительные органы бдут не согласны трактовать это как покупку билетов.
0
darksimpson ,  
Цель и мошенничество еще надо доказать, особенно когда автор выкладывает в свет свои эксперименты (то есть, фактически, обкладывается говном загодя, чтобы на сраной козе было подъехать труднее, что правильно). Но с другой стороны, у нас ведь как — был бы человек…
0
Bioman85 ,  
А все выше указанное надо доказать, как и доказать то, что было умышленное действие с целью обогащения, что в принципе практически невозможно, тем более автор указал, что все сведения были переданы разработчикам, которым влом что-то с этим делать, так в чем тогда вина автора? Опять же, никакой экономической выгоды для себя автор при всем этом не получил, никаких деструктивных изменений не было внесено, прочитайте статью автора еще раз, он не разбирал алгоритм ключа, вследствие чего он мог только делать откаты, а не фактические изменения.И да, сложно из этого сделать уголовное дело без большого ущерба, да и вообще, сами то верите, что все вот так прямо побегут пользоваться этим всем делом? Многие то в этом вообще ничего не понимают, да и едва ли будут разбираться в этом.
+1
darksimpson ,   * (был изменён)
Если посмотреть с несколько более отрешенной точки зрения, то получится, что у нас уголовно наказуемое действие — по улице ходить, грубо говоря. Поэтому, обычно каждый сам ставит перед собой вопрос и дает на него ответ (то есть на что-то такое решается или нет в результате).
+4
ivan2kh ,   * (был изменён)
значение баланса электронного кошелька хранится в области памяти от младших 4 бит 8 байта до старших 3 бит 10 байта и рассчитывается по формуле
137B8/C8=18F(16)=399(10)

C8(16) == 200(10)
Сомнительно, чтобы они хранили сумму в полу копейках. Вероятно младший бит служебный и используется для контроля четности или должен всегда равен 0.
+1
recontemplator ,  
А я решил, что это такой юмор разработчиков: за поездку на «тройке» расплачиваться, «полушками» :-).
+23
+26 –3
TheTon ,  
Таким и должен быть пост для Хабра. Спасибо, прочёл все с удовольствием.
+11
DrZlodberg ,  
Аккуратнее так. Сейчас везде стоят камеры и любая подозрительная активность (а несоответствие данных при синхронизации, пусть даже и отложенной, вполне под неё подходит). Особенно если иметь наглость ездить через одни и те же станции а метро.
А по теме — спасибо, очень интересно. Тоже хотелось его поковырять, но покупать для этого новый смарт как-то не хочется.
+7
+8 –1
karabox ,  
прямо как хороший детектив почитал. respect
0
elite7 ,   * (был изменён)
Отличное исследование!

У меня на Android 4.2.2 TroikaDumper-0.1.apk 1 640 086 байт не захотел ставится.
«Синтаксическая ошибка» «Ошибка при синтаксическом анализе пакета»

Mifare Classic Tool на Тройку ругнулся, что такой тэг неизвестен.

Не рассмотрены анлим тарифы Тройки — когда покупаешь на 3 месяца или на год без ограничений по числу поездок.
+3
Ammonia ,  
Приложение точно работает на Android 6.
0
Miha_xXx ,  
В приложении прописано Min SDK 19 (т.е. Android 4.4) из-за чего вы и получаете данную ошибку. Если оно не использует специфику 4.4+, то можно в наглую изменить min.SDK через тот же APKtool
+38
+40 –2
Iktash ,  
Я правильно понимаю, что автор нашел уязвимость, создал удобное средство её эксплуатации, доступное для массового использования, написал об этом на хабр — и все это под собственной именем и фамилией?
+12
+14 –2
PavelMSTU ,  
Ничего автору не сделают.
Иначе еще больше трэша будет…
Вангую, что пост войдет в топ, как когда-то «Как попасть на дачу президента в пять часов утра»
+10
prospero78su ,  
Автор нашёл уязвимость, создал не очень удобное, но всё же средство её эксплуатации, доступное для массового использования, написал об этом и на хабр — и всё это вряд ли под собственным именем и фамилией. Он не похож на идиота.
+3
+4 –1
amarao ,  
Исследование безопасности — молодцы. Тщательность анализа — супер.

Остаётся этический вопрос: при тестировании, фактически, происходила эксплуатация уязвимости с получением материальной выгоды.

Что надо было сделать? Приобрести жетонов/билетов на сумму, равную сумме умотреблённого в результате уязвимости. Жетоны можно было просто покидать обратно, билетики сохранить.
+22
Ammonia ,  
Фактических проездов на транспорте не происходило. Для проверки достаточно было открыть турникет.
+3
darksimpson ,  
Скорее всего, если бы ты проходил в турникеты, а не просто бы их открывал, то карточка залочилась бы за пол дня (в метре). Они отслеживали «машину времени» достаточно активно. Если только опять что-то не переделали и не поломали в процессе.
+1
impetus ,  
тогда фотки этого человека с камер у них в изобилии.
Но поскольку проходов не было — предъявить ему нечего,
соотв правоохранители не привлекались.
0
darksimpson ,  
Насколько мне известно, у нас (в Мск) это практически не работает. Но инфа может быть устаревшая.
+3
ascending ,  
А на наземном транспорте? Пикали картой и выбегали?
+8
TimsTims ,  
> Приобрести жетонов
Я вас удивлю :)
+1
darksimpson ,  
Ну, может человек из Питера.
+3
Light_Metal ,  
Тройка в Питере?
И да, жетоны в метро есть, например, еще и в Екатеринбурге. Московские, кстати :)
0
monah_tuk ,  

Пару лет назад в Новосибирске ещё были. А в Питере больше нет? Давно там не был. В Москве ещё лет 8-10 назад их не стало. Был расстроен — думал собрать образцы жетонов городов, где в России метро есть :) Пока только Питер, Новосибирск.


ЗЫ а я думал, что у нас только 4 метрополитена: Екатеринбург, Москва, Питер, Новосибирск, оказывается ещё есть в Нижнем Новгороде, Казани и Самаре.

0
Light_Metal ,  
Есть-есть, никуда не делись.

Кстати, в Новосибирске свои жетоны, или привозные, как в Екатеринбурге? :)
+1
axilirator ,   * (был изменён)
Жетоны свои :)
0
monah_tuk ,  

Мне показалось — какие-то более тонкие. Дома нужно найти, сфотографировать. Но чеканка своя, правда скромная, Питерский красивее :) По слухам, тоже от жетонов отказываться будут.

+1
reji ,  
В Омске есть. Правда, там всего одна станция, и поэтому я не уверен, что есть жетоны.
+16
ITMatika ,  
Статья отличная! Но я очень беспокоюсь за дальнейшую судьбу автора, держите нас в курсе :)
+4
BigD ,  
«Куда вы меня уноси...»
+2
axilirator ,   * (был изменён)
+3
Kress ,  
Превосходная статья!
Риторический вопрос: у нас в городе используются обычные транспортные карты с магнитной лентой. Всегда, глядя на тетенек в метро, пополняющих эти карты, думал: какая защита у этих карт от чего-то вроде скимминга или даже кражи пополняющего терминала?
0
wolowizard ,  
помнится, раньше копировали бумажные метробилеты с магнитной полосой с помощью устройств на базе головки от катушечного магнитофона
0
ValdikSS ,  
Но годы идут, и теперь у нас есть Cardberry и прочее говно.
+5
Black_Shadow ,  
Первое время в Питере турникеты были с несколькими головками чтения-записи, чтобы карточку можно было вставлять как угодно. Карточка перезаписывалась каждый раз, и для копирования было достаточно вставить 2 карточки в 1 считыватель.
0
Fiofant ,  
Может я не внимательно прочитал, но как вы получаете в своем приложении ключи от A и B секторов без интернета, а «Мой проездной» запрашивает их через API? Или эти ключи не уникальны для каждой карты?
+19
Ammonia ,  
Ключи однинаковые для всей системы. В приложении TroikaDumper они просто захардкожены.
+4
menraen ,  
Вот на этом месте реально отвисла челюсть! Я даже нецензурных слов не могу подобрать таких, чтобы полно и ёмко охарактеризовать этот факт!
0
darksimpson ,  
В этом нет ничего криминально страшного, особенно с учетом использования имитовставки. «Машина времени» (как я уже написал выше в комментах) еще относительно недавно достаточно бодро отслеживалась в Метро, вроде бы вплоть до того, что на этой же станции трюк повторно не срабатывал. Но, опять же, могли что-то поменять или поломать.
Хотя в принципе, брать карту Plus и юзать ее в режиме совместимости — уродство, но на то у них есть некоторые печальные причины, от которых так просто не избавиться :)
+2
mmMike ,  
Увы. Старые дешевые Mifare Classic ридеры просто не предусматривают деривацию ключей.
Только мастер ключи и на ограниченное количество «слотов».

А совместимость с инфраструктурой гораздо дороже чем мелкие потери от хакеров.
С учетом того, что и еще есть «черный список» карт, загружаемый в устройства.
Потенциальные потери от мошенничества — ни о чем.
+2
TimsTims ,  
> Время последней поездки, записанное в секторе памяти электронного кошелька, не должно повторяться при поездках в метро
Ammonia подскажите, но ведь это значит, что можно через программу эмулировать-генерировать любое время последнего прохождения, и тогда можно не заморачиваться с синхронизацией через автобусы?
+6
Ammonia ,   * (был изменён)
Нет, имелось в виду, что для обновления времени прохода нужно использовать валидаторы в наземном транспорте.
Вы не сможете изменить никакие данные на карте самостоятельно, иначе будет недействительная криптоподпись.

Дополнил текст в статье.
0
lagr ,  
Очень круто. Респект.
+3
topy ,  
Вот теперь я знаю зачем NFC нужен в телефоне!
0
TimsTims ,   * (был изменён)
Ну, я знаю несколько программ банков и платежных систем, которые вполне успешно эмулируют пластиковые карты для беспроводной оплаты. Тоже вполне неплохо.
А так-же упоминаемая в статье программа «Мой проездной» вполне неплохо работает, что даже в кассы спускаться не надо для пополнения, всё через телефон… было… до этого времени))
0
wiz ,  
Постоянно плачу с мобилки в окрестных супермаркетах.
0
Akr0n ,  
Ну и как реально можно защитится от восстановления дампа? Это надо чтоб все устройства были онлайн через единую БД. С турникетами метро такое еще возможно, а вот с наземным транспортом — слишком сложно.
+2
Ammonia ,  
Например начать с диверсификации ключей, чтобы при взломе одной карты не происходило компроментации всей системы.
0
Akr0n ,  
Чтобы ключи для каждой карты различались и зависели от серийного номера чипа?
0
JediPhilosopher ,  
Но это все равно не поможет. Ну сломаете вы не всю систему разом, а только пару карточек для себя.
Вообще тоже интересует тема с защитой, так как возможно в скором времени придется разрабатывать схожую систему — платежи с идентификацией аккаунта пользователя через NFC-карту, как раз рассматриваем Mifare Plus. Про идею с подменой сертификатов и MitM для кражи ключей приходящих с сервера я как-то не подумал. И теперь вот вообще не вижу способа сделать это секьюрно.
Неужели единственный способ — использование навороченных карточек типа Mifare DESFire, которые как и EMV IC карты содержат в себе уже настоящий процессор и могут вычислять всякие подписи и выполнять шифрование самостоятельно?
0
amf3tam1n ,  
Вполне возможно вам достаточно MFPlus S/X в режиме SL3 (шифрование AES)
И использование SAM-модулей от NXP в режиме X-interface (подключение SAM напрямую к IC NFC) для хранения ключей, диверсификации и прочей аппаратной криптографии. Тогда единственное место где можно перехватить данные с карты — это интерфейс между хостом и считывателем.

Если вы расчитываете на андроид устройства, то там тоже есть варианты секурных хранилищ (UICC (SIM), SDCard, Embedded Secure Element). Но остается проблема загрузки ключей по воздуху. Лучше не давать это делать обычным пользователям.
0
bromium ,  
К сожалению, решения UICC и eSE плотно завязаны на ведоров, досутп к eSE и к сим провайдера не так просто получить (организационно, в первую очередь)
0
BigW ,  
Что меня прямо скажем смутило, это отсутствие валидации баланса карты… пополнение то всегда онлайн… почему потом нет сравнения расчетного остатка карты с текущим, странно все это…
0
bromium ,  
Как раз Mifare карты достаточно продвинуты, особенно новые поколения Mifare Plus, карта много чего умеет. Просто в Тройке они работают, для обратной совместимости, по устаревшему протоколу, который как раз и весь дырявый.

Под Ваши потребности, думаю, вполне можно подобрать недорогое решение из линейки Mifare.
0
JediPhilosopher ,  
Так в статье автор же и говорит, что он пользовался не уязвимостью в карте (помню на хабре была уже статья где ломали подобный проездной, тогда он был сделан именно на Classic, и там автор пользовался именно уязвимостью самой карты), а вытащил ключи для нее из приложения.
+1
KamiSempai ,  
Тогда при отсутствии сети будут проблемы, так как не получиться запросить подходящий ключ. И как уже писал JediPhilosopher это не сильно поможет.
+1
darksimpson ,  
Не поможет. Ключи за 5 секунд достаются из воздуха атакой «без карты». Если не лениться, а допилить Хамелеон тот же и немного автоматизировать, то можно сделать бе… в общем, можно все сделать :)
+1
menraen ,  
А можете пояснить, почему требуется аппаратное решение типа Хамелеона, почему нельзя полностью эмулировать карточку телефоном с NFC — включая UID? К примеру, раньше Google Wallet/Android Pay работал только на телефонах с чипом NXP с Secure Element, а потом что-то поменяли и стало работать на любом аппарате с NFC — т.е. сэмулирвать платежную карточку теперь можно исключительно софтом. А что мешает тогда тем-же софтом полностью сэмулировать Mifare Classic/Mifare Ultralight — включая UID и OTP-зоны?
0
darksimpson ,  
Потому, что это нельзя сделать так легко и просто. И еще, практически ни одна /официальная/ реализация не даст подставить свой уид, такой, какой нужен. А на уид все завязано.
0
bromium ,  
Mifare Classic и Ultralight сэмулировать не получится — это проприетарная штука, там дополнительный, не по стандрату, инфообмен идет между картой и ридером, так что только соовтетсвующий чип от Nxp и либа могут это обрабатывать.

Есть, конечно, варианты, но настолько геморройные и на практике сложно реализуемые. В общем, есть варианты проще.
+2
darksimpson ,   * (был изменён)
А еще, текущим прецедентом люди сами создали себе проблем. Ведь теперь диверсифицируй-не диверсифицируй, а все равно получишь… кучу старых карт с Legacy ключами, от которых, кроме как с помпой, фанфарами и кучей говн из медных труб не избавишься. Всё, ёк.
Кстати, раскрою небольшой секрет: с ключами для генерации и проверки имитовставки в кошеле все обстоит так же (в отличие от обычных ультралайтов, где они достаточно часто ротейтятся, правда с оговорками тоже).
0
Gryphon88 ,  
На счёт «не избашись» не согласен. Мне карту-проездной на пригородные электрички меняли с 2008 2 раза бесплатно, при очередном ежемесячном пополнении в кассе, под предлогом «у нас теперь карты новго образца».
0
chersanya ,   * (был изменён)
На тройку можно очень редко деньги класть — если кто например проездом в Москве пару раз в год бывает, то 1000 р на несколько лет может хватит. Хотя конечно всегда можно решить это — пусть бы турникет писал что требуется замена.
0
Gryphon88 ,  
Я немного другое имел в виду: кто-то пополнил Тройку на 1000р, это событие было записано на Большой Черный Транспортный Сервер, а потом успешно прикладывал её к турникету 100 раз. Данные синхронизировались, когда соответствующие автобусы/троллейбусы приехали спать в парки, вместе со временем использования карты. Тут и смотрим записи с камеры над турникетом, соответствующие времени прикладывания
0
vladon ,  
Ну и что на камерах увидят? Человека, который прошёл по кривой карте. В этом нет состава преступления. Может он её на улице нашёл или у кого-то возле метро купил? Или в кассе кривую дали, он же не обязан разбираться.
0
Gryphon88 ,   * (был изменён)
Да, тут ничего доказательно не предъявишь, не телефон же он прикладывал. Максимум — нарушение правил пользования и обязать заменить карту за свои без возмещения залога в 50р.
0
bromium ,  
Так сейчас и оплату телефоном в метро сделали — тоже не предъявить теперь за это.
0
impetus ,   * (был изменён)
между «опознать» человка и «предъявить» — дистанция большая… Просто посмотреть хотя бы — это один человек ходит или бородачи с дредами по 100 чел с одной карты заходят… Опять же — то ли просто человек, или знакомая рожица чья… В общем я бы просто из любопытсва посмотрел бы. будь у меня доступ.
0
darksimpson ,  
«Требуется замена» — это уже сам по себе неприятный момент во многих смыслах. А так, это и паспорт можно всех поголовно согнать менять.
+1
Dmitry_4 ,  
Но отслеживать автобусы в.реальном времени почему-то получилось.
0
Akr0n ,   * (был изменён)
Там трафик односторонний фактически и очень небольшой. А вот если на посадке турникет будет тормозить при проходе каждого пассажира, ничем хорошим это не кончится. Тогда как сбой в работе GPS-трекера не критичен.
+1
Dmitry_4 ,  
Вайфай опять же скоро обещают.
0
Akr0n ,  
Все же, это не критичный для транспортной инфраструктуры дополнительный сервис, на этот канал нельзя будет завязать такие вещи.
0
darksimpson ,  
Существует масса методов для правильной организации этого функционала с использованием нестабильных каналов передачи данных. Элементарно копить транзакции и пачечками их туда-сюда гонять. Это работает (правда, только когда это нормально делают, и в этом основная проблема).
0
bromium ,  
Да, но тогда мы возвращаемся в исходную точку — инфа должна быть на карте, например, с тем же балансом. Что толку, что мы накопили транзакции, когда нет связи, а потом синхронизировались и увидели, что эта карта либо в блэк-листе, либо баланс зашел в минус.
0
darksimpson ,  
В любом случае инфа будет на карте. и при правильной организации я не вижу в этом ничего плохого.
+1
stifff ,  
в рилтайме будет не очень, но ведь блеклисты на конечных можно и подтягивать-то
0
Eklykti ,  
Добавить к терминалу сотовый модем за пару баксов — слишком сложно?
+2
NikiN ,  
Покрытие не везде идеально, плюс такие системы разрабатывались лет 10 назад, когда оно было еще хуже. Слабая защищенность это следствие совместимости со слоупочными проектами
0
elite7 ,  
Чтобы защитится, надо чтобы турникеты были онлайн большую часть времени.

То есть в случае проблем с каналами связи всё должно работать (и следовательно была возможность двойной траты)

Но если все турникеты онлайн, то возможности двойной траты быть не должно.
–1
+3 –4
ErhoSen ,  
Пусть меня поправят знающие люди — правильно ли я понимаю, что такой трюк с приложением на ios не получился бы? То есть наверняка .ipa можно как-то декомпилировать, но поправить код, собрать обратно и запустить — вряд ли?
Не срача ради, правда интересно.

А статья чудесная. Надеюсь она приведёт к усовершенствованию системы(что в такой консервативной области весьма круто). Спасибо!
+4
Ammonia ,  
но поправить код, собрать обратно и запустить — вряд ли

Имея девелоперский сертификат это не составит труда.
+1
silvansky ,  

Девелоперский сертификат сейчас можно даже бесплатный использовать.

0
+1 –1
VBKesha ,  
Что то мне кажется что декомпилировать ObjectiveC ещё можно а вот чтобы скомпилировать можно, а вот чтобы скомпилировать назад придётся прилично повозится. Всё таки там бинарный код а не, код виртуальной машины как у Java, Lua и если ничего не поменялось то .Net.
+1
+2 –1
L3333437 ,  
и че дизасемблеры отменили?
0
VBKesha ,  
Нет конечно, но сложность по сравнению с декомпилятором получается совсем другая.
+2
silvansky ,  

Вполне можно, иначе откуда берутся крякнутые игры на торрентах?

+1
Avitale ,  
Насколько мне известно, NFC в iPhone работает только в связке с ApplePay, так что для того, чтобы сделать подобное приложение для айфонов, придется еще взламывать ограничение на NFC.
+1
art_linux ,  
NFC на iPhone аппаратно не позволяет читать другие карты из-за отсутствия активной антенны
0
bromium ,  
Странное утверждение, не очень потяно, что имеется ввиду. Чтобы NFC вообще работал, требуется как раз антенна, без этого как по радиоканалу вы общаться с картой планируете?
+1
Dmitry_4 ,  
Кстати, зачем пользоваться тройкой, когда поезд в метро дешевле по картам на 60 поездок?
0
TimsTims ,  
Например когда ты закидываешь 300 рублей, чтобы просто было и катаешься в метро всего несколько раз в месяц.

> в метро дешевле по картам на 60 поездок
Опять-же зависит от количества поездок — если ты спускаешься в метро каждый день по 3 раза в день, то уже выгоднее брать безлимитный со сроком действия.
0
+1 –1
Dmitry_4 ,  
В том и дело, что по трешке ездит куча народу, кто использует две поездки в день.
0
TimsTims ,  
Как считали? И как выделили тех, Кто постоянно покупает по 1й поездке от тех, кто лишь проездом в городе?
0
Dmitry_4 ,  
Среди коллег.
+8
Urvin ,  
На тройку записывается любой проездной (60 поездок, 90 минут итд). Наверняка секрет в этом.
0
TimsTims ,  
Похоже, вы слишком экстраполируете
image
+1
admhome ,  
Я использую 2 поездки на метро в день. Если отбросить весь наземный общественный транспорт, то дешевле 60 поездок, но у меня есть и карта для поездок (как раз 60) и карта просто с деньгами. Всё это потому что утром от дома до пересадки я еду в автобусе почти всегда, затем электричка, затем метро — получается ещё открытый билет по тарифу 90 минут, затем трамвай до работы за ноль рублей. Обратно же пешком до метро, используется карта метро на фиксированное количество поездок, далее электричка (там своя карта, да) и потом пешком до дома. Такая вот попытка оптимизации расходов.
+1
RomanPyr ,  
На подмосковные электрички Тройка тоже работает, если записать на неё проездной.
+1
catharsis ,  
Через приложение Мой Проездной можно записать на Тройку даже разовые билеты на электричку
0
RomanPyr ,  
И через автоматы тоже.
0
Dee3 ,  
Чем тогда она отличается от Стрелки?
0
RomanPyr ,  
Тем, что если вы не пользуетесь пригородными автобусами, то вам нужна только одна карта.
0
Light_Metal ,  
0
ilyuxa ,  
Вот это поворот. Было бы очень удобно.
+2
vayho ,   * (был изменён)
эти 60 поездок можно записать на тройку и ездить по ней, а когда закончатся уже деньги начнут списывать
0
catharsis ,  
Тогда не получится использовать «90 минут» по мере необходимости.
0
Avitale ,  
Мне для «90 минут» пришлось завести вторую Тройку. :)
+3
Iv38 ,  
Тройка офигенно удобная штука. Во-первых, как уже сказали, помимо кидания на Тройку денег, на нее можно записать и любой из абонементов. А если у тебя вдруг кончились поездки, а ты вовремя не позаботился о покупке нового абонемента, можешь войти в метро потратив 32 рубля с баланса карты. На Тройку также можно записывать билеты на электрички и абонементы на них, что позволяет (если ездишь на электричках) вместо двух карточек носить одну. Ну и автоматам пополнения тройки можно скармливать мелочь. И от мелочи избавляешься, и имеешь тот самый резерв на карте.

Тратить на проезд деньги с баланса карты выгодно, если пользуешься метро очень редко.
–3
Dmitry_4 ,  
На элекрички не работает тройка, там стрелька или карта ыржэдэ
+1
rttm ,  
Работает. Сам лично проверял. Пихаешь карту в так называемый «билетопечатающий автомат», который билетики выдает, оплачиваешь. Только была проблема в том, что чек надо сохранять.
В общем вот
+1
mogrein ,  
Езжу каждый день — работает.
0
DimkaI ,  
Каждый день езжу на электричке туда и обратно. Записываю на тройку сразу в автомате и прохожу через турникеты. Контролёры ни разу не предъявили претензий.
0
Fedcomp ,   * (был изменён)
Работает как тройка так и стрелка без каких либо проблем. Одноразовые билеты и абонементы.
0
ivanovlev ,   * (был изменён)
При этом при наличии на тройке допустим 300р и у тебя в руках еще 400 на кассе отказываются оформить на ней 60 поездок за 670р. Вот такое вот гов… ущербная система
0
Iv38 ,  
Да, невозможность оформления абонементов с баланса карты и желательно онлайн мне тоже не нравится.
+36
+37 –1
ExplosiveZ ,  
Хабр торт! Наконец-то этот маркетинговый буллшит чем-то разбавлен.
+1
Compuser ,  
Вот нашел список смартфонов с NFC модулем производства NXP и не только)
en.wikipedia.org/wiki/List_of_NFC-enabled_mobile_devices
0
fallen8rwtf ,  
«Использовался дешевый смартфон на платформе Android» — Какую модель использовали, чтобы потом не эксперементировать с поиском нужной железки?)
+1
Ammonia ,  
Можете отталкиваться от списка совместимых телефонов в этом приложении https://github.com/ikarus23/MifareClassicTool
+1
frag1k ,   * (был изменён)
Galaxy S5 (SM-G900), если тело запроса не подкорректировано.
0
QtRoS ,  
Браво, вдохновляет на подобные исследования!
А я так и ношу в кошельке билеты с аттракциона, хотел поисследовать способ формирования идентификаторов там, никак руки не доходят.
0
engune ,  
Интересно было почитать статью и ход мыслей, видно полезное применение новшеств в виде NFC.
0
+1 –1
CrazyViper ,  
Автор молодец! Отличное исследование и отличное его описание.

PS: Хорошо хоть изредка появляются такие отличные статьи на хабре.
+1
+2 –1
leshakk ,  
Автору — береги себя.
По крайней мере, не стоило так подставляться и писать про эксперименты с подделкой баланса.
Для системы проще отчитаться от поимке «киберпресупника», чем признать собственные ляпы.

И да, респект за подробное исследование и спасибо за интереснейший пост!

PS. Вспомнил пост про аналогичные эксперименты с таксофонными карточками.
Там у ребят закончилось уголовной статьёй и судимостью: habrahabr.ru/post/191450
0
complynx ,  
Ещё один момент по поводу APK… Лично у меня, на Sams. Note 3, приложение не отлавливает карточку. Оно пишет Ready, и всё. При этом карточка читается и для работы с ней предлагаются либо яндекс, либо MCT.
+2
Ammonia ,  
У вас и MCT не будет работать, так как NFC чип производства broadcom скорее всего. Вот список НЕподдерживаемых телефонов https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
0
complynx ,  
Оу, спасибо! Не знал об этом нюансе.
Теперь понятны некоторые вещи, да.
+17
darksimpson ,  
Всем хабровчанам привет, я тот самый автор, который еще тогда написал статью в «Хакер» :)

Давно хотел вылить что-то подробное по тройке и современному состоянию систем Метро и МГТ на Хабр, но ввиду своей жуткой лени и печальной занятости, никак не доходили руки (а инфы просто огромное море, правда, некоторую к сожалению выкладывать нельзя, но и без нее тоже интересно).
Автору — респект, что за это взялся и отдельно респект за его начинание в расковыривании /так называемого/ Layout'а у кошелька. По собственному опыту, доскональное расковыривание лэйаута — это достаточно емкая и интересная работа.

Вообще, если кому интересны какие-то вопросы по этой теме — задавайте. Я тоже постараюсь ответить в рамках того, что знаю и в рамках того, что можно говорить.
+3
Ammonia ,  
О, привет! Рад тебя видеть.
+5
darksimpson ,  
Привет! Спасибо :)

Ну вот видишь, никому не интересны технически подробности. Ладно, поеду тогда домой. Может это и правильно: меньше знаешь — крепче сон.
0
roman863 ,  
darksimpson, можешь рассказать про неиспользуемые лайоуты в метро сейчас в лс?
+2
DmitrySpb79 ,   * (был изменён)
Интересно понять, правильно ли я понял смысл:
— сектора карты закрыты ключом, не зная его их не прочитать, так? С андроидом понятно, а откуда утекали ключи в до-андроидную эпоху? Человеческий фактор? Или тупо брутфорсом?
— есть отдельный ключ на запись, правильно?
— что за китайские карты с возможностью записи нулевого сектора, на обычные карты он не пишется что ли? И что в нем такого особого хранится что он так защищен?
— если допустим, ключей нигде нет, возможно ли сдампить радиообмен с помощью антенны и приемника настроенного на частоту обмена? (допустим, есть SDR умеющий принимать от 20КГц и возможность записать сигнал в IQ)

Спасибо.
+3
darksimpson ,  
1. Ключи всегда утекали через известные (и неизвестные) фундаментальные уязвимости закрытой технологии шифрования Crypto1, которая издревле использовалась в Mifare Classic. От активного и пассивного мониторинга эфира до оффлайн атак на карты и атак на ридеры. Также, ключи утекали через реверс-инжиниринг железа метро, МГТ и их софта.
2. По технологии, есть два ключа, роли которых можно выбирать. Но в нашем случае, да — один «на чтение», один «на запись». Так повелось.
3. Нулевого блока. Нулевой блок на всех Classic (и совместимых) картах — некая «заводская зона», которая по уму на заводе пишется один раз, содержит в себе в том числе относительно уникальный серийный номер карты и не подлежит перезаписи. Сериный номер используется в том числе для организации защиты (от клонирования, например). В некоторых специальных китайских картах сделано так, что нулевой блок возможно перезаписывать.
4. Да, возможно. Это один из методов «доставания» ключей, в том числе и из «пофиксенных» новых Plus в режиме совместимости, так как некоторые базовые косяки Crypto1 устранить уже не выйдет, грубо говоря.
0
elite7 ,  
Есть ли слухи, что кому-то удавалось ли склонировать Тройку с анлим поездками? :-)
0
Gryphon88 ,  
Хороший проездной был… Что тут можно сделать, чтобы таакой финт легко ловился и был сложнее проверяем, кроме уникальных ключей, как предлагалось выше? Мне в голову приходит только анализ поведения, можно даже не онлайновый — сравнение, на сколько билет был пополнен и сколько было списано на проходе. А камеры висят и в метро, и почти во всем наземном транспорте, кроме маршруток.
0
vladon ,  
«Ничего не знаю, подошёл какой-то мужик и предложил пополнить карту с его кредитки, ему срочно наличные были нужны, вот он через свой телефон и пополнил, приложение похоже на „Мой проездной“»
0
+1 –1
bromium ,  
Забавно, но точно про такую же уязвимость было рассказано на phdays неделю назад:

http://www.phdays.ru/broadcast/ (справа сделать поиск по NFC и выбрать выступление про псевдобезопасность)

Просто совпадение?
0
TimsTims ,  
У вас и MCT не будет работать, так как NFC чип производства broadcom скорее всего. Вот список НЕподдерживаемых телефонов https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md

https://habrahabr.ru/post/301832/#comment_9627966
+1
+2 –1
bromium ,  
Кстати, на google play уже давно выложены приложения, которые проверяют баланс тройки, например Тройка. Проверка баланса

что касается баланса...
Байты, где записан баланс, проще перевести из hex в dec и разделить на 200 (что есть с8 в hex) — мне иногда так проще было при вычислении баланса на встроенном в android калькулаторе.


Интересно, а про количество дней, прошедших с 1.1.1992, автор сам догадался, или все-таки где-то подсмотрел? ;)
+2
darksimpson ,  
Вот, мне кстати всегда было интересно получить ответ на этот сакральный вопрос, еще много лет назад — почему именно 01.01.1992 года? Не уже ль это такое тонкое трололо по поводу отмены регулирования цен? Или все более прозаично? Может у кого есть какие-нибудь интересные варианты?
0
leshakk ,  
Скорее всего, стартовая дата «унаследована» из форматов хранения данных какой-нибудь АСУ родом их 90-х, спецификации которой разрабатывались в то время.
0
darksimpson ,  
Ммм… Не, не выглядит.
Хотя, возможно.
0
recontemplator ,  
Спасибо за увлекательную статью.
Примечательно (как любит повторять автор), что технология содержит средства, которые могли бы существенно затруднить проведение подобной атаке (последнюю подпись, можно было бы сверять со значением на сервере), но она почему-то не задействована даже в заведомо online решениях.
Может ли у этого быть рациональное объяснение?
Например, общий процент фрода, и его «стоимость» так малы, что не превышают стоимости дополнительных серверных мощностей необходимых для проверки всех транзакций (маловероятно).
Или — отключение этой проверки существенно уменьшает время транзакции = увеличивает пропускную способность, что может быть важно в часы пик (более вероятно).
Уязвимость используется самими разработчиками (как-то неприятно про это даже думать).
0
bromium ,  
Wпочему же, как раз наоборот: автор написал, что приходится после восстановления баланса наземным транспортом пользоваться, где нет онлайна, а вот в метро достаточно быстро блокируют, вероятно как раз по паре значений дата, подпись
+4
darksimpson ,   * (был изменён)
Да, по поводу того, как хранится баланс в этом лэйауте (осторожно, говорящая жаба!):

// Read Sector 8 data blocks (0 to 2)
for (int i = 0; i < 3; i++)
  System.arraycopy(mfc.readDataBlock(sect8StartBlock + i), 0, mfsect, i * 16, 16);


// Read and show money value from ticket
int money = BitOps.copyBitsToInt(mfsect, 196, 19, false, false) / 100;


и сама функция copyBitsToInt из класса BitOps:

public static int copyBitsToInt(byte[] from, int fromStart, int length, boolean revBits, boolean revBytes) {
  byte[] intBytes = new byte[]{0, 0, 0, 0};
  copyBits(from, intBytes, fromStart, 32 - length, length, revBits, revBytes);
  return (intBytes[3] & 0xFF) | ((intBytes[2] & 0xFF) << 8) | ((intBytes[1] & 0xFF) << 16) | ((intBytes[0] & 0xFF) << 24);
}

public static void copyBits(byte[] from, byte[] to, int fromStart, int toStart, int length, boolean revBits, boolean revBytes) {
    int j = 0;
    int y = 0;
    for (int i = 0; i < length; i++) {
      j = (revBits) ? length - 1 - i : i; // Reverse bits counter ("from" side)
      y = (revBytes) ? ((((length - 1) / 8) - (i / 8)) * 8) + (i % 8) : i; // Reverse bytes counter ("to" side)
      if (((from[(fromStart + j) / 8]) & (1 << (7 - ((fromStart + j) % 8)))) > 0) // If bit is set, then
        to[(toStart + y) / 8] |= 1 << (7 - ((toStart + y) % 8)); // Set bit
      else
        to[(toStart + y) / 8] &= ~(1 << (7 - ((toStart + y) % 8))); // Unset bit
    }
  }
0
darksimpson ,  
Извините, метод, а не функция, конечно. Си в голову засел.
0
Yuuri ,  
Метод тоже функция, так что всё ок :)
+1
Ammonia ,  
Получается тогда у меня ошибка в определении смещения. Деньги записаны не со старших 3 бит 10 байта, а начиная с пятого. Просто 4 и 5 биты были всегда нулевыми, поэтому реальную границу было сложно определить. Я наверное не стану исправлять в статье, пусть сохранится для истории.
+3
audiserg ,  
Отличная статья. Как вы так быстро раскусили делитель и место под баланс? И про 1.1.92 тоже интересно
0
roman863 ,  
darksimpson, вы можете про формат ржд рассказать в тройке? Можно на почту, чтобы не публично.
0
darksimpson ,  
Я не разбирал РЖД, увы.
0
roman863 ,  
Без инсайда там и не разберешь)
0
darksimpson ,  
И то верно.
0
CKA3ATb_BCEM ,  
Зачем инсайд, когда терминалы работают на винде?
Мне в своё время удалось получить программу билетопечатающего терминала. Много интересного там, вот только ключи шифрования не смог вытащить.
Могу поделиться, но не знаю как связаться с вами.
0
darksimpson ,  
Не, спасибо. Я пас.
0
roman863 ,  
CKA3ATb_BCEM, напиши в лс мне. Помогу вытащить.
0
+1 –1
DmitrySpb79 ,  
Интересно, сколько провисит на сайте эта статья?
Вангую что завтра-послезавтра будет удалена «по требованию правоохранительных органов» :)))
+10
+12 –2
darksimpson ,  
Кстати, интересное наблюдение. Еще всего несколько лет назад, когда я вел вполне себе ЖЖ с подробностями, даже некоторым софтом, писал статьи в Хакер и рассказывал Компьютерре как «поломал Метро» и все дела (причем инфа там тоже была), ни у кого даже в мыслях ничего такого небыло, что статьи уберут, ЖЖ закроют, тираж изымут, а автора посадят…

А сейчас… Причем, не только здесь, а вообще, тенденция такая. Хотя, по сути, формально, ничего с того времени ни законодательно, ни как-либо еще особо не изменилось.

Понимаете, что происходит? Вот. И это страшненько. Система, которая порабощает и промывает — во всей красе.
+4
DmitrySpb79 ,   * (был изменён)
Ну тут просто — если пресс-служба метрополитена обратится в правоохранительные органы с заявлением что публикация на сайте наносит им ущерб, то тем и идти далеко не надо — судя по справочнику, ООО «Хабр» зарегистрировано в Москве.

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

Что касается тенденции… Когда-то давно интернет был уютным местом, где общались технари и инженеры, все друг другу доверяли, и вообще, было классно. Мне например совершенно незнакомый человек с fido7.photo.ru продал в свое время цифровую камеру в рассрочку на 3 месяца, без каких-либо расписок, просто под честное слово — возможно ли такое сейчас? Сейчас увы, доступ в интернет есть у всех, и не только у честных людей. Так что какое-то регулирование таки нужно, и я не могу сказать что это так уж плохо.
+3
+6 –3
darksimpson ,  
Дело не в регулировании. Дело в какой-то тотальной промывке мозга и искажении наших представлений и мнений. Вот так втихую. Я не против регулирования как такового, но меня настораживает вот это вот 1984. Неуютно при понимании происходящего. Хотя, может я и утрирую.
0
Disasm ,  
> Во-первых, незачем плодить халяву, должен быть некий порог входа для тех кто реально интересуется технологиями, а не просто халявщик, во-вторых, это все-таки неэтично по отношению к метрополитену да и городу в целом, ведь средства от продажи билетов таки идут на развитие и модернизацию транспорта.
А по-моему всё правильно автор сделал. Руководство метрополитена поставлено в известность? Поставлено. Если они не хотят улучшать безопасность, надо переходить к более жёстким мерам. Вон благодаря Karsten Nohl с аналогичными методами в его стране мобильная связь стала немного безопаснее.
Без приложения в данном случае это просто крутая техническая статья, с приложением — шанс на улучшение безопасности.
+6
DmitrySpb79 ,  
Тут на самом деле, тема куда сложнее чем кажется на первый взгляд.

Во-первых, с вероятностью 99% ничего не изменится. И дело не в том, что разрабы в метро тупые, а в том что поменять все проездные в 10 миллионном городе — та еще задача. Вот как вы себе это представляете — обновить всем проездные, включая работающих, пенсионеров, прочих социальщиков и пр. Далее, как я понял из статьи, в автобусах данные не синхронизируются — предлагаете все автобусы проапгрейдить? Да никто не будет всем этим заморачиваться, проще закрыть глаза на то, что пара тысяч студентов будет нахаляву кататься.

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

В третьих, и наверно самое главное. Любое ужесточение безопасности — в первую очередь создает неудобства честным гражданам. Дали допустим, возможность пополнить проездной с мобилы — тут же нашелся «умник» который хакнул. Ну закроют эту фичу, придется вам стоять в очереди в кассу чтобы проездной пополнить, кто от этого выиграет? Сами же автора «добрыми словами» вспоминать будете. В идеале для честного человека — лучшая защита это та, которой нет, о которой не надо заморачиваться. Закроют допустим возможность делать социальные проездные на несколько лет с захардкоженными ключами, придется бабушкам каждый месяц ходить и проездной обновлять, чтобы ключи в проездном синхронизировались, будете из-за этих бабушек дольше в очереди стоять.

Как-то так.
+3
darksimpson ,  
Нет. Чтобы «умник не хакнул» нужно просто делать нормально, вы уж меня извините. Используется карта Plus, но не используются все ее возможности (и я даже не хочу вступать в спор почему). Существует асимметричная криптография, которую можно запускать с очень хорошим результатом по времени даже на мелких современных ARM-МК… Я недавно участвовал в разработке одной городской транспортной системы (не в России), делал железо с нуля (защищенный ридер, грубо говоря) и имею представление, как все можно организовать безопасно и без потери удобства.
То, что происходит у нас — куча Legacy (от которого тяжело избавиться, потому, что изначально все через жопу было сделано), наплевательское отношение «на авось и так сойдет» и отличные продажи этого всего за классные конкурентные цены. Ну вот так, увы.
+1
GamePad64 ,  

Проездные, кстати, обновляются через автоматы в метро. Два года назад при пополнении "тройки" высветилась надпись "Программное обеспечение карты обновлено" или что-то вроде того.

0
bromium ,  
Конечно, это один из вариантов — переключить карту в режим sl3 при следующем пополнении, где уже используется aes. Вероятно, в турникетах метро стоят настолько устаревшие ридеры, что они не поддерживают оаботу с sam-модулями. С другой стороны, при большом желании и эту проблему решить можно
0
darksimpson ,  
Скажем так, вы попали в цель :) Ну если поднапрягутся и сделают — честь им и хвала будет, чё.
–17
roman863 ,  
DmitrySpb79, попросите автора удалить статью, зачем это все открыто выкладывать. Кто интересуется, тому известно это все итак.
0
tyderh ,  
Андрей, спасибо, прочитал с удовольствием.
0
mmMike ,  
Статья конечно интересная и с подробностями.

Но в принципе, сам факт работы с простой Mifare Classic напрямую чрез A/B ключи в Android приложении через NFC говорит о том, что эти ключи легко можно вытащить. Просто никому особо не надо было это.
А NXP зря притянули. Их представители всегда на встречах активно не рекомендуют использовать режим Mifare Classic. Он конечно есть в целях совместимости на новых картах NXP, но…

Догадываюсь, какой был диалог «бизнес» — «IT» (разработка+сопровождение):
  • Бизнес: Нам нужно что бы с бесконтактной картой можно было работать в
  • IT: Ну давайте DES Fire использовать… но тогда инфраструктуру менять придется… Или Java карту с прокси апплетом и поддержкой Mifare Classic… Но дорогая она нынче.
  • Бизнес: Мы тут посчитали… дороговато. Даешь работу в телефоне с обычной дешевой Mifare Classic
  • IT: Так сломают же..
  • Бизнес: А не волнует. Зато дешевле. И авось не сломают. Да и пусть ломают. потери не большие. Делайте!
  • IT: Есть!


возможно резон есть. Ну сколько этих гиков и хакеров… Украдут копейки.
0
bromium ,  
Извините, а почему Вы в ответе it предлагаете все равно использовать mifare classic? Вы разве не понимаете, что это не решает проблемы из-за взлома самого криптопротокола в classic?
0
mmMike ,  
Не совсем понял вопроса (по приведенному мной диалогу).
Как раз базовые уязвимости Mifare Classic все известны.
И из соображений безопасности и перспективы «Mifare Classic» не выбор.
Но вложения в уже существующую инфраструктуру уж больно велики. Ни кто не хочет разово менять инфраструктуру.
Да и модули ридеров Mifare Classic стоят сущие копейки.

И еще одна причина… Было бы из чего выбирать то.

И уж простят меня представители NXP, но лично я не считаю что у NXP новых карт есть будущее.

Рискну предположить, что переход будет выполнятся на открытый «ISO14443 B» с T=CL (карту которую могут делать не только NXP).
Я бы предположил что это будет Java карта.
Calipso, Mifare (PLUS то же) и прочие… да на них просто не сделать ту логику, которую зачастую хочет заказчик! С разницы не будет. Карта памяти и все. Все логика во внешнем приложении… Что не очень безопасно.

И хоть NXP, как мне кажется, сильно демпенгует с чипсетами и модулями ридеров (под свои карты), но как то страшновато попадать в кабалу к одному производителю.

Все это мои личные предположения и домыслы, хоть и основанные на… (в общем есть основания)
+1
bromium ,  
Вы писали " Или Java карту с прокси апплетом и поддержкой Mifare Classic…"
Если в качестве бесконтактного криптопротокола обмена данными между картой и ридером будет crypto-1 от Mifare Classic — то это ничего не меняет, считай, защиты никакой нет.

Далее: при чем здесь ISO14443 B? Он такой же открытый, как и тип А, зачем переходить на другой тип? смысла никакого абсолютно. Собственно, обозначение ISO это подразумевает (международный стандарт).

Более того, сейчас есть чипы, которые не только от Nxp и это не Mifare (да, и Вы, вероятно, оговорились — NXP карты не делает, а производит чипы).

Calypso, кстати, это T=CL. Но тоже проприетарная вещь, так что хрень редьки не слаще.

Вообще, значение T=CL переоценено. Какую такую логику нельзя сделать? В Mifare Classic — это посекторное хранение данных, а в T=CL файловая структура. Принципиально — одно и то же. Да, с файлами, возможно, работать чуть проще. НО итам шлейф тянуть дополнительных команд надо.

Да и зачем скрывать логику, исходить из принципов security through obscurity? Она может быть да и, считаю, вообще должна быть открытой — чтобы все понимали, как это работает, чтобы все было прозрачно (вон, спецификации EMV ведь открыты — но это не значет, что чиповую карту взломать легко — используются для атак как раз недостакти в реализации спецификаций).

Обеспечивать надо информационную безопасность — чтобы нельзя было получить ключи, данные и дискредитировать их.

Вот для этого уже давно существуют аппаратные решения — хоть от NXP, хоть от других производителей.

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

Вообще, это вопрос правильного проектирования — систему надо разрабатывать таким образом, чтобы не зависеть от конкретного вендора. И это возможно. Например, я разрабатывал систему, которая не зависит от производителя. Да, приходится учитывать функциональность конкретного типа чипа, но задача как раз и в том, чтобы это предусмотреть при разработке. Создать некий уровень абстракции, который потом уже проецируется на конкретные носители.
0
mmMike ,  
Вы писали " Или Java карту с прокси апплетом и поддержкой Mifare Classic…"
Если в качестве бесконтактного криптопротокола обмена данными между картой и ридером будет crypto-1 от Mifare Classic — то это ничего не меняет, считай, защиты никакой нет.

Это не придуманный фентезийный вариант.
Когда задача поставлена сохранить инфраструктуру приема Mifare Classic (ну только с этой картой большинство уже установленных железок на транспорте работают) и есть необходимость в незащищеных устройствах менять A|B ключи (время жизни) и модифицировать данные, то это один из вариантов — прокси апплет карты поддерживает криптосессию с сервером и меняет данные в Mifare области.
Не от хорошей жизни конечно.

считай, защиты никакой нет

Между «защиты нет никакой» можно перехватив радиотрафик и брутфорсить 6 байтовый ключ конкретной карты и
«защиты нет никакой» можно вытащить этот ключ из android приложения
лежит большая технологическая пропасть.

Более того, сейчас есть чипы, которые не только от Nxp и это не Mifare

Дуальные java карты например.

Все остальное (попытки Sagem-Orga), производители Calipso, локальные пропориетарные проекты… мелочь на фоне дуальных Java карт и NXP.
Мало того что мелочь, так еще и с неопределенным будущем.

(да, и Вы, вероятно, оговорились — NXP карты не делает, а производит чипы).

Мы же говорим не о том, кто пластик собирает. Под производителем карт, лично я понимаю скорее создателя маски кристалла(ПО и технологии). Gemalto и Oberthur вот, как правило, свои wafer не делает (да и сборку карт не всегда). Но все же их называют производителем карт, когда они СВОИ карты выпускают на чипе Infenion.
А Mifare PLUS — это только NXP.
Да и вообще в NXP просто жутко раздражаются когда при них упоминаешь китайских «независимых» производителей. Увы… уплыла технология на сторону.

Далее: при чем здесь ISO14443 B? Он такой же открытый, как и тип А, зачем переходить на другой тип? смысла никакого абсолютно. Собственно, обозначение ISO это подразумевает (международный стандарт).

«A» это фактически зафиксированный NXP протокол (тогда еще Philips). То, что он фиксирован в стандарте не отменяет некоторых юр. обязательств на тех, кто его захочет использовать. «B» таких проблем не имеет.
То что, например Gemplus (ой… GemAlto) выпускает свои Mifare карты и даже выходила на рынок со своими MifareClassic ридером и любит дуальные Java карты с «A» — это не означает, что они это делает потому что стандарт открытый…

Calypso, кстати, это T=CL. Но тоже проприетарная вещь, так что хрень редьки не слаще.

Калипсо в общем то открытый стандарт (был по крайней мере 4 года назад, когда мне нужно было по нему оценку сделать).
В смысле: доступный для ознакомления. Но вот «внести» в него изменения со стороны не возможно. И вообще это скорее стандарт не на карту (не столько на карту), а на платежную систему в целом. Плохо ложится на требования Российских заказчиков… Впрочем это отдельная длинная тема.

Вообще, значение T=CL переоценено. Какую такую логику нельзя сделать? В Mifare Classic — это посекторное хранение данных, а в T=CL файловая структура. Принципиально — одно и то же. Да, с файлами, возможно, работать чуть проще. НО итам шлейф тянуть дополнительных команд надо.

T=CL — это транспорт. Не более. Никакого отношения к файловой системе не имеющий.
Лично моем мнение, что вся логика принятия решения должна быть в приложении карты (как в EMV).

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

Боюсь создатели EMV и банковских карт с Вами не согласятся (я то же). Вот как раз проще иметь единое платежное приложение в устройстве. Если бы Вы только знали… какой геморой обновить инфраструктуру устройств. А всего то в городе N у администрации возник новый тип льготников, которым всего то нужно выдать 500 карт чуть с другой логикой…

Java карты дороже, чем Mifare PLUS, например, но не принципиально дороже.
А в принципе, все делается на одном потоке… разные маски и одинаковое количество чипов на одном вафере. Так что разница в цене всех карт — чистый маркетинг производителя.

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

По факту, в мире смарт карт, «проецируется на конкретные носители» — это только Java карты. Других альтернатив нет (Maltos скорее мертв чем жив)
0
bromium ,  
Когда задача поставлена сохранить инфраструктуру приема Mifare Classic (ну только с этой картой большинство уже установленных железок на транспорте работают) и есть необходимость в незащищеных устройствах менять A|B ключи (время жизни) и модифицировать данные, то это один из вариантов — прокси апплет карты поддерживает криптосессию с сервером и меняет данные в Mifare области.
Не от хорошей жизни конечно.


Именно про это сомнительное решение я и говорю. Вы сами не слышите, что говорите: предлагает использовать более дорогой носитель но все с тем де Mifare Classic, чтобы безопасно загрузить ключи Mifare, которые легко вскрываются и так (я бы даже не назвал это брутфорсом — на вскрытие уходит 5 мин.)

Между «защиты нет никакой» можно перехватив радиотрафик и брутфорсить 6 байтовый ключ конкретной карты и
«защиты нет никакой» можно вытащить этот ключ из android приложения
лежит большая технологическая пропасть.


Так вот проблема на самом деле в том, что ключи шли в приложение в открытом виде. Не тройку взломали (ее взломали давно, вернее, чип на ее основе — тут автор Америки не открыл), а приложение хреново написано. Есть множество способов, как защитить обмен данными между сервером и приложением. И тогда не надо ваши дуалки с апплетом, злоумышленнику тогда будет проще «сниффернуть» траффик и выдернуть ключи (если ему очень надо). А вот с приложением от БМ ничего не надо было — ключи в открытом виде.

Дуальные java карты например.

Ну, и каков там проктол бесконтактного интерфейса? T=CL? А криптопротокол и команды обмена данными с картой самому придумывать предлагаете? Тоже вариант так в США в некоторых городах сделано (но не на дуалках) — правда, сомнительное в плане соместимости и экономики решение.

Боюсь создатели EMV и банковских карт с Вами не согласятся (я то же). Вот как раз проще иметь единое платежное приложение в устройстве. Если бы Вы только знали… какой геморой обновить инфраструктуру устройств. А всего то в городе N у администрации возник новый тип льготников, которым всего то нужно выдать 500 карт чуть с другой логикой…


Вообще-то, от конфигурации терминала, правил банка-эквайрера тоже многое зависит.

А вот насчет вашего геморроя — про это я и говорю: в арихтектуре системы не предусмотрели нормальную возможность обновления терминальных устройств. А эту головную боль предлагаете на льготников переложить — «всего-то 500 карт» — пусть бабушка протопает еще раз в собес, отстоит там очередь и ей обменяют карту (за деньги или «бесплатно» — то есть за ошибки проектировщика заплатит кто-то третий)

Мне знакомо такое «решение» проблем среди некоторых разработчиков. Отсюда и эти всякие очереди за бумажками, бюрократический футбол — проще не внутри реить проблемы, а переложить на юзеров.

Вы взяли удобный юз-кейс, а что, если таких карт не 500, а 5 000 000?

Java карты дороже, чем Mifare PLUS, например, но не принципиально дороже.

Так удобно рассуждать только до тех пор, пока самому не приходится за все это платить.

По факту, в мире смарт карт, «проецируется на конкретные носители» — это только Java карты. Других альтернатив нет (Maltos скорее мертв чем жив)


Мы говорим про трнаспортные бесконтактные карты, где не требуется впихивать «невпихуемое», как вы предлагаете, перенся логику работы на карту — вот это релаьно тупиковая ветвь развития. Вся ИТ-отрасль это доказывает (см. бум на «облака» — не просто так это стало популярным).

Вообще, любая техническая задача должна быть увязана с основными бизнес-целями. Я Ваш подход абсолютно не приемлю: перекладывать с больной головы на здоровую, спокойно рассуждать о «непринципиальной» разнице в цене… Это пример неуважения к пользователям и к тем, кто платит за разработку («зачем заморачиваться — пусть заказчик за все платит, зачем нам думать, как сделать удобнее и дешевле»)
0
mmMike ,  
Именно про это сомнительное решение я и говорю. Вы сами не слышите, что говорите: предлагает использовать более дорогой носитель но все с тем де Mifare Classic, чтобы безопасно загрузить ключи Mifare, которые легко вскрываются и так (я бы даже не назвал это брутфорсом — на вскрытие уходит 5 мин.)

Это требование от бизнеса. Использовать Mifare Classic.
Насчет «легко вскрываются». Нужно иметь перехватчик протокола в канале карта ридер. нужно обладать специальными знаниями. Я например, знаю как это делается в подробностях.
В общем, далеко не каждый школьник/студент сможет собрать аппаратную часть, даже если он знает что и как (а в открытом доступе этой информации нет и надеюсь не будет). Не тривиально это.

Есть множество способов, как защитить обмен данными между сервером и приложением.

Принципиально не возможно защитится от компроментации данных, если клиентское приложение фактически «на руках у пользователя» и выполняется в незащищенной среде. При использовании прокси апплета, криптосессия устанавливается между апплетом и сервером и уже в этом канале (3des GP secure channel) передаются критичные данные которые в принципе не появляются в отрытом виде снаружи.

Все ваши остальные рассуждения говорят о том, что в области «транспортные карты и платежи» Вы никогда не работали и конкретных подводных камней не знаете. Как и откуда появляется новый функционал (особенно ужасные льготные карты и их алгоритмы) на практике не видели. С заказчиками на эти конкретные темы не общались.

Честно говоря… я все сказал по своему практическому опыту.

Рассуждать про облака… бизнес цели… неуважение к пользователям… тупиковые ветви развития… это не ко мне.
Не люблю пустой треп «за жизнь».
0
+1 –1
bromium ,  
Насчет «легко вскрываются». Нужно иметь перехватчик протокола в канале карта ридер. нужно обладать специальными знаниями. Я например, знаю как это делается в подробностях.
В общем, далеко не каждый школьник/студент сможет собрать аппаратную часть, даже если он знает что и как (а в открытом доступе этой информации нет и надеюсь не будет). Не тривиально это.


Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.

Все ваши остальные рассуждения говорят о том, что в области «транспортные карты и платежи» Вы никогда не работали и конкретных подводных камней не знаете. Как и откуда появляется новый функционал (особенно ужасные льготные карты и их алгоритмы) на практике не видели. С заказчиками на эти конкретные темы не общались.


Когда не хватает аргументов, переходят на личности — это известный факт. По существу парировать было нечего, обозвав это разговорами за жизнь. Забавны отсылки к моему опыту. У меня-то сложилось мнение, что все как раз наоборот. Плюс кое-кто застрял в прошлом веке, нарисовал удобную ему картину мира и не хочет развиваться.
0
mmMike ,  
Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.

Ссылку pls. С удовольствие покажу при встрече инженерам подразделения Mifare из NXP.

Когда не хватает аргументов, переходят на личности — это известный факт. По существу парировать было нечего, обозвав это разговорами за жизнь. Забавны отсылки к моему опыту.

Причем здесь личности.Вы действительно работали в проектах по транспортным картам?
Где вы увидели переход на личности? Так работали или нет?

Я теоретически должен быть рад проблемам Тройки. Но вот особо осуждать их не могу.
Потому что представляю как им (разработке) выкручивали руки требуя приложение в смартфоне.
И это суровая правда жизни. Не всегда можно выбрать идеальное с точки зрения архитектуры и «красивости» решение в рамках поставленных ограничений.
0
darksimpson ,  
Давайте не будем кривить душой. Тройка — Mifare Plus. Она уже, как слон, «есть быть куплена». И бизнесу в этой плоскости доказывать ничего не надо. В SL3/SL2 никакой проблемы проксировать обмен с картой в приложении для смартфона нет, сделав систему очень устойчивой (я намеренно избегаю «абсолютно безопасной», так как разные косяки могут быть всегда). И бизнесу тоже это доказывать не надо — это работа небольшой пряморукой команде разработчиков на примерно столько же часов, может чуть поболее. То есть, для бизнеса это все стоит ничуть не сильно дороже в итоге.
Следовательно, вывода всего два: а) криворукие разработчики, которые не умеют и не хотят; б) более глубинные проблемы (обратной совместимости).
Я думаю, в данном случае и то, и то. Как минимум потому, что можно было начать с SL2 где можно пользоваться AES, а где _пока еще_ нельзя, из-за проблем с обратной совместимостью, пользоваться crypto1 по старому. Подготовить почву и нормально постепенно обновлять старье, через некоторое время полностью выведя его из строя и перещелкнув все в SL3 полностью, вообще незаметно для юзера.
+1
mmMike ,  
Вы совершенно правы.
Меня то же «несколько» удивило, что используя Mifare Plus даже в режиме SL1, они не стали пользоваться предоставленной опциональной возможностью AES аутентификации (которая есть и в SL1). Но акцентировать на этом не стал (ну все же информация по Mifare PLUS конфиденциальна).
Но раз вы публично пальцем ткнули…

Не буду больше защищать несколько корявые решения «Тройки». Тем более что они мне не партнеры, а даже наоборот.
+1
darksimpson ,  
Да, верно, я сейчас немного освежил память. Даже не SL2-SL3, а SL1-SL3. Но не суть, смысл остается.

P.S. Я пока еще не нарушил подписанное NDA ;)
0
bromium ,   * (был изменён)
Ссылку pls. С удовольствие покажу при встрече инженерам подразделения Mifare из NXP.


NXP давно в курсе. Вообще, специалистам, энтузиастам, давно это все известно. Недавно новая уязвимость была обнаружена: card-only attack на Mifare Plus (вообще снифферы больше не нужны).

Причем здесь личности.Вы действительно работали в проектах по транспортным картам?
Где вы увидели переход на личности? Так работали или нет?


Примерно, в половине всех проектов по транспортным картам, что есть в стране. Предлагаете теперь начать меряться… опытом?

Потому что представляю как им (разработке) выкручивали руки требуя приложение в смартфоне


Да никто никому не выкручивал, банк очень хотел зарабатывать на комиссии, потмоу сделали в спешке тяп-ляп. Что, програмисты не в курсе MITM-attack в TLS? Тогда это уж совсем какие-то студенты-первокурсники. А уж использовать ключи в открытом виде (в base64) — вообще epic fail. Как всегда, понадеялись «на авось». Собственно, результат закономерен.
0
mmMike ,  
NXP давно в курсе. Вообще, специалистам, энтузиастам, давно это все известно. Недавно новая уязвимость была обнаружена: card-only attack на Mifare Plus (вообще снифферы больше не нужны).

Вы меня не поняли… О факте уязвимости известно. Ну и что?
Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.

Ссылку pls, где можно купить и где лежат утилиты доступные каждому школьнику.
Ладно, черт с ним с утилитами и железом, где подробности Mifare Cripto1 в свободном доступе?

Не документация полученная по NDA, а именно в свободном доступе, доступная «каждому школьнику».
Да даже при наличии документации, уверяю, каждому школьнику это не сделать.
«Что нам стоит дом построить… нарисуем — будем жить».

К вопросу «отстали от жизни». Такие слова то подтверждать нужно…
0
darksimpson ,   * (был изменён)
Утилиты и подробности Crypto1 в свободном доступе, например:
https://github.com/nfc-tools/mfoc
https://github.com/nfc-tools/mfcuk
+ можно посмотреть репы проксмарка на предмет издохников утилит mfkey32 и mfkey64.

Купить без регистрации и СМС:
https://www.kickstarter.com/projects/1980078555/chameleonmini-a-versatile-nfc-card-emulator-and-mo
http://hydrabus.com/buy-online/
https://store.ryscc.com/products/elechouse-proxmark3
+ еще у китов на ебэе периодически бывает проксмарк недорого.

(не знаю, правда, можно ли публиковать ссылки)

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

Более того, вот новая уязвимость
http://www.cs.ru.nl/~rverdult/Ciphertext-only_Cryptanalysis_on_Hardened_Mifare_Classic_Cards-CCS_2015.pdf

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

Вообще, по идее, mmMike должен бы извиниться и признать, что не прав.

Ну а мне доказать свою правоту очень просто: раз mmMike из Новосибирска, то у меня, по счастливой случайности, есть новосибирская транспортная карта. На выбор готов сообщить ключи от любого сектора, находясь за тысячи км от Новосибирска (т. е. без сниффера).

Еще можете посмотреть видео из phdays: там как раз рассказ и про данную уязвимость, который была обнаружена, по всей видимости, раньше автора данной статьи, и про то, как взламывать Mifare http://www.phdays.ru/broadcast/ «Псевдобезопасность NFC сервисов»
0
mmMike ,   * (был изменён)
Про то что информацию и железки трудно найти — был не прав.
Извиняюсь.

К слову, то что classic не уязвима — я как и не писал…
Давно не искал и не смотрел такие вещи как инструментарий для анализа в продаже.

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

for bromium
+1
darksimpson ,  
Мне, честно говоря, как-то всё равно :)

Но вот по теме, в сухом остатке имеем то, что имеем.
0
darksimpson ,  
И вот еще по HardenedNest, для Plus:
https://github.com/aczid/crypto1_bs
0
mmMike ,  
Спасибо.

Да… действительно отстал… Похоже зря давно не интересовался.

Понятно, что в принципе ничего сложного сделать платку (сформировать 13Мгц сигнал и/или записать его на современном проце). Хотя казалось, что это все же уровень не школьника и не всякого студента (судя по публикациями на хабре).

Но не думал, что этим уже штатно торгуют!
А еще выкладывают в на github описание Cripto1, которое раньше даже под NDA из NXP вытащить было невозможно.

Действительно. Уровень входа минимальнейший.
0
bromium ,  
Ну, Crypto1 «лишь» реверснули. Не уверен, что самостоятельно можно реализовать криптообмен с картой (например, для аутентификации через SAM) без косяков.
0
darksimpson ,  
Без косяков нельзя. Сам Crypto1 − косяк. Если использовать все плюшки Plus, то никаких проблем.
0
Abramovich_AD ,  
Интересно.Данный метод сработает с МОБИЛЬНЫМ БИЛЕТОМ??? Который на сим-карте.Принцип работы вроде такой же, как и у тройки? Или здесь метод записи через софтину не сработает и запорет сим-карту или билет на ней!?
+2
Wandy ,  
Отлично! Как раз заказал импланты Mifare Classic 1K с перезаписываемым 0-сектором. Теперь мне нужен живой москвич для экспериментов.
0
stoplinux ,  
Спасибо большое! Отличная статья.
Скажите, правильно ли я понял, что сейчас метрополитену достаточно исправить отправку ключа B при запросе баланса:

Примечательно, что здесь так же присутствуют ключи B, которые используются для записи данных на карту, хотя для запроса баланса достаточно было бы ключей А, разрешающих только чтение секторов памяти.


и трюк повторить не удастся?
0
darksimpson ,   * (был изменён)
Нет. Метрополитену уже ничего не исправить. По крайней мере малой кровью.
0
stoplinux ,   * (был изменён)
Однако атака была бы не возможна, если бы ключ B не отправлялся сервером?
Не похоже ли это на оставленный backdoor?
0
darksimpson ,  
Была бы возможна, даже если бы и не отправлялся.
0
Disasm ,  
Каким образом? На тройке же mfoc не даёт результатов, так что по A ключам, в теории, B ключи не получить (кроме как полным перебором, конечно).
0
bromium ,  
Ни mfoc ни mfcuk на mifare plus не действует, но сниффинг обмена данными между картой и ридером все равно позволит вытянуть ключ
0
oleg_chornyi ,  
Так через приложение можно же и пополнять карту. Т.е. в ответ на какой-нибудь другой запрос этот ключ все равно приходил бы.
0
Alex781 ,  
В метро, я думаю, проблем нет — улучшат стоплист — будут быстрей блокировать, а вот в автобусах проблематичней че-то сделать.
0
and7ey ,  
Странно, что они заявляют в новостях, что все уже исправили. Или они предложение обновили, что-то там исправили (перестали присылать ключ в открытом виде) и считают это исправлением?

PS. Интересно, а можно ли с карты считать количество оставшихся поездок, данные последней поездки из билета типа 60 поездок и т.п.?
0
ChALkeRx ,   * (был изменён)
Прокат велосипедов — Стоимость не уточнялась

Если речь идёт про Велобайк, то там «Тройка» + пин-код служат всего лишь альтернативным идентификатором пользователя. Деньги списываются напрямую с привязанной банковской карты, «Тройкой» оплатить нельзя.

+1
willson ,  
В первую очередь автор довольно затейливо описал про «повторное использование уязвимости». Что ты фактически можешь украсть так это одну-две, ну если очень быстро будешь перемещаться, то чуть больше поездок (в рамках одного дня), после чего карта превратится в тыкву. И, конечно: понятно, что нет никакого смысла с этим бороться, ведь если даже начнется массовая эпидемия таких халявщиков, то потом пойдет еще и массовая продажа новых карточек.
–13
+1 –14
roman863 ,  
А можно из статьи удалить скрин с ключами? Зачем они тут? Кому надо они достанут, а так открыто выкладывать не надо.
0
iDoka ,  
Для работы нужен смартфон на платформе Android с NFC модулем производства NXP.

Подскажите, пожалуйста, какие смартфоны (вердоры и модели из последних) поддерживают такую связку, либо, быть может, где ведется реестр таких NFC-смертфонов?
0
choo-joykin ,  
выше была ссылка на гитхаб со списком
+4
leshakk ,  
Ну вот и жёлтая пресса подтянулась :(
Уже в заголовке «правильно» расставили акценты:
«В Москве хакер взломал «Тройку» и две недели бесплатно катался в общественном транспорте»
http://www.msk.kp.ru/daily/26531/3551729/
0
Tiamon ,  
Тут уже и главный «желтый» подтянулся https://hi-tech.mail.ru/news/hacker-troika/?frommail=2 правда без ссылки на статью
+3
ProstoTyoma ,   * (был изменён)
«Метрополитен и ВТБ устранили возможность взлома карты „Тройка“»
http://www.interfax.ru/russia/510444
0
alchemist666 ,  
Как я понял, они пофиксили, только возможность дампить старым способом, ключи для чтения/записи/перезаписи в служебные сектора, ну ещё и сертификаты обновили, т.е. если снова найти способ дампа сертификатов, то всё продолжает, так же работать. НО пока что на общественном транспорте, эта фича должна работать, пока не обновят терминалы.
Или я всё же не прав, и они уже ни как ни чего не пофиксят(малой кровью)? Тогда если этот способ работает, не проще ли каждые полгода к примеру, менять эти мастер ключи…
0
roman863 ,  
Прикрыли уже, можете идти покупать билет в кассе))
0
Mixim333 ,  
Спасибо, познавательно. У самого в бумажнике лежат транспортные карты двух городов=> вещь распространенная, поэтому меня очень заботит вопрос: «А зачем каждый город делает свою карту?» — сделали бы «Транспортную карту Одна страна», которая работала бы в любом городе, применили бы в ней достойные алгоритмы шифрования и всем было бы удобно…

Еще пару месяцев назад на одной из своих карт заподозрил «утечку денег» (куда-то ушли 30-60 рублей), но разбираться не стал, больше такого не повторялось (насколько помню, приложил бумажник с картой к терминалу в автобусе, хотя раньше всегда карту доставал). Ammonia, может быть просветите: возможно ли такое и если да, то по каким причинам происходит?
0
+1 –1
bougakov ,  
потому что транспортные системы разных городов — это, сюрприз, разные юр. лица. Вот положили вы на такую карту 100 руб. — как двум метрополитенам решить, чьи они?

Вариант «подержать на депозите» не предлагайте — весь смысл проездного в том, что деньги вы вносите авансом и предприятие на них рассчитывает при планировании расчётов с поставщиками.
–1
bromium ,  
Проблема даже еще более сложная: в разных городах разная стоимость проезда, а проездные — это не только примитивный электронный кошелек, а и более сложные виды проездных.

Например, в одном городе есть билет на 40 поездок стоимостью 800 руб. и сроком действия 30 дней.

А в другом — на 30 поездок стоимостью 900 руб. и сроком днйствия 45 дней.

По какому принципу перечислять между разными системами деньги? Из какого расчета, если я купил проездной в одном городе, а поездку совершил в другом?

Тупо разделить стомость проездного на количество поездок? Тогда тот город, где стоимость ниже, получить больше, а вот в обратном случае — меньше? Да и нельзя так делать — ведь это по сути предоплаченный тариф — за некую стоимость получаешь фиксированный набор услуг. Некорректно будет их сравнивать, приводя к некой условной единице
0
PhpRu ,  
Недавно Ликсутов говорил, что Тройку и Подорожник сделают обратно совместимыми. Т.е. в Питере будет работать Тройка, а в Москве — Подорожник, не вся страна, конечно, но хотя бы начало положено.
0
bromium ,  
Очередная чиновничья профанация. Как объединение тройки со стрелкой. Просто на одну карту в ее память записывают 2 билета разных систем, единственное преимущество: не надо таскать две карты, зато обоазуется два кошелька, остатки по которым хранятся… Постойте, а где же они хранятся? Да, в разных компаниях.

Вместо того, чтобы это был один общий кошелек, желательно привязанный счет, чтобы не размещать остатки в неких структурах, которые, «возможно», на этом зарабатывают
0
PhpRu ,  
Появилась карта тройка+стрелка. Тоже были разные карты. объединяют потихоньку. Очень хочется верить, что когда-нибудь для простых смертных сделают всё по умую lenta.ru/news/2016/06/02/karta/
0
dottedmag ,  
Транспортные карты – это анахронизм, никто новые их делать не будет. Будут делать оплату телефоном или, в крайнем случае, свайпом платёжной карты.
+1
krvrd ,  
Игорь, отличный текст, спасибо)

Посмотрите, тут есть комментарий производителя чипов и ментов. До разработчика, похоже, не достучались.

moslenta.ru/article/2016/05/27/trojka
0
Shrike ,  
Пишут:
UPD: Через несколько часов после выпуска статьи пресс-служба Московского метрополитена сообщила, что устранила уязвимость в системе. Для этого разработчики даже связались с программистом, который нашел баг.

врут?
0
Akr0n ,  
Скорее всего, просто пофиксили отсылку ключа B в приложении.
0
vetal5872 ,  
Хакер нашел уязвимость в карте «Тройка» для бесплатного проезда:

www.gazeta.ru/tech/news/2016/05/27/n_8688887.shtml
+1
Kondra007 ,  
Задам наивный вопрос: а можно как-то на сервере проверять подпись apk-файла, с которого идут запросы? Чтобы не отвечать таким вот «пересобранным» приложениям.
0
dottedmag ,  
Нет.
0
kolipass ,  

Можно получить сигнатуры и слать их на сервер, но взломщик может подделать получение сигнатуры. Но можно проверять сигнатуры apk из .so файликов, но кто это будет делать....

0
ArtRoman ,   * (был изменён)
Можно, например, посылать хэш подписи приложения, но это – security through obscurity, и сделать модификацию на отправку корректной строки, опять же, будет не так сложно.
Делать проверку из .so-файла не так сложно, но и so-бинарники тоже декомпилируются и правятся.
0
alex_uzao ,  
Спасибо за статью — очень интересно и познавательно! Всегда интересовался как устроена информационная система в метро, когда-то давно даже сам писал программку на дельфи, позволявшую по кодам станций на картонном проездном выводить маршрут пользователя карты.

Автор, мои поздравления, про Вас уже на мейл.ру написали news.mail.ru/incident/25920697. Боже, какой же бред они несут!
0
bromium ,  
Кстранные автор в конце выводы делает. Разве шифрование данных на карте спасет от «машины времени»? Конечно, нет, ведь доступ к данным открыт, можно даже не заморачиваться тем, что и как на карте записано: тупо восстанавливать предыдущий дамп.

На самом деле, перевод на уровень sl3 не так и сложен — нужно подать на карту несколько команд. А уж aes взломать с помощью андроида… Не так просто (если кодеры из банка москвы снова ключи в открытом виде передавать не будут)))
0
vladbarcelo ,  
Тут пару дней назад на канале #hackers некто MuNk интересовался мифарками, не вы ли часом были?
0
PhilipF ,  
На LG G4 не поставилось. Пишет, что не нужно никаких разрешений, и не реагирует на кнопку «Установить».
Хотя разрешено ставить программы из любых источников.
0
EpoxuH ,  
В статье указано, что при аутентификации передаётся номер телефона. Может ли это стать одним из способов поимки юзера TroikaDumper и доказательством его виновности/причастности (в чём и к чему опустим)?
+1
Ammonia ,  
Номер телефона передается в приложении Мой проездной, в TroikaDumper ничего в интернет не передается вообще.
+2
dcc0 ,   * (был изменён)
И, наверное, кого-то могут уволить за реализацию этой системы.
И к жетонам уже не вернуться — есть 3D принтеры.
Остаётся один вариант — абонентская плата (принудительная) для каждого москвича.
Т.е. коммунизм начнётся с московского метро.
Я всегда знал это. =)

P.S.
Удивительно, кто-то обнулил мою карму. К чему бы это?!
–10
roman863 ,  
А может автора в бан за распространение запрещенной проги ?) Возможно она номера кредиток ворует, так что не советую скачивать ее. Предлагаю вообще ее из статьи удалить.
+2
dlinyj ,  
У меня такое чувство, что вы заинтересованное лицо…
–7
roman863 ,  
dlinyj, автор просто идиот, выкладывать это все в паблик.
+2
dlinyj ,  
Скажите это всем пользователям, кто им восхищается ;). См. комментарии выше.
–3
roman863 ,  
Он всех подставил, эта информация была известна, выкладывать ее в сеть глупо просто.
–4
roman863 ,  
Если прикроют эту халяву, то думаю эти пользователи сами будут не в восторге от него))
0
dlinyj ,  
Я честный человек, и пусть прикрывают дырку, а вот узнать как же это работает интересно.
–3
roman863 ,  
Это давно известно и не являлось секретом.
+1
dlinyj ,  
Логичный вопрос, если это известно, то почему я об этом не знаю?
–2
roman863 ,  
Не хотели видимо сами изучить вопрос, посмотреть их прогу, погуглить в конце концов.
+2
elite7 ,  
если это не являлось секретом, то как это можно выложить в паблик?
Это же не являлось секретом, и значит давно доступно в паблике.
Просто есть разные адаптации материала.

Что плохого в том, что пара сотен школьников попробуют, а 10 из них станет хорошими специалистами и создадут в будущем надежную систему, чем замок, открывающийся булавкой?
–1
roman863 ,  
Тут не нужна надежная система, так как с ней не будет халявы.
+4
Iv38 ,  
Не ну вы таки поглядите каков персонаж! Он предлагает забанить автора статьи потому, что теперь, вероятно, не сможет эксплуатировать уязвимость в личных целях. Для своего незаконного, так сказать, обогащения. Охренеть. У меня альтернативное предложение по поводу бана имеется.
0
roman863 ,  
Обогащаться как раз сейчас начнут все массово кто даже не понимает как это работает.
+1
dcc0 ,  
А я ЩиТаЮ автор — молодец. Вскрыв техническую проблему, он вскрыл и ряд социально-экономических проблем.
Беглый взгляд на техническую часть финансово-расчётной системы недвусмысленно даёт понять о постоянных обновлениях всего и вся в этой области. Т.е. система, которая рассчитана на обслуживание человека и экономики в постоянном апгрейде. Вот сейчас хотят и системы в банках менять — отказаться от пластиковых карт.
И тут вопрос — сколько мы (человечество) прожили с этими картами? Сколько на все это было потрачено средств?
По меркам мировой истории карты существуют не так давно и уже менять. Я понимаю, что надо загрузить программистов и инженеров, так как без таких заказов они просто пропадут, но примерно лет 20-30 мы жили с картами, и 15 лет из этих 30 мы эти карты внедряли. А теперь что?
И все эти рассуждения приводят нас к глубоким философским вопросам бытия…
0
DjOnline ,  
Приложение «мой проездной» не обновляет криптоподпись?
+1
ValdikSS ,  
Технически обновляет, но она генерируется на стороне сервера, а приложение записывает только то, что сервер прислал.
0
PhilipF ,  
Заткнули дырку в программе «Мой проездной».
Программа вчера обновилась, а сегодня сообщили, что старые версии больше не будут работать с 21:30 сегодня.
0
and7ey ,  
Какую дырку закрыли? Что теперь приложение делает по-другому известно?
–1
+1 –2
kom09 ,  
И все закончилось тем, что программисты ВТБ/Банка Москвы сломали приложение.
На Windows Phone/Mobile полностью — при попытке прочитать Тройку выдает «Не удалось прочитать данные карты».
На Android частично — Тройку и стрелку читает, но в процессе покупки билета ЦППК вылезает ошибка «Произошла ошибка, свяжитесь со службой поддержки ВТБ Банк Москвы».

Вот все работало, и тут приходит шибко умный чудак на букву «м», ставит всех на уши и куча пользователей лишаются удобного сервиса. Надеюсь у правоохранительных органов для автора все-таки найдется статья. Хотя бы условный срок ему не повредит.
+1
SunX ,  
Не Автор же поднял шумиху и не он сломал приложение. Да и, если быть честным, он был далеко не первым кто подобное провернул (в комментариях есть примеры подобных работ). Он просто бесплатно провел анализ безопасности для них и так как они решили от него отмахнуться, то рассказал о результатах обществу, всё.
Впрочем автор может ничего и не нарушал, а просто декомпилировал приложение (что, как я помню, в России вполне законно, если делается для исследовательских целей) и на основе этого сделал предположение, что можно было бы бесплатно ездить на общественном транспорте (с некоторыми ограничениями).
–2
roman863 ,  
Поддерживаю про на букву М и остальное)) На вин фон перестало работать.
0
vah13 ,  
Респект автору