22.09.2014

Взлом алгоритма шифрования у принтеров Canon Pixma

image

В этой статье в очередной раз будут продемонстрированы бреши в безопасности устройств, относящиеся к классу ‘Internet of Things’ (концепция «интернет вещей»). Очередной выпуск будет посвящен исследованию прошивки принтеров Canon Pixma, которые часто приобретаются для домашнего пользования или малых и средних предприятий. При помощи уязвимости в этих устройствах можно через интернет изменить прошивку и запустить собственный код.

Автор: Michael Jordon

В этой статье в очередной раз будут продемонстрированы бреши в безопасности устройств, относящиеся к классу ‘Internet of Things’ (концепция «интернет вещей»). Очередной выпуск будет посвящен исследованию прошивки принтеров Canon Pixma, которые часто приобретаются для домашнего пользования или малых и средних предприятий. При помощи уязвимости в этих устройствах можно через интернет изменить прошивку и запустить собственный код. У беспроводных принтеров Canon Pixma есть веб-интерфейс, позволяющий просматривать информацию о принтере (например, уровень чернил). Также при помощи данного интерфейса можно распечатать тестовую страницу и проверить обновления для прошивки.

Рисунок 1: Внешний вид веб-интерфейса принтера Pixma MG6450

Интерфейс не требует какой-либо аутентификации, позволяя любому получить к нему доступ. На первый взгляд функционал относительно безобиден: мы лишь можем распечатать несколько сотен тестовых страниц и истратить все чернила и бумагу. Однако все не так радужно. Основная проблема заключается в процедуре обновления прошивки. Во время запуска процесса обновления мы можем изменить настройки прокси и DNS серверов, что позволяет изменить местонахождение, откуда принтер будет забирать новую версию прошивки. Давайте рассмотрим, как компания Cannon защищает нас от подобного рода действий. Если коротко, то никак. Используется очень слабое шифрование и отсутствует цифровая подпись (чтобы гарантировать, что весь процесс обновления выполнен по правилам). Далее в статье будет детально рассказано о том, как взломать этот алгоритм, в результате чего мы сможем загрузить нашу собственную версию прошивки при помощи вредоносной картинки. Загруженный троян будет шпионить за распечатываемыми документами, либо будет использоваться для доступа к сети жертвы. В демонстрационном примере я решил запустить на принтере Doom (популярная игра в 90-е годы). Эта задача не столь тривиальна, особенно когда нет доступа к отладчику и вообще к любым элементарным операциям. Кроме того, в операционной системе на архитектуре ARM должны присутствовать все необходимые компоненты (тема отдельной статьи). Ниже показано видео с запущенной игрой (заранее извиняюсь за плохие цвета):

http://video.contextis.co.uk/PixmaDoom/

