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

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

H Уязвимость карты Подорожник: бесплатные поездки в наземном транспорте Санкт-Петербурга в черновиках



Почти год назад на Хабрахабре появилась статья "Исследование защищенности карты Тройка", в которой было подробно описано устройство проездных билетов и векторы атаки на систему оплаты общественного транспорта в Москве. Ещё тогда, вдохновившись прочитанным, мне захотелось попробовать применить описанные в статье приёмы к петербургскому аналогу Тройки — карте Подорожник, которая используется для оплаты поездок в общественном транспорте города.

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

Описание носителя карты Подорожник и подбор ключей шифрования


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

В качестве стандарта носителя Подорожника выбран MIFARE Plus 4K, работающий в режиме совместимости с MIFARE Classic.

Данный стандарт является усовершенствованной версией MIFARE Classic: алгоритм шифрования был изменён на AES, что позволило закрыть известные на момент выхода уязвимости. Первые MIFARE Plus появились в 2009 году и до конца 2015 года в публичном доступе не было информации о каких-либо уязвимостях в данных носителях.

В октябре 2015 года вышла в свет работа "Ciphertext-only Cryptanalysis on Hardened Mifare Classic Cards", описывающая атаку на карты MIFARE, работающие в режиме совместимости с Mifare Classic. Именно работа Подорожника в режиме совместимости позволила получить дальнейший доступ к карте. Отдельно хочу отметить, что никаких приложений (мобильных или десктопных) позволяющих взаимодействовать с Подорожником не выпускалось, поэтому вариант извлечения ключей используя реверс-инжиниринг (как в случае с Тройкой) автоматически отпал.

Память MIFARE Plus 4K разбита на 40 секторов: первые 32 сектора содержат 64 байта информации, последние 8 — 256 байт, что в сумме и даёт 4096 байт, которые указаны в названии.

Для доступа к каждому сектору используется два ключа, KeyA и KeyB — они никак не зависят друг от друга и применяются для чтения/записи соответственно.

В апреле 2016 года на Github появился репозиторий aczid/crypto1_bs, содержащий реализацию атаки описанную в научной статье. Я не буду подробно останавливаться на процессе компиляции и запуска скрипта, лишь скажу, что для атаки достаточно использовать любой libnfc-ридер, например, известный в узких кругах ACR122U.


Таким образом были получены ключи A и B от всех 40 секторов карты Подорожник.

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


После получения ключей доступа к секторам, стало возможно чтение и запись любых данных на карту. После снятия первых дампов сразу бросилось в глаза, что большинство секторов (1-3, 6, 7, 13-39) забиты нулями и никак не используются: для чего в таком случае используется карта на 4 Кб (а не на 2, например) для меня осталось загадкой. Более того, после нескольких поездок было обнаружено, что данные меняются только в секторах 4, 5 и 9. Так же сразу стало очевидно, что сектор 9 содержит в себе только данные о числе поездок за текущий месяц: значения в некоторых блоках памяти только инкрементируются и соответствуют этому показателю.

Самое же интересное происходит в секторах 4 и 5 — привожу их значения до и после одной из поездок:

+Sector: 4				+Sector: 4
F02300000FDCFFFFF023000000FF00FF	E01500001FEAFFFFE015000000FF00FF
F02300000FDCFFFFF023000000FF00FF	E01500001FEAFFFFE015000000FF00FF
FC00D11439014D04204E0001371E8066	FC00D11439014D04204E0001371E8066
E56AC127DD4548778B0019FC84A3784B	E56AC127DD4548778B0019FC84A3784B

+Sector: 5				+Sector: 5
94293901C532100E0000000000009E39	102B3901851E100E000000000000AF9B
030094293900B96D0690000000000000	0400102B3900386D9A9A000000000000
030094293900B96D0690000000000000	0400102B3900386D9A9A000000000000
77DABC9825E17F0788009764FEC3154A	77DABC9825E17F0788009764FEC3154A

Легко заметить, что первый и второй блоки в секторе 4 всегда совпадают, точно так же ведут себя блоки 2 и 3 в пятом секторе. Экспериментируя с различными балансами, валидаторами в метро и наземном транспорте и интервалами между поездками удалось выяснить следующее:

  • Первые 2 байта первого (или второго) блока четвёртого сектора хранят в себе информацию о балансе электронного кошелька карты в виде целочисленного числа, последние 2 разряда которого содержат информацию о копейках.
  • Первые 4 байта первого блока пятого сектора хранят количество минут, прошедших с 1 января 2010 года. Таким образом, информация о последней поездке хранится на карте с точностью до минуты.
  • Следом за минутами, два байта выделено для идентификатора валидатора: эти идентификаторы отличаются даже в пределах одной станции метро и получить одинаковое значение можно лишь пройдя через тот же турникет.
  • Первый байт второго (или третьего) блока пятого сектора хранит в себе информацию о кол-ве поездок в текущем месяце, аналогично той, что записана в девятом секторе.

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

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


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

Тестирование атаки производилось по следующим схемам:

  1. Пополнение баланса, сохранение дампа, трата доступных средств, восстановление дампа и попытка пополнить баланс через автомат, результат — мгновенная блокировка карты.
  2. Пополнение баланса, сохранение дампа, трата доступных средств, восстановление дампа и последующий проход в метро, результат — успешный проход в метро, блокировка карты спустя 2 часа после прохода.
  3. Пополнение баланса, сохранение дампа, трата доступных средств, восстановление дампа и последующие поездки только в наземном транспорте, результат — никаких блокировок, удалось повторить несколько раз.
  4. Пополнение баланса, сохранение дампа, трата доступных средств, восстановление дампа, поездка в наземном транспорте, поездка в метро, результат — успешный проход в метро, блокировка карты спустя 2 часа после прохода.

