Уязвимости в Google Wallet позволяют подобрать PIN-код

Хакеры нашли способ подбора PIN-кодов к кошелькам Google Wallet, которые используются для платежей по беспроводной связи малого радиуса действия (стандарт NFC, основан на RFID). Оказывается, можно подбирать PIN-код методом брутфорса без обращения к серверу Google благодаря выявленной уязвимости в архитектуре этого приложения.

Google Wallet хранит всю информацию во внутренней базе данных sqlite3. Специалист по безопасности Джошуа Рубин решил посмотреть на эту базу внимательнее. Он сразу же обнаружил ещё кое-что интересное. В базе данных он обратил внимание на таблицу со странным названием metadata.

В таблице один из элементов называется gmad_bytes_are_fun и является чем-то вроде зашифрованной файловой системы для хранения данных. Содержимое бинарных данных в этой строке явно предполагает, что там находится вся информация о кредитной карте, и её явно хорошо бы изучить подробнее, пишет Джошуа Рубин, но в данный момент его интересовало другое.

Второй элемент называется deviceInfo и для понимания этих данных нужно было понять, чем они обработаны. После нескольких попыток выяснилось, что данные скомпилированы с помощью google протокола 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.

Описание уязвимости: https://zvelo.com/blog/entry/google-wallet-security-pin-exposure-vulnerability
Уязвимости Google Wallet, найденные в 2011 году: http://viaforensics.com/mobile-security/forensics-security-analysis-google-wallet.html
Видео с демонстрацией уязвимости Google Wallet: http://youtube.com/watch?v=P655GXnE_ic