Хакеры нашли способ подбора PIN-кодов к кошелькам Google Wallet, которые используются для платежей по беспроводной связи малого радиуса действия (стандарт NFC, основан на RFID). Оказывается, подбирать PIN-код можно методом брутфорса без обращения к серверу Google благодаря выявленной уязвимости в архитектуре этого приложения.
А началось всё в декабре 2011 года, когда был проведён анализ Google Wallet компанией viaForensics. Уже тогда стало ясно, что это приложение не идеально и с ним явно будут проблемы. Так оно и вышло.
Google Wallet хранит всю информацию во внутренней базе данных sqlite3. Специалист по безопасности Джошуа Рубин решил посмотреть на эту базу внимательнее и проверить выводы, сделанные viaForensics. Он сразу же определил, что насчёт слабой защиты они не ошиблись, но при этом Джошуа обнаружил ещё кое-что интересное. В базе данных он обратил внимание на таблицу со странным названием metadata
. Её назвали так специально, чтобы отвести от столь ценной таблицы внимание потенциальных злоумышленников, глупый подход, который лишь указывает на отсутствие реальной защиты. Итак, а таблице было всего три строки, но в каждой из них — большой блоб бинарных данных.
Один ряд называется gmad_bytes_are_fun
и является чем-то вроде зашифрованной файловой системы для хранения данных. Содержимое бинарных данных в этой строке явно предполагает, что там находится вся информация о кредитной карте, и её явно хорошо бы изучить подробнее, пишет Джошуа Рубин, но в данный момент его интересовало другое.
Другая строка называется deviceInfo
и для понимания этих данных нужно было понять, чем они обработаны. После нескольких попыток выяснилось, что данные скомпилированы с помощью гугловского протокола Protocol Buffers. Это открытая библиотека для унификации данных в сообщениях между системами. Чтобы прочитать эти данные, нужно указать правильный message format
в файле .proto
(Protocol Buffer Basics: Java). Сделав подходящий .proto
, Джошуа сумел прочитать бинарные данные и был шокирован увиденным. Там были Unique User IDs (UUID), информация об аккаунтах Google (GAIA) и Cloud to Device Messaging (C2DM, пуш-уведомления), статус Google Wallet Setup, параметр "TSA" (видимо, Trusted Services), статус SE и самое главное — данные "Card Production Lifecycle" (CPLC) и PIN-код.
Хэш пин-кода хранится в зашифрованном виде в SHA256. Однако, зная длину PIN-кода (четыре цифры), достаточно попробовать максимум 10 тыс. хэшей SHA256, так что криптографическая защита здесь вовсе не является проблемой. PIN-код побирается менее чем за секунду даже на смартфоне.
Таким образом, подобрать код можно без обращения к серверу, на котором стоит ограничение в пять неправильных попыток. Поскольку PIN-код легко подбирается на телефоне, смысл этого ограничения на сервере полностью теряется, как и смысл всей системы безопасности Google Wallet.
На видео Джошуа демонстрирует, насколько быстро его программа Wallet Cracker подбирает пароль.