После блокировки карты в метро, её все ещё можно использовать в наземных видах транспорта довольно продолжительное время: внесённый в стоп-лист Подорожник работал ещё минимум 2 недели, после чего тестирование было прекращено.

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

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

Мобильное приложение Plantain


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

Для работы потребуется телефон с ОС Android 4.2+ с NFC-модулем производства NXP. Работа приложения протестирована на Yotaphone 2 и планшете Google Nexus 7.

Я занимаюсь веб-разработкой и до этого не имел дела с разработкой под Android, поэтому код может быть написан не по гайдлайнам и с использованием bad practices.

Ссылка на Github: github.com/bafoed/plantain

Готовую .apk-версию можно скачать на странице релизов: github.com/bafoed/plantain/releases






Заключение


В заключении хочу сказать, что описанные в данной статье уязвимости являются следствием ошибок, допущенных ещё при создании первых версий Подорожника. Используемые носители MIFARE Plus могут работать в режиме с использованием криптографически безопасного AES, и с какой целью на картах включена совместимость со старым, уязвимым стандартом, сказать сложно. Для исправления уязвимости необходимо значительно участить сбор и анализ данных на валидаторах наземного транспорта (по тому же принципу, как это сделано в метрополитене), усовершенствовать методы хранения данных на памяти карты, или идти в ногу со временем и обновлять аппаратные и программные составляющие компоненты под современные реалии информационной безопасности.

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

0
+1 –1
PastorGL ,   * (был изменён)
> для чего в таком случае используется карта на 4 Кб (а не на 2, например) для меня осталось загадкой

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

Сделали бы уж сразу единый проездной для всей страны (это я вздыхаю как провинциал, далёкий от обеих столиц).
0
Acuna ,  
Сам как житель «одной из столиц» еще больше подогрею Ваш интерес тем, что его даже во всех маршрутках принимают (!) )))
0
AleXP3 ,  
В маршрутках больше любят наличку. Ее потом, на конечной, водители и перебивают в безнал через «подорожник» как раз.
0
Acuna ,  
Вполне возможно, однако берут в любом случае всегда без проблем, однако с другой стороны их заинтересованность должна быть больше: на конечной перебивать меньше надо будет.
0
AleXP3 ,  
Они «перебитое» себе в карман кладут — это я точно знаю (приятель есть из автопарка). Так что наличка им больше по нраву всегда. Другое дело, что не борзеют и рожи не корчат.
0
Acuna ,  
Ахах, ясно, в карман, в общем, перебивают!) Век живи — век учись) Ну рожи, кстати, не корчат хотя-бы потому, что процент подорожников крайне мал, я сколько не езжу (езжу немного, только по делу, но все же), только у пары раз буквально видел, хотя вереница людей проходит приличная, особенно если маршрут длинный.

P. S. А вообще, зря я это узнал, мне уже даже самому неловко, они останавливаются в любом месте, где руку выставил, хоть из парадной выходи и сразу голосуй, аварийку включают чтобы виднее быть другим в потоке, так удобно, а я им подорожник за все заслуги вместо мелочи) Как говорится, «Почему-то танцуют они, а стыдно мне»))
0
DjOnline ,  
Очень не хватает этого в Москве. Замучился мелочь носить на всякий случай.
0
Acuna ,  
Огого! Вот это поворот! Я думал у вас там все в облаках давно, а вы тут с мелочью до сих пор ходите :DD Ну а в метро у вас, кстати, как, все те же пластиковые жетоны по-прежнему? И вообще какая у вас система оплаты транспорта на данный момент присутствует? У нас-то электронные проездные на все виды транспорта уже были когда я еще в школе учился (в прямом смысле), то есть лет десять назад минимум…
0
DjOnline ,  
Причём здесь метро? Я про оплату в обычных маршрутках. Бывают конечно государственные маршрутки с турникетами и карточками тройки, но это редкость.
+1
soniq ,  
Так в Москве как раз все маршрутки и стали «государственными», с турникетами и соответствующим расписанием. Маршрутки в область пока остались на старой схеме, но скоро это обещали «исправить».
0
Acuna ,  
Я понимаю, что речь идет о маршрутках, ибо сам и начал эту тему. Про метро я просто спросил, пользуясь случаем.
0
dimas ,   * (был изменён)
Эт для каких маршруток в марте 2017 мелочь носить приходится? :) Разве что только для областных…
0
DjOnline ,   * (был изменён)
Да, Реутов, Новокосино-2, 100м от Москвы :)
0
dimas ,  
Ну так административно область. Зато можно порадоваться что нормальные маршрутки остались, а не оленеводный бардак…
0
DjOnline ,  
Почему бардак? :)
Впрочем кажется я видел на маршрутке поддержку карты Стрелка, просто пока ей не пользовался.
0
dimas ,  
Потому что маршрутки вырезали, а график автобусов до сих пор не пересчитали… В результате мне приходится к соседней станции метро ездить, если не хочется стоять по пятнадцать минут в ожидании и изображать шпрот в банке…
0
bromium ,  
В мае московскую тройку и питерский подорожник собираются объединить, вот зачем.


И что? В тройке используется два сектора, в подорожнике, как пишет автор, 3. Т. е карты на 1кб (16 секторов) было бы достаточно.

А т. н. «объединение» — это просто запись данных разных систем в соответствующие сектора памяти карты.

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