Но кто разрешит пользоваться веб-интерфейсом через интернет, спросите вы? Из 32 тысяч IP-адресов при помощи сервиса Shodan (http://www.shodanhq.com) было найдено 9000 IP, где может использоваться потенциально уязвимый принтер. 1822 из этих IP-адресов оказались «живыми», и 122 IP-адреса имели уязвимую версию прошивки (около 6%). В конечном итоге мы насчитали не менее 2000 уязвимых моделей, напрямую подключенных к интернету.

Даже если принтер не подключен напрямую к интернету, а находится за NAT или офисным интранетом, устройство все равно остается уязвимым к удаленной атаке. Отсутствие аутентификации делает принтер уязвимым к CSRF-атакам (межсайтова подделка запроса), позволяющих изменять настройки принтера. Один из моих коллег (спасибо Полу Стоуну) создал тестовую страницу, которая сканировала локальную сеть и искала уязвимые принтеры при помощи сканирования портов средства JavaScript (техника JavaScript port scanning). Как только уязвимый принтер находится, страница отсылает запрос к веб-интерфейсу, изменяя настройки прокси сервера и запуская процедуру обновления прошивки. Даже если принтер не подключен к интернету, запрос вредоносной страницы исходит со стороны браузера пользователя, находящегося в той же самой сети, что и принтер.

Мы связались с компанией Cannon в марте этого года и рассказали об этой проблеме. Представители компании ответили, что в будущих версиях будет предусмотрен логин и пароль для доступа к веб-интерфейса. В конце статьи приведена полная версия их ответа.

В данной статье рассказывается о взломе алгоритма шифрования. В отдельной статье будут рассмотрены возможности, начиная с изменения прошивки и заканчивая запуском собственного кода, позволяющего использовать беспроводную сеть, манипулировать памятью и показывать на экране то, что было продемонстрировано на видео выше. Внутри прошивки не используется операционная система, а только сжатый ARM-код, что делает задачу по реверс-инжинирингу весьма интересной, особенно когда нет доступа к отладчику или консоли, и когда требуется 10 минут на обновление принтера, который должен оставаться работоспособным.

Схема взлома алгоритма шифрования

Давайте вначале взглянем на зашифрованную прошивку:

Рисунок 2: Зашифрованная прошивка

Из рисунка выше видно, что в прошивке есть повторяющиеся элементы (один из них приведен выше), что говорит о слабости алгоритма шифрования. Повторяющийся элемент наводит нас на мысль о длине ключа. В данном случае длина элемента – 0х30. Это либо длина ключа, либо его множитель. Глядя на частоту символов, мы еще больше убеждаемся в том, что схема шифрования не очень хороша.

Рисунок 3: Частота вхождения символов в зашифрованную прошивку (по вертикальной оси – частота, по горизонтальной – байты 0-0xff)

Если предположить, что алгоритм представляет собой операцию XOR ключа и обычного текста, тогда весь процесс шифрования выглядит так:

Рисунок 4: Базовый алгоритм XOR-шифрования

Если это наш случай, тогда блоки рассчитываются так:

P0 ^ K = C0
P1 ^ K = C1
Pn ^ K = Cn

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

P0 ^ K ^ C0 = 0
P1 ^ K ^ C0 = P1 ^ P0
Pn ^ K ^ C0 = Pn ^ P0

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

Рисунок 5: Зашифрованная прошивка с выполненной операцией XOR между первым и остальными блоками

Картина выглядит красиво, но получившийся текст все еще остается непонятным. Нам нужно выяснить содержимое первого блока, чтобы расшифровать остальную информацию. После продолжительных экспериментов с различными настройками, я обнаружил, что в старых прошивках у принтеров Canon использовалось не подобное «шифрование», а формат SRecord.

В основном этот формат использовался для записи в память микроконтроллеров и других логических устройств (бинарная информация передается в шестнадцатеричных ASCII-кодах). Пример:

Рисунок 6: Пример записи в формате SRecord (источник: Википедия)

Как видно из рисунка выше, используются шестнадцатеричные ASCII-коды, переносы строк и символ ‘S’ в начале каждой строки. Это наталкивает нас на интересные мысли о том, что находится в начале прошивки (предполагаем, что используется формат SRecords): первый символ - ‘S’, за которым идет серия ASCII-кодов. Начальное предположение: первая строчка может выглядеть так:

S00000000000000000000000000000000000000000000000

Первые результаты дешифрования:

Рисунок 7: Первая попытка дешифрации прошивки

Результаты дешифрования в основном состоят из ASCII-текста (значения в основном распределены в диапазоне 0x30-0x7f), а первая колонка (отмеченная зеленым на Рисунке 6) содержит только ASCII-значения. Это подтверждает, что первый байт соответствует формату SRecord. Однако вторая колонка (отмеченная синим на Рисунке 6) не соответствует формату SRecord и, следовательно, второй символ – не нулевой. Третья колонка содержит корректное значение, поскольку все символы валидны, включая символ перевода строки (0xd). Мы можем автоматизировать процесс подбора символов, поскольку у нас есть подмножество возможных вариантов, а затем проверить содержимое колонки, полученное после дешифрования. После успешного подбора обнаруживается, что длина ключа - 0x10, а у нас в наличие появляется корректное содержимое в формате SRecord. У записей в формате SRecord предусмотрена контрольная сумма, что помогает нам проверить правильность ключа. Файл выглядит примерно так:

Рисунок 8: Расшифрованная прошивка

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

История развития события:

  • 14 марта 2014 года – компания Canon оповещена о проблеме.
  • 18 марта 2014 года – компания Canon запросила дополнительную информацию о проблеме.
  • 19 мая 2014 года – компания Canon распространила информацию о проблеме.
  • 29 мая 2014 года – запрос на публикацию статьи.
  • 5 июня 2014 – компания Canon признала существование проблемы.
  • 9 июня 2014 – представители компании Canon посетили офис компании Context для обсуждения статьи.
  • 12 сентября 2014 – публикация статьи в блоге вместе с презентацией на конференции 44Con.

Заявление Cannon, касаемое это проблемы:

«Мы благодарим компанию Context за то, что она довела информацию об этой проблеме до нашего сведения; каждое сообщение, касаемое потенциальных уязвимостей, рассматривается нами очень серьезно. Мы всегда усиленно работаем над безопасностью всех наших продуктов, однако в мире всем изменяется настолько быстро, чтобы мы не в состоянии уследить за всеми угрозами и всегда открыты для общения по этой теме для того, чтобы наши клиенты были максимально защищены

В скором времени будет выпущено обновление. Во всех новых продуктах линейки PIXMA для доступа к веб-интерфейсу будет использоваться логин и пароль. Модели, выпущенные начиная со второй половины 2013 года, также будут обновлены. В моделях, выпущенных до середины 2013 года, эта проблема отсутствует. В итоге, проблема, обнаруженная компанией Context, будет полностью решена».

Рекомендации

Мы рекомендует отключить от интернета беспроводные принтеры (как и все остальные устройства, относящиеся к классу «Internet of Things»). Чтобы защититься от CRSF-атак, не следует кликать по сомнительным ссылкам. У нас нет информации о масштабах эксплуатации этого рода уязвимостей, но мы надеемся, что теперь безопасность ваших беспроводных устройств станет немного выше. Также всегда проверяйте последние версии прошивок для используемых вами устройств. Часто этот процесс не автоматизирован, и требуется периодически заходить на сайт производителя.