Защита карты «Тройка» позволяла восстанавливать состояние карты после использования без внесения на карту денег

Атаку подобрали при помощи приложения для Android, где слабо была защищена часть отвечающая за противостояние MITM-атакам, данные о балансе карты и не была устранена возможность атаки типа "повторное воспроизведение":

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

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

...

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

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

084ff192e2d911314c5dca3c47fda702

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

f59f0863705bdbca60e9f522d3292ce0

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

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

f50d5a0c23f22a2583a47480038ab180

....

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

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

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

Добавить 5 комментариев

  • Ответить
    Анатолий Орлов AliExpress Россия, ex-Ozon.ru, ex-Яндекс

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

  • Ответить
    Альтер Эго

    В обоих случаях (метро/наземный) карта попадет в чёрный список максимум на следующий день навечно. В метро это будет автоматом означать что ее можно уже просто выкинуть… а в наземном все не так однозначно, текущее оборудование не позволяет держать в каждом устройстве контроля все «плохие» билеты, но правда и тут сложно будет попользоваться, т.к. никто не мешает грузить в устройства именно то, чем пользуются, выкинув то, что давно не встречалось, так что все равно прибьют, но просто тут вероятность не совсем 100% и может занять много больше времени…