Просто разгадка в другом: карта Подорожник основана на самом дорогом чипе семейства Mifare Plus, хотя, как видим, подошел бы самый дешевый (потому что возможности самого дорогого попросту не используются), например, Mifare Plus S1K (SE 1 k).

Разница в цене чипов — процентов 40%, если не больше. А карты закупаются за счет средств бюджета…
+3
SyrexS ,  
В кассе карта стоит 50 рублей, так что за карту все таки платит пользователь
0
Pakos ,  
А единый проездной невозможен
Тарифы не беда — на карте хранится сумма (в одном из режимов).
0
M_AJ ,  

А как быть с ключами? Никто не даст чужой системе свои ключи. Короче, проще везде внедрить оплату через PayPass

–2
Kriger91 ,  
Так уже везде внедрена.
0
M_AJ ,  

В смысле? В Питер нельзя расплатиться PayPassoм в наземном транспорте в регионах наверное тем более.

0
sleeply4cat ,  
А в метро можно?
Я месяца два назад пытался пройти, турникет показал «красный глаз».
0
M_AJ ,  

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

0
ingumsky ,  
К левой же.
0
kerberos464 ,  
В метро давно уже можно (год, как минимум), но проходить надо через турникет, ближайший к будке охраны, и прикладывать карту нужно к валидатору, который тоже расположен ближе к будке охраны.
0
KestL ,  
Неа, валидатор всегда слева для PayPass, справа для транспортных карт.
0
+1 –1
M_AJ ,  

Извиняюсь, к ЛЕВОЙ а не правой.

0
sleeply4cat ,  
а, ну тогда я всё делал правильно. Надо будет попробовать ещё раз, когда в метро буду.
0
Andrusha ,  
Её чуть дольше держать нужно, чем проездной, ещё иногда подвигать туда-сюда. У меня точно работали Тинькофф и Русский Стандарт.
0
sleeply4cat ,  
не-а, вчера потыкался — карта считывается, турникет светит красным, деньги не снимает.
правда, использовал телефон с HCE, но не думаю, что разница существенна, PayPass — он и в Африке PayPass.
0
kicum ,  
Если пробовал ApplePay — не получится, но есть куча сторонних приложений, к которым можно приявзать карту — они работают. Просто выбери в сторе, насчет Android- хз
0
sleeply4cat ,  
Ведроид, SecureElement'а нет, так что карты не привязываются, только через посредников с виртуальными.
0
Andrusha ,  
А, ну с телефона я не пробовал, только карты. У меня телефон и в магазинах иногда не срабатывал.
0
dezconnect ,  
Все работает отлично и через телефон и через карты с paypass (Тиньков, Альфа)
0
sleeply4cat ,  
Nexus 5x, виртуальная карта Тиньков, «Кошелёк».
0
Acuna ,  
На самом деле тот же подорожник часто нужно немного подержать, иногда подвигать туда-сюда. Часто показывает красный. Хотя для меня это всегда было загадкой, ибо если он и показывает красный, значит саму карточку он определяет как таковую, а не просто как кусок пластика, однако возможно не успевает считать информацию с нее. То есть типа как «Да, я понимаю, что это какая-то информация, но мне нужно время, чтобы ее прочитать»)
0
Andrusha ,  
Может, конкретная карта глючная? У меня подорожник идеально отрабатывает: прикасаюсь коротким ребром к кругу, если записаны «40 поездок на 30 дней», то моментально; если деньги, то чуть дольше, но ничего двигать не надо. Вот считыватели банковских карт это да, аттракцион.
0
Acuna ,  
Хм… Вот дела… Ребром — это прям вообще торцом? Я ее как-бы свайпаю тремя пальцами по датчику, чтобы была максимальная площадь охвата, где-то секунду-две примерно… Думал этого более чем достаточно. И кстати такое только в метро, в маршрутках все нормально. Возьму у знакомой ее подорожник, проверю если вдруг в метро окажусь, самому даже уже интересно.
0
sleeply4cat ,  
Странно, ни разу такого не встречал. Вероятно, у вас дефектная карта.
0
Acuna ,  
Вот дела… Никогда-бы не подумал, если бы не спросил) Возьму у знакомой ее подорожник, проверю как-раз, когда буду в метро в ближайшее время.
0
Pakos ,  
Там есть какая-то несогласованность между банками и метро, в метро карта может быть в стоп-листе после первой попытки прохода, но почему — никто не знает. Потом само рассасывается. Банк отсылает к метро, метро — к банку. У меня нет такой карты. потому со слов коллеги, когда-то пытавшегося.
0
Alexandr_c ,  
У меня еще более интересная ситуация, плачу через Apple Pay. На часах карта походу находится в стоп-листе после нескольких поездок. А на телефоне все работает нормально. Видимо id карты отличается даже не разных устройствах.
0
dezconnect ,   * (был изменён)
Могу предположиить что не у всех банков номера карт соответствуют алгоритму Луна (Привет Райфайзен!)
0
Asaelko ,  
Есть волшебная официальная ссылка, по которой можно проверить последние платежи и разрешить стоп-конфликты (если с карты в последний раз списались деньги «в долг», например, то есть проход был разрешен, но снять не получилось)

http://metrospb.uniteller.ru/auth/login
0
GerrAlt ,  
Не совсем так, можно расплатиться карточкой как минимум на автобусном маршруте до Пулково (если не ошибаюсь PayPass не обязателен).

