Приветствую всех! Ещё пару лет назад Android POS и прочие платёжные терминалы с сенсорным экраном вместо традиционной клавиатуры были у нас редкостью. Но всё меняется, и вот уже обычные терминалы во многих магазинах навсегда ушли в историю.
Меня неоднократно спрашивали, каким образом осуществляется защита ключей в таких устройствах и есть ли она вообще, так что я раздобыл несколько таких девайсов, дабы окончательно с этим разобраться.
Итак, в сегодняшней статье поговорим про Android POS и про то, чем такие девайсы отличаются от обычных терминалов. Заодно разберём такой экземпляр и посмотрим, как он устроен и какими методами защиты обладает.
❯ Суть такова
Давным-давно я
писал про то, как устроена защита от вскрытия и как работает управление ключами в обычном платёжном терминале. Но вот последнее время магазины заполонили сенсорные терминалы.
Вот самый популярный такой экземпляр — Kozen P12, массово устанавливаемый Сбербанком абсолютно везде, от крупных супермаркетов до торговых ларьков. Все его видели, многие ругали его из-за отвратительного UX, однако многие даже не догадываются, что работает эта коробочка на ножке на самом обычном Android, на котором запущено в Kiosk Mode платёжное приложение.
Ещё один представитель, Kozen P10F.
Этими двумя моделями список, очевидно, не заканчивается. Вот, например, aQsi 5Ф, стоящий в моём городе почти в каждом мелком магазинчике. На самом деле примеров очень много, по запросу «онлайн-касса со встроенным эквайрингом» выдаются десятки моделей. По большей части все эти устройства — не просто кассовые аппараты, а полноценные платёжные терминалы.
Само собой, крупные вендоры (VeriFone, Ingenico, PAX) от этой темы также не отошли.
❯ Про безопасность этих девайсов
После их повального распространения у некоторых появились закономерные опасения в том, безопасны ли они. Вдруг там установлено какое-то левое приложение и вместо настоящего запроса ПИН выдаётся какое-то окно, похожее на него? И есть ли там вообще какая-то система защиты, какая была в обычных терминалах? Именно это мы сейчас и узнаем.
❯ Обзор оборудования
Итак, ко мне в руки попали два таких терминала. Один из них рабочий, а вот второй мы чуть позже разберём и посмотрим, как он устроен.
Первый на очереди вот такой вот девайс, известный у нас как Кассатка-Мини-Ф.
На самом деле, конечно, из отечественного тут в основном кассовый софт, тогда как «настоящее» имя данного терминала — Telpo TPS900. Производителей таких железок довольно много, часть из них выпускает и традиционные POSы. Все эти Telpo, Wizarpos, Sunmi, Ciontek, Aisino, Nexgo и ещё куча фирм оптом завозятся в Россию, где на них наклеивают этикетки, устанавливают кассовый и банковский софт, подключают фискальный накопитель и продают уже под более звучными именами, заодно предлагая дополнительные услуги и оказывая поддержку.
С обратной стороны камера для считывания штрих-кодов, динамик и аккумулятор.
Под аккумулятором слоты под SIM и SAM карты, разъём для microSD и закрытый крышечкой отсек для фискального накопителя.
Аккумулятор неожиданно разборный, не встречал такого очень давно.
Внутри него две литий-полимерные банки и плата защиты.
Плата защиты отдельно.
А вот другой аппарат, aQsi 5Ф, в миру известный как Ciontek CS10.
Если тот мне достался как дохлый, то этот аппарат даже работает и пускает в меню. Приобретён он был за какую-то символическую сумму для опытов с эмулятором ФН.
Даже ключи всё ещё остались на месте.
С обратной стороны камера и (судя по значку в батарейном отсеке) окошко лазерного сканера.
Под крышкой аккумулятор и шлейфик фискального накопителя.
На этот раз батарея состоит из двух банок 18650 в термоусадке.
Слоты для карточек всё те же. Рядом с разъёмом кабеля фискального накопителя место для ещё одного, видимо, для каких-то других фискальных стран.
❯ Внутренности
Поскольку синий терминал был заявлен как нерабочий, разберём его.
Внимание! Вскрытие любого современного POS-терминала ведёт к его порче. Восстановить его, скорее всего, уже не получится, официальный сервис после такого оживлять его наверняка откажется.
Итак, приступаем к разборке. Для этого надо открутить винтики в нижней части корпуса и батарейном отсеке и снять крышку принтера (снимается она туго, но если это не сделать, то при разделении корпуса на две половинки она просто сломается).
А вот и начинка. Чёрная пластина, на которой сидят слоты SAM-карт, явно часть защиты от вскрытия.
Контактная резинка тампера.
А вот этот шлепок припоя — некогда бывший тампер. Да-да, это то, о чём вы подумали. В своё время кто-то пытался оживить данный девайс и не придумал ничего лучше как залить тамперы оловом. Причём залил он их откровенно криво, затронув ещё и внешнее кольцо и тем самым закоротив цепь безопасности на землю.
Антенны сотового модема.
Кабель фискального накопителя.
Снимем пластину. Три группы с тремя контактными площадками связывают её с цепью безопасности. Через шлейфик подключаются SAM-карты.
А вот и материнская плата. Сердцем устройства является SoM SC20-E от Quectel. Каким-то защищённым этот модуль не является, штучка эта общего назначения. По сути это такой же GSM-модуль, как широко устанавливавшиеся в подобные девайсы Siemens/Cinterion MC55i или популярные в среде ардуинщиков SIM800L, только этот сильно круче — на нём стоит полноценный андроид, он имеет LVDS для подключения матрицы, контроллер тачскрина, USB, несколько UART и прочие интерфейсы. А вот защищённого хранилища ключей или ещё чего-то подобного там нет. То есть, несмотря на то, что этот модуль находится внутри контролируемой зоны, за пин-пад отвечает не он, а тачскрин подключается напрямую к нему. Что немаловажно, модуль поддерживает Secure Boot, правда, софт и детальная документация под NDA, так что совершенно неведомо, как заменить ключи и можно ли вообще это сделать.
Также на плате виден слот для чиповых карт, батарейку, а также контактные площадки, через которые цепь безопасности соединялась с верхней пластиной. Когда-то там были анизотропные резинки, но сейчас они давно потеряны. Видна и причина поломки — оторвавшийся microUSB-разъём, прилипший к динамику.
А вот начинка модуля. Построен он на SoC Qualcomm MSM8909, в миру известном как Snapdragon 210.
Магнитная головка.
Антенны GPS и Wi-Fi.
Передняя часть корпуса. Резинки тамперов также давно утеряны.
А вот эта штука — антенна для бесконтактных платежей. Сам считыватель построен на чипе PN5180.
Обратная сторона платы.
❯ На чём же сделано хранилище ключей?
Как мы только что выяснили, SoM тут совершенно общего назначения и в процессе хранения долговременных ключей и генерации ПИН-блока участия не принимает. Так что посмотрим на остальные микросхемы на плате.
MP2639A — контроллер заряда двух литиевых банок.
DRV8833 — драйвер шагового мотора.
FE1.1 — USB-хаб на четыре порта.
И вот наконец самое интересное — MAX32555. Это защищённый микроконтроллер, реализующий все функции пин-пада.
Даташит, как это водится, находится под злостными NDA, но кое-что таки доступно. Как видно, МК реализует практически все «платёжные» функции: хранение ключей, шифрование, аппаратный генератор случайных чисел, интерфейсы смарт-карт, магнитный считыватель на три дорожки (достаточно подключить к нему саму головку, предусилитель и F/2F-декодер уже есть внутри, тамперы, контроль температуры и питания (вдруг злоумышленник решит залить чип азотом или вызвать глюки помехами по питанию). Также на борту есть встроенный защищённый контроллер матричной клавиатуры и ещё куча GPIO, так что по сути на этом чипе можно реализовать полноценный пин-пад с минимальной обвязкой (возможно, в каких-то китайских пин-падах так и сделано, однако я их не разбирал, так что не могу заявить об этом точно), а если добавить Bluetooth-модуль, то получится mPOS-терминал. В данном девайсе чип используется исключительно как вместилище ключей.
❯ Первый запуск
Вся неисправность заключалась в оторванном microUSB-разъёме. Как мне было объяснено, разъём этот сломали через несколько месяцев работы, после чего отнесли на ремонт неведомо куда, где девайс оживить так и не смогли. Ну что же, попробуем что-то сделать и мы.
Сажаем разъём на место. Подаём питание, ждём, пока хоть немного зарядится аккумулятор, жмём кнопку, и…
К моему удивлению, экран загорелся и началась загрузка Android.
И после полуминуты ожидания появляется самый обычный экран блокировки. Неужели разборка прошла для этой штуки бесследно?
Ан нет. На экране ничем не убираемое сообщение о некой аппаратной ошибке. Очевидно, причина её в сработавшем тампере. Аналогично легко понять, что никакой сервис после таких издевательств этот аппарат на ремонт уже не возьмёт.
Подэкранные кнопки работают. Можно даже открыть запущенные приложения, но сообщение это не уберётся.
С экрана блокировки можно попасть в кассовое приложение. Как нетрудно догадаться, активация эквайринга слетела вместе с ключами.
Неподписанная кнопка справа открывает вот такое меню.
Также с экрана блокировки можно открыть номеронабиратель для экстренного вызова.
Однако все сервисные комбинации в нём отрублены. Не работает даже
*#06#, впрочем, как и на других девайсах на Android. На этом терминале не зайти даже в Recovery, если попробовать зажать кнопку громкости при включении, то аппарат просто зависает на заставке. Ну а пытаться залить свою прошивку с компьютера бесполезно: из-за включенного Secure Boot загрузка неподписанного образа окирпичит терминал.
❯ Ключи
Само собой, упомянутый в той ошибке FSK — не частотное кодирование, а какой-то низкоуровневый ключ наподобие IngeTrust в терминалах Ingenico.
Поддержка Telpo на связанные с этим вопросы не отвечает.
Вот тут вставлено видео с YouTube, так что если вместо него отображается белый экран, то вы знаете, что делать.
Сам процесс загрузки есть тут. Однако автор видео ожидаемо деталями не делится, не исключено, что это вообще развод на деньги.
Сейчас уже не осталось платёжных терминалов, где сбросить тампер может сам пользователь. Везде для этого нужен софт, имеющийся у производителя. В зависимости от модели сносится тампер везде по-разному, но суть одна: нужны специальные ключи, которые обычно генерируются под конкретный серийный номер терминала или скачиваются с сервера в момент активации загрузки.
В отличие от «традиционных» пин-падов, возможностей для атаки тут сильно больше, например, снятие экрана банальным прогревом термофеном тут не контролируется решительно ничем. Также никто не мешает просто отпаять установленный там SoM и заменить его на модуль с другой прошивкой, где Secure Boot не активирован, превратив тем самым защищённый терминал в обычный телефон со встроенным принтером. В отличие от традиционного POS, где для подобной манипуляции надо было выкинуть всю штатную начинку и собрать свою (к слову, это не фантастика, такие случаи описывались, хотя они и редки), перепаять один-единственный модуль — дело пятнадцати минут, десять из которых уйдёт на разборку аппарата и демонтаж платы.
❯ Про aQsi, Square другие способы защиты
Разумеется, конструкция, как показана тут, — не единственный из возможных вариантов.
Вот это американский Square Terminal. Он тоже загружается и выдаёт ошибку после вскрытия.
Но самое интересное у него находится на выполненном отдельной платой модуле шифрования. Здесь стоит отдельный контроллер тачскрина, позволяющий криптопроцессору не принимать данные о нажатиях от основного процессора, а считывать их самому. То есть в момент запроса ПИН девайс выводит на экран картинку с клавиатурой, а считывание и обработка нажатий клавиш и шифрование ПИН выполняется криптопроцессором, система только принимает от него готовый ПИН-блок. Рядом с этим чипом стоит аналоговый мультиплексор, позволяющий полностью отключить сенсор от «андроидной» части в момент запроса ПИН.
Ещё интереснее это работает в aQsi (Ciontek) — при вскрытии аппарат просто перестаёт загружаться, при включении не реагируя ни на что. Связано это с тем, что один из разделов на Flash зашифрован ключами, которые берутся как раз из контроллера пин-пада и при вскрытии стираются.
❯ Пин-пад с точки зрения программиста
SDK и инструментарий для платёжного оборудования обычно находятся под NDA, так что единственная возможность их скачать — искать утечки, чего я для данного устройства найти не смог. Однако для одного из аппаратов (Wizarpos) я таки
нашёл кое-что интересное в лице примеров кода и приложений. Мне неведомо устройство аппаратной части этого пин-пада, зато нашёлся пример кода для работы с ним (как мне удалось выяснить, у других большинства вендоров принцип аналогичен):
PINPadDevice device = (PINPadDevice) POSTerminal.getInstance(mContext)
.getDevice("cloudpos.device.pinpad");
device.open();
device.setupCallbackHandler(new PinPadCallbackHandler() {
@Override
public void processCallback(byte[] data) {
Log.e(TAG, "processCallback ");
mHandler.obtainMessage(PIN_KEY_CALLBACK, data[0]).sendToTarget();
}
@Override
public void processCallback(int nCount, int nExtra){
// don't need implement.
}
});
KeyInfo keyInfo = new KeyInfo(PINPadDevice.KEY_TYPE_MK_SK, 0, 0, 4);
String pan = "0123456789012345678";
OperationResult operationResult = device.waitForPinBlock(keyInfo, pan, false,
TimeConstants.FOREVER);
if (operationResult.getResultCode() == OperationResult.SUCCESS) {
byte[] pinBlock = ((PINPadOperationResult) operationResult).getEncryptedPINBlock();
sendSuccessLog2("PINBlock = " + StringUtility.byteArray2String(pinBlock));
} else {
sendFailedLog2(mContext.getString(R.string.operation_failed));
}
device.close();
Как видно, Android не взаимодействует с пин-падом напрямую, а только даёт команду на запрос ПИН и ждёт callback о том, что ПИН введён и что можно получить ПИН-блок. Шифрование тут осталось точно таким же, как это работает, я уже рассказывал с примерами в
прошлом посте про пин-пады.
❯ Так что же в итоге?
Оказывается, по защищённости многие из подобных девайсов не уступают традиционным POS. Как и на них, немалая часть защиты обеспечивается подписыванием приложений, аппаратная часть также подстроилась под сенсорные экраны, хотя основные принципы остались теми же. Впрочем, уверен, что все дыры ещё не заткнуты, так что в будущем, с большим распространением таких аппаратов, мы узнаем ещё много интересного, как это некогда
было с VeriFone и Ingenico.
Такие дела.
Ссылки
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