Дослідження захищеності карти Трійка

Карта трійка

Карта Трійка представляє із себе універсальний поповнюється електронний гаманець, який широко використовується в системах оплати громадського транспорту Москви з 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). Так як програма дозволяє проводити безпосередній запис балансу на карту, очевидно, що воно містить ключі для читання і запису. Далі будуть описані кроки реверс-інжинірингу додатки для отримання необхідних даних.

Завантаження АПК-архіву


Для вивчення коду необхідно отримати додаток у вигляді інсталяційного архіву АПК (Android application package). Простіше всього це зробити, використовуючи один з численних онлайн-сервісів для завантаження АПК, наприклад apkpure.com. За допомогою даного сервісу можна завантажити будь-які додатки з Google Play Market на комп'ютер.

image

Декомпіляція програми


APK-файл додатка Android є архівом, всередині якого знаходяться файли ресурсів, конфігурації, графіка та інші мультимедійні дані, а також файл classes.dex, який є скомпільованим кодом програми.
За допомогою утиліти ibotpeaches.github.io/Apktool/ APK-файл може бути розпакований. Разом з цим файл classes.dex буде розкладений на безліч файлів формату *.smali.
Smali — це формат вихідних текстів для Dalvik, віртуальної машини Android. Це низькорівневий мова, мова асемблера Dalvik. Файли будуть мати порядкові імена на кшталт a.smali, b.smali, і т. д., всередині оголошення класів, методів та інструкції віртуальної машини. Структура папок буде розгорнута у відповідності з назвою пакетів класів.

image

Таким чином було отримано розгорнуте за складовими і готове для аналізу і модифікації додаток. Однак аналізувати smali-код досить складно. По-перше, код містить велику кількість допоміжних інструкцій і не зручний для читання людиною. По-друге, не існує доступних інструментів для роботи з кодом (підсвічування синтаксису, рефакторинг, навігація по класах і методів).
Набагато зручніше було б використовувати для аналізу високорівневий вихідний код на мові Java, далі буде розглянуто процес його отримання з того ж APK-файлу.

Конвертація Dalvik Executable (dex) в Java Archive (jar)
Для аналізу коду програми необхідно конвертувати .dex файли, отримані з APK архіву, в .jar файли, які далі можуть бути декомпилированы у вихідні тексти на мові Java. Це можна зробити з допомогою програми dex2jar github.com/pxb1988/dex2jar. Як очевидно з назви, вона конвертує .dex файли в формат .jar. Оскільки конвертується тільки код, без ресурсів, конфігураційних і медіафайлів, .jar-файл на виході зазвичай менше за розміром, ніж вихідний АПК.
image

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

Аналіз вихідного коду



Отримані за допомогою Java Decompiler вихідні тексти можуть бути завантажені в будь-IDE (Integrated Development Environment) для більш зручного вивчення. Наприклад, Android Studio.
Декомпілятор не завжди ідеально обробляє проект — іноді він не справляється і залишає частини smali-коду. Але це не критично, так як головним завданням на даному етапі є аналіз коду. Основною метою пошуку у вихідних текстах програми були ключі для доступу до секторах карти Трійка, опис формату зберігання даних в областях пам'яті карти, що містять баланс електронного гаманця та механізм поповнення балансу карти.

image

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

класи в коді програми «Мій проїзний»
image

Відключення перевірки TLS-сертифіката



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

В додаток «Мій проїзний» вбудована перевірка відбитка сертифіката для запобігання підміни сертифіката і прослуховування переданих даних на мережному рівні. Так званий Certificate Pinning.

функція перевірки відбитка TLS сертифіката
image

В даній перевірці явно задано SHA1 відбиток сертифіката, тому в разі підміни сертифіката перевірка не буде пройдена і з'єднання з сервером встановлено не буде. Навіть у разі випуску сертифіката від іншого сертифікаційного центру.

ланцюжок сертифікатів та відбиток сертифіката bmmobile.bm.ru
image

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

цикл перевірки відбитка TLS сертифікатів
image

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

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

Складання модифікованої програми



Щоб застосувати внесені у вихідний код зміни, необхідно скомпілювати АПК.
За допомогою утиліти apktool можна зібрати розпакований APK архів назад.

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

Підписання APK

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

створення сертифікату підпису
image

підписання APK-файлу
image

Перехоплення трафіку програми

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

Автентифікація



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

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

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



У відповіді сервера міститься ID користувача і сесійний ключ.

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


Отримання ключів від карти Трійка

У запиті на читання карти Трійка передається сесійний ключ, отриманий в момент аутентифікації, і серійний номер карти у форматі base64.

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

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


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

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


Запит балансу

Після отримання ключі з сервера ключів, відбувається зчитування необхідних секторів з карти пам'яті і відправка вмісту пам'яті на сервер. В даному прикладі видно сектора 0,4,7,8.


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


У відповіді міститься інформація про квитки, записаних на картці і баланс електронного гаманця.