Также можно купить билет на электричку с оплатой по карте через автомат.
0
Syrex ,   * (был изменён)
В Москве она внедрена ну оооочень условно, оплатить проезд можно картой PayPass в основном в центре, и то чаще всего только на одном входе станции из нескольких, в наземном транспорте — так вообще нигде, оплата возможна только тройкой или единым.
В Питере она внедрена на всех станциях метро (было приятным сюрпризом во время поездки в Питер), но в наземном транспорте получилось воспользоваться только в автобусе от Пулково до Питера, в остальных автобусах либо подорожником оплата, либо вообще только наличными
0
ingumsky ,  
Сейчас ещё по Невскому ходит несколько маршрутов, работающих с PayPass, а вообще тут на днях Газпромбанк выиграл конкурс на оборудование всех автобусов валидаторами для PayPass.
0
23rd ,  
А есть ссылка?
0
+1 –1
ingumsky ,  
Первая ссылка в Гугле:
http://www.the-village.ru/village/city/transport/258466-karty-avtobusy-gazprombank
0
+1 –1
osipov_dv ,  
Вы хотите за поездку платить 50 рублей, вместо 7 (или сколько там в регионах)?
0
Pakos ,  
Почему 50? У меня поездки стоят 34, 33, 32 и т.д. в зависимости от её номера, кладу сумму — на карте сумма, никакого количества поездок. В чём проблема снять 7 рублей?
0
SyrexS ,  
Потому что на карту можно положить не только деньги, но и проездной на количество поездок.
А вот что спишется при наличии и денег и поездок на карте — непонятно
0
kloppspb ,   * (был изменён)
Так о том речь и идёт: разруливается же как-то ситуация, в которой на разных видах транспорта разная стоимость поездки. И ещё интересней: у нас есть автобусы, на которых поездка в пределах одной части маршрута стоит N, а если заехал в соседнюю зону — уже 2N. И снимают оплату сразу, а не 2 раза. Значит, проблема как-то решаема.

Впрочем, приём оплаты с обычных карт, как это уже сделано в метро, может свести проблему на нет.
0
osipov_dv ,  
Даже на наземном транспорте и метро цена поездок различается, в случае с электронным кошельком будет списываться корректная сумма. Но это не самый популярный вариант, так как заметно дороже абонемента. А в абонементе все поездки стоят одинаково, что метро, что наземка.
0
kloppspb ,  
При нерегулярных поездках может быть как раз наоборот. Если покупать мало поездок, то выгода почти никакая, но есть шанс нарваться на необходимость докупать, причём в самый неподходящий момент. А если много, то пропадут. Поэтому и сам кошельком пользуюсь, и знаю много людей, которые тоже.
Но ведь подорожников и так много, если верить сайту (раздел «Виды электронных карт», чем отличаются не вникал), может имеет смысл разделить карты с кошельком и поездками?
0
osipov_dv ,  
Ага, разделить, потом выяснить что кто-то пользуется только наземным или только метро… и вернуть обратно билеты на каждый вид транспорта.
0
+1 –1
kloppspb ,  
Так, стоп. А в чём, собственно, проблема? Если я кладу деньги на кошелёк, то с него и списывается. Пополнение на той же карте поездок — другой юзкейс, и после такого пополнения поездки и списываются. Получается, что там какой-то переключатель режима стоит, что ли? Который дёргается при пополнении.
0
osipov_dv ,  
сперва списываются поездки, потом если их нет, то деньги из кошелька.

PS: я не про подорожник, я про тройку говорю.
0
kloppspb ,  
В подорожнике при пополнении кошелька на терминале кассира высвечивается и сумма на кошельке, и количество поездок, соответствующее этой сумме. А вот когда проверяю вручную в аппарате, то поездки уже не показываются вообще.
0
osipov_dv ,  
в приложении тройка показывается все, не знаю, работает ли оно с подорожником.
0
luxeon8 ,  
В подорожнике такая же система. Сам храню на карте поездки для метро (часто езжу) и деньги для наземного транспорта (редко).
0
Pakos ,  
Выход — «электронный кошелёк», где стоимость различная а на счету — внесённая сумма денег. Даже не пользуясь наземным транспортом (но имея варианты, а не фиксировано «40 поездок в месяц») оно выгоднее.
0
DjOnline ,  
Раньше, года 4 назад, когда только начали появляться банковские карты с чипом метром, например Транспортная от Русского Стандарта, была прогрессивная цена поездки, чем больше ездиешь, тем дешевле каждая. Не было никакого смысла покупать обычные 60 поездок. Затем, с запуском Тройки, сделали такие же тарифы, и теперь на Тройке и на банковской карте единая цена за поездку всегда 35, без прогрессивной шкалы. Пропал всякий смысл этим пользоваться, если хоть иногда, но ездиешь, потому что проще купить 60 поездок, которые действуют 3 месяца, и стоят 28.3р за поездку.

Вот если бы сохранилась прогрессивная шкала, и она автоматически действовала бы в каждом городе страны (путь даже индивидуально) — вот это было бы удобно. В Питере вообще странная система — туристу в Питере даже на неделю нет смысла покупать Подорожник и платить ещё за сам пластик, цена за поедку практически такая же как и поштучно покупать жетоны. И да, это удивляет, т метро в Питере дороже Москвы.
0
M_AJ ,  
С января 2017 Подорожник для туриста имеет смысл, так как жетоны поштучно теперь по 45 рублей, против 36 по Подорожнику (с 11 поездки 35, с 21 — 34 и так до 32).
0
sw0rl0k ,  
Ну с Тройкой всё понятно. Если есть и деньги и поездки, то будут списываться сначала все поездки, а потом деньги.
0
+1 –1
Animegravitation ,  
А вы не вздыхайте а используйте правовое поле. Соглас ЗоЗПП и закона о национальной платежной системе предприятия с выручкой более 120 миллионо в год обязаны принимать национальные платежные средства — в частности карты МИР.
Мне неизвестен ни один терминал который бы принимал только карты мир но не принимал бы карты Visa и Master Card и Samsung Pay.
Пишите претензию в транспортное предприятие города с требование предоставить возможнос оплаты картой МИР. Если город более 200 000 то наверняка выручка главного перевозчика более 120 миллионов.
Если вам отказывают — пишите обращение в Роспотребнадзор и прикладывает ответ перевозчика.
Штраф для юр лиц от 30 до 50 тысяч рублей. плюс предписание выпишет Роспотребнадзор
Шевелимся граждане — шевелимся :)
+5
+6 –1
bromium ,   * (был изменён)
Вы уже написали, или только подстрекаете?

