Grabduck

Банкоматных вирусов пост

:

Ребята, я не выдержал. Речь сейчас пойдет о банкоматном вирусе, обнаруженном больше года назад в банкоматах Diebold, и основном принципе его работы. Тема эта древняя, пик истерии давно уже прошел, но общественность так и не узнала, что же произошло на самом деле, из-за чего даже ИТ-шники строят массу догадок и рассказывают мифы. Про этот вирус было написано много статей, от технических описаний до политпросвещения домохозяек, но самый главный трюк нам так и не раскрыли. Объяснять я постараюсь попроще, ибо нам важно понять суть, а не вникать в детали конкретной реализации чего-либо.

Картинка для привлечения внимания:


Начнем с начала. Год назад в СМИ поднялась паника: «в банкоматах вирусы!», вследствие чего все уважающие себя банковские управленцы эту панику поддержали и стали пытаться что-то сделать. Паника возникла неспроста: в мире бродит множество любителей халявы, т. н. кардеров, целью которых является получить данные вашей банковской карты, в т. ч. и PIN-код, чтобы потом сделать ее дубликат и снять все деньги или что-нибудь приобрести. Для этого придумываются разные способы обмана, но до появления вируса все они носили физический характер. А вот вирус весьма интересен, ибо вывел технологию принципиально на новый уровень – PIN-коды стали тырить на программном уровне. Надо заметить, что вирус еще умеет выдавать наличность в неограниченном объеме по спецкарте, но нам, как клиентам, на это наплевать, тут банк на деньги попадает, а не мы.

Теперь давайте сделаем поверхностный экскурс в сам банкомат, и разберемся, откуда там могут быть вирусы. Открою тайну: подавляющее большинство банкоматов работает под Windows XP. Догадливый читатель поймет, что в данном случае угроза налицо, и надо начинать бояться. Но не все так плохо, как кажется. Во-первых, добросовестные поставщики банкоматного софта этот Windows сильно урезают, отключая в нем все, что только можно, защищают порты, закрывают доступы и так далее. А во-вторых, банкомат никогда не смотрит прямо в интернет – он или в выделенном сегменте корпоративной сети, или подключен через какую-нибудь шифровалку, типа Cisco или Checkpoint, и вирусу туда пробраться, мягко говоря, без вариантов. Соответственно, выход тут только инсайдерский, ибо извне подсунуть что-то в банкомат проблематично.

А что же представляет собой типичный банкоматный софт? А вот что. Архитектура этого софта аналогична клиент-серверной. Сервер в данном случае умеет работать с конкретным железом (которого в банкомате навалом) и публикует наружу программные интерфейсы, общие для каждого типа железа (диспенсер, кардридер, принтер, клавиатура и т. д.). Клиент, т. е. само бизнес-приложение, в свою очередь, пользуясь этими интерфейсами, показывает нам рекламу, выдает долгожданную зарплату, печатает чеки и радостно мигает лампочками. Все это хозяйство называется стандартом CEN/XFS. Я, пожалуй, приложу картинку.

Узнав такую новость, мы немедленно приступаем к написанию своего банкоматного софта с блэкджеком и шлюхами , благо секретов тут нет, и все эмуляторы и спецификации от нас никто не прячет. Магнитную полосу мы прочитаем с кардридера, когда клиент вставит карту, а PIN-код из PIN-клавиатуры, когда клиент его наберет. Вот он, как говорится, profit. И с виду, вроде как, все нормально. Но радоваться рано, нас ждет небольшой облом. Дело в том, что PIN-код из клавиатуры в чистом виде прочитать нельзя. Можно только в зашифрованном.

Сделаем лирическое отступление, для общего развития интересующихся. PIN-код в чистом виде не гуляет нигде, кроме самой клавиатуры и специального прибора HSM, который находится в процессинге. Процесс ввода PIN-кода следующий. Софт передает в клавиатуру номер карты и команду на ввод PIN-кода. Далее, в процессе ввода, клавиатура возвращает только факт нажатия клавиши, но не сообщает какой именно. Затем клавиатура формирует конструкцию из двузначной длины PIN-кода, самого PIN-кода, потом добивает до 16 символов цифрой F и делает над этим «исключающее или» с правыми 12-тью цифрами номера карты, кроме последней проверочной цифры. Например, для PIN-кода 1234 и карточки 4987.6543.2109.8765 мы возьмем 04.1234.FFFFFFFFFF, сделаем над этим XOR с 0000.765432109876 и получим 0412.42AB.CDEF.6789. А дальше вот это последнее число шифруется рабочим ключом, который уже находится в клавиатуре, и шифр возвращается приложению, заказавшему операцию ввода PIN-кода.

Теперь разберемся с ключами шифрования, раз уж мы про них заговорили. Эти ключи находятся в самой клавиатуре, и прочитать их оттуда нельзя. Как правило, до начала эксплуатации банкомата банковские офицеры безопасности вручную заводят в клавиатуру так называемый мастер-ключ (MK). Затем периодически из процессинга в банкомат прилетает специальный рабочий ключ (WK), зашифрованный тем самым мастер-ключом, который кроме клавиатуры и специального прибора HSM, о котором упоминалось выше, никто не знает (офицеры вводят каждый свою компоненту и тоже полный ключ не знают). Итого у нас в клавиатуре сидят MK и MK(WK).

Начнем плавно подходить к кульминации. На самом деле в клавиатуру можно записать много разных ключей. А еще можно скормить ей PIN-блок, заставить расшифровать его рабочим ключом, зашифровать другим ключом и вернуть результат. Т. е. в чистом виде мы ключ никогда не получим, а в зашифрованном каким-либо ключом – пожалуйста. Так почему бы нам не записать туда свой, заведомо известный мастер-ключ и не дать клавиатуре команду шифровать PIN-блок именно им, а не каким-то другим? А мы потом его расшифруем, т. к. ключ нам теперь уже известен. Именно так и делает наш вирус.

Вот и весь фокус, ребята. Ничего сложного, правда?

Напоследок расскажу, в чем тут подвох. Неслучайно вирус орудовал именно на банкоматах Diebold. Дело в том, что в некоторых банкоматах Diebold были установлены старые клавиатуры, не соответствующие современным требованиям безопасности. А современные требования безопасности гласят, что клавиатуры в банкоматах должны обеспечивать иерархию ключей. Это означает, что если мы даем команду клавиатуре расшифровать PIN-блок рабочим ключом, то зашифровать мы его затем можем только тем мастер-ключом, которым был зашифрован рабочий. Это логично, т. к. если мы сумели загрузить рабочий ключ, значит мы знаем этот мастер-ключ (мы же им шифровали рабочий) и нам можно доверять. А вот если мы попросим зашифровать PIN-блок каким-либо ключом из соседней ветки, то нам не дадут – налицо признаки злых намерений.

Вот и все. Длинновато получилось, не надо было про PIN-блоки писать, ну да ладно. Надеюсь, я немного прояснил ситуацию, а разных мифов и толкований в известных кругах станет ходить поменьше. Особенно это актуально для больших банковских управленцев, которые мечтают ставить на банкоматы антивирусы, не понимая, что получат геморроя в разы больше, чем пользы. Нормальные парни давно пользуются решениями а-ля Solidcore и живут спокойно.