{ "providerCode":"1",
"ticketCode":"3",
"ticketName":"Електронний гаманець",
"ticketNo":"8553535",
"statusCode":"0",
"currentServices":[ 
{"name":"ГАМАНЕЦЬ",
"param":[ 
{"name":"Залишок",
"value":"150.00"}],
"type":"TRK_EK",
"topUpType":"CASH"}],
"availableServices":[ 
{ "rpcServiceId":"2231",
"name":"ГАМАНЕЦЬ",
"priceMin":"1.00",
"priceMax":"2854.00",
"type":"TRK_EK",
"topUpType":"CASH"}


Підсумок аналізу API

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

З'ясовано, що формат даних у пам'яті картки аналізується віддалено на сервері, і не передається в додаток. Тому на даному етапі встановити яким чином дані організовані в пам'яті картки неможливо. Однак отримана інформація дозволяє продовжити дослідження.

Аналіз пам'яті карти Трійка

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

дані в пам'яті картки в шістнадцятковому форматі
image

Формат даних у секторі електронного гаманця



Щоб зрозуміти структуру зберігання даних у пам'яті картки, була використана чиста картка, куплена в касі, на якій не було виконано жодної поїздки. Далі картка була поповнена 10 разів на 1 рубль через автомат. Після кожного поповнення стан пам'яті зберігалося. В кінці всі збережені дані були порівняні і встановлено, що зміни відбуваються лише у двох блоках 8 сектора.

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

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

image

Де 137B8 значення в карти пам'яті в шістнадцятковій, а 399 сума в рублях.
Таким чином можна розрахувати значення з попередньої таблиці.

розрахунок балансу в секторі електронного гаманця
image

Номер турнікета, дата і час проходу

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

image

Шляхом підбору значень було встановлено, що нульовий та перший байт в першому секторі зберігає ідентифікатор останнього турнікета, через який здійснювався прохід. Далі другий і третій байти містять дату останнього проходу у вигляді кількості днів від 1.1.1992.
Відповідно, 0x2260 = 8800, де 8800 число днів від 1.1.1992, що з урахуванням високосних років припадає на дату 5 лютого 2016 і відповідає дійсній дату проходу.

Час проходу записано в четвертому байті і старших чотирьох бітах п'ятого байта, і кратно 30 секунд, починаючи з 00:00 годин. Отже, розрахунок часу можна виконати дві дії:

для розрахунку годин image

і для розрахунку хвилин image

Таким чином отримаємо час 15:30, що відповідає дійсному часу проходу.

На основі отриманих даних можна розшифрувати дані представлені в попередній таблиці

image

Кожна карта Трійка має унікальний серійний номер, відмінний від UID. Цей номер нанесений на самій карті і використовується для віддаленого поповнення карти. Він зберігається в нульовому блоці восьмого сектора з байта по молодші чотири біта сьомого байта.

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

Запис даних на картку Трійка

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

Атака повторного відтворення

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

Незважаючи на те, що області пам'яті електронного гаманця захищені імітовставки, система виявилася вразливою для атаки повторного відтворення.
Було збережено стан пам'яті сектора електронного гаманця до проходу через турнікет, після чого виконаний прохід і операція списання 31 рубля з балансу картки. Після чого стан пам'яті карти було повернуто до вихідного стану. В результаті, на карті була відновлена сума балансу до проходу через турнікет. Дану операцію вдалося повторити кілька разів. З цього випливає висновок, що система не захищена від подібного виду атак.

кроки атаки повторного відтворення
image

Для встановлення можливості реальної експлуатації уразливості було виконано тривале тестування атаки повторного відтворення на інфраструктуру громадського транспорту Москви.
Першим був протестований наземний транспорт: тролейбуси, автобуси, трамваї. Електронний гаманець був поповнений одного разу на суму 50 рублів і всі проходи через турнікети були виконані за допомогою атаки повторного відтворення.
Протягом п'яти днів було скоєно 57 поїздок в наземному транспорті на загальну суму 1767 рублів. Після чого картка була повернена до каси метрополітену було отримано повернення заставної суми в 50 рублів.

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

Обхід блокування картки
Експериментально були знайдені способи уникати блокування картки при використанні атаки повторного відтворення. Основні фактори спрацьовування блокування:

  • Час останньої поїздки, записане в секторі пам'яті електронного гаманця, не повинно повторюватися при поїздках в метро

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

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



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

Додаток TroikaDumper

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

інтерфейс програми TroikaDumper
image

Висновок

Загальний час, витрачений на роботу, становить два тижні. Більшість з поставлених цілей дослідження були досягнуті. Незважаючи на вживані системи захисту, такі як ключі доступу до карти і криптографічний підпис в секторі електронного гаманця, підробка балансу виявилася можлива.
Відносно легко був здійснений реверс-інжиніринг програми «Мій проїзний», що дозволило обійтися без злому фізичних систем транспортної інфраструктури.
Найбільше часу зайняло вивчення структури даних у пам'яті картки. Це виявилося можливим із-за того, що дані зберігаються в незашифрованому вигляді. У разі, якщо б дані в пам'яті картки були зашифровані, найімовірніше, було б фізичне проникнення в системи працюють з картою, що робить атаку істотно складніше.

Підсумком дослідження стало написання програми TroikaDumper, що дозволяє легко експлуатувати уразливості в системі карти Трійка, маючи смартфон з підтримкою функції NFC. Додаток просто у використанні і може бути використане масово.

Для виправлення знайдених вразливостей необхідно удосконалення формату зберігання даних у пам'яті картки та оновлення програмного забезпечення всіх систем, що працюють з картою.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.