Обыватели забывабт, что платежные системы и банки берут за эквайринг процент (в районе 2%) — плюс нужно оборудование соответствующее (прошедшее сертификацию платежных систем). Кто за это заплатит? В конечном итоге, конечно же пассажир (ведь на него перенесут эти затраты).
Кто выиграет: платежные системы и вендры оборудования.

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

Или такой вопрос: на что важнее потратить деньги — на возможность оплаты paypass или на кондиционеры? Я Тройку и так пополняю банковской картой, так что paypass мне не особо и нужен.

А упомянутый Вами закон, по сути, лоббирует интересы банков и платежных систем (в т. ч. зарубежных) — они получает увеличение своих обротов просто так, потому что так всех обязали. Заметьте, в законе ничего не сказано об ограничении и регулировании эквайринговых комиссий, которые в нашей стране запредельны.

Вот и получается очередной «Платон 2.0» или ЭРА-ГЛОНАСС: новый вид дани без положительных результатов взамен (нам обещали, что с вводом Платона средства от него пойдут на ремонт дорог. Ну что, дороги лучше стали?).

Как легко же манипулировать людьми: создали им некое «удобство», но содрали за это деньги:

за обслуживание карты — плати, за смс- информирование плати.

расплатился картой — торговая точка платит банку, соовтественно, в цену товара включает комиссию.

захотел снять свои же деньги выше некоего лимита — плати.

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

Да, удобство бесспорное, но почему в европе за эквайринг дебетовых карт комиссия 0,2%, а у нас в 10 раз больше?

ps понимаю, что навлеку на себя «праведный гнев», правда — болезненная штука. Но молчать больше не могу
0
pfzim ,  
Полностью согласен!
+2
+3 –1
Animegravitation ,  
Уже написал :)
Успокойтесь — 2% от платежа ничто в сравнении какие %ты тупо разворовываются или тратятся не по целевому направлению.
Тем более есть закон и его надо соблюдать.
Почему в метро можно оплатить поездку картой а в автобусе нельзя?
И да мне надоело таскать вечно «железо» и мелочь
По поводу стоимости эквайринга это вам к банкам и МПС — потребитель тут никак повлиять не может
А нал по вашему не надо обслуживать?
А стоимость инкассации равна 0?
Или минусы вы видите только в безнале а у нала сплошные плюсы?
СМС прошлый век -когда есть ИБ и push уведомления

Зато при наличии кредитки — ты всегда можешь оплатить покупку, а не ой извинте я забыл деньги дома в нужном количестве.
Или у меня размена нет.
И если у вас украдут наличку то вы её потеряете навсегда а при утере или краже карты её можно быстро заблокировать
Так что везде есть плюсы и везде есть минусы
+11
habrahabr ,  
Комментарий для СМИ, которые завтра напишут у себя «Программист нашёл уязвимость в карте Подорожник» и по традиции забудут ссылочку на Хабр — вы это, не забывайте! )

А статья отличная!
+3
+4 –1
kolayuk ,  

Не программист, а "русские хакеры" (с)

+1
SravniRu ,  
А мы вот обошлись без «хакеров» в заголовке, например. Правда, и без «программистов».
И ссылочку поставили)
https://www.sravni.ru/novost/2017/3/16/iz-za-ujazvimosti-po-transportnoj-karte-podorozhnik-mozhno-ezdit-besplatno/
0
+1 –1
leshakk ,  
«В Москве хакер взломал «Тройку» и две недели бесплатно катался в общественном транспорте»
… Потом программист написал приложение, чтобы все пассажиры могли обманывать турникеты на входе…
http://www.msk.kp.ru/daily/26531/3551729/
Ждём продолжения от самых «компетентных» журналистов…
0
Busla ,  
заголовок:
Юный петербуржец взломал «Подорожник» и бесплатно ездил по городу

https://life.ru/t/life78/986299/iunyi_pietierburzhiets_vzlomal_podorozhnik_i_biesplatno_iezdil_po_ghorodu
0
leshakk ,  

Эх, засудить бы разок такую вот "акулу пера"....


Известный комикс про учёного и журналиста...
image
0
KonstantinSpb ,  
Совпадающие блоки это скорей всего хэш от данных, а два их скорей для надежности.
А т.к. делалась перезапись дампа в лоб, то логично, что карта блокировалась очень быстро, т.к. было несовпадение по метке времени.
+1
bromium ,  
Дамп ни чем не отличается от оргинала, в этом суть replay атаки. О какие несовпадения по метке Вы говорите?
Просто в метро турникеты работают в режиме онлайн (ну, обмен с сервером происходит в пределах 2-х часов, как видим) — и там, как вариант, отслеживают по остаткам балансов карты.

А наземный транспорт в оффлайне — выгрузка, скорее всего, раз в день вечером. Ну и, похоже, мониторинга мошеннической активности не делают.

