Немецкие исследователи информационной безопасности Карстен Ноль (Karsten Nohl), dexter и Фабиан Браунляйн (Fabian Braunlein) на конференции Chaos Computing Club рассказали о критических уязвимостях платежных протоколов, которые могут быть использованы злоумышленниками для кражи данных банковских карт покупателей и денег со счетов продавцов.
В чем проблема
Пользователи должны иметь возможность верить платежным системам: терминалы оплаты сейчас можно встретить повсюду, а оплата банковскими картами становится все более популярной, а в некоторых странах объём безналичных транзакций превышает расчеты наличными.
Тем не менее, большая часть всей этой платежной инфраструктуры опирается на проприетарные протоколы родом из 90-х годов прошлого века — на практике это означает наличие большого количества дыр безопасности. Платежные терминалы и процессоры все чаще становятся целью злоумышленников.
Кража финансовых данных
Используя уязвимости платежных протоколов преступники могут получать доступ к информации большого количества банковских карт, а затем подбирать к ним PIN-коды.
К примеру, в Германии главным коммуникационным протоколом для связи платежных терминалов и кассовых аппаратов является ZVT. Он просто позволяет хакерам считывать информацию с банковских карт, получив доступ к локальной сети магазина.
Хуже того, в протоколе реализован механизм для удаленного чтения PIN-кодов карточек. Он защищен криптографической подписью (MAC). Однако ключ симметричного шифрования хранится в так называемых Hardware Security Modules (HSM), некоторые из которых подвержены простым атакам по времени (timing attack) — это позволяет злоумышленникам получить доступ к ключу.
Важный момент — в множестве платежных терминалов используется один и тот же ключ, что открывает злоумышленникам широкие возможности для совершения атак (и противоречит базовым принципам проектирования защищенных систем).
Компрометация счетов продавцов
Кроме того, недостаточная защищенность финансовых протоколов открывает злоумышленникам возможности и по краже денег со счетов продавцов.
Платежные терминалы общаются со специальными платежными процессорами (которые, в свою очередь, взаимодействуют с банками) через интернет, используя стандарт ISO 8583. Существуют различные «диалекты» этого стандарта — в Германии популярен Poseidon. И он также содержит критические уязвимости.
В частности, одна из ошибок аутентификации описывается так. Для исполнения криптографического протокола аутентификации терминал использует секретный ключ. Пока что, все хорошо. Но дальше мы вновь видим повторение ошибки ZVT — множество терминалов хранят один и тот же ключ. Замена одного номера (Terminal ID) в любом конкретном терминале открывает доступ к счету продавца, к которому «привязан» этот терминал. Что еще хуже, Terminal ID печатается на каждом чеке — это еще больше облегчает проведение атаки.
В результате, атакующие могут производить возврат средств (refund) или производить оплату промокодов на сотовую связь (top-up codes).
Подробное описание представленных атак можно найти в этом PDF.
Не все так плохо
Обнаруженные немецкими исследователями проблемы безопасности платежных протоколов затрагивают главным образом технологии, использующиеся в Германии, и не столь распространены в других странах.
Тем не менее, российские исследователи информационной безопасности также публиковали информацию о серьезных уязвимостях в системах работающих в нашей стране банков и возможных атаках на сами банкоматы и платежные терминалы.
Комментарии (3)
Jesting
31.01.2016 13:52+4Про ZVT, если вдруг кто не прочел в первоисточнике, объясню: Торговая точка использует связку кассовый компьютер + терминал для приёма карт.
В древности терминал подключался к кассе через Serial-порт. Теперь же появилась возможность осуществлять тоже соединение через Ethernet. Протокол, который не был предназначен для сети, при этом никто не менял. И если раньше man-in-the-middle в отдельно взятом последовательном кабеле был невозможен(всякое шпионское опустим) то теперь теоретически злоумышленник может встроить себя в сеть магазина, получать и даже модифицировать весь трафик между терминалом и кассой.
Про пин-код который никогда не покидает терминал в открытом виде, но всё же получается узнать при помощи ZVT. На терминале можно вводить не только пин-код но так же сумму и прочие значение. Протокол может запросить ввод такого значение при этом отобразив произвольное приглашение. Теоретически можно попросить терминал о вводе 4-х значного числа и при этом отобразить приглашение с текстом Enter PIN. Такой ввод терминалом не будет восприниматься как пин-код. Пользователь введет заветные цифры (правда немаскированно) и терминал отправит ввод злоумышленнику.
Современные терминалы кстати имеют защиту от произвольного приглашения к вводу. Как правила все приглашения захардкожены и специальной командой (условно ShowPromtNumbe(int num)) можно отобразить одно из приглашений находящихся в памяти терминала. Таким образом подобная схема в текущих реалиях возможно только на очень старом и давно не обновляемом железе.
Для того чтобы подобных злодеяний было меньше, в 2006 году приняли стандарт PCI DSS, который достаточно жестко регламентирует многие аспекты платежной инфраструктуры и сопутствующих вещей.
axilirator
Было бы неплохо пометить публикацию как перевод.
Оригинальная статья: srlabs.de/pos-vulns