Однако при использовании билетов информация о них заносится в память турникетов (это нужно хотя бы для того, чтобы вести статистику) и в определенное время (возможно, по расписанию) сливается в центральную базу данных и уже там обрабатывается. Каждый раз при покупке билета его данные заносятся в локальную БД, а оттуда отправляются в ЦОД. Это подтверждают метрополитеновские программы: они могут функционировать как в режиме накопления данных, так и в онлайн-режиме, сразу отправляя информацию в центральную базу. Если несколько раз засвечивается номер, который не зафиксирован в БД, это быстро выявляется и билет попадает в стоп-лист, который закачивается в турникеты при следующем обновлении (их память, конечно, не резиновая, но даже за вычетом объема памяти, используемой микропрограммой турникета в служебных целях, ее должно хватить, чтобы занести достаточное количество записей). Так что все сгенерированные мною Mifare Ultralight в течение нескольких дней попадали в стоп-лист.
А можно ли многократно перезаписывать карточку?
- В билете есть перезаписываемая область данных (48 байт), зона однократной записи (4 байта) и зона записи блокировок. С помощью установки управляющих битов можно заблокировать запись в определенные страницы или даже запретить блокирование записи. Смысл в том, что перезаписать можно все данные, кроме зоны однократной записи (one-time programmable, OTP) и битов блокировок: в подземке зона OTP используется для постепенного "выжигания" битов в зависимости от количества использованных поездок (в процентном соотношении). И эта зона, естественно, проверяется при валидации билета турникетом. Когда количество поездок полностью исчерпано, на запись блокируются все страницы памяти и билет остается только выкинуть. Так что "вечный" Ultralight сделать не получится. С клонированным Mifare Classic (отсутствие их жесткой привязки к аппаратному серийному номеру позволяет изготовить "клон") в этом смысле проще: теоретически им можно пользоваться, пока не истечет срок действия карточки, которая была взята в качестве "донора", а потом можно просто пойти и выудить свежий дамп. На практике, правда, многие клонированные "классики" тоже попадают в стоп-лист. На данный момент я как раз пытаюсь понять, по какому принципу идет отсев "левых" карт и какую роль в этом играет аппаратный серийный номер, который собственно для защиты данных не используется.
То есть, выходит, "классики" более уязвимы, чем простые билеты?
- Да, как ни странно, вся защита карт на основе Mifare Classic (а это проездные, студенческие и пенсионные карты и т. д.) основывается на использовании двух ключей: A и B. Причем они лежали в той же метрополитеновской программе, о которой речь шла в начале, в виде констант, и их без труда удалось посмотреть с помощью дизассемблера. Забавно, что там же были ключи не только для секторов, используемых турникетами метро, но и для зон, проверяемых валидаторами наземного транспорта. Применив найденные ключи, я легко сделал копию собственного студенческого проездного на один из старых просроченных, который мне в свое время подарили для экспериментов (чистых карточек Mifare 1К у меня на тот момент не было).
Думаю, это стало возможным оттого, что система социальных карт, функционирующая примерно с начала 2000 года, по сути не модернизировалась с момента своего запуска. Но не исключено, что если число выявленных фактов использования клонированных карточек перейдет некий рубеж, руководство метрополитена наконец возьмется за решение этой проблемы. Поговаривают, что такие планы уже есть: в дополнение к ключам А и B (которые, похоже, несколько лет не менялись) собираются ввести защиту по типу используемой в билетах Ultralight. На карте достаточно свободного места, которое, в принципе, можно использовать для этих целей, так что неизвестно, сколько еще времени "классики" будут оставаться столь же уязвимыми, как сейчас.
Один клон я дал знакомому для теста, пока проблем нет. В принципе, достать свежие дампы (данные можно генерировать и самостоятельно, но у меня сложилось впечатление, что клоны в некоторых случаях могут проработать значительно дольше "сфабрикованных" собратьев - так ли это, я сейчас пытаюсь проверить) гораздо проще, чем может показаться: достаточно компактного ноутбука вроде Eee PC с подключенным ридером (который можно свободно купить тысячи за четыре рублей). У меня есть небольшая самописная утилита, которая позволяет такой связке без проблем вытаскивать информацию из проездных, нужно лишь провести ридером поблизости от кошелька или кармана соседа на эскалаторе. Кстати, информация о держателе карточки записана в зону, которую можно считать при помощи стандартного, рекомендованного к использованию ключа, описанного в документации на MAD (Mifare Application Directory). Это, кстати, прекрасная почва не только для злоупотреблений, но и для более приятных вещей - например, знакомства с миловидными студентками.