Возможно, после выхода статьи, начнут делать
0
Jef239 ,  
Насколько я слышал, турникеты в Питере всегда работали в полном онлайне. 2 часа — это период запуска задачи, производящей контроль транзакций.
+1
M_AJ ,  

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

+4
KonstantinSpb ,  
Несовпадение по метке времени следующее, на карте записана временная метка Т1, с этой меткой вы сохранили дамп, потом прошли через турникет и помимо списания баланса, изменилась метка времени на более новую Т2 > T1. Потом снова записываем дамп, проходим и система прочитала временную метку для вашей карты, сохранила. Потом при передаче этих на данных на сервер, будет видно, что последняя метка использования больше сохраненной, карта блокируется.
0
antoo ,  
Именно такой логикой я и руководствовался перед тем, как решил попробовать 4-й способ из статьи. Наземные валидаторы не синхронизируются (или делают это очень долго), но обновляют временные метки и делают правильные имитовставки с балансом. Способ не сработал, поэтому можно сделать вывод, что проверяется всё-таки не только временная метка, но и вся история пополнений подорожника.
+2
v0s ,  
Те совпадающие блоки
F0230000 0FDCFFFF F0230000 00FF00FF
F0230000 0FDCFFFF F0230000 00FF00FF

— это формат value-блоков в Mifare, они хранят по одному 4-байтовому числу каждый.
Структура такая: N, ~N, N, 00 ff 00 ff

Порядок байт little endian, значит тут число 0x23f0 = 9200 = 92 руб 00 коп.
Ну и соответственно 0x23f0 = ~ 0xffffdc0f

А именно value-блоки выбраны, потому что их можно уменьшать специальным запросом к карте: вместо того чтобы давать турникету ключ на запись, ему выдается ключ на чтение+уменьшение. Украдешь ключ из турникета — сможешь только списывать деньги с карточек :-)
+8
bromium ,  
Автор забыл упомянуть, что эксплуатация упомянутой уязвимости возможна лишь при условии, что ключи к одному из секторов карты должны быть известны. К «счастью», один из секторов Подорожника имеет стандартные ключи (FFFFFFFFFFFF).

Но даже если бы это было не так, то все равно, криптопротокол Mifare Classic взламывается за секунды с использованием простейшего сниффера. Обэ том известно в узких кругах еще с 2008 (!) года. Кстати, вот почему Mifare Plus появился в 2009 году (проиводитель «закрыл уязвимость» — вернее, добавил поддержку AES).

Почему не используется AES — тоже объяснимо. Mifare Classic можно было взламывать буквально за секунды, используя card only attack (там были проблемы с предсказуемым датчиком случайных чисел).

В Mifare Plus эту аппаратную ошибку пофиксили. Ну а интеграторы и успокоились — ведь чтобы поддержать AES надо переписывать ПО и в ряде случаев делать аппаратный апгрейд инфраструктуры. А это дорого, гораздо проще под хорошим предлогом закупать более дорогие карты и использовать их в небезопасном режиме (т. е. ничего не менять в системе): чиновники ведь все равно ничего не понимают (или делают вид, что не понимают)
+4
bromium ,  
В подтвержение слов вот такой ответ чиновника можно найти на просторах интернета. Понятно, что он подписал бумагу, ничего не понимая в нем, полагаясь на компетентность своих исполнителей.

Забавно читать про AES и криптостойкость, когда понимаешь, как все обстоит на самом деле
0
amf3tam1n ,  
Да там еще все более запущено.
Основной недостаток «Тройки» — организация хранения данных на карте (фиксированные сектора) вместо использования описания приложений через MAD. Отсутствие диверсификации и AES. Подозреваю что в «Подорожнике» все те же самые болячки. Такое ощущение, что при разработке системы документация от NXP не читалась совсем.
Из-за отсутствия заголовка вылезают разные проблемы. Например невозможность расширить карту для использования другими поставщиками услуг. При этом есть куча зарезервированных секторов которыми никто и никогда не воспользуется.
Невозможность чтения списка приложений (т.к. его нет). Соответственно теряется гибкость работы системы. Например, если у человека соцкарта и на ней кошелек тройки, то можно было бы при чтении только одного сектора можно было бы разделить логику выполнения чтения с карты (сначала сектор соцкарты, потом сектор электронного кошелька) и т.д.
При наличии MAD, можно было бы использовать текущий носитель для расширения функционала, например записать кошельки других транспортных систем или данные СКД, при этом не важно какие сектора уже заняты.
+2
aamonster ,  

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


А потом просмотрел. А то недоступность логов карты раздражает.

0
difiso ,  
Кстати да, полезная вещь. Такое есть в Лондоне с их OysterCard. Подходишь к терминалу, и вперед: узнать баланс, пополнить, посмотреть историю. Можно посмотреть на каком автобусе ехал, узнать где, когда и во сколько проходил турникеты метро, есть и цена каждой поездки. Правда там это все имеет смысл, т.к. у них цена поездки на метро зависит от того где зашел и где вышел, а также от дня недели и от времени входа (час пик, день или ранее утро). У нас не так все хорошо, но тоже было бы полезно.
+1
Antelle ,  

Но оно из онлайна берётся, не с карточки.

+1
GamePad64 ,  

Карта Стрелка в Московской области умеет это всё: пополнение баланса с банковской карты (без дальнейшей записи балансе на карту через терминал), просмотр истории поездок и баланса через мобильное приложение, sms (или push) о новых поездках
Имхо, самая удобная карточка из трёх.

