Низкоуровневый взлом банкоматов NCR



    Изображение: Sascha Kohlmann, CC BY-SA 2.0

    Существуют системы, доступа к которым у простых смертных нет по умолчанию. И разработчики таких систем наивно полагают, что они защищены от проникновения и зорких глаз исследователей.

    Взять хотя бы банкоматы (АТМ). Нередки случаи, когда к АТМ подходят неизвестные, подключают ноутбук, забирают деньги и уходят, не оставляя каких-либо логов в системе. А недавние истории с «котлетами» (вредоносное ПО под названием Cutlet Maker) и подавно подтверждают, что неуязвимых систем нет — есть недоисследованные.

    Начало исследования


    Бытует мнение, что единственный способ украсть деньги из банкомата — это приехать на самосвале, подцепиться к банкомату крюком и выдрать его с потрохами, а потом использовать болгарку, лом и газосварочный аппарат. Но есть и другой метод.

    После непродолжительных поисков на Ebay у меня на столе оказалась платка диспенсера NCR USB S1 Dispenser с прошивкой. Цели были такие:

    • найти обход шифрования команд, которые посылает компьютер по USB самому диспенсеру, в частности на выдачу банкнот;
    • узнать, как обойти необходимость физического доступа в сейф для проведения аутентификации (передергивания кассеты) для генерации ключей шифрования команд из предыдущего пункта.



    Прошивка


    Прошивка представляет из себя ELF-файл под процессор NXP ColdFire (Motorola 68040, мой любимый процессор), работающий на VxWorks v5.5.1.



    В ELF-файле интерес представляют две основные секции — .text и .data:

    • В одной из них содержится код, который крутится все основное время (назовем его основной прошивкой), когда диспенсер подключен к системнику в верхней части АТМ.
    • Во второй лежит упакованный с помощью zlib код загрузчика (его местное название USB Secure Bootloader), который отвечает за заливку прошивки и запуск основного кода.

    И самое приятное то, что в файлике остались невырезанными символы — бери да ищи что-нибудь интересное.

    Внутреннее устройство основной прошивки


    Если разделять код на основные составляющие, то получится такая схема (в порядке подчинения):

    1. Поток, который занимается получением USB-пакетов и распределением их по сервисам.
    2. Сервисы — основные исполняющие единицы, каждому из них отведена своя роль и у каждого есть свои задачи (классы).
    3. Классы — здесь это задачи, которые может выполнять тот или иной сервис с помощью контроллеров.
    4. Контроллеры — собственно «воркеры» (workers), которые занимаются валидацией присланных им задач, их выполнением, а также формированием ответных пакетов.



    Так как кода в прошивке много, было решено начать с поиска всех возможных сервисов, а дальше уже смотреть, куда передаются задачи.

    В итоге нашлись следующие сервисы, которые как раз должны выполнять то, что я ищу:

    1) DispTranService (Dispenser Transaction Service): работа с шифрованными командами, формирование пачек банкнот, аутентификация. Можно сказать, самое интересное — здесь.



    2) securityService: после аутентификации на стороне диспенсера генерируется сессионный ключ, который по запросу компьютера отправляется на него в зашифрованном виде. Этим ключом будут шифроваться все важные команды — выдача, формирование пачки банкнот.



    Впоследствии на глаза попался еще один сервис: UsbDownloadService. Его задача – при подключении диспенсера к компьютеру и несоответствии версии прошивки диспенсера той, что хранится на компьютере банкомата, переходить в bootloader с целью заливки прошивки, с которой должна работать ОС (лежит в папке с ПО вендора на компьютере). Этот сервис также умеет отдавать информацию о версии прошивки.



    Физическая аутентификация


    Физическая аутентификация реализована на высочайшем уровне и защищает АТМ от простой отправки по USB команд на выдачу без авторизации. В данном случае она заключается в том, что только при открытом сейфе с деньгами нужно выполнить одно из следующих действий:

    • вынуть и вставить нижнюю кассету,
    • переключить тумблер на задней стенке стойки с диспенсером.



    Но все это требуется только если уровень доступа установлен на максимальный, то есть физический. Всего их три: USB (0), логический (1) и физический (2). Остальные два используются сервисниками и разработчиками для отладки и тестирования прошивки. Ну а физический — крайне рекомендуется вендором к использованию по умолчанию.

    Уязвимость


    Далее описана критическая уязвимость (уже исправленная вендором на момент публикации статьи), которая позволяла при наличии доступа в сервисную зону, но без доступа в сейф (например, через проделанное в лицевой панели ATM отверстие) выполнять любые команды диспенсера, включая выдачу наличных.



    Как выяснилось, UsbDownloadService принимает команды, не требующие шифрования. Звучит заманчиво. Но вдруг дальше все защищено, и название Secure Bootloader оправдает себя?

    (Спойлер: не оправдает!)

    We need to go deeper


    Как уже было сказано, в секции .data лежит упакованный код загрузчика, который долгое время не вызывал у меня интереса, да и коллеги, когда исследовали прошивку, не обратили на него внимание.



    Пока наличие загрузчика было тайной, оставался открытым вопрос: как же все-таки ПО на компьютере заливает прошивку? Ведь в основной прошивке ничего такого обнаружить не удалось.



    Итак, bootloader распакован, загружен в IDA по смещению 0x100000 — теперь можно исследовать… Только символов нет!

    Не беда: сравнение основной прошивки с кодом загрузчика, чтение datasheet контроллера — и начинает вырисовываться определенная картина.



    Выяснилось, что заливка прошивки хоть и выглядит защищенной, таковой на деле не является. Всего-то нужно знать, как заливать ее правильно.

    На полное понимание этого процесса было потрачено довольно много усилий и времени (подробнее об этом можно узнать из доклада «Blackbox is dead—Long live Blackbox!» на конференции Black Hat 2018 в Лас-Вегасе). Чего только стоит перепайка памяти NVRAM, заливка в нее бэкапа с целью «раскирпичивания» всего контроллера… Спасибо коллеге Алексею за терпение!

    В итоге получился следующий алгоритм заливки прошивки в диспенсер:

    1) Сгенерировать пару RSA-ключей и залить публичный ключ в контроллер.



    2) Записать последовательно секции .data и .text из ELF по их физическим адресам из заголовков секций.



    3) Подсчитать SHA-1 от записанных данных, зашифровать хеш приватным ключом, отправить в контроллер.



    4) Подсчитать и отправить сумму всех записанных word-ов прошивки.



    После чего, если все подсчитано и записано успешно, загрузится основная прошивка.

    Выяснилось, что при записи прошивки существует только одно ограничение: версия прошивки должна быть не ниже текущей. Но ведь никто не мешает нам подменить версию прошивки в самих ее данных.

    В итоге моя особая прошивка с antisecurity-фиксами была залита и успешно запущена!

    К этому моменту код основной прошивки был хорошо изучен, найдены команды на выдачу банкнот. Теперь их можно посылать незашифрованными, и диспенсер их с радостью выполнит.



    Выдача


    После всего пережитого во время исследования (например, «закирпиченый» реальный банкомат), результат был таким приятным и компенсирующим усилия, что алгоритм захотелось повторить и с другим крупным вендором.



    Самый что ни на есть настоящий банкомат начал натужно жужжать и охотно поделился с нами свежими хрустящими банкнотами (в данном случае вендорскими «фантиками»). Никакой магии не применялось: только ноутбук, мозг и USB-шнурок.

    Выводы


    Мы в очередной раз убедились, что, руководствуясь принципом security through obscurity, обеспечить надлежащую защиту невозможно. Проприетарность кода или прошивки совершенно не означает, что к ней в один прекрасный момент не получит доступ злоумышленник и не воспользуется найденными уязвимостями. Всем необходимым для реализации корыстных целей можно обзавестись при наличии определенной суммы денег.

    Разработчики должны заниматься кодом, а безопасники — его защитой. Именно поэтому наиболее продуктивным подходом видится сотрудничество с ИБ-компаниями с достаточным опытом в обеспечении безопасности различных систем, которые помогут построить адекватную защиту в каждом конкретном случае.

    P.S. Вендор подтвердил уязвимость (брешь также обнаружена и в другой модели — S2), которая была заявлена как исправленная в февральском фиксе 2018-го года.

    Список CVE:


    Благодарности


    До меня над прошивкой (правда без платы диспенсера) уже работали мои коллеги — Дима Скляров и Миша Цветков. Их наработки мне очень помогли в исследовании, за что им огромное спасибо! По части «железа» мне очень помог Алексей Стенников.
    Positive Technologies 337,08
    Компания
    Поделиться публикацией
    Комментарии 38
      +2
      Спасибо, было интересно!
        +4
        Вопрос, допустим я нашел такой баг в Тинкоффских новых банкоматах, обратился в тинькофф, обратился в поддержку, сказал им что есть баг, такой-то такой-то. Предоставил техникам всю информацию как его воспроизвести — могут меня потом запрячь по статье? Вот просто так, чисто формально по русски, за то что знаю и умею.
          –2

          В теории, если подписать NDA, и соблюсти пункты, то нет. Но, конечно, зависит от вендора.

            +3
            в свое время сообщал об уязвимостях в инет банке, поблагодарили 5000 милями на карту AA
              0
              А что за уязвимость была, если не секрет?
                0
                5000 миль) да уж… лучше бы слили инфу… больше бы заработали.
              +1
              Интересная статья, спасибо!
              Но ведь чтобы провернуть такую атаку, нужно просверлить в банкомате дырку!
              Разве там нет датчиков объёма / давления, которые подадут сигнал тревоги?
                0

                Верхнюю часть защищают не так сильно, как нижнюю, но защита есть.


                Выедут за атакующим в любом случае — вопрос лишь во времени на выполнение сценария.

                  +2

                  Почему не поместить всё в камеру с герметичными выводами, там же нет таких вычислительных мощностей, которые требуют активное охлаждение? За пределами камеры оставить только механические устройства с подвижными элементами. Чтобы при первом включении записывалось значение давления с датчика, а при любом изменении свыше установленного порога всё аппаратно блокировалось до физической замены какого-нибудь элемента или вообще всё сжигалось мощным импульсом по шинам питания. Не герметичные узлы проклеить трубкой и подключить к камере с контролируемым давлением. Вроде звучит дёшево и от физического доступа защищает.
                  Нечто подобное используется в авиации: крупные литые детали и всяческие нагруженные элементы снабжаются полостями, куда накачивается газ. При образовании трещины камера сообщается с атмосферой, давление газа меняется и срабатывает сигнализация. Предельно недорогое и надёжное решение, дешевле и легче настоящих датчиков объема.

                0
                Там на атм же бортовые камеры и все дырки будет видно как делает персонаж для взлома.
                  +1
                  Провинциальные банкоматы в небольших поселках, при всем желании охрана подоспеет, когда уже будет поздно
                    +3
                    Скажу так — приходилось мне видеть NCR'ы одного крупного банка изнутри. Камера есть, но не подключена.
                      0
                      Камера разве снимает все время? Насколько я знаю, она только делает фотографию при выставлении карты и при выполнении операции.
                        +1

                        По моему опыту работы в банковском IT: Решение о записи (реальной, по событию или фейковой) принимает отдел безопасности. Причем как правило даже не ИБ а те дядьки что отвечают за физическую безопасность. И решение принимается сугубо индивидуально: в тц может делать просто фото, а в сельпо писать постоянно.

                      0

                      А почему не сделают небольшую коробочку которая будет находится в сейфе и которая будет и с банком обмениваться в зашифрованном виде и диспенсером управлять, а вся остальная периферия пусть остается на системном блоке вне сейфа.

                        0
                        Т.е. всё равно из верхней сервисной зоны у компьютера должно быть общение с той коробочкой.
                          0

                          Коробочка приняв данные с с карты (или информацию с системного блока) обменивается с банком информацией, принимает решение и управляет диспенсором. Зачем для этого целый виндос непонятно. По мощностям и системный блок возможно уже не нужен, да и порядочно времени устройств с малым тепловыделением.
                          Хотя давно делают ноутбуки, но их (без экрана) в сейф почему-то не прячут.

                        –2
                        Слишком инвазивно. Банкоматы нынче вроде через беспроводной интернет работают — в пору создавать имитатор мобильной соты и доступа к интернету/банковским серверам, вставлять карточку-болванку с произвольно записанной информацией, давать беспроводное подтверждение и «снимать фантики». Ну конечно предварительно мониторить эфир, ловить и декодировать пакеты, глушить и подменять сигнал — но в результате полная неинвазивность и банкомат останется тот же, а если и другой — принцип работы и оборудование уже готовы.
                          +1

                          По вашему они по открытому каналу общаются?

                            –2
                            Данные-то в эфир передают, а не по проводу — при особом упорстве можно проанализировать (они же не используют нестандартные физические принципы связи).
                              +2

                              т.е. вскрывать современную криптографию вы уже умеете?
                              зачем вам тогда об банкомат руки марать ?

                                0
                                Нет, мне было бы интересно почитать про техническую реализацию беспроводной части.
                                  0
                                  Не поверите — обычный сотовый модем.
                                  А иногда и обычный проводной ethernet, когда есть такая возможность. Через обычную незащищенную сеть владельца объекта.
                                    0
                                    Под «технической реализацией беспроводной части» следует понимать не оборудование банкомата, а всё остальное для неинвазивного взлома.

                            +3

                            Так там поверх "воздушного" канала vpn поднимается. Чего там подменять будете? К тому же при потере связи он и в ребут и полная инициализация. Банкоматы мониторы, если часто будет уходить по связи — приедут проверять, там могут и видео глянуть.

                              –1
                              А то что нужно подменить мобильную соту и кусок интернета не смущает?
                              MITM тоже никто не отменял.
                              Если банкомат так просто ребутнуть — тоже уязвимость (даже если не взломать для получения денег, то просто глушилку сотовой сети с направленной антенной = постоянный ребут, успешный саботаж системы).
                                0

                                Вы хотите украсть денег или просто саботировать работу банкомата? Саботирует простейшая бумажка на экране — Банкомат не работает.

                                  0
                                  Я не хочу делать ничего незаконного, но теоретически задача интересная.

                                  Зачем бумажка, когда за ней светится монитор и видно, что всё работает?
                                    0
                                      0
                                      А то я подавителей ни разу типа не видел. Нет бы ссылку на фемтосоту с подменой CellID, для которой бы предварительно снифили мобильный траффик несколькими HackRF…
                                      Например habr.com/company/securitycode/blog/280886

                                      Вынимание из розетки вызывает писк, как и отключение электричества, и всё это не относится к беспалевным неинвазивным методам (без попадания в камеры наблюдения).
                                        0
                                        Вы что хотите в конечном итоге получить? Саботировать работу банкомата? Или иметь возможность им удаленно управлять?
                                        Для первого имитатор базовой станции не нужен (см. про розетку. ничего там не пищит, кстати).
                                        Для второго — бесполезен, если вы не умеете как минимум взламывать ipsec. А если вдруг умеете — банкомат далеко не самый интересный объект применения таких умений.
                                          –2
                                          В первом моём комментарии написано — в статье слишком инвазивный метод, нужен беспалевный.

                                          [сарказм]Ну да, не пищит. Сигнализации просто так висят, а при отключениях это не писк, это послышалось, или нет, свистит трансформатор в бесперебойнике...[/сарказм]

                                          Не управлять, а произвольно менять данные.
                                      0
                                      Зачем бумажка, когда за ней светится монитор и видно, что всё работает?

                                      Вы бумажек на работающих банкоматах не видели? Покажу Обращать внимание на нормальный экран рабочего банкомата.

                              0

                              А вот пресса зажигает
                              https://www.kommersant.ru/doc/3708881
                              10.08.2018
                              Эксперты Positive Technologies выявили уязвимость и сообщили о ней в головной офис NCR. 6 февраля 2018 года NCR на своем сайте www.ncr.com вывесила пресс-релиз об устранении уязвимости, выпуске обновления и дала рекомендации его установить. Российские банки, которые используют эти банкоматы, узнали об уязвимости от корреспондента “Ъ”, и по их словам не получили и обновления программного обеспечения для ее устранения.


                              По словам директора исследовательского центра компании Digital Security Романа Бажина… К тому же чтобы ее исправить, необходимо устанавливать обновление программного обеспечения вручную на каждый банкомат. «Обновление достаточно сложное, потребуется подключаться к каждому устройству, а это весьма проблематично, учитывая большую территориальную распределенность банкоматов»,— подчеркнул эксперт.

                                +1
                                Все это прекрасно, но грабители обычно выбирают более легкие цели и методы.

                                У меня товарищ работает в сети терминалов приема платежей.

                                Казалось-бы столичный супермаркет, рядом охранник магазина — заходят ребята в спецовках — за 5 минут аккуратно, не вызывая подозрений, вскрывают замок аппарата и берут деньги.

                                Мониторы так снимали — при этом еще нагло заявляют охране, что забирают на сервис.

                                В общем, механическая защищенность этих терминалов куда хуже, не говоря уже о электронике.

                                Самые упоротые выдирали уличный терминал, бросали в ВАЗ-универсал, угнанный рядом и ищи-свищи.
                                  0
                                  Если сейчас глупость скажу, сильно не ругайтесь, а подскажите где не прав. На счет неинвазивности такая идея: берем диспенсер и даем ему команду на формирование некоторой пачки денег параллельно записывая электрический сигнал на выходе. Далее «проигрываем» сигнал в сторону живого банкомата с применением направленной антенны и магнитрона (так вроде та штука из микроволновки называется). Если удастся создать в проводах такую же последовательность электрических импульсов как при формировании пачки, то может и тут все сформируется?..
                                    0

                                    Если такое возможно, то почему автор не просто подключился к проводам от диспенсера в сейф? Может сигнал от диспенсера все время специфический зашифрованный определенным ключем (хотя автор заостряет внимание на передачу по USB от системного блока в диспенсер)?

                                    0
                                    Не, именно от диспенсера в сейф. Думаете там тоже шифрованный сигнал?.. Я думал там просто тупая исполнительная железка которая управляется диспенсером. Но если и там шифрование — тогда да. Явно ничего не выйдет. Но какова идея! «Стельнул» ЭМИ в банкомат, а он тебе в ответ пачку денег :-)

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое