Изображение: 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:


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


До меня над прошивкой (правда без платы диспенсера) уже работали мои коллеги — Дима Скляров и Миша Цветков. Их наработки мне очень помогли в исследовании, за что им огромное спасибо! По части «железа» мне очень помог Алексей Стенников.

Комментарии (35)


  1. VBKesha
    10.08.2018 17:49
    +2

    Спасибо, было интересно!


  1. mphys
    10.08.2018 18:19
    +1

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


    1. DrMefistO Автор
      10.08.2018 18:23

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


    1. foxyrus
      10.08.2018 21:57
      +3

      в свое время сообщал об уязвимостях в инет банке, поблагодарили 5000 милями на карту AA


      1. lostpassword
        10.08.2018 22:19

        А что за уязвимость была, если не секрет?


      1. serg_deep
        11.08.2018 10:23

        5000 миль) да уж… лучше бы слили инфу… больше бы заработали.


  1. lostpassword
    10.08.2018 19:18
    +1

    Интересная статья, спасибо!
    Но ведь чтобы провернуть такую атаку, нужно просверлить в банкомате дырку!
    Разве там нет датчиков объёма / давления, которые подадут сигнал тревоги?


    1. DrMefistO Автор
      10.08.2018 19:36

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


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


      1. zbsh
        11.08.2018 06:25
        +1

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


  1. denis-19
    10.08.2018 21:11

    Там на атм же бортовые камеры и все дырки будет видно как делает персонаж для взлома.


    1. MaestrO_998
      10.08.2018 21:32
      +1

      Провинциальные банкоматы в небольших поселках, при всем желании охрана подоспеет, когда уже будет поздно


    1. Alexsey
      10.08.2018 23:04
      +3

      Скажу так — приходилось мне видеть NCR'ы одного крупного банка изнутри. Камера есть, но не подключена.


    1. tutam
      11.08.2018 06:53

      Камера разве снимает все время? Насколько я знаю, она только делает фотографию при выставлении карты и при выполнении операции.


      1. Dare
        11.08.2018 12:36
        +1

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


  1. pnetmon
    10.08.2018 21:58

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


    1. DrMefistO Автор
      10.08.2018 22:05

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


      1. pnetmon
        11.08.2018 10:27

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


  1. vinny496
    11.08.2018 05:32
    -2

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


    1. Zolg
      11.08.2018 08:15
      +1

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


      1. vinny496
        11.08.2018 15:54
        -2

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


        1. Zolg
          11.08.2018 15:59
          +1

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


          1. vinny496
            13.08.2018 00:51

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


            1. Zolg
              13.08.2018 11:24

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


              1. vinny496
                13.08.2018 12:01

                Под «технической реализацией беспроводной части» следует понимать не оборудование банкомата, а всё остальное для неинвазивного взлома.


    1. really4g
      11.08.2018 10:42
      +3

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


      1. vinny496
        11.08.2018 16:01

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


        1. pnetmon
          11.08.2018 17:03

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


          1. vinny496
            13.08.2018 00:49

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

            Зачем бумажка, когда за ней светится монитор и видно, что всё работает?


            1. Zolg
              13.08.2018 11:28

              1. vinny496
                13.08.2018 11:58

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

                Вынимание из розетки вызывает писк, как и отключение электричества, и всё это не относится к беспалевным неинвазивным методам (без попадания в камеры наблюдения).


                1. Zolg
                  13.08.2018 12:14

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


                  1. vinny496
                    13.08.2018 12:34

                    В первом моём комментарии написано — в статье слишком инвазивный метод, нужен беспалевный.

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

                    Не управлять, а произвольно менять данные.


            1. pnetmon
              13.08.2018 14:44

              Зачем бумажка, когда за ней светится монитор и видно, что всё работает?

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


  1. pnetmon
    12.08.2018 19:00

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


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


  1. gerasimenkoao
    13.08.2018 10:14

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

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

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

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

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

    Самые упоротые выдирали уличный терминал, бросали в ВАЗ-универсал, угнанный рядом и ищи-свищи.