0
n_demitsuri ,  
Справедливости ради надо заметить, что Стрелка — самая ненадежная из трех. Даже сейчас проблемы с работой карты бывают, а уж на этапе внедрения их было совсем полно. Было бы очень интересно, если бы кто-нибудь оттуда рассказал про внутреннее устройство.
0
g13serj ,  

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

0
QtRoS ,  
Эх, жалко, что статья не такая полная получилась. От захватывающей истории исследования «Тройки» я лично до сих пор в восторге, помнится даже под впечатлением (будучи в отпуске на отдыхе) хотел так же разобрать по косточкам билет на какой-то аттракцион, но под рукой девайсов не было…
+1
+2 –1
nerudo ,  
Автор ведь помнит, что в общественном транспорте имеется видеонаблюдение?
0
PEgorov ,  
Там, насколько я помню, весьма хреновенькие камеры, которые в случае чего позволят искать автора по приметам уровня «мужчина средних лет, среднего роста, одет в джинсы и черную куртку», которым соответствуют пару миллионов москвичей.
0
Anisotropic ,  
Milfare classic? Понятно почему оно не взлетает на моих телефонах, тут NFC его не поддерживает
0
frog ,  
На всякий случай — если телефон Android, то в xml файлике для android.nfc.action.TECH_DISCOVERED должны быть перечислены все стандарты. Метки/карты неупомянутых там стандартов будут игнорироваться. Просто народ регулярно в сети удивляется, почему одни метки приложением видятся, а другие нет.
0
DrZlodberg ,   * (был изменён)
Стоит напомнить, что в метро у турникетов дофига камер и, вроде, тех кто светится в одном и том же месте с подозрительными картами могут и на беседу позвать. В автобусах (по крайней мере в мск) кстати тоже, но там некому ловить.
0
M_AJ ,  

Через турникет больше одного раза не пройдешь, карта попадет в ЧС. Ну разве что повезет и он будет в офлайне, и ЧС выгрузится с задержкой.

0
DrZlodberg ,  
Это не важно. Смысл в том, что палится (сразу или постфактум) попытка прохода (как минимум в процессе экспериментов) с не валидной картой, а по камерам и меткам времени легко получить картинку. Дальше дело внимательности местной охраны.
0
M_AJ ,  

Когда автор прикладывал карту, и обнаруживал, что она заблокирована, "мужик в будке" должен был увидеть это на терминале, так что камеры и не нужны. Другое дело, что им обычно нет до этого дела, хотя иногда бывают облавы.

0
DrZlodberg ,  
Мужик в будке мог просто отвлечься или просто некого позвать было. Но вообще метробабки — это отдельный крайне злобный подвид человечества, и просто так они обычно никого не отпускают. Ну и в автобусе мог спалиться. Вероятность попасться минимальная, но если много раз и в одном районе — могут и подрядить местных.
+2
TerminusMKB ,  
«Дальше ваши рыжие кудри примелькаются, и вас просто начнут бить» © Остап Бендер
+1
ebragim ,  

Да кому это надо? Вашу карту просто банят, закупать карты сотнями для одноразового использования слишком затратно и не окупает затрат.

0
DrZlodberg ,  
Да тут дело скорее не в выгоде, а в поимке таких эксперементаторов. Пока они ещё палятся. А то потом сообразят генератор номеров и ищи… Просто у некоторых иногда с карт будут пропадать 1 поездка, мало кто даже заметит.
Хотя это лишь мои соображения. Может и действительно пофиг.
0
M_AJ ,  

Там же еще номер чипа учитывается

