Карта Тройка представляет из себя универсальный пополняемый электронный кошелек, широко используемый в системах оплаты общественного транспорта Москвы с 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 на компьютер.
Декомпиляция приложения
APK-файл приложения Android является архивом, внутри которого находятся файлы ресурсов, конфигурации, графика и другие мультимедиа данные, а также файл classes.dex, который является скомпилированным кодом приложения.
С помощью утилиты ibotpeaches.github.io/Apktool/ APK-файл может быть распакован. Вместе с этим файл classes.dex будет разложен на множество файлов формата *.smali.
Smali — это формат исходных текстов для Dalvik, виртуальной машины Android. Это низкоуровневый язык, язык ассемблера Dalvik. Файлы будут иметь порядковые имена вроде a.smali, b.smali, и т.д., внутри них объявления классов, методов, и инструкции виртуальной машины. Структура папок будет развернута в соответствии с названием пакетов классов.
Таким образом было получено развернутое по составляющим и готовое для анализа и модификации приложение. Однако анализировать smali-код довольно сложно. Во-первых, код содержит большое количество вспомогательных инструкций и не удобен для чтения человеком. Во-вторых, не существует доступных инструментов для работы с кодом (подсветка синтаксиса, рефакторинг, навигация по классам и методам).
Намного удобнее было бы использовать для анализа высокоуровневый исходный код на языке Java, далее будет рассмотрен процесс его получения из того же APK-файла.
Конвертация Dalvik Executable (dex) в Java Archive (jar)
Для анализа кода приложения необходимо сконвертировать .dex файлы, полученные из APK архива, в .jar файлы, которые далее могут быть декомпилированы в исходные тексты на языке Java. Это можно сделать с помощью программы dex2jar github.com/pxb1988/dex2jar. Как очевидно из названия, она конвертирует .dex файлы в формат .jar. Поскольку конвертируется только код, без ресурсов, конфигурационных и медиафайлов, .jar-файл на выходе обычно будет меньше по размеру, чем исходный APK.
Декомпиляция jar в исходные тексты Java
Полученные jar файлы теперь можно декомпилировать в исходные тексты языка Java.
Для этого можно использовать любой из доступных Java декомпиляторов, например JD-GUI
Анализ исходного кода
Полученные с помощью Java Decompiler исходные тексты могут быть загружены в любую IDE (Integrated Development Environment) для более удобного изучения. Например, Android Studio.
Декомпилятор не всегда идеально обрабатывает проект — иногда он не справляется и оставляет части smali-кода. Но это не критично, так как главной задачей на данном этапе является анализ кода. Основной целью поиска в исходных текстах программы были ключи для доступа к секторам карты Тройка, описание формата хранения данных в областях памяти карты, содержащих баланс электронного кошелька и механизм пополнения баланса карты.
Беглый анализ исходных текстов позволил найти основные классы и методы работы приложения: регистрацию, работу с кредитной картой, запрос баланса и прочее. Однако ключей для доступа к карте Тройка в исходных текстах обнаружено не было. Было решено не тратить время на подробное изучение исходных текстов, а вместо этого исследовать данные, которыми обменивается приложение с сервером во время работы.
классы в коде приложения «Мой проездной»
Отключение проверки TLS-сертификата
Во время работы приложение «Мой проездной» устанавливает соединение с сервером bmmobile.bm.ru. Для защиты от прослушивания и модификации данных все передаваемые данные между приложением и сервером зашифрованы с помощью протокола TLS. Для проверки подлинности ключа сервера используются TLS сертификаты.
В приложение «Мой проездной» встроена проверка отпечатка сертификата для предотвращения подмены сертификата и прослушивания передаваемых данных на сетевом уровне. Так называемый Certificate Pinning.
функция проверки отпечатка TLS сертификата
В данной проверке явно задан SHA1 отпечаток сертификата, поэтому в случае подмены сертификата проверка не будет пройдена и соединение с сервером установлено не будет. Даже в случае выпуска сертификата от другого сертификационного центра.
цепочка сертификатов и отпечаток сертификата bmmobile.bm.ru
Для перехвата данных необходимо было подменить сертификат, используемый для установления зашифрованного соединения. Наиболее простым решением этой задачи оказалось отключение проверки TLS сертификата. Вернее, модификация условия проверяющего отпечаток таким образом, чтобы любой сертификат проходил проверку успешно.
Функция проверки отпечатка циклично проверяет отпечаток каждого сертификата в цепочке сертификатов, и в случае, если найдено совпадение, проверка завершается успешно. Таким образом, в цепочке всегда присутствуют сертификаты, отпечатки которых не совпадают с заданным в коде.
цикл проверки отпечатка TLS сертификатов
Для обхода данной проверки достаточно модифицировать условный оператор сравнения отпечатка в smali-файле, заменив if-eqz на if-neq, что означает обратное условие «не равно».
В результате проверка проходит успешно для любого сертификата, как поддельного, так и оригинального, достаточно чтобы в цепочке сертификатов присутствовал хотя бы один сертификат с отличным от заданного отпечатком.
Примечательно, что это единственная модификация кода, которая потребовалась для отключения защиты от подделки сертификата.
изменение условного оператора в цикле проверки отпечатка сертификата
Сборка модифицированного приложения
Чтобы применить внесенные в исходный код изменения, необходимо скомпилировать APK.
С помощью утилиты apktool можно собрать распакованный APK архив обратно.
сборка APK из исходных текстов
Подписание APK
APK-файлы имеют подпись, которая позволяет убедиться, что файл был корректно загружен и выпущен конкретным разработчиком. Без подписи APK-файл установить не получится, но можно использовать самоподписанный сертификат (в этом случае нужно включить опцию “установка из недоверенных источников” в настройках телефона). В результате подписи будет получен APK-файл, готовый для установки на смартфон.
создание сертификата для подписи
подписание APK-файла
Перехват трафика приложения
Перехват защищенного трафика выполняется методом проксирования 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. Приложение позволяет найти все сектора, к которым подходят перехваченные ключи, так называемый перебор по словарю.
данные в памяти карты в шестнадцатеричном формате
Формат данных в секторе электронного кошелька
Чтобы понять структуру хранения данных в памяти карты, была использована чистая карта, купленная в кассе, по которой не было выполнено ни одной поездки. Далее карта была пополнена 10 раз на 1 рубль через автомат. После каждого пополнения состояние памяти сохранялось. В конце все сохраненные данные были сравнены и установлено, что изменения происходят только в двух блоках 8 сектора.
дампы памяти восьмого сектора после пополнений на 1 рубль
Видно, что данные изменяются в первом блоке (нумерация от нуля) с 9 по 15 байт. Очевидно, что в данном месте содержится баланс электронного кошелька. Путем подбора возможных форматов хранения данных было выяснено, что значение баланса электронного кошелька хранится в области памяти от младших 4 бит 8 байта до старших 3 бит 10 байта и рассчитывается по формуле
Где 137B8 значение в памяти карты в шестнадцатеричном формате, а 399 сумма в рублях.
Таким образом можно рассчитать значения из предыдущей таблицы.
расчет баланса в секторе электронного кошелька
Номер турникета, дата и время прохода
Аналогичная методика была применена для изучения формата остальных данных в секторе. Было выполнено несколько проходов через турникеты метро и сохранено состояние памяти после каждого прохода. Проходы были выполнены с интервалом времени в 1 минуту попеременно на двух различных турникетах.
Путем подбора значений было установлено, что нулевой и первый байт в первом секторе хранит идентификатор последнего турникета, через который осуществлялся проход. Далее второй и третий байты содержат дату последнего прохода в виде количества дней от 1.1.1992.
Соответственно, 0x2260 = 8800, где 8800 число дней от 1.1.1992, что с учетом високосных лет приходится на дату 5 февраля 2016 и соответствует действительной дате прохода.
Время прохода записано в четвертом байте и старших четырех битах пятого байта, и кратно 30 секундам, начиная с 00:00 часов. Следовательно, расчет времени можно выполнить в два действия:
для расчета часов
и для расчета минут
Таким образом получим время 15:30, что соответствует действительному времени прохода.
На основе полученных сведений можно расшифровать данные представленные в предыдущей таблице
Каждая карта Тройка имеет уникальный серийный номер, отличный от UID. Этот номер нанесен на самой карте и используется для удаленного пополнения карты. Он хранится в нулевом блоке восьмого сектора с третьего байта по младшие четыре бита седьмого байта.
Несмотря на то, что все данные хранятся в открытом виде, на их расшифровку было потрачено больше всего времени. При этом некоторые данные остались нерасшифрованными.
Предположительно, последние пять байт в первом блоке восьмого сектора содержат криптографическую подпись (т.н. имитовставка, MAC), которая генерируется с использованием приватного ключа в памяти турникета. Данная подпись, вероятно, служит для верификации подлинности данных, записанных в секторе электронного кошелька. Однако попыток взлома алгоритма имитовставки не производилось.
Запись данных на карту Тройка
Права доступа к секторам карт типа Mifare определяются битами доступа в третьем блоке каждого сектора. Биты доступа, установленные в восьмом секторе, разрешают чтение сектора ключом А и запись ключом B. Полученные из приложения «Мой проездной» ключи, позволяют выполнить запись любых данные в сектор электронного кошелька.
Атака повторного воспроизведения
В результате экспериментов было установлено, что сектор памяти, хранящий информацию о балансе электронного кошелька, содержит криптографическую подпись для подтверждения подлинности данных, так называемую имитовставку. Данный механизм служит для защиты данных от подделки. Подпись обновляется каждый раз в момент изменения баланса электронного кошелька. Это может быть операция списания при проходе через турникет, либо операция пополнения кошелька через терминал или приложение «Мой проездной».
Все устройства, работающие с балансом электронного кошелька (турникеты, терминал), проверяют достоверность подписи, и, в случае несоответствия подписи, возвращают ошибку “карта неисправна”.
Установлено, что подпись формируется на основе уникального идентификационного номера карты (UID), поэтому клонирование сектора памяти электронного кошелька из одной карты на другую с отличным UID, всегда дает недействительную подпись.
Несмотря на то, что области памяти электронного кошелька защищены с помощью имитовставки, система оказалась уязвима для атаки повторного воспроизведения.
Было сохранено состояние памяти сектора электронного кошелька до прохода через турникет, после чего выполнен проход и операция списания 31 рубля с баланса карты. После чего состояние памяти карты было возвращено к исходному состоянию. В результате, на карте была восстановлена сумма баланса до прохода через турникет. Данную операцию удалось повторить несколько раз. Из этого следует вывод, что система не защищена от подобного вида атак.
шаги атаки повторного воспроизведения
Для установления возможности реальной эксплуатации уязвимости было выполнено продолжительное тестирование атаки повторного воспроизведения на инфраструктуре общественного транспорта Москвы.
Первым был протестирован наземный транспорт: троллейбусы, автобусы, трамваи. Электронный кошелек был пополнен единожды на сумму 50 рублей и все проходы через турникеты были выполнены с помощью атаки повторного воспроизведения.
В течение пяти дней было совершено 57 поездок в наземном транспорте на общую сумму 1767 рублей. После чего карта была возвращена в кассу метрополитена и был получен возврат залоговой суммы в 50 рублей.
Для тестирования систем метрополитена была куплена новая карта и пополнена на 50 рублей. Все проходы через турникеты были выполнены с помощью атаки повторного воспроизведения. Было выполнено 12 поездок в течение 2 дней на общую сумму 384 рубля. На третий день карта была заблокирована на всех турникетах метро и наземного транспорта. После полного восстановления состояния памяти карты до состояния на момент приобретения, карта продолжила работать в наземном транспорте, но блокировалась при проходе в метро.
Из этого следует, что турникеты в метро имеют защиту от данного вида атак, однако срабатывает она с задержкой в несколько дней.
Обход блокировки карты
Экспериментально были найдены способы избегать блокировки карты при использовании атаки повторного воспроизведения. Основные факторы срабатывания блокировки:
- Время последней поездки, записанное в секторе памяти электронного кошелька, не должно повторяться при поездках в метро. То есть перед проходом в метро необходимо выполнить списание на турникете наземного транспорта, таким образом получив актуальную дату последнего прохода после восстановления дампа.
- Турникеты в наземном транспорте оперативно не синхронизируются с централизованной базой данных, поэтому операции, произведенные с использованием атаки повторного воспроизведения, обнаруживаются очень долго. Поэтому турникеты наземного транспорта могут быть использованы для обновления времени последней поездки перед использованием карты в метро
- Иногда необходимо выполнять минимальное пополнение карты, например на сумму 1 рубль
В результате удалось обойти механизм обнаружения мошеннических операций и выполнить более десяти поездок в метро в течение недели.
Приложение TroikaDumper
В рамках данного исследования, для удобства эксплуатации атаки повторного воспроизведения было создано приложение TroikaDumper. Оно позволяет локально (без подключения к интернету) просматривать записанные в памяти карты данные, такие как: баланс электронного кошелька, время последнего прохода через турникет, идентификатор последнего турникета, имитовставку, серийный номер карты Тройка, идентификационный номер карты (UID).
Приложение позволяет сохранять состояние памяти и записывать его на карту.
Приложение доступно в исходных текстах github.com/gshevtsov/TroikaDumper и в скомпилированном виде TroikaDumper.apk. Для работы нужен смартфон на платформе Android с NFC модулем производства NXP.
_
_
интерфейс приложения TroikaDumper
Заключение
Общее время, затраченное на работу, составило две недели. Большинство из поставленных целей исследования были достигнуты. Несмотря на применяемые системы защиты, такие как ключи доступа к карте и криптографическая подпись в секторе электронного кошелька, подделка баланса оказалась возможна.
Относительно легко был осуществлен реверс-инжиниринг приложения «Мой проездной», что позволило обойтись без взлома физических систем транспортной инфраструктуры.
Больше всего времени заняло изучение структуры данных в памяти карты. Это оказалось возможным из-за того, что данные хранятся в незашифрованном виде. В случае, если бы данные в памяти карты были зашифрованы, вероятнее всего, потребовалось бы физическое проникновение в системы работающие с картой, что делает атаку существенно сложнее.
Итогом исследования стало написание приложения TroikaDumper, позволяющее легко эксплуатировать уязвимости в системе карты Тройка, имея смартфон с поддержкой функции NFC. Приложение просто в использовании и может быть использовано массово.
Для исправления найденных уязвимостей необходимо усовершенствование формата хранения данных в памяти карты и обновление программного обеспечения всех систем, работающих с картой.
Комментарии (338)
Urvin
26.05.2016 13:47+23Валидаторы в метро
…
Предположительно, работают на базе x86 компьютера и операционной системы Windows.
WinXPPavelMSTU
26.05.2016 14:51+1Чиновники!..
PavelMSTU
26.05.2016 15:14Хабраюзеры, а можно минуснуть и ответить, а не просто минутность?
Вот зачем ставить Win на такое оборудование?VBKesha
26.05.2016 15:48+18Потому что это просто. Программистов полно которые под вынь напишут. И зачем тогда с чем то ещё заморачиваться.
zhovner
26.05.2016 16:04+2Легче сертифицировать все это дело чем городить с нуля.
VBKesha
26.05.2016 16:12+1Даже там где дело не касается сертификации могут так сделать просто потому что быстрей(видел такое несколько раз) а на проект дали мало времени(потому что было 5 посредников и на передачу от одного к другому ушло 80% заложенного времени) поэтому делайте на винде.
western333
26.05.2016 21:15Потому что, себестоимость аппарата (или как его там валидатора) в автобусе 10 тыс рублей, а по бумагам он проходит 270 тыс рублей, потому как на win xp ничего программировать не надо оно все есть в инете нахаляву и остается только подкрутить, но при этом снять за это большие бабки типа разработали сами.
IRainman
30.05.2016 19:14+1Себестоимость прототипа этого аппарата, собранного из говна и палок на коленке 10 тыс. рублей, вы хотели сказать ;)
То что установлено это промышленное вандалоустойчивое оборудование (то что в подвижных единицах ещё и для транспорта), прошедшее испытания и сертификацию (по всем словам ранее), кроме того в сумму входит не только устройство но ещё его установка и куча сопутствующей работы рядом, вроде прокладки коммуникаций, косметическая работа после и пр…
Asen
27.05.2016 15:32-1У многих нынче этот вопрос в голове. И причем он касается далеко не только систем обслуживания. Понятно, что надежная ИС — это фундамент надежности всей системы в дальнейшем, но всемжепофиг
Часто ответ даже еще проще: никто даже не думает о том, что есть что-то другое(не WinXP)…
istem
29.05.2016 08:11Поправьте, если ошибаюсь. Криптоустройства должны иметь лицензию для использования в коммерческих целях. Да и сами устройства и программное обеспечение должны соответствовать требованиям всяких разных ФЗ и ФСБ. Винда обладает и тем и другим и третьим. Насчёт других операционных систем сказать не могу.
IRainman
30.05.2016 19:24+2Там не просто Win, а, в данном случае, Windows XP Embedded POSReady, т. е. специальная редакция, которая как раз и предназначена для такого оборудования.
Ставят потому что хорошая поддержка со стороны железа (драйвера), адекватная поддержка со стороны самих MS, а также кучи организаций, которые эти решения внедряют и поддерживают, ну и конечно же море уже написанного и хорошо работающего ПО. В общем, если коротко: развитая экосистема вокруг ОС.Ammonia
31.05.2016 01:48+2Согласен, не вижу никакой проблемы в использовании Windows на таких устройствах.
x893
26.05.2016 13:52+1А не пробовали в такую карту делать копии?
github.com/emsec/ChameleonMinidarksimpson
26.05.2016 21:33+1Хамелеон в текущей итерации очень плохо работает, увы. Ждем новую итерацию.
Loxmatiymamont
26.05.2016 14:09+12А вы с разработчиками связвались, по поводу
>>исправления найденных уязвимостей необходимо усовершенствование формата хранения данных в памяти карты и обновление программного обеспечения всех систем, работающих с картой.Ammonia
26.05.2016 14:44+69Да. Никого это не заинтересовало.
Loxmatiymamont
26.05.2016 14:49+16Круто. Тогда с нетерпением жду разбор питерского подорожника.
darksimpson
26.05.2016 21:34+1А вот там разработчиков это очень интересует, вплоть до разборок по поводу и без.
monah_tuk
27.05.2016 12:42Вот проводишь такие исследования, а ведь рапортовать потом страшно: а вдруг вместо "спасибо", повестка в суд придёт? Ведь, по факту, на некоторую сумму нагрели же.
saboteur_kiev
26.05.2016 15:20+36О том, что вы пытались связаться с разработчиками и их ответ, что им это неинтересно — стоило бы добавить в статью, можно даже в самое начало, чтобы руководство этих разработчиков сразу бы это видело.
complynx
26.05.2016 17:31+9Поддерживаю.
Чтобы у читателя не складывалось впечатление, что автор просто сделал утилиту для незаконного прохода, ибо у меня сложилось именно такое представление.
Я бы хотел видеть, что была не только проведена работа, но сперва уведомлены подверженные атаке члены, и только после их отказа от устранения неисправностей, желательно с отчётом о том, что они сказали, открытые примеры эксплойтов.zetta
26.05.2016 21:15+1ви так говорите, как будто это что-то плохое…
darksimpson
26.05.2016 21:17+1Нет, не так. Вот так: «Вы так говорите, как будто это что-то изменит или чему-то поможет...»
saboteur_kiev
27.05.2016 00:37+4Это не обязательно плохое. Но я очень огорчусь, если автора статьи пострадает от известно кого. И вдобавок таких статей на Хабре больше не появится из-за подобных случаев.
maxp
27.05.2016 05:34+8Судя по количеству плюсов у подобных постов у хабрааудитории наивность довольно велика.
Ребята, поймите простую вещь — разработчикам не заказывали _абслютно защищенную систему_.
Для них достаточно просто обеспечить невозможность массовой коммерческой эксплуатации уязвимостей. Понимаете разницу?
С транспортной карты хомячить можно только маленькими суммами, по финансовым логам они прослеживаются на раз и карта блокируется. Особо ретивые хакеры при этом могут показательно попасть под статью, как только махинации с картами станут для кого-то проблемой.
А пока умные мальчики поковырявшись неделю бесплатно ходят в зоопарк или планетарий это никого не волнует.Ohar
27.05.2016 15:39+3обеспечить невозможность массовой коммерческой эксплуатации уязвимостей. Понимаете разницу?
приложение TroikaDumper… позволяет сохранять состояние памяти и записывать его на карту
Нет, не понимаем. А вы понимаете?maxp
28.05.2016 06:33Хорошо, опишите тогда возможный сценарий зарабатывания заметных денег на этом.
Ключевые моменты:
— деньги нельзя получить из системы, их можно только сэкономить,
— онлайновый дабл-спенд пресекается на раз-два, причем, с перспективой маскишоу и последствиями,
— офлайновый дабл-спенд ограничен временем (5 дней, если не ошибаюсь) и он все-равно виден в логах по результатам дня
— пользовательское телефонное приложение ломается всегда по определению, но сделать в очередном релизе привязку по номеру телефона не так уж сложно.Ohar
28.05.2016 12:37+2Заработать деньги на это нельзя, даже если бы никакой защиты вообще не стояло.
Можно было бы только сэкономить и ждать маски-шоу.
Но вот экономить может неограниченное число пассажиров.maxp
28.05.2016 13:39-2Это только в теории.
На практике фродовое приложение моментом выкинут из стора, как только это понадобится. На официальное приложение можно напустить обфускатор и оно перестанет ломаться одним if'ом. Ради чего потом кому-то надо будет тратить немало времени, чтобы сломать его? Только ради любви к искусству трудиться более одного раза обычно лень.
Это я все к тому, что разработчикам системы все эти вещи известны лучше, чем нам всем вместе взятым, а риски давно известны и оценены.ctacka
29.05.2016 01:51+1И риск получения ключей, конечно, оценен дешевле, чем обфусцирование кода клиентского приложения?
Хочется верить, конечно, что взяв за основу уязвимый протокол разработчики оценивали риски и выбрали его осознанноmaxp
29.05.2016 03:21Тут как бы вариантов особо нет — андроидное приложение разбирается всегда. Просто цель разработчиков сделать эти работы экономически невыгодными.
dobergroup
28.05.2016 13:17>> онлайновый дабл-спенд пресекается на раз-два, причем, с перспективой маскишоу и последствиями,
Почему?maxp
28.05.2016 13:48Что почему?
Почему управляющая система способна заносить карту в стоплист по определенному событию или условию?
Или почему энергичный телесюжет с нарезкой из камер наблюдения, полицейских машин и преступников в наручниках уменьшает убытки от фрода на порядок лучше многих сугубо технических решений?dobergroup
28.05.2016 14:44Может я туплю, но не сильно вижу возможность формализировать такие условия.
А спрашивал я да, про маски-шоу: Вы предпологаете борьбу скорее с конечными пользователями?maxp
29.05.2016 03:11Ну в смысле, если существуют воры, то с ними вполне можно бороться :)
Тем более, когда факт и умысел налицо.lamoss
31.05.2016 23:32Факт и умысел ещё доказать надо. Если стоять за турникетами и каждому за полцены поездки накидывать — тогда да. А если я дома себе возвращаю потраченные деньги — то какой факт может быть? Вот моя тройка, вот я ей пользуюсь. Пользуюсь ей как указано в правилах пользования. А что там считывается или нет — откуда мне знать?
Ghool
31.05.2016 23:09Вопрос в том, что уже есть неофициальный дампер, не требующий привязки к телефонному номеру.
И что бы он перестал действовать — надо менять структуру, в том числе все карты, которые на руках.
Некоторые продаются на год.
То есть как минимум, год это будет действовать.
SGwar
28.05.2016 12:02«Проблема абсолютно точно не в “железе”. Судя по описанию того, как происходил взлом, “дыра” находится в программном приложении, с помощью которого удалось получить доступ к информации, которой обменивается карта и система прохода, а также к памяти карты. Это не наша сфера ответственности, связь карты с турникетом работает, к нам вопросов нет», — подчеркнул Дианов.
news.mail.ru/society/25925519/?frommail=1darksimpson
28.05.2016 21:38+1Насчет «железа» (как комбинации собственно железа и его эмбеддед софта), вы видимо, не знаете всей печали и глубины. Описанная проблема, может быть и не в железе (и то явно, а не косвенно). Но существует и масса других проблем, гораздо более печальных.
silvansky
26.05.2016 14:12+16Во-первых, статья крутая, спасибо! =)
Во-вторых, Вы сообщили в руководство Метрополитена или ещё куда-нибудь о найденной уязвимости? Думаю, желательно не только сообщить, но и подтвердить готовность возместить убытки, нанесённые экспериментом в размере совершённых на халяву поездок.
darkAlert
26.05.2016 14:13-10зачем это делать? Он разве обязан? Ему за это платят?
silvansky
26.05.2016 14:23+14Как минимум чтобы себя обезопасить. Приложение, если наберёт какое-то количество пользователей, привлечёт к себе внимание правоохранительных органов и статья всегда найдётся. Если же получится сразу договориться с руководством метрополитена, то этого можно будет с большой вероятностью избежать. Так что тут дело не только в этике, но и в моём беспокойстве за судьбу автора. Всё же реально в статье описывается метод бесплатного проезда в московском транспорте. И убытки могут быть вполне реальными.
KindDragon
27.05.2016 18:15+1Я с вами в целом согласен, но боюсь если он даже предварительно сообщил об этом в руководство Метрополитена — ничем его не обезопасит. Так как он опубликовал до устранения уязвимости.
bluetooth
26.05.2016 14:33+3Уголовно наказуемое действие, разве нет?
Light_Metal
26.05.2016 19:33+2Причем полный букет статей из раздела «преступления в сфере компьютерной безопасности»…
Исследование достойное, заслуживает внимания.
Но приложение, выложенное в общий доступ, мне кажется, лишнее.
Bioman85
26.05.2016 19:33У вас уже покупка билетов стало уголовно наказуемым? Едва ли под это найдется статья, ну подошел человек к турникету, ну открыл, развернулся и пошел обратно.Какая из этого материальная выгода? Да и вообще, если посмотреть, автор не похож на человека, который потратил на это две недели просто для того, чтобы на метро бесплатно покататься.Статья хорошая, мне понравилось.
Viacheslav01
27.05.2016 13:44+1Реверс инжиниринг, внесение в приложение деструктивных изменений, предоставление неограниченному кругу лиц инструмента вносящего изменнения в работу программно аппаратного комплекса с целью мошейничества. Боюсь правоохранительные органы бдут не согласны трактовать это как покупку билетов.
darksimpson
27.05.2016 13:50Цель и мошенничество еще надо доказать, особенно когда автор выкладывает в свет свои эксперименты (то есть, фактически, обкладывается говном загодя, чтобы на сраной козе было подъехать труднее, что правильно). Но с другой стороны, у нас ведь как — был бы человек…
Bioman85
27.05.2016 14:28А все выше указанное надо доказать, как и доказать то, что было умышленное действие с целью обогащения, что в принципе практически невозможно, тем более автор указал, что все сведения были переданы разработчикам, которым влом что-то с этим делать, так в чем тогда вина автора? Опять же, никакой экономической выгоды для себя автор при всем этом не получил, никаких деструктивных изменений не было внесено, прочитайте статью автора еще раз, он не разбирал алгоритм ключа, вследствие чего он мог только делать откаты, а не фактические изменения.И да, сложно из этого сделать уголовное дело без большого ущерба, да и вообще, сами то верите, что все вот так прямо побегут пользоваться этим всем делом? Многие то в этом вообще ничего не понимают, да и едва ли будут разбираться в этом.
darksimpson
26.05.2016 21:36+1Если посмотреть с несколько более отрешенной точки зрения, то получится, что у нас уголовно наказуемое действие — по улице ходить, грубо говоря. Поэтому, обычно каждый сам ставит перед собой вопрос и дает на него ответ (то есть на что-то такое решается или нет в результате).
ivan2kh
26.05.2016 14:27+4значение баланса электронного кошелька хранится в области памяти от младших 4 бит 8 байта до старших 3 бит 10 байта и рассчитывается по формуле
137B8/C8=18F(16)=399(10)
C8(16) == 200(10)
Сомнительно, чтобы они хранили сумму в полу копейках. Вероятно младший бит служебный и используется для контроля четности или должен всегда равен 0.recontemplator
26.05.2016 22:39+1А я решил, что это такой юмор разработчиков: за поездку на «тройке» расплачиваться, «полушками» :-).
DrZlodberg
26.05.2016 14:33+11Аккуратнее так. Сейчас везде стоят камеры и любая подозрительная активность (а несоответствие данных при синхронизации, пусть даже и отложенной, вполне под неё подходит). Особенно если иметь наглость ездить через одни и те же станции а метро.
А по теме — спасибо, очень интересно. Тоже хотелось его поковырять, но покупать для этого новый смарт как-то не хочется.
elite7
26.05.2016 14:56Отличное исследование!
У меня на Android 4.2.2 TroikaDumper-0.1.apk 1 640 086 байт не захотел ставится.
«Синтаксическая ошибка» «Ошибка при синтаксическом анализе пакета»
Mifare Classic Tool на Тройку ругнулся, что такой тэг неизвестен.
Не рассмотрены анлим тарифы Тройки — когда покупаешь на 3 месяца или на год без ограничений по числу поездок.Miha_xXx
27.05.2016 03:35В приложении прописано Min SDK 19 (т.е. Android 4.4) из-за чего вы и получаете данную ошибку. Если оно не использует специфику 4.4+, то можно в наглую изменить min.SDK через тот же APKtool
Iktash
26.05.2016 14:57+38Я правильно понимаю, что автор нашел уязвимость, создал удобное средство её эксплуатации, доступное для массового использования, написал об этом на хабр — и все это под собственной именем и фамилией?
PavelMSTU
26.05.2016 15:16+12Ничего автору не сделают.
Иначе еще больше трэша будет…
Вангую, что пост войдет в топ, как когда-то «Как попасть на дачу президента в пять часов утра»
prospero78su
26.05.2016 15:23+10Автор нашёл уязвимость, создал не очень удобное, но всё же средство её эксплуатации, доступное для массового использования, написал об этом и на хабр — и всё это вряд ли под собственным именем и фамилией. Он не похож на идиота.
amarao
26.05.2016 14:59+3Исследование безопасности — молодцы. Тщательность анализа — супер.
Остаётся этический вопрос: при тестировании, фактически, происходила эксплуатация уязвимости с получением материальной выгоды.
Что надо было сделать? Приобрести жетонов/билетов на сумму, равную сумме умотреблённого в результате уязвимости. Жетоны можно было просто покидать обратно, билетики сохранить.Ammonia
26.05.2016 15:25+22Фактических проездов на транспорте не происходило. Для проверки достаточно было открыть турникет.
darksimpson
26.05.2016 21:21+3Скорее всего, если бы ты проходил в турникеты, а не просто бы их открывал, то карточка залочилась бы за пол дня (в метре). Они отслеживали «машину времени» достаточно активно. Если только опять что-то не переделали и не поломали в процессе.
impetus
26.05.2016 23:17+1тогда фотки этого человека с камер у них в изобилии.
Но поскольку проходов не было — предъявить ему нечего,
соотв правоохранители не привлекались.darksimpson
26.05.2016 23:22Насколько мне известно, у нас (в Мск) это практически не работает. Но инфа может быть устаревшая.
TimsTims
26.05.2016 15:40+8> Приобрести жетонов
Я вас удивлю :)darksimpson
26.05.2016 21:38+1Ну, может человек из Питера.
Light_Metal
27.05.2016 00:21+3Тройка в Питере?
И да, жетоны в метро есть, например, еще и в Екатеринбурге. Московские, кстати :)monah_tuk
27.05.2016 12:53Пару лет назад в Новосибирске ещё были. А в Питере больше нет? Давно там не был. В Москве ещё лет 8-10 назад их не стало. Был расстроен — думал собрать образцы жетонов городов, где в России метро есть :) Пока только Питер, Новосибирск.
ЗЫ а я думал, что у нас только 4 метрополитена: Екатеринбург, Москва, Питер, Новосибирск, оказывается ещё есть в Нижнем Новгороде, Казани и Самаре.
Light_Metal
27.05.2016 13:09Есть-есть, никуда не делись.
Кстати, в Новосибирске свои жетоны, или привозные, как в Екатеринбурге? :)monah_tuk
27.05.2016 13:41Мне показалось — какие-то более тонкие. Дома нужно найти, сфотографировать. Но чеканка своя, правда скромная, Питерский красивее :) По слухам, тоже от жетонов отказываться будут.
ITMatika
26.05.2016 15:12+16Статья отличная! Но я очень беспокоюсь за дальнейшую судьбу автора, держите нас в курсе :)
Kress
26.05.2016 15:24+3Превосходная статья!
Риторический вопрос: у нас в городе используются обычные транспортные карты с магнитной лентой. Всегда, глядя на тетенек в метро, пополняющих эти карты, думал: какая защита у этих карт от чего-то вроде скимминга или даже кражи пополняющего терминала?wolowizard
26.05.2016 17:19помнится, раньше копировали бумажные метробилеты с магнитной полосой с помощью устройств на базе головки от катушечного магнитофона
Black_Shadow
30.05.2016 12:27+5Первое время в Питере турникеты были с несколькими головками чтения-записи, чтобы карточку можно было вставлять как угодно. Карточка перезаписывалась каждый раз, и для копирования было достаточно вставить 2 карточки в 1 считыватель.
Fiofant
26.05.2016 15:25Может я не внимательно прочитал, но как вы получаете в своем приложении ключи от A и B секторов без интернета, а «Мой проездной» запрашивает их через API? Или эти ключи не уникальны для каждой карты?
Ammonia
26.05.2016 15:26+19Ключи однинаковые для всей системы. В приложении TroikaDumper они просто захардкожены.
menraen
26.05.2016 21:17+4Вот на этом месте реально отвисла челюсть! Я даже нецензурных слов не могу подобрать таких, чтобы полно и ёмко охарактеризовать этот факт!
darksimpson
26.05.2016 21:27В этом нет ничего криминально страшного, особенно с учетом использования имитовставки. «Машина времени» (как я уже написал выше в комментах) еще относительно недавно достаточно бодро отслеживалась в Метро, вроде бы вплоть до того, что на этой же станции трюк повторно не срабатывал. Но, опять же, могли что-то поменять или поломать.
Хотя в принципе, брать карту Plus и юзать ее в режиме совместимости — уродство, но на то у них есть некоторые печальные причины, от которых так просто не избавиться :)
mmMike
27.05.2016 12:34+2Увы. Старые дешевые Mifare Classic ридеры просто не предусматривают деривацию ключей.
Только мастер ключи и на ограниченное количество «слотов».
А совместимость с инфраструктурой гораздо дороже чем мелкие потери от хакеров.
С учетом того, что и еще есть «черный список» карт, загружаемый в устройства.
Потенциальные потери от мошенничества — ни о чем.
TimsTims
26.05.2016 15:45+2> Время последней поездки, записанное в секторе памяти электронного кошелька, не должно повторяться при поездках в метро
Ammonia подскажите, но ведь это значит, что можно через программу эмулировать-генерировать любое время последнего прохождения, и тогда можно не заморачиваться с синхронизацией через автобусы?Ammonia
26.05.2016 15:46+6Нет, имелось в виду, что для обновления времени прохода нужно использовать валидаторы в наземном транспорте.
Вы не сможете изменить никакие данные на карте самостоятельно, иначе будет недействительная криптоподпись.
Дополнил текст в статье.
topy
26.05.2016 16:04+3Вот теперь я знаю зачем NFC нужен в телефоне!
TimsTims
26.05.2016 16:11Ну, я знаю несколько программ банков и платежных систем, которые вполне успешно эмулируют пластиковые карты для беспроводной оплаты. Тоже вполне неплохо.
А так-же упоминаемая в статье программа «Мой проездной» вполне неплохо работает, что даже в кассы спускаться не надо для пополнения, всё через телефон… было… до этого времени))
ErhoSen
26.05.2016 16:05-1Пусть меня поправят знающие люди — правильно ли я понимаю, что такой трюк с приложением на ios не получился бы? То есть наверняка .ipa можно как-то декомпилировать, но поправить код, собрать обратно и запустить — вряд ли?
Не срача ради, правда интересно.
А статья чудесная. Надеюсь она приведёт к усовершенствованию системы(что в такой консервативной области весьма круто). Спасибо!Ammonia
26.05.2016 16:10+4но поправить код, собрать обратно и запустить — вряд ли
Имея девелоперский сертификат это не составит труда.VBKesha
26.05.2016 16:49Что то мне кажется что декомпилировать ObjectiveC ещё можно а вот чтобы скомпилировать можно, а вот чтобы скомпилировать назад придётся прилично повозится. Всё таки там бинарный код а не, код виртуальной машины как у Java, Lua и если ничего не поменялось то .Net.
Avitale
26.05.2016 17:42+1Насколько мне известно, NFC в iPhone работает только в связке с ApplePay, так что для того, чтобы сделать подобное приложение для айфонов, придется еще взламывать ограничение на NFC.
art_linux
26.05.2016 19:00+1NFC на iPhone аппаратно не позволяет читать другие карты из-за отсутствия активной антенны
bromium
30.05.2016 11:50Странное утверждение, не очень потяно, что имеется ввиду. Чтобы NFC вообще работал, требуется как раз антенна, без этого как по радиоканалу вы общаться с картой планируете?
Akr0n
26.05.2016 16:05Ну и как реально можно защитится от восстановления дампа? Это надо чтоб все устройства были онлайн через единую БД. С турникетами метро такое еще возможно, а вот с наземным транспортом — слишком сложно.
Ammonia
26.05.2016 16:09+2Например начать с диверсификации ключей, чтобы при взломе одной карты не происходило компроментации всей системы.
JediPhilosopher
26.05.2016 17:31Но это все равно не поможет. Ну сломаете вы не всю систему разом, а только пару карточек для себя.
Вообще тоже интересует тема с защитой, так как возможно в скором времени придется разрабатывать схожую систему — платежи с идентификацией аккаунта пользователя через NFC-карту, как раз рассматриваем Mifare Plus. Про идею с подменой сертификатов и MitM для кражи ключей приходящих с сервера я как-то не подумал. И теперь вот вообще не вижу способа сделать это секьюрно.
Неужели единственный способ — использование навороченных карточек типа Mifare DESFire, которые как и EMV IC карты содержат в себе уже настоящий процессор и могут вычислять всякие подписи и выполнять шифрование самостоятельно?BigW
27.05.2016 22:18Что меня прямо скажем смутило, это отсутствие валидации баланса карты… пополнение то всегда онлайн… почему потом нет сравнения расчетного остатка карты с текущим, странно все это…
amf3tam1n
27.05.2016 22:18Вполне возможно вам достаточно MFPlus S/X в режиме SL3 (шифрование AES)
И использование SAM-модулей от NXP в режиме X-interface (подключение SAM напрямую к IC NFC) для хранения ключей, диверсификации и прочей аппаратной криптографии. Тогда единственное место где можно перехватить данные с карты — это интерфейс между хостом и считывателем.
Если вы расчитываете на андроид устройства, то там тоже есть варианты секурных хранилищ (UICC (SIM), SDCard, Embedded Secure Element). Но остается проблема загрузки ключей по воздуху. Лучше не давать это делать обычным пользователям.
bromium
30.05.2016 11:54К сожалению, решения UICC и eSE плотно завязаны на ведоров, досутп к eSE и к сим провайдера не так просто получить (организационно, в первую очередь)
bromium
30.05.2016 11:52Как раз Mifare карты достаточно продвинуты, особенно новые поколения Mifare Plus, карта много чего умеет. Просто в Тройке они работают, для обратной совместимости, по устаревшему протоколу, который как раз и весь дырявый.
Под Ваши потребности, думаю, вполне можно подобрать недорогое решение из линейки Mifare.JediPhilosopher
30.05.2016 12:59Так в статье автор же и говорит, что он пользовался не уязвимостью в карте (помню на хабре была уже статья где ломали подобный проездной, тогда он был сделан именно на Classic, и там автор пользовался именно уязвимостью самой карты), а вытащил ключи для нее из приложения.
KamiSempai
26.05.2016 19:28+1Тогда при отсутствии сети будут проблемы, так как не получиться запросить подходящий ключ. И как уже писал JediPhilosopher это не сильно поможет.
darksimpson
26.05.2016 21:42+1Не поможет. Ключи за 5 секунд достаются из воздуха атакой «без карты». Если не лениться, а допилить Хамелеон тот же и немного автоматизировать, то можно сделать бе… в общем, можно все сделать :)
menraen
27.05.2016 19:17+1А можете пояснить, почему требуется аппаратное решение типа Хамелеона, почему нельзя полностью эмулировать карточку телефоном с NFC — включая UID? К примеру, раньше Google Wallet/Android Pay работал только на телефонах с чипом NXP с Secure Element, а потом что-то поменяли и стало работать на любом аппарате с NFC — т.е. сэмулирвать платежную карточку теперь можно исключительно софтом. А что мешает тогда тем-же софтом полностью сэмулировать Mifare Classic/Mifare Ultralight — включая UID и OTP-зоны?
darksimpson
28.05.2016 21:41Потому, что это нельзя сделать так легко и просто. И еще, практически ни одна /официальная/ реализация не даст подставить свой уид, такой, какой нужен. А на уид все завязано.
bromium
30.05.2016 11:56Mifare Classic и Ultralight сэмулировать не получится — это проприетарная штука, там дополнительный, не по стандрату, инфообмен идет между картой и ридером, так что только соовтетсвующий чип от Nxp и либа могут это обрабатывать.
Есть, конечно, варианты, но настолько геморройные и на практике сложно реализуемые. В общем, есть варианты проще.
darksimpson
26.05.2016 21:45+2А еще, текущим прецедентом люди сами создали себе проблем. Ведь теперь диверсифицируй-не диверсифицируй, а все равно получишь… кучу старых карт с Legacy ключами, от которых, кроме как с помпой, фанфарами и кучей говн из медных труб не избавишься. Всё, ёк.
Кстати, раскрою небольшой секрет: с ключами для генерации и проверки имитовставки в кошеле все обстоит так же (в отличие от обычных ультралайтов, где они достаточно часто ротейтятся, правда с оговорками тоже).Gryphon88
27.05.2016 00:51На счёт «не избашись» не согласен. Мне карту-проездной на пригородные электрички меняли с 2008 2 раза бесплатно, при очередном ежемесячном пополнении в кассе, под предлогом «у нас теперь карты новго образца».
chersanya
27.05.2016 01:02На тройку можно очень редко деньги класть — если кто например проездом в Москве пару раз в год бывает, то 1000 р на несколько лет может хватит. Хотя конечно всегда можно решить это — пусть бы турникет писал что требуется замена.
Gryphon88
27.05.2016 01:18Я немного другое имел в виду: кто-то пополнил Тройку на 1000р, это событие было записано на Большой Черный Транспортный Сервер, а потом успешно прикладывал её к турникету 100 раз. Данные синхронизировались, когда соответствующие автобусы/троллейбусы приехали спать в парки, вместе со временем использования карты. Тут и смотрим записи с камеры над турникетом, соответствующие времени прикладывания
vladon
28.05.2016 00:23Ну и что на камерах увидят? Человека, который прошёл по кривой карте. В этом нет состава преступления. Может он её на улице нашёл или у кого-то возле метро купил? Или в кассе кривую дали, он же не обязан разбираться.
Gryphon88
28.05.2016 20:11Да, тут ничего доказательно не предъявишь, не телефон же он прикладывал. Максимум — нарушение правил пользования и обязать заменить карту за свои без возмещения залога в 50р.
bromium
30.05.2016 11:58Так сейчас и оплату телефоном в метро сделали — тоже не предъявить теперь за это.
impetus
30.05.2016 18:50между «опознать» человка и «предъявить» — дистанция большая… Просто посмотреть хотя бы — это один человек ходит или бородачи с дредами по 100 чел с одной карты заходят… Опять же — то ли просто человек, или знакомая рожица чья… В общем я бы просто из любопытсва посмотрел бы. будь у меня доступ.
darksimpson
27.05.2016 01:55«Требуется замена» — это уже сам по себе неприятный момент во многих смыслах. А так, это и паспорт можно всех поголовно согнать менять.
Dmitry_4
26.05.2016 16:24+1Но отслеживать автобусы в.реальном времени почему-то получилось.
Akr0n
26.05.2016 16:26Там трафик односторонний фактически и очень небольшой. А вот если на посадке турникет будет тормозить при проходе каждого пассажира, ничем хорошим это не кончится. Тогда как сбой в работе GPS-трекера не критичен.
Dmitry_4
26.05.2016 16:31+1Вайфай опять же скоро обещают.
Akr0n
26.05.2016 16:34Все же, это не критичный для транспортной инфраструктуры дополнительный сервис, на этот канал нельзя будет завязать такие вещи.
darksimpson
26.05.2016 22:02Существует масса методов для правильной организации этого функционала с использованием нестабильных каналов передачи данных. Элементарно копить транзакции и пачечками их туда-сюда гонять. Это работает (правда, только когда это нормально делают, и в этом основная проблема).
bromium
30.05.2016 11:59Да, но тогда мы возвращаемся в исходную точку — инфа должна быть на карте, например, с тем же балансом. Что толку, что мы накопили транзакции, когда нет связи, а потом синхронизировались и увидели, что эта карта либо в блэк-листе, либо баланс зашел в минус.
darksimpson
30.05.2016 12:58В любом случае инфа будет на карте. и при правильной организации я не вижу в этом ничего плохого.
stifff
27.05.2016 00:01+1в рилтайме будет не очень, но ведь блеклисты на конечных можно и подтягивать-то
elite7
27.05.2016 07:48Чтобы защитится, надо чтобы турникеты были онлайн большую часть времени.
То есть в случае проблем с каналами связи всё должно работать (и следовательно была возможность двойной траты)
Но если все турникеты онлайн, то возможности двойной траты быть не должно.
Dmitry_4
26.05.2016 16:07+1Кстати, зачем пользоваться тройкой, когда поезд в метро дешевле по картам на 60 поездок?
TimsTims
26.05.2016 16:13Например когда ты закидываешь 300 рублей, чтобы просто было и катаешься в метро всего несколько раз в месяц.
> в метро дешевле по картам на 60 поездок
Опять-же зависит от количества поездок — если ты спускаешься в метро каждый день по 3 раза в день, то уже выгоднее брать безлимитный со сроком действия.Dmitry_4
26.05.2016 16:25В том и дело, что по трешке ездит куча народу, кто использует две поездки в день.
TimsTims
26.05.2016 16:30Как считали? И как выделили тех, Кто постоянно покупает по 1й поездке от тех, кто лишь проездом в городе?
admhome
26.05.2016 16:55+1Я использую 2 поездки на метро в день. Если отбросить весь наземный общественный транспорт, то дешевле 60 поездок, но у меня есть и карта для поездок (как раз 60) и карта просто с деньгами. Всё это потому что утром от дома до пересадки я еду в автобусе почти всегда, затем электричка, затем метро — получается ещё открытый билет по тарифу 90 минут, затем трамвай до работы за ноль рублей. Обратно же пешком до метро, используется карта метро на фиксированное количество поездок, далее электричка (там своя карта, да) и потом пешком до дома. Такая вот попытка оптимизации расходов.
Iv38
26.05.2016 19:15+3Тройка офигенно удобная штука. Во-первых, как уже сказали, помимо кидания на Тройку денег, на нее можно записать и любой из абонементов. А если у тебя вдруг кончились поездки, а ты вовремя не позаботился о покупке нового абонемента, можешь войти в метро потратив 32 рубля с баланса карты. На Тройку также можно записывать билеты на электрички и абонементы на них, что позволяет (если ездишь на электричках) вместо двух карточек носить одну. Ну и автоматам пополнения тройки можно скармливать мелочь. И от мелочи избавляешься, и имеешь тот самый резерв на карте.
Тратить на проезд деньги с баланса карты выгодно, если пользуешься метро очень редко.Dmitry_4
26.05.2016 20:05-3На элекрички не работает тройка, там стрелька или карта ыржэдэ
rttm
26.05.2016 21:14+1Работает. Сам лично проверял. Пихаешь карту в так называемый «билетопечатающий автомат», который билетики выдает, оплачиваешь. Только была проблема в том, что чек надо сохранять.
В общем вот
syberpunkq
26.05.2016 21:14+1
DimkaI
27.05.2016 11:06Каждый день езжу на электричке туда и обратно. Записываю на тройку сразу в автомате и прохожу через турникеты. Контролёры ни разу не предъявили претензий.
Fedcomp
27.05.2016 12:17Работает как тройка так и стрелка без каких либо проблем. Одноразовые билеты и абонементы.
ivanovlev
28.05.2016 13:51При этом при наличии на тройке допустим 300р и у тебя в руках еще 400 на кассе отказываются оформить на ней 60 поездок за 670р. Вот такое вот гов… ущербная система
Iv38
30.05.2016 12:18Да, невозможность оформления абонементов с баланса карты и желательно онлайн мне тоже не нравится.
Compuser
26.05.2016 16:40+1Вот нашел список смартфонов с NFC модулем производства NXP и не только)
en.wikipedia.org/wiki/List_of_NFC-enabled_mobile_devices
fallen8rwtf
26.05.2016 16:41«Использовался дешевый смартфон на платформе Android» — Какую модель использовали, чтобы потом не эксперементировать с поиском нужной железки?)
Ammonia
26.05.2016 16:41+1Можете отталкиваться от списка совместимых телефонов в этом приложении https://github.com/ikarus23/MifareClassicTool
QtRoS
26.05.2016 17:56Браво, вдохновляет на подобные исследования!
А я так и ношу в кошельке билеты с аттракциона, хотел поисследовать способ формирования идентификаторов там, никак руки не доходят.
engune
26.05.2016 17:58Интересно было почитать статью и ход мыслей, видно полезное применение новшеств в виде NFC.
CrazyViper
26.05.2016 18:00Автор молодец! Отличное исследование и отличное его описание.
PS: Хорошо хоть изредка появляются такие отличные статьи на хабре.
leshakk
26.05.2016 18:10+1Автору — береги себя.
По крайней мере, не стоило так подставляться и писать про эксперименты с подделкой баланса.
Для системы проще отчитаться от поимке «киберпресупника», чем признать собственные ляпы.
И да, респект за подробное исследование и спасибо за интереснейший пост!
PS. Вспомнил пост про аналогичные эксперименты с таксофонными карточками.
Там у ребят закончилось уголовной статьёй и судимостью: habrahabr.ru/post/191450
complynx
26.05.2016 18:51Ещё один момент по поводу APK… Лично у меня, на Sams. Note 3, приложение не отлавливает карточку. Оно пишет Ready, и всё. При этом карточка читается и для работы с ней предлагаются либо яндекс, либо MCT.
Ammonia
26.05.2016 19:22+2У вас и MCT не будет работать, так как NFC чип производства broadcom скорее всего. Вот список НЕподдерживаемых телефонов https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
darksimpson
26.05.2016 20:30+17Всем хабровчанам привет, я тот самый автор, который еще тогда написал статью в «Хакер» :)
Давно хотел вылить что-то подробное по тройке и современному состоянию систем Метро и МГТ на Хабр, но ввиду своей жуткой лени и печальной занятости, никак не доходили руки (а инфы просто огромное море, правда, некоторую к сожалению выкладывать нельзя, но и без нее тоже интересно).
Автору — респект, что за это взялся и отдельно респект за его начинание в расковыривании /так называемого/ Layout'а у кошелька. По собственному опыту, доскональное расковыривание лэйаута — это достаточно емкая и интересная работа.
Вообще, если кому интересны какие-то вопросы по этой теме — задавайте. Я тоже постараюсь ответить в рамках того, что знаю и в рамках того, что можно говорить.Ammonia
26.05.2016 20:43+3О, привет! Рад тебя видеть.
darksimpson
26.05.2016 21:31+5Привет! Спасибо :)
Ну вот видишь, никому не интересны технически подробности. Ладно, поеду тогда домой. Может это и правильно: меньше знаешь — крепче сон.roman863
27.05.2016 02:08darksimpson, можешь рассказать про неиспользуемые лайоуты в метро сейчас в лс?
DmitrySpb79
27.05.2016 12:51+2Интересно понять, правильно ли я понял смысл:
— сектора карты закрыты ключом, не зная его их не прочитать, так? С андроидом понятно, а откуда утекали ключи в до-андроидную эпоху? Человеческий фактор? Или тупо брутфорсом?
— есть отдельный ключ на запись, правильно?
— что за китайские карты с возможностью записи нулевого сектора, на обычные карты он не пишется что ли? И что в нем такого особого хранится что он так защищен?
— если допустим, ключей нигде нет, возможно ли сдампить радиообмен с помощью антенны и приемника настроенного на частоту обмена? (допустим, есть SDR умеющий принимать от 20КГц и возможность записать сигнал в IQ)
Спасибо.darksimpson
27.05.2016 14:02+31. Ключи всегда утекали через известные (и неизвестные) фундаментальные уязвимости закрытой технологии шифрования Crypto1, которая издревле использовалась в Mifare Classic. От активного и пассивного мониторинга эфира до оффлайн атак на карты и атак на ридеры. Также, ключи утекали через реверс-инжиниринг железа метро, МГТ и их софта.
2. По технологии, есть два ключа, роли которых можно выбирать. Но в нашем случае, да — один «на чтение», один «на запись». Так повелось.
3. Нулевого блока. Нулевой блок на всех Classic (и совместимых) картах — некая «заводская зона», которая по уму на заводе пишется один раз, содержит в себе в том числе относительно уникальный серийный номер карты и не подлежит перезаписи. Сериный номер используется в том числе для организации защиты (от клонирования, например). В некоторых специальных китайских картах сделано так, что нулевой блок возможно перезаписывать.
4. Да, возможно. Это один из методов «доставания» ключей, в том числе и из «пофиксенных» новых Plus в режиме совместимости, так как некоторые базовые косяки Crypto1 устранить уже не выйдет, грубо говоря.
elite7
28.05.2016 00:48Есть ли слухи, что кому-то удавалось ли склонировать Тройку с анлим поездками? :-)
Gryphon88
26.05.2016 21:12Хороший проездной был… Что тут можно сделать, чтобы таакой финт легко ловился и был сложнее проверяем, кроме уникальных ключей, как предлагалось выше? Мне в голову приходит только анализ поведения, можно даже не онлайновый — сравнение, на сколько билет был пополнен и сколько было списано на проходе. А камеры висят и в метро, и почти во всем наземном транспорте, кроме маршруток.
vladon
28.05.2016 00:30«Ничего не знаю, подошёл какой-то мужик и предложил пополнить карту с его кредитки, ему срочно наличные были нужны, вот он через свой телефон и пополнил, приложение похоже на „Мой проездной“»
bromium
26.05.2016 21:22Забавно, но точно про такую же уязвимость было рассказано на phdays неделю назад:
http://www.phdays.ru/broadcast/ (справа сделать поиск по NFC и выбрать выступление про псевдобезопасность)
Просто совпадение?TimsTims
27.05.2016 21:40У вас и MCT не будет работать, так как NFC чип производства broadcom скорее всего. Вот список НЕподдерживаемых телефонов https://github.com/ikarus23/MifareClassicTool/blob/master/INCOMPATIBLE_DEVICES.md
https://habrahabr.ru/post/301832/#comment_9627966
bromium
26.05.2016 21:43+1Кстати, на google play уже давно выложены приложения, которые проверяют баланс тройки, например Тройка. Проверка баланса
что касается баланса...Байты, где записан баланс, проще перевести из hex в dec и разделить на 200 (что есть с8 в hex) — мне иногда так проще было при вычислении баланса на встроенном в android калькулаторе.darksimpson
26.05.2016 21:49+2Вот, мне кстати всегда было интересно получить ответ на этот сакральный вопрос, еще много лет назад — почему именно 01.01.1992 года? Не уже ль это такое тонкое трололо по поводу отмены регулирования цен? Или все более прозаично? Может у кого есть какие-нибудь интересные варианты?
leshakk
27.05.2016 12:53Скорее всего, стартовая дата «унаследована» из форматов хранения данных какой-нибудь АСУ родом их 90-х, спецификации которой разрабатывались в то время.
recontemplator
26.05.2016 22:47Спасибо за увлекательную статью.
Примечательно (как любит повторять автор), что технология содержит средства, которые могли бы существенно затруднить проведение подобной атаке (последнюю подпись, можно было бы сверять со значением на сервере), но она почему-то не задействована даже в заведомо online решениях.
Может ли у этого быть рациональное объяснение?
Например, общий процент фрода, и его «стоимость» так малы, что не превышают стоимости дополнительных серверных мощностей необходимых для проверки всех транзакций (маловероятно).
Или — отключение этой проверки существенно уменьшает время транзакции = увеличивает пропускную способность, что может быть важно в часы пик (более вероятно).
Уязвимость используется самими разработчиками (как-то неприятно про это даже думать).bromium
27.05.2016 22:30Wпочему же, как раз наоборот: автор написал, что приходится после восстановления баланса наземным транспортом пользоваться, где нет онлайна, а вот в метро достаточно быстро блокируют, вероятно как раз по паре значений дата, подпись
darksimpson
26.05.2016 22:58+4Да, по поводу того, как хранится баланс в этом лэйауте (осторожно, говорящая жаба!):
// 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 } }
Ammonia
27.05.2016 00:56+1Получается тогда у меня ошибка в определении смещения. Деньги записаны не со старших 3 бит 10 байта, а начиная с пятого. Просто 4 и 5 биты были всегда нулевыми, поэтому реальную границу было сложно определить. Я наверное не стану исправлять в статье, пусть сохранится для истории.
audiserg
26.05.2016 23:24+3Отличная статья. Как вы так быстро раскусили делитель и место под баланс? И про 1.1.92 тоже интересно
roman863
26.05.2016 23:52darksimpson, вы можете про формат ржд рассказать в тройке? Можно на почту, чтобы не публично.
darksimpson
27.05.2016 00:14Я не разбирал РЖД, увы.
roman863
27.05.2016 01:50Без инсайда там и не разберешь)
darksimpson
27.05.2016 01:56И то верно.
CKA3ATb_BCEM
27.05.2016 22:16Зачем инсайд, когда терминалы работают на винде?
Мне в своё время удалось получить программу билетопечатающего терминала. Много интересного там, вот только ключи шифрования не смог вытащить.
Могу поделиться, но не знаю как связаться с вами.
DmitrySpb79
27.05.2016 00:22Интересно, сколько провисит на сайте эта статья?
Вангую что завтра-послезавтра будет удалена «по требованию правоохранительных органов» :)))darksimpson
27.05.2016 00:48+10Кстати, интересное наблюдение. Еще всего несколько лет назад, когда я вел вполне себе ЖЖ с подробностями, даже некоторым софтом, писал статьи в Хакер и рассказывал Компьютерре как «поломал Метро» и все дела (причем инфа там тоже была), ни у кого даже в мыслях ничего такого небыло, что статьи уберут, ЖЖ закроют, тираж изымут, а автора посадят…
А сейчас… Причем, не только здесь, а вообще, тенденция такая. Хотя, по сути, формально, ничего с того времени ни законодательно, ни как-либо еще особо не изменилось.
Понимаете, что происходит? Вот. И это страшненько. Система, которая порабощает и промывает — во всей красе.DmitrySpb79
27.05.2016 01:15+4Ну тут просто — если пресс-служба метрополитена обратится в правоохранительные органы с заявлением что публикация на сайте наносит им ущерб, то тем и идти далеко не надо — судя по справочнику, ООО «Хабр» зарегистрировано в Москве.
Насчет статьи — технические подробности это интересно, а вот приложение для телефона, позволяющее любой школоте накрутить себе поездки, я бы выкладывать все же не стал. Во-первых, незачем плодить халяву, должен быть некий порог входа для тех кто реально интересуется технологиями, а не просто халявщик, во-вторых, это все-таки неэтично по отношению к метрополитену да и городу в целом, ведь средства от продажи билетов таки идут на развитие и модернизацию транспорта.
Что касается тенденции… Когда-то давно интернет был уютным местом, где общались технари и инженеры, все друг другу доверяли, и вообще, было классно. Мне например совершенно незнакомый человек с fido7.photo.ru продал в свое время цифровую камеру в рассрочку на 3 месяца, без каких-либо расписок, просто под честное слово — возможно ли такое сейчас? Сейчас увы, доступ в интернет есть у всех, и не только у честных людей. Так что какое-то регулирование таки нужно, и я не могу сказать что это так уж плохо.darksimpson
27.05.2016 04:21+3Дело не в регулировании. Дело в какой-то тотальной промывке мозга и искажении наших представлений и мнений. Вот так втихую. Я не против регулирования как такового, но меня настораживает вот это вот 1984. Неуютно при понимании происходящего. Хотя, может я и утрирую.
Disasm
27.05.2016 07:31> Во-первых, незачем плодить халяву, должен быть некий порог входа для тех кто реально интересуется технологиями, а не просто халявщик, во-вторых, это все-таки неэтично по отношению к метрополитену да и городу в целом, ведь средства от продажи билетов таки идут на развитие и модернизацию транспорта.
А по-моему всё правильно автор сделал. Руководство метрополитена поставлено в известность? Поставлено. Если они не хотят улучшать безопасность, надо переходить к более жёстким мерам. Вон благодаря Karsten Nohl с аналогичными методами в его стране мобильная связь стала немного безопаснее.
Без приложения в данном случае это просто крутая техническая статья, с приложением — шанс на улучшение безопасности.DmitrySpb79
27.05.2016 09:23+6Тут на самом деле, тема куда сложнее чем кажется на первый взгляд.
Во-первых, с вероятностью 99% ничего не изменится. И дело не в том, что разрабы в метро тупые, а в том что поменять все проездные в 10 миллионном городе — та еще задача. Вот как вы себе это представляете — обновить всем проездные, включая работающих, пенсионеров, прочих социальщиков и пр. Далее, как я понял из статьи, в автобусах данные не синхронизируются — предлагаете все автобусы проапгрейдить? Да никто не будет всем этим заморачиваться, проще закрыть глаза на то, что пара тысяч студентов будет нахаляву кататься.
Во-вторых, как уже я написал выше, деньги от билетов таки идут на модернизацию и закупку транспорта. Когда топикстартер в следующий раз будет ехать в старом раздолбанном автобусе, может задумается, что если бы не халявщики, может автобус бы и поновее был.
В третьих, и наверно самое главное. Любое ужесточение безопасности — в первую очередь создает неудобства честным гражданам. Дали допустим, возможность пополнить проездной с мобилы — тут же нашелся «умник» который хакнул. Ну закроют эту фичу, придется вам стоять в очереди в кассу чтобы проездной пополнить, кто от этого выиграет? Сами же автора «добрыми словами» вспоминать будете. В идеале для честного человека — лучшая защита это та, которой нет, о которой не надо заморачиваться. Закроют допустим возможность делать социальные проездные на несколько лет с захардкоженными ключами, придется бабушкам каждый месяц ходить и проездной обновлять, чтобы ключи в проездном синхронизировались, будете из-за этих бабушек дольше в очереди стоять.
Как-то так.darksimpson
27.05.2016 13:05+3Нет. Чтобы «умник не хакнул» нужно просто делать нормально, вы уж меня извините. Используется карта Plus, но не используются все ее возможности (и я даже не хочу вступать в спор почему). Существует асимметричная криптография, которую можно запускать с очень хорошим результатом по времени даже на мелких современных ARM-МК… Я недавно участвовал в разработке одной городской транспортной системы (не в России), делал железо с нуля (защищенный ридер, грубо говоря) и имею представление, как все можно организовать безопасно и без потери удобства.
То, что происходит у нас — куча Legacy (от которого тяжело избавиться, потому, что изначально все через жопу было сделано), наплевательское отношение «на авось и так сойдет» и отличные продажи этого всего за классные конкурентные цены. Ну вот так, увы.
GamePad64
27.05.2016 13:56+1Проездные, кстати, обновляются через автоматы в метро. Два года назад при пополнении "тройки" высветилась надпись "Программное обеспечение карты обновлено" или что-то вроде того.
bromium
27.05.2016 21:56Конечно, это один из вариантов — переключить карту в режим sl3 при следующем пополнении, где уже используется aes. Вероятно, в турникетах метро стоят настолько устаревшие ридеры, что они не поддерживают оаботу с sam-модулями. С другой стороны, при большом желании и эту проблему решить можно
darksimpson
28.05.2016 22:26Скажем так, вы попали в цель :) Ну если поднапрягутся и сделают — честь им и хвала будет, чё.
roman863
27.05.2016 01:47-17DmitrySpb79, попросите автора удалить статью, зачем это все открыто выкладывать. Кто интересуется, тому известно это все итак.
mmMike
27.05.2016 09:07Статья конечно интересная и с подробностями.
Но в принципе, сам факт работы с простой Mifare Classic напрямую чрез A/B ключи в Android приложении через NFC говорит о том, что эти ключи легко можно вытащить. Просто никому особо не надо было это.
А NXP зря притянули. Их представители всегда на встречах активно не рекомендуют использовать режим Mifare Classic. Он конечно есть в целях совместимости на новых картах NXP, но…
Догадываюсь, какой был диалог «бизнес» — «IT» (разработка+сопровождение):
- Бизнес: Нам нужно что бы с бесконтактной картой можно было работать в
- IT: Ну давайте DES Fire использовать… но тогда инфраструктуру менять придется… Или Java карту с прокси апплетом и поддержкой Mifare Classic… Но дорогая она нынче.
- Бизнес: Мы тут посчитали… дороговато. Даешь работу в телефоне с обычной дешевой Mifare Classic
- IT: Так сломают же..
- Бизнес: А не волнует. Зато дешевле. И авось не сломают. Да и пусть ломают. потери не большие. Делайте!
- IT: Есть!
возможно резон есть. Ну сколько этих гиков и хакеров… Украдут копейки.bromium
27.05.2016 21:52Извините, а почему Вы в ответе it предлагаете все равно использовать mifare classic? Вы разве не понимаете, что это не решает проблемы из-за взлома самого криптопротокола в classic?
mmMike
29.05.2016 10:25Не совсем понял вопроса (по приведенному мной диалогу).
Как раз базовые уязвимости Mifare Classic все известны.
И из соображений безопасности и перспективы «Mifare Classic» не выбор.
Но вложения в уже существующую инфраструктуру уж больно велики. Ни кто не хочет разово менять инфраструктуру.
Да и модули ридеров Mifare Classic стоят сущие копейки.
И еще одна причина… Было бы из чего выбирать то.
И уж простят меня представители NXP, но лично я не считаю что у NXP новых карт есть будущее.
Рискну предположить, что переход будет выполнятся на открытый «ISO14443 B» с T=CL (карту которую могут делать не только NXP).
Я бы предположил что это будет Java карта.
Calipso, Mifare (PLUS то же) и прочие… да на них просто не сделать ту логику, которую зачастую хочет заказчик! С разницы не будет. Карта памяти и все. Все логика во внешнем приложении… Что не очень безопасно.
И хоть NXP, как мне кажется, сильно демпенгует с чипсетами и модулями ридеров (под свои карты), но как то страшновато попадать в кабалу к одному производителю.
Все это мои личные предположения и домыслы, хоть и основанные на… (в общем есть основания)bromium
29.05.2016 12:25+1Вы писали " Или 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, хоть от других производителей.
То, что Вы предлагает — вообще не разумно и я с этим не согласен — хранить логику на карте — тогда себестоимость карты возрастает в разы, поменялась логика, а у людей миллионы карт на руках — и что тогда? Как раз все, что возможно, надо переносить на бэк-энд, а на карте хранить только самое основное, не загружать ее лишним.
Вообще, это вопрос правильного проектирования — систему надо разрабатывать таким образом, чтобы не зависеть от конкретного вендора. И это возможно. Например, я разрабатывал систему, которая не зависит от производителя. Да, приходится учитывать функциональность конкретного типа чипа, но задача как раз и в том, чтобы это предусмотреть при разработке. Создать некий уровень абстракции, который потом уже проецируется на конкретные носители.
mmMike
29.05.2016 14:19Вы писали " Или 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 скорее мертв чем жив)
bromium
29.05.2016 15:15Когда задача поставлена сохранить инфраструктуру приема 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 скорее мертв чем жив)
Мы говорим про трнаспортные бесконтактные карты, где не требуется впихивать «невпихуемое», как вы предлагаете, перенся логику работы на карту — вот это релаьно тупиковая ветвь развития. Вся ИТ-отрасль это доказывает (см. бум на «облака» — не просто так это стало популярным).
Вообще, любая техническая задача должна быть увязана с основными бизнес-целями. Я Ваш подход абсолютно не приемлю: перекладывать с больной головы на здоровую, спокойно рассуждать о «непринципиальной» разнице в цене… Это пример неуважения к пользователям и к тем, кто платит за разработку («зачем заморачиваться — пусть заказчик за все платит, зачем нам думать, как сделать удобнее и дешевле»)
mmMike
29.05.2016 16:00Именно про это сомнительное решение я и говорю. Вы сами не слышите, что говорите: предлагает использовать более дорогой носитель но все с тем де Mifare Classic, чтобы безопасно загрузить ключи Mifare, которые легко вскрываются и так (я бы даже не назвал это брутфорсом — на вскрытие уходит 5 мин.)
Это требование от бизнеса. Использовать Mifare Classic.
Насчет «легко вскрываются». Нужно иметь перехватчик протокола в канале карта ридер. нужно обладать специальными знаниями. Я например, знаю как это делается в подробностях.
В общем, далеко не каждый школьник/студент сможет собрать аппаратную часть, даже если он знает что и как (а в открытом доступе этой информации нет и надеюсь не будет). Не тривиально это.
Есть множество способов, как защитить обмен данными между сервером и приложением.
Принципиально не возможно защитится от компроментации данных, если клиентское приложение фактически «на руках у пользователя» и выполняется в незащищенной среде. При использовании прокси апплета, криптосессия устанавливается между апплетом и сервером и уже в этом канале (3des GP secure channel) передаются критичные данные которые в принципе не появляются в отрытом виде снаружи.
Все ваши остальные рассуждения говорят о том, что в области «транспортные карты и платежи» Вы никогда не работали и конкретных подводных камней не знаете. Как и откуда появляется новый функционал (особенно ужасные льготные карты и их алгоритмы) на практике не видели. С заказчиками на эти конкретные темы не общались.
Честно говоря… я все сказал по своему практическому опыту.
Рассуждать про облака… бизнес цели… неуважение к пользователям… тупиковые ветви развития… это не ко мне.
Не люблю пустой треп «за жизнь».
bromium
29.05.2016 20:31Насчет «легко вскрываются». Нужно иметь перехватчик протокола в канале карта ридер. нужно обладать специальными знаниями. Я например, знаю как это делается в подробностях.
В общем, далеко не каждый школьник/студент сможет собрать аппаратную часть, даже если он знает что и как (а в открытом доступе этой информации нет и надеюсь не будет). Не тривиально это.
Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.
Все ваши остальные рассуждения говорят о том, что в области «транспортные карты и платежи» Вы никогда не работали и конкретных подводных камней не знаете. Как и откуда появляется новый функционал (особенно ужасные льготные карты и их алгоритмы) на практике не видели. С заказчиками на эти конкретные темы не общались.
Когда не хватает аргументов, переходят на личности — это известный факт. По существу парировать было нечего, обозвав это разговорами за жизнь. Забавны отсылки к моему опыту. У меня-то сложилось мнение, что все как раз наоборот. Плюс кое-кто застрял в прошлом веке, нарисовал удобную ему картину мира и не хочет развиваться.mmMike
30.05.2016 06:37Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.
Ссылку pls. С удовольствие покажу при встрече инженерам подразделения Mifare из NXP.
Когда не хватает аргументов, переходят на личности — это известный факт. По существу парировать было нечего, обозвав это разговорами за жизнь. Забавны отсылки к моему опыту.
Причем здесь личности.Вы действительно работали в проектах по транспортным картам?
Где вы увидели переход на личности? Так работали или нет?
Я теоретически должен быть рад проблемам Тройки. Но вот особо осуждать их не могу.
Потому что представляю как им (разработке) выкручивали руки требуя приложение в смартфоне.
И это суровая правда жизни. Не всегда можно выбрать идеальное с точки зрения архитектуры и «красивости» решение в рамках поставленных ограничений.
darksimpson
30.05.2016 09:40Давайте не будем кривить душой. Тройка — Mifare Plus. Она уже, как слон, «есть быть куплена». И бизнесу в этой плоскости доказывать ничего не надо. В SL3/SL2 никакой проблемы проксировать обмен с картой в приложении для смартфона нет, сделав систему очень устойчивой (я намеренно избегаю «абсолютно безопасной», так как разные косяки могут быть всегда). И бизнесу тоже это доказывать не надо — это работа небольшой пряморукой команде разработчиков на примерно столько же часов, может чуть поболее. То есть, для бизнеса это все стоит ничуть не сильно дороже в итоге.
Следовательно, вывода всего два: а) криворукие разработчики, которые не умеют и не хотят; б) более глубинные проблемы (обратной совместимости).
Я думаю, в данном случае и то, и то. Как минимум потому, что можно было начать с SL2 где можно пользоваться AES, а где _пока еще_ нельзя, из-за проблем с обратной совместимостью, пользоваться crypto1 по старому. Подготовить почву и нормально постепенно обновлять старье, через некоторое время полностью выведя его из строя и перещелкнув все в SL3 полностью, вообще незаметно для юзера.mmMike
30.05.2016 10:01+1Вы совершенно правы.
Меня то же «несколько» удивило, что используя Mifare Plus даже в режиме SL1, они не стали пользоваться предоставленной опциональной возможностью AES аутентификации (которая есть и в SL1). Но акцентировать на этом не стал (ну все же информация по Mifare PLUS конфиденциальна).
Но раз вы публично пальцем ткнули…
Не буду больше защищать несколько корявые решения «Тройки». Тем более что они мне не партнеры, а даже наоборот.darksimpson
30.05.2016 10:13+1Да, верно, я сейчас немного освежил память. Даже не SL2-SL3, а SL1-SL3. Но не суть, смысл остается.
P.S. Я пока еще не нарушил подписанное NDA ;)
bromium
30.05.2016 12:08Ссылку pls. С удовольствие покажу при встрече инженерам подразделения Mifare из NXP.
NXP давно в курсе. Вообще, специалистам, энтузиастам, давно это все известно. Недавно новая уязвимость была обнаружена: card-only attack на Mifare Plus (вообще снифферы больше не нужны).
Причем здесь личности.Вы действительно работали в проектах по транспортным картам?
Где вы увидели переход на личности? Так работали или нет?
Примерно, в половине всех проектов по транспортным картам, что есть в стране. Предлагаете теперь начать меряться… опытом?
Потому что представляю как им (разработке) выкручивали руки требуя приложение в смартфоне
Да никто никому не выкручивал, банк очень хотел зарабатывать на комиссии, потмоу сделали в спешке тяп-ляп. Что, програмисты не в курсе MITM-attack в TLS? Тогда это уж совсем какие-то студенты-первокурсники. А уж использовать ключи в открытом виде (в base64) — вообще epic fail. Как всегда, понадеялись «на авось». Собственно, результат закономерен.mmMike
30.05.2016 12:35NXP давно в курсе. Вообще, специалистам, энтузиастам, давно это все известно. Недавно новая уязвимость была обнаружена: card-only attack на Mifare Plus (вообще снифферы больше не нужны).
Вы меня не поняли… О факте уязвимости известно. Ну и что?
Как раз все это в открытом доступе и доступно каждому школьнику (схемы, утилиты — думать вообще не надо), Вы отстали от жизни. Плюс можно купить готовую аппаратную часть за ~100 долларов.
Ссылку pls, где можно купить и где лежат утилиты доступные каждому школьнику.
Ладно, черт с ним с утилитами и железом, где подробности Mifare Cripto1 в свободном доступе?
Не документация полученная по NDA, а именно в свободном доступе, доступная «каждому школьнику».
Да даже при наличии документации, уверяю, каждому школьнику это не сделать.
«Что нам стоит дом построить… нарисуем — будем жить».
К вопросу «отстали от жизни». Такие слова то подтверждать нужно…
darksimpson
30.05.2016 13:08Утилиты и подробности 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
+ еще у китов на ебэе периодически бывает проксмарк недорого.
(не знаю, правда, можно ли публиковать ссылки)
Я знаю как минимум одного школьника, который при наличии просто относительно непустой головы, относительно прямых рук, целеустремленности и желания все это делает. Вы недооцениваете современную школоту :)bromium
30.05.2016 13:51Вот именно про это, в том числе, я и говорю.
Более того, вот новая уязвимость
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 сервисов»
mmMike
30.05.2016 14:01Про то что информацию и железки трудно найти — был не прав.
Извиняюсь.
К слову, то что classic не уязвима — я как и не писал…
Давно не искал и не смотрел такие вещи как инструментарий для анализа в продаже.
А то, что есть объективные условия почему ее до сих пор используют, наверное Вы и сами понимаете.
for bromium
darksimpson
30.05.2016 14:02+1Мне, честно говоря, как-то всё равно :)
Но вот по теме, в сухом остатке имеем то, что имеем.
darksimpson
30.05.2016 13:18И вот еще по HardenedNest, для Plus:
https://github.com/aczid/crypto1_bsmmMike
30.05.2016 13:34Спасибо.
Да… действительно отстал… Похоже зря давно не интересовался.
Понятно, что в принципе ничего сложного сделать платку (сформировать 13Мгц сигнал и/или записать его на современном проце). Хотя казалось, что это все же уровень не школьника и не всякого студента (судя по публикациями на хабре).
Но не думал, что этим уже штатно торгуют!
А еще выкладывают в на github описание Cripto1, которое раньше даже под NDA из NXP вытащить было невозможно.
Действительно. Уровень входа минимальнейший.
bromium
30.05.2016 13:57Ну, Crypto1 «лишь» реверснули. Не уверен, что самостоятельно можно реализовать криптообмен с картой (например, для аутентификации через SAM) без косяков.
darksimpson
30.05.2016 14:05Без косяков нельзя. Сам Crypto1 ? косяк. Если использовать все плюшки Plus, то никаких проблем.
Abramovich_AD
27.05.2016 11:06Интересно.Данный метод сработает с МОБИЛЬНЫМ БИЛЕТОМ??? Который на сим-карте.Принцип работы вроде такой же, как и у тройки? Или здесь метод записи через софтину не сработает и запорет сим-карту или билет на ней!?
Wandy
27.05.2016 11:17+2Отлично! Как раз заказал импланты Mifare Classic 1K с перезаписываемым 0-сектором. Теперь мне нужен живой москвич для экспериментов.
stoplinux
27.05.2016 12:32Спасибо большое! Отличная статья.
Скажите, правильно ли я понял, что сейчас метрополитену достаточно исправить отправку ключа B при запросе баланса:
Примечательно, что здесь так же присутствуют ключи B, которые используются для записи данных на карту, хотя для запроса баланса достаточно было бы ключей А, разрешающих только чтение секторов памяти.
и трюк повторить не удастся?darksimpson
27.05.2016 13:09Нет. Метрополитену уже ничего не исправить. По крайней мере малой кровью.
stoplinux
27.05.2016 14:47Однако атака была бы не возможна, если бы ключ B не отправлялся сервером?
Не похоже ли это на оставленный backdoor?darksimpson
27.05.2016 15:51Была бы возможна, даже если бы и не отправлялся.
Disasm
27.05.2016 16:13Каким образом? На тройке же mfoc не даёт результатов, так что по A ключам, в теории, B ключи не получить (кроме как полным перебором, конечно).
bromium
27.05.2016 21:58Ни mfoc ни mfcuk на mifare plus не действует, но сниффинг обмена данными между картой и ридером все равно позволит вытянуть ключ
oleg_chornyi
27.05.2016 22:15Так через приложение можно же и пополнять карту. Т.е. в ответ на какой-нибудь другой запрос этот ключ все равно приходил бы.
Alex781
27.05.2016 22:15В метро, я думаю, проблем нет — улучшат стоплист — будут быстрей блокировать, а вот в автобусах проблематичней че-то сделать.
and7ey
31.05.2016 19:21Странно, что они заявляют в новостях, что все уже исправили. Или они предложение обновили, что-то там исправили (перестали присылать ключ в открытом виде) и считают это исправлением?
PS. Интересно, а можно ли с карты считать количество оставшихся поездок, данные последней поездки из билета типа 60 поездок и т.п.?
ChALkeRx
27.05.2016 14:00Прокат велосипедов — Стоимость не уточнялась
Если речь идёт про Велобайк, то там «Тройка» + пин-код служат всего лишь альтернативным идентификатором пользователя. Деньги списываются напрямую с привязанной банковской карты, «Тройкой» оплатить нельзя.
willson
27.05.2016 14:43+1В первую очередь автор довольно затейливо описал про «повторное использование уязвимости». Что ты фактически можешь украсть так это одну-две, ну если очень быстро будешь перемещаться, то чуть больше поездок (в рамках одного дня), после чего карта превратится в тыкву. И, конечно: понятно, что нет никакого смысла с этим бороться, ведь если даже начнется массовая эпидемия таких халявщиков, то потом пойдет еще и массовая продажа новых карточек.
roman863
27.05.2016 15:41-13А можно из статьи удалить скрин с ключами? Зачем они тут? Кому надо они достанут, а так открыто выкладывать не надо.
iDoka
27.05.2016 15:57Для работы нужен смартфон на платформе Android с NFC модулем производства NXP.
Подскажите, пожалуйста, какие смартфоны (вердоры и модели из последних) поддерживают такую связку, либо, быть может, где ведется реестр таких NFC-смертфонов?
leshakk
27.05.2016 17:24+4Ну вот и жёлтая пресса подтянулась :(
Уже в заголовке «правильно» расставили акценты:
«В Москве хакер взломал «Тройку» и две недели бесплатно катался в общественном транспорте»
http://www.msk.kp.ru/daily/26531/3551729/Tiamon
27.05.2016 18:39Тут уже и главный «желтый» подтянулся https://hi-tech.mail.ru/news/hacker-troika/?frommail=2 правда без ссылки на статью
ProstoTyoma
27.05.2016 18:27+3«Метрополитен и ВТБ устранили возможность взлома карты „Тройка“»
http://www.interfax.ru/russia/510444alchemist666
28.05.2016 17:36Как я понял, они пофиксили, только возможность дампить старым способом, ключи для чтения/записи/перезаписи в служебные сектора, ну ещё и сертификаты обновили, т.е. если снова найти способ дампа сертификатов, то всё продолжает, так же работать. НО пока что на общественном транспорте, эта фича должна работать, пока не обновят терминалы.
Или я всё же не прав, и они уже ни как ни чего не пофиксят(малой кровью)? Тогда если этот способ работает, не проще ли каждые полгода к примеру, менять эти мастер ключи…
Mixim333
27.05.2016 18:39Спасибо, познавательно. У самого в бумажнике лежат транспортные карты двух городов=> вещь распространенная, поэтому меня очень заботит вопрос: «А зачем каждый город делает свою карту?» — сделали бы «Транспортную карту Одна страна», которая работала бы в любом городе, применили бы в ней достойные алгоритмы шифрования и всем было бы удобно…
Еще пару месяцев назад на одной из своих карт заподозрил «утечку денег» (куда-то ушли 30-60 рублей), но разбираться не стал, больше такого не повторялось (насколько помню, приложил бумажник с картой к терминалу в автобусе, хотя раньше всегда карту доставал). Ammonia, может быть просветите: возможно ли такое и если да, то по каким причинам происходит?bougakov
27.05.2016 19:39потому что транспортные системы разных городов — это, сюрприз, разные юр. лица. Вот положили вы на такую карту 100 руб. — как двум метрополитенам решить, чьи они?
Вариант «подержать на депозите» не предлагайте — весь смысл проездного в том, что деньги вы вносите авансом и предприятие на них рассчитывает при планировании расчётов с поставщиками.bromium
27.05.2016 22:07-1Проблема даже еще более сложная: в разных городах разная стоимость проезда, а проездные — это не только примитивный электронный кошелек, а и более сложные виды проездных.
Например, в одном городе есть билет на 40 поездок стоимостью 800 руб. и сроком действия 30 дней.
А в другом — на 30 поездок стоимостью 900 руб. и сроком днйствия 45 дней.
По какому принципу перечислять между разными системами деньги? Из какого расчета, если я купил проездной в одном городе, а поездку совершил в другом?
Тупо разделить стомость проездного на количество поездок? Тогда тот город, где стоимость ниже, получить больше, а вот в обратном случае — меньше? Да и нельзя так делать — ведь это по сути предоплаченный тариф — за некую стоимость получаешь фиксированный набор услуг. Некорректно будет их сравнивать, приводя к некой условной единице
PhpRu
27.05.2016 21:00Недавно Ликсутов говорил, что Тройку и Подорожник сделают обратно совместимыми. Т.е. в Питере будет работать Тройка, а в Москве — Подорожник, не вся страна, конечно, но хотя бы начало положено.
bromium
27.05.2016 22:13Очередная чиновничья профанация. Как объединение тройки со стрелкой. Просто на одну карту в ее память записывают 2 билета разных систем, единственное преимущество: не надо таскать две карты, зато обоазуется два кошелька, остатки по которым хранятся… Постойте, а где же они хранятся? Да, в разных компаниях.
Вместо того, чтобы это был один общий кошелек, желательно привязанный счет, чтобы не размещать остатки в неких структурах, которые, «возможно», на этом зарабатываютPhpRu
03.06.2016 13:39Появилась карта тройка+стрелка. Тоже были разные карты. объединяют потихоньку. Очень хочется верить, что когда-нибудь для простых смертных сделают всё по умую lenta.ru/news/2016/06/02/karta/
dottedmag
29.05.2016 12:09Транспортные карты – это анахронизм, никто новые их делать не будет. Будут делать оплату телефоном или, в крайнем случае, свайпом платёжной карты.
krvrd
27.05.2016 22:13+1Игорь, отличный текст, спасибо)
Посмотрите, тут есть комментарий производителя чипов и ментов. До разработчика, похоже, не достучались.
moslenta.ru/article/2016/05/27/trojka
Shrike
28.05.2016 01:54Пишут:
UPD: Через несколько часов после выпуска статьи пресс-служба Московского метрополитена сообщила, что устранила уязвимость в системе. Для этого разработчики даже связались с программистом, который нашел баг.
врут?
alex_uzao
27.05.2016 22:14Спасибо за статью — очень интересно и познавательно! Всегда интересовался как устроена информационная система в метро, когда-то давно даже сам писал программку на дельфи, позволявшую по кодам станций на картонном проездном выводить маршрут пользователя карты.
Автор, мои поздравления, про Вас уже на мейл.ру написали news.mail.ru/incident/25920697. Боже, какой же бред они несут!
vetal5872
27.05.2016 22:14Хакер нашел уязвимость в карте «Тройка» для бесплатного проезда:
www.gazeta.ru/tech/news/2016/05/27/n_8688887.shtml
Kondra007
27.05.2016 22:14+1Задам наивный вопрос: а можно как-то на сервере проверять подпись apk-файла, с которого идут запросы? Чтобы не отвечать таким вот «пересобранным» приложениям.
kolipass
30.05.2016 13:45Можно получить сигнатуры и слать их на сервер, но взломщик может подделать получение сигнатуры. Но можно проверять сигнатуры apk из .so файликов, но кто это будет делать....
ArtRoman
30.05.2016 13:56Можно, например, посылать хэш подписи приложения, но это – security through obscurity, и сделать модификацию на отправку корректной строки, опять же, будет не так сложно.
Делать проверку из .so-файла не так сложно, но и so-бинарники тоже декомпилируются и правятся.
bromium
27.05.2016 22:35Кстранные автор в конце выводы делает. Разве шифрование данных на карте спасет от «машины времени»? Конечно, нет, ведь доступ к данным открыт, можно даже не заморачиваться тем, что и как на карте записано: тупо восстанавливать предыдущий дамп.
На самом деле, перевод на уровень sl3 не так и сложен — нужно подать на карту несколько команд. А уж aes взломать с помощью андроида… Не так просто (если кодеры из банка москвы снова ключи в открытом виде передавать не будут)))
vladbarcelo
28.05.2016 01:50Тут пару дней назад на канале #hackers некто MuNk интересовался мифарками, не вы ли часом были?
PhilipF
28.05.2016 12:00На LG G4 не поставилось. Пишет, что не нужно никаких разрешений, и не реагирует на кнопку «Установить».
Хотя разрешено ставить программы из любых источников.
EpoxuH
28.05.2016 18:50В статье указано, что при аутентификации передаётся номер телефона. Может ли это стать одним из способов поимки юзера TroikaDumper и доказательством его виновности/причастности (в чём и к чему опустим)?
Ammonia
28.05.2016 18:51+1Номер телефона передается в приложении Мой проездной, в TroikaDumper ничего в интернет не передается вообще.
dcc0
29.05.2016 00:28+2И, наверное, кого-то могут уволить за реализацию этой системы.
И к жетонам уже не вернуться — есть 3D принтеры.
Остаётся один вариант — абонентская плата (принудительная) для каждого москвича.
Т.е. коммунизм начнётся с московского метро.
Я всегда знал это. =)
P.S.
Удивительно, кто-то обнулил мою карму. К чему бы это?!
roman863
29.05.2016 14:31-10А может автора в бан за распространение запрещенной проги ?) Возможно она номера кредиток ворует, так что не советую скачивать ее. Предлагаю вообще ее из статьи удалить.
dlinyj
29.05.2016 20:08+2У меня такое чувство, что вы заинтересованное лицо…
roman863
29.05.2016 20:48-7dlinyj, автор просто идиот, выкладывать это все в паблик.
dlinyj
29.05.2016 20:50+2Скажите это всем пользователям, кто им восхищается ;). См. комментарии выше.
roman863
29.05.2016 20:53-3Он всех подставил, эта информация была известна, выкладывать ее в сеть глупо просто.
roman863
29.05.2016 21:53-4Если прикроют эту халяву, то думаю эти пользователи сами будут не в восторге от него))
dlinyj
29.05.2016 22:04Я честный человек, и пусть прикрывают дырку, а вот узнать как же это работает интересно.
roman863
29.05.2016 22:06-3Это давно известно и не являлось секретом.
elite7
29.05.2016 22:18+2если это не являлось секретом, то как это можно выложить в паблик?
Это же не являлось секретом, и значит давно доступно в паблике.
Просто есть разные адаптации материала.
Что плохого в том, что пара сотен школьников попробуют, а 10 из них станет хорошими специалистами и создадут в будущем надежную систему, чем замок, открывающийся булавкой?
Iv38
30.05.2016 12:39+4Не ну вы таки поглядите каков персонаж! Он предлагает забанить автора статьи потому, что теперь, вероятно, не сможет эксплуатировать уязвимость в личных целях. Для своего незаконного, так сказать, обогащения. Охренеть. У меня альтернативное предложение по поводу бана имеется.
roman863
31.05.2016 02:17Обогащаться как раз сейчас начнут все массово кто даже не понимает как это работает.
dcc0
29.05.2016 23:00+1А я ЩиТаЮ автор — молодец. Вскрыв техническую проблему, он вскрыл и ряд социально-экономических проблем.
Беглый взгляд на техническую часть финансово-расчётной системы недвусмысленно даёт понять о постоянных обновлениях всего и вся в этой области. Т.е. система, которая рассчитана на обслуживание человека и экономики в постоянном апгрейде. Вот сейчас хотят и системы в банках менять — отказаться от пластиковых карт.
И тут вопрос — сколько мы (человечество) прожили с этими картами? Сколько на все это было потрачено средств?
По меркам мировой истории карты существуют не так давно и уже менять. Я понимаю, что надо загрузить программистов и инженеров, так как без таких заказов они просто пропадут, но примерно лет 20-30 мы жили с картами, и 15 лет из этих 30 мы эти карты внедряли. А теперь что?
И все эти рассуждения приводят нас к глубоким философским вопросам бытия…
kom09
02.06.2016 13:05-1И все закончилось тем, что программисты ВТБ/Банка Москвы сломали приложение.
На Windows Phone/Mobile полностью — при попытке прочитать Тройку выдает «Не удалось прочитать данные карты».
На Android частично — Тройку и стрелку читает, но в процессе покупки билета ЦППК вылезает ошибка «Произошла ошибка, свяжитесь со службой поддержки ВТБ Банк Москвы».
Вот все работало, и тут приходит шибко умный чудак на букву «м», ставит всех на уши и куча пользователей лишаются удобного сервиса. Надеюсь у правоохранительных органов для автора все-таки найдется статья. Хотя бы условный срок ему не повредит.SunX
02.06.2016 14:32+1Не Автор же поднял шумиху и не он сломал приложение. Да и, если быть честным, он был далеко не первым кто подобное провернул (в комментариях есть примеры подобных работ). Он просто бесплатно провел анализ безопасности для них и так как они решили от него отмахнуться, то рассказал о результатах обществу, всё.
Впрочем автор может ничего и не нарушал, а просто декомпилировал приложение (что, как я помню, в России вполне законно, если делается для исследовательских целей) и на основе этого сделал предположение, что можно было бы бесплатно ездить на общественном транспорте (с некоторыми ограничениями).
MagisterLudi
Вот за это я люблю Хабр
fotonstep
Тема с 2008 года существует, ничего нового
PavelMSTU
Ссылку можно?
ValdikSS
fotonstep прав. Может, не с 2008 года, но два года уж точно.
PavelMSTU
Я рад, что fotonstep прав. Ссылку можно?
Akr0n
Держите
ValdikSS
Ну вот на сосаче, например.
PavelMSTU
Спасибо!
gxcreator
Сосач умер
Kirillko312
Сосач жив
homm
А ссылка жива.
bromium
Официально криптопротокол mifare classic был взломан в 2008 г. студентами одного голландского университета.
Поскольку криптопротокол classic называется crypto1, впоследствии была разработана энтузиастами библиотека crapto1 (игра слов — crap — г… о), которая позволяет, например, легко вытаскивать ключи из подслушанного протокола между картой и ридером.
Ссылку приводить не буду — легко гуглится.
Ну а в kali linux давно уже в поставку входят утилиты, эксплуатирующие уязвимость чипов mifare classic
Akr0n
В Хакере, вроде бы, про это несколько раз писали, про Mifare Classic. Там еще с программатором приходилось возиться, NFC не было :)
fotonstep
Именно. Вот начало этой темы: https://xakep.ru/2009/02/06/47074/
И то, на каком-то из сайтов геймленда она появилась на полгода раньше. Сейчас уже не помню, где именно
Akr0n
Да да. Но тогда все было сложно, а теперь у каждого второго смартфон с NFC…
darksimpson
Хм. Насколько мне известно, раньше меня этим никто не начал заниматься (по крайней мере в открытую). Если я что-то упустил тогда, было бы интересно посмотреть что. Правда.
dlinyj
Читаю, и думаю скинуть тебе ссылку, а вон ты тут ;)
darksimpson
Агась )
TimsTims
+1
Автору просто респект и уважение