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

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

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

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

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

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

084ff192e2d911314c5dca3c47fda702

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

f59f0863705bdbca60e9f522d3292ce0

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

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

f50d5a0c23f22a2583a47480038ab180

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

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

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

  • Ответить
    Анатолий Орлов ex-Яндекс

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

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

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