0
DrZlodberg ,  
Если так, то да, сложнее и дороже. Тут уже эмулятор нужен. :(
0
Mimizavr ,  
Лично знаю людей, которые ездят так уже полгода на одной и той же карте и пока не заблокировали. Самому удивительна такая дыра.
0
nipponspb ,  
Да, подтверждаю, такое ощущение, что в ПО для наземного транспорта вообще какой-то косяк, и карты на валидность в принципе не проверяется.
Знакомый инвалид потерял карту, льготную, сделал дубликат, исходную вроде «заблокировали». Потом нашел первую, оказалось, она спокойно работала в наземном траспорте. И какое-то время у него было две карты на наземный транспорт. Пока он по ошибке не прошел с невалидной в метро, и ее заблокировали по-настоящему. Второй раз он такой дубликат сделал сознательно, и в метро с ним не ходит, но иметь две карты ему довольно удобно в некоторых случаях.
Как я понимаю, так может поступить любой обладатель права льготного проезда.
Возможно сейчас эту дырку прикроют, увы.
0
VBKesha ,  
Вопрос немножко не в тему но какие ещё бываю карты кроме MIFARE а то купил как то ради интереса модуль Mifare RC522 те две карты что шли вместе с ним читаются нормально. Всё остальные беспроводные карты что у меня были (ключи от офисов, разные скипасы) не читаются хоть убейся. Вот интересно что бывает ещё и как можно определить тип попавшейся беспроводной карты.
+1
a1ien_n3t ,  
От оффиса и вские скипасы скорее всего EM-Marin.
0
envtmp ,  
Статья отличная, хотелось бы увидеть подобный разбор для совмещённых карт «Тройка-Стрелка», дающих возможность жителям ближнего замкадья использовать одну пластиковую карту для проезда по Мск и области.
–3
+1 –4
sotnikdv ,  
Я хочу только сказать, что то, что сделал автор абсолютно незаконно и будет являться в лучшем случае административным правонарушением. При этом, как уже здесь указали, сопоставить по нескольким временным отметкам снимки с камер и найти нужного человека на камере — элементарно. Как и во многих случаев отследить чья карта по пополнениям и т.д.

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

Поэтому вы бы ваши испытания в поле проводили бы как нибудь или совершенно легально или (не рекомендуется) максимально анонимно.

Просто взгляд со стороны.
0
Bismuth208 ,  
Поразительно, что данные хранятся в настолько открытом виде!
Жаль, что как написали выше, движок нашей реальности быстро найдет вмешательство такого ArtMoney.
+1
NAI ,  
Году в 2008 были уже статьи на тему БСК. С тех пор известно что:
Количество поездок (баланс) в петрбурге хранится в двух местах — на карте и в БД (метрополитена?). При разнице данных, карта блокируется. Метрополитен подключен напрямую, транспорт синхронизируется раз в сутки (когда транспорт приходит в автопарк).

Эта та причина, по которой при пополнении карты через интернет, перед использованием ее необходимо приложить к валидатору. Если пополнить баланс и попытаться пройти с несинхронизированными данными — карта лочится.
0
TeddyJack ,  
По идее, если в БД баланс больше, а на носителе меньше, то тогда надо при первом контакте перезаписывать носитель в большую сторону. А если на носителе больше, чем в БД, значит был взлом и карту надо блочить.
А почему карту не использовать просто как идентификатор, а баланс хранить только в БД? Очень медленное к БД обращение?
0
NAI ,  
Баланс хранится на карте для наземного транспорта. Если автобус не оснащен интернетом, то как проверять БСК? Скорее всего это некоторый аварийный режим работы (возможно просто пережиток прошлого). В моем первом сообщении конечно же содержится ошибка — карта блокируется только если баланс в БД меньше чем баланс на карте.
0
Leeb ,   * (был изменён)
В метро очень жёсткие тайминги на работу с картами. ЕМНИП, около 200мс. Сделано для того, чтобы перед турникетами не скапливались очереди.
0
PEgorov ,  
А вот давно интересно было, я правильно понимаю, что сейчас возможно склонировать тройку? И ее даже не забанят до тех пор, пока вы не будете делать что-то странное, типа прохода на ВДНХ по оригиналу и проходу на Парке Культуры по клону?
0
a1ien_n3t ,  
Нет клонировать не получится. Так-как есть UID карты он прошивается при изготовлении, и не подлежит изменению.
А от UID рассчитывается имитовставка.
0
Zolg ,  

В принципе есть китайские клоны mifare с перезаписываемым нулевым сектором (не баг, а фича)
Но не факт, что они достаточно клоны с точки зрения турникета метро

0
BasilioCat ,  
Не понятно, почему до сих пор никто не сделал эмулятор самой карты Mifare. И почему не отреверсили валидатор из наземного транспорта (они десятками ломаются, наверняка можно найти) для получения алгоритма генерации имитовставки?
0
Zolg ,  
Что значит «эмулятор mifare»? Клоны той, или иной степени совмстимости китайцы и не только штампуют многомиллионными тиражами. Думаю, что большинство типа mifare карт внутри содержат чип производства не nxp. Но у 99.9+% этих клонов сектор 0, как и положено, не перезаписываемый.
«Найти» валидатор из наземного транспорта ?!?!? А зачем ?!?!? Это крайне сомнительное с правовой точки зрения действо выходит далеко за пределы удовлетворения любопытства и имеет смысл только, если вы решили конкурировать с кассами метро, а не просто just for fun разобраться «где лажанули разработчики“. Такие “конкуркнты“ может и “находили» валидаторы, но врядли выложат результаты исследований на гитхаб.
И, кстати, вам приходилось считывать защищенную от считывания прошивку мк? Не самая простая процедура.
+1
antoo ,   * (был изменён)
Есть вот такой.
0
KonstantinSpb ,  
Интересные девайсы, как говорится, всё уже придумано до нас
0
Konachan700 ,  
В валидаторе чип с аппаратным AES256 на прошивку, типа этого. Ключ внутри чипа, WriteOnly, OTP. JTAG выключен. Оперативка встроена. Что и как там можно реверсить? Даже в условиях крутой лаборатории это сверхсложная и крайне дорогая задача.
Карты же китайцы худо-бедно отреверсили и продают, специально для копирования, с изменяемым нулевым сектором.
0
Zolg ,   * (был изменён)
Не совсем. Даже если ее склонировать (о трудностях — в комментариях выше), для использования и оригинала и клона нужно синхронизировать их содержимое после каждого прохода.
0
kerberos464 ,  
Не знаю, почему, но программа Plantain у меня работает странно — все три имеющихся подорожника опознаёт, показывает их UID, но «почти» не показывает баланс и инфу о последней поездке.
Говорю «почти» — потому что прикладывал карты сотню раз, а то и больше, но инфу показало только два раза.
Телефон — Samsung Galaxy S3/747, прошивка — цианоген мод 5.1.1, одна из стабильных.
0
VereVa ,  
автор удалил приложение с github :)
0
Dimchansky ,  
0
Mayflower ,  
Автор удалил приложение с github, думаю его использование действительно незаконно. Я знаю, что многие хабраюзеры заинтересовались приложением (лично у меня в почте уже 2 письма о нем за последний час). В связи с этим предложение к хабрасообществу: создать на основе текущего кода приложение только с функцией чтения информации (только с ключами A4 и A5), я думаю многим этого очень не хватает.
0
tech42 ,  
На текущий момент найти выгрузить приложоление можно. Рекомендую автору с концами удалить репозиторий.
0
Dimchansky ,  
На github уже 16 форков. Наглядный пример эффекта Барбары Стрейзанд.