November 1, 2023

Ваш принтер — не ваш принтер!


Английская версия ,中文版本

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

В 2021 году мы обнаружили уязвимости RCE предварительной аутентификации ( CVE-2022-24673 и CVE-2022-3942 ) в принтерах Canon и HP, а также уязвимость ( CVE-2021-44734 ) в Lexmark. Мы использовали эти уязвимости для эксплуатации Canon ImageCLASS MF644Cdw, HP Color LaserJet Pro MFP M283fdw и Lexmark MC3224i в Pwn2Own Austin 2021 . Ниже мы опишем подробности уязвимостей и их эксплуатации Canon и HP.

Это исследование также представлено на выставках HITCON 2022 и CODE BLUE 2022 . Посмотреть слайды можно здесь.

Принтер

Раньше для подключения принтера к компьютеру часто требовался кабель IEEE1284 или USB-принтер. Нам также пришлось установить драйвер принтера, предоставленный производителем. В настоящее время большинству принтеров, представленных на рынке, не требуется USB или традиционный кабель. Пока принтер подключен к интрасети через кабель локальной сети, мы можем немедленно найти и использовать принтер.

Принтер также предоставляет не только печать, но и различные услуги, такие как FTP, AirPrint, Bonjour. Не что иное, как сделать печать более удобной.

Мотивация

Почему мы хотим исследовать принтеры?

Красная команда

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

Pwn2Own Остин 2021

Другая причина заключается в том, что принтеры стали одной из основных целей Pwn2Own Mobile. Мы также готовились снова принять участие в этапе Pwn2Own, поэтому решили начать с него.

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

В этой статье основное внимание будет уделено деталям Canon и HP.

Анализ

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

Канон

Извлечение прошивки

Первоначальная версия анализа — v6.03, вначале мы использовали binwalk для анализа, но прошивка запутана, и мы не можем проанализировать ее напрямую.

Запутанная прошивка Canon ImageCLASS MF644Cdw

Мы также попробовали «Сундук с сокровищами: PARTY QUEST: FROM DOOM TO EXPLOIT» от Synacktiv и «Взлом принтеров Canon Pixma – обреченное шифрование» от исследования Contextis. Но на этот раз это совсем другая серия, и мы не можем использовать тот же метод для деобфускации прошивки.

Итак, мы начали анализировать запутанный формат и содержимое прошивки.

Из запутанной прошивки мы видим, что начало — это Magic NCFW, за которым следует размер прошивки, а остальные части — это запутанные данные.

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

Мы можем получить URL-адрес загрузки прошивки через официальный сайт или пакет обновления.

https://pdisp01.c-wss.com/gdl/WWUFORedirectTarget.do?id=MDQwMDAwNDc1MjA1&cmp=Z01&lang=EN

После анализа его можно разделить на три части.

WМы можем приблизительно определить правила URL-адреса загрузки. Этим методом мы скачиваем все версии прошивок. Версии, которые мы загрузили на тот момент, включали:

  • В2.01
  • В4.02
  • В6.03
  • В9.03
  • В10.02

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

Но мы можем попробовать скачать прошивку Canon другой серии и узнать, есть ли аналогичный алгоритм обфускации. После того, как вся прошивка скачана, общий размер файла составляет 130 ГБ. Мы можем найти незашифрованную прошивку, набрав NCFWи servicemode.html.

Наконец мы нашли четыре прошивки, соответствующие условиям. Для анализа мы выбрали принтеры серии WG7000 и обнаружили подозрительную функцию деобфускации.

К счастью, переписав эту функцию, прошивку MF644Cdw можно деобфускировать.

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

Первая база, которую мы нашли, была 0x40b0000. Но после декомпиляции с помощью IDA большая часть строки functionне соответствовала debug message.

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

Как решить эту проблему? Мы сначала нашли объект function with a known function nameи function name stringвнесли в него необходимые коррективы. Найдя смещение, мы настроили базу изображения на правильный адрес. Последняя найденная база образа — 0x40affde0 . После настройки вы увидите, что исходное имя функции можно определить правильно.

Далее можно провести типовой анализ прошивки. После предварительного анализа можно узнать Canon ImageCLASS MF644Cdw:

  • ОС — DryOSV2
    • Индивидуальная ОСРВ от Canon
  • 32-битный ARMv7 с прямым порядком байтов
  • Связано с кодом приложения в одно изображение.
    • Ядро
    • Услуга

HP

Прошивку HP относительно легко получить. Мы можем использовать binwalk -Z для получения правильной прошивки. Это заняло около 3-4 дней. Остальные шаги, такие как поиск базового адреса изображения, такие же, как у Canon. После предварительного анализа архитектура HP Color LaserJet Pro MFP M283fdw выглядит следующим образом:

  • Операционные системы
    • ОСРВ — модификация из ThreadX/Green Hills
  • ARM11 со смешанным порядком байтов
    • Код — прямой порядок байтов
    • Данные – обратный порядок байтов

Поверхность атаки

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

Услуга

Порт

Описание

РУИ

ПТС 80/443

веб интерфейс

ПДЛ

ПТС 9100

Язык описания страницы

ПИЖЛ

ПТС 9100

Язык задания принтера

ИПП

ПТС 631

Протокол Интернет-печати

ЛПД

ПТС 515

Протокол демона линейного принтера

SNMP

УДП 161

Простой протокол управления сетью

СЛП

ПТС 427

Протокол определения местоположения службы

mDNS

УДП 5353

Многоадресный DNS

ЛЛМНР

УДП 5355

Разрешение многоадресных имен Link-Local

Обычно для облегчения управления открывается RUI (веб-интерфейс). Порт 9100 также широко используется принтерами и в основном используется для передачи печатных данных.

Другие различаются у разных поставщиков, но перечисленные обычно присутствуют, и большинство из них включены по умолчанию. После оценки общей архитектуры мы сосредоточиваемся на обнаружении сервисов и серии сервисов DNS. Наш многолетний опыт часто показывает, что такие протоколы, реализованные производителями, часто подвержены уязвимостям. Основными сервисами, которые мы проанализировали, были SLP , mDNS и LLMNR .

Далее мы возьмем Pwn2Own Austin 2021 в качестве примера, чтобы увидеть, какие проблемы часто возникают у этих протоколов.

Взлом принтеров на Pwn2Own

Канон

Протокол определения местоположения службы

SLP — это протокол обнаружения служб, который позволяет компьютерам и другим устройствам находить службы в локальной сети. В прошлом в SLP EXSI было много уязвимостей . Canon реализует услугу SLP в основном самостоятельно. Подробную информацию об услуге SLP можно найти в RFC2608 .

Прежде чем мы рассмотрим детали SLP, нам нужно поговорить о структуре пакетов SLP.

Структура пакета SLP

Здесь нам нужно только обратить внимание на function-id. Это поле определяет тип запроса и формат полезной части. Canon реализует только запрос на обслуживание и запрос атрибута.

В запросе атрибута (AttrRqst) пользователь может получить список атрибутов в соответствии с услугой и областью действия. Мы можем указать область поиска, например принтеры Canon.

Пример:

Структура запроса атрибута выглядит следующим образом.

В основном он состоит из длины (Length) и значения (Value). При анализе такого формата следует быть осторожным, поскольку здесь часто встречаются ошибки. На самом деле, в Canon есть уязвимость при объединении этого формата.

Уязвимость

Когда он анализирует список областей, он преобразует escape-символы в ASCII. Например, \41будет преобразован в A. Но что плохого в этом простом преобразовании? Давайте посмотрим на псевдокод.

int parse_scope_list(...){
	char destbuf[36];
	unsigned int max = 34;
	parse_escape_char(...,destbuf,max);
}

Как показано в приведенном выше коде, в parse_scope_list, он передает буфер фиксированного размера destbufи максимальный размер 34 в parse_escape_char. Здесь нет уязвимости. Давайте посмотрим parse_escape_char.

int __fastcall parse_escape_char(unsigned __int8 **pdata, _WORD *pdatalen, unsigned __int8 *destbuf, _WORD *max)
{
  unsigned int idx; // r7
  int v7; // r9
  int v8; // r8
  int error; // r11
  unsigned __int8 *v10; // r5
  unsigned int i; // r6
  int v12; // r1
  int v13; // r0
  unsigned int v14; // r1
  bool v15; // cc
  int v16; // r2
  bool v17; // cc
  unsigned __int8 v18; // r0
  int v19; // r0
  unsigned __int8 v20; // r0
  unsigned int v21; // r0
  unsigned int v22; // r0

  idx = 0;
  v7 = 0;
  v8 = 0;
  error = 0;
  v10 = *pdata;
  for ( i = (unsigned __int16)*pdatalen; i && !v7; i = (unsigned __int16)(i - 1) )
  {
    v12 = *v10;
    if ( v12 == ',' )
    {
      if ( i < 2 )
        return -4;
      v7 = 1;
    }
    else
    {
      if ( v12 == '\\' ) //----------------------[1]
      {
        if ( i < 3 )
          return -4;
        v13 = v10[1];
        v14 = v13 - '0';
        v15 = v13 - (unsigned int)'0' > 9;
        if ( v13 - (unsigned int)'0' > 9 )
          v15 = v13 - (unsigned int)'A' > 5;
        if ( v15 && v13 - (unsigned int)'a' > 5 )
          return -4;
        v16 = v10[2];
        v17 = v16 - (unsigned int)'0' > 9;
        if ( v16 - (unsigned int)'0' > 9 )
          v17 = v16 - (unsigned int)'A' > 5;
        if ( v17 && v16 - (unsigned int)'a' > 5 )
          return -4;
        if ( v14 <= 9 )
          v18 = 0x10 * v14;
        else
          v18 = v13 - 0x37;
        if ( v14 > 9 )
          v18 *= 0x10;
        *destbuf = v18; //-------------------[2]
        v19 = v10[2];
        v10 += 2;
        v20 = (unsigned int)(v19 - 0x30) > 9 ? (v19 - 55) & 0xF | *destbuf : *destbuf | (v19 - 0x30) & 0xF;
        *destbuf = v20;
        LOWORD(i) = i - 2;
        if ( !strchr((int)"(),\\!<=>~;*+", *destbuf) )
        {
          v21 = *destbuf;
          if ( v21 > 0x1F && v21 != 0x7F )
            return -4;
        }
        goto LABEL_40;
      }
      if ( strchr((int)"(),\\!<=>~;*+", v12) ) //-----------------------[3]
        return -4;
      v22 = *v10;
      if ( v22 <= 0x1F || v22 == 0x7F )
        return -4;
      if ( v22 != ' ' )
      {
        v8 = 0;
        goto LABEL_35;
      }
      if ( !v8 )
      {
        v8 = 1;
LABEL_35:
        if ( (unsigned __int16)*max <= idx ) //----------------------[4] 
        {
          error = 1;
          goto next_one;
        }
        if ( v8 )
          LOBYTE(v22) = 32;
        *destbuf = v22;
LABEL_40:
        ++destbuf;
        idx = (unsigned __int16)(idx + 1);
      }
    }
next_one:
    ++v10;
  }
  if ( error )
  {
    *max = 0;
    debugprintff(3645, 4, "Scope longer than buffer provided");
LABEL_48:
    *pdata = v10;
    *pdatalen = i;
    return 0;
  }
  if ( idx )
  {
    *max = idx;
    goto LABEL_48;
  }
  return -4;
}

Как видите, [3]это случай, когда escape-символы не обрабатываются. Он проверяет, превышает ли длина максимальную длину [4]. Однако в случае [1]обработки escape-символов проверка длины не выполняется, и преобразованный результат напрямую копируется в целевой буфер [2].

Если задана длинная строка escape-символов, это приводит к переполнению стека.

После обнаружения уязвимости первым делом нужно посмотреть, какая у нее защита, чтобы определиться с планом эксплойта. Но после анализа мы обнаружили, что принтер Canon не имеет никакой защиты, связанной с памятью .

Защита

  • Нет защиты стека
  • Нет ДЭП
  • Нет АСЛР

Нет Stack Guard, нет DEP и нет ASLR, удобство для хакеров ! Как и в 90-е годы, просто переполнение стека может контролировать мир. Далее, как и в случае с прошлым методом эксплойта переполнения стека, нам просто нужно найти фиксированный адрес для хранения шеллкода, перезаписать обратный адрес и перейти к шеллкоду. В конце концов мы нашли сервис BJNP для хранения нашего шеллкода.

БДНП

BJNP также является протоколом обнаружения служб, разработанным Canon, и в прошлом существовало множество уязвимостей. Synacktiv также использовал Pixma MX925 через этот протокол. Для получения более подробной информации, пожалуйста, обратитесь сюда . BJNP сохраняет данные управляемого сеанса в глобальном буфере. Мы можем использовать эту функцию для размещения нашего шеллкода в фиксированном месте без строгих ограничений.

Этап эксплуатации

  • Используйте BJNP для хранения нашего шеллкода в глобальном буфере.
  • Переполнение стека триггера в SLP и перезапись адреса возврата
  • Вернуться в глобальный буфер

Pwn2Own Остин 2021

Обычно организатор Pwn2Own (ZDI) просит участников доказать, что мы достигли цели. Метод презентации здесь зависит от игроков. Изначально мы хотели напечатать логотип прямо на ЖК-экране, поскольку использовали принтер Lexmark.

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

На самом деле распечатать изображение на экране не так уж и сложно. Другие команды нашли методы . Желающие могут попробовать :)

Отлаживать

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

  • Разберите принтер и получите консоль отладки.
  • Используйте старый эксплойт для установки индивидуального отладчика

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

После ROP или выполнения шеллкода распечатайте результат на веб-странице или в другом видимом месте, а затем вызовите режим сна. Мы можем прочитать результат с веб-страницы и, наконец, перезагрузить компьютер, чтобы повторить этот процесс.

Далее поговорим о принтерах HP.

HP

Разрешение многоадресных имен Link-Local

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

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

После получения клиентом C клиент C отправляет его обратно клиенту A, который реализует разрешение доменного имени локальной ссылки.

LLMNR в основном основан на формате DNS-пакета и имеет следующий формат:

Основной формат — это заголовок, за которым следуют запросы, а число представляет количество запросов разных типов.

Каждый DNS-запрос состоит из множества меток, и каждая метка будет содержать длину и строку, как показано на рисунке выше. Существует также механизм сжатия сообщений . Работа с ними очень подвержена уязвимостям. Подобные проблемы также упоминаются в докладе «Цена сложности: разные уязвимости при реализации одного и того же RFC» на конференции BlackHat 2021.

Уязвимость

Давайте посмотрим на реализацию HP:

int llmnr_process_query(...){
    char result[292];
    consume_labels(llmnr_packet->qname,result,...);
    ...
}

Здесь вы можете видеть, что когда HP обрабатывает пакеты LLMNR, она передает буфер фиксированного размера в Consumer_lables. consume_lablesиспользуется для обработки меток DNS, а фиксированный буфер используется для хранения результатов.

int __fastcall consume_labels(char *src, char *dst, llmnr_hdr *a3)
{
  int v3; // r5
  int v4; // r12
  unsigned int len; // r3
  int v6; // r4
  char v7; // r6
  bool v8; // cc
  int v9; // r0
  unsigned __int8 chr; // r6
  int result; // r0

  v3 = 0;
  v4 = 0;
  len = 0;
  v6 = 0;
  while ( 1 )
  {
    chr = src[v3]; //-------------[1]
    if ( !chr )
      break;
    if ( (int)len <= 0 )
    {
      v8 = chr <= 0xC0u;
      if ( chr == 0xC0 )
      {
        v9 = src[v3 + 1];
        v6 = 1;
        v3 = 0;
        src = (char *)a3 + v9;
      }
      else
      {
        len = src[v3++];
        v8 = v4 <= 0;
      }
      if ( !v8 )
        dst[v4++] = '.';
    }
    else
    {
      v7 = src[v3++];
      len = (char)(len - 1);
      dst[v4++] = v7; //----------[2]
    }
  }
  result = v3 + 1;
  dst[v4] = 0;
  if ( v6 )
    return 2;
  return result;
}

Мы видим, что [1]получим длину метки, а затем обработаем ее в соответствии с типом. [2]используется как случай длины. Здесь нет проверки длины, и метка записывается напрямую в буфер dst, что приводит к переполнению стека. На этом этапе мы подумали, что можем использовать его так же, как Canon. Однако, когда мы писали эксплойт, мы обнаружили, что принтеры HP имеют больше механизмов защиты.

Защита

  • Нет защиты стека
  • XN(ДЕП)
  • Модуль защиты памяти (MPU)
  • Нет АСЛР

В этом случае включаются механизмы защиты памяти XN и MPU, и данная уязвимость имеет больше ограничений. Мы можем переполнить только около 0x100 байт без нулевого байта , что значительно ограничивает нашу ROP и усложняет ее. Нам нужно найти другие уязвимости или методы для достижения нашей цели.

Через некоторое время мы начали думать о том, как принтеры HP реализуют XN(DEP) и MPU. Давайте рассмотрим HP RTOS:

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

После рассмотрения мы подумали, а можно ли это обойти, разобравшись в MMU и MPU в HP RTOS?

MMU в HP M283fdw

HP M283fdw использует одноуровневую трансляцию таблицы страниц и каждую запись таблицы перевода для перевода раздела размером 1 МБ. Таблица трансляции расположена по адресу 0x4003c000 .

Каждая запись таблицы трансляции соответствует физическому адресу и правам раздела. ЦП определяет, может ли оно быть выполнено или изменено в соответствии с записью. Здесь рассматриваются разрешения AP, APX и XN. Мы также можем сопоставить любой физический адрес с помощью этой записи таблицы трансляции.

Как правило, мы можем изменить запись таблицы перевода через ROP, если у нас есть переполнение стека при высоких привилегиях. Но когда мы попытались писать напрямую в таблицу трансляции, принтер HP сломался.

Мы проверили и обнаружили, что основной причиной исключения ошибки памяти является то, что модуль защиты памяти (MPU) защищает таблицу трансляции.

МПУ в HP M283fdw

MPU позволяет разбивать память на регионы и устанавливать индивидуальные атрибуты защиты для каждого региона. Это совершенно другой механизм, чем MMU, и он часто встречается в устройствах Интернета вещей. HP включает MPU при загрузке и определяет разрешения для каждого региона, поэтому мы не можем манипулировать таблицей страниц.

После долгого обратного проектирования и обращения к руководству ARM мы обнаружили, что MPU можно отключить, очистив MPU_CTRL. Мы обнаружили, что это местоположение 0xE0400304, что немного отличается от спецификации ARM.

Эксплуатация

Поняв механизм MMU и MPU HP, мы можем легко использовать ROP для отключения MPU и успешного изменения записи таблицы трансляции. Мы можем произвольно изменять код любого сервиса и в итоге выбрали Line Printer Daemon(LPD) . Мы превратили его в бэкдор, прочитали больше полезных данных в указанное место и, наконец, выполнили шеллкод.

Но есть одна вещь, о которой необходимо упомянуть. После перезаписи записи таблицы перевода и кода LPD обязательно очистите TLB и сделайте недействительными I-cache и D-cache . В противном случае весьма вероятно, что он будет выполнен в старом варианте, что приведет к сбою эксплойта.

Очистить TLB

flush_tlb:
    mov r12, #0
    mcr p15, 0, r12, c8, c7, 0

Недействительный I-кэш

disable_icache:
    mrc p15, 0, r1, c1, c0, 0
    bic r1, r1, #(1 << 12)
    mcr p15, 0, r1, c1, c0, 0

Этап эксплуатации

  • Переполнение стека триггера в LLMNR и перезапись адреса возврата
  • Используйте ограниченную ROP для
    • отключить МПУ
    • изменить запись таблицы перевода и получить разрешение на выполнение чтения и записи
    • очистить TLB
    • изменить код LPD
    • аннулировать I-кэш и D-кэш
  • Используйте модифицированный LPD для чтения нашего шеллкода и перехода к шеллкоду.

Pwn2Own Остин 2021

Когда мы смогли выполнить шеллкод, у нас осталась всего одна неделя, и мы наконец решили использовать точную строку для отображения Pwned by DEVCOREна ЖК-дисплее.

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

F-Secure Labs использовала функцию воспроизведения музыки, чтобы представить ее в то время. Это увлекательно. Вы можете зайти сюда , чтобы посмотреть ситуацию на Pwn2Own.

Результат

В Pwn2Own Austin 2021 мы заняли 2-е место после взлома других устройств и принтеров. Мы получили хороший опыт и узнали много нового.

смягчение последствий

Обновлять

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

Отключить неиспользуемый сервис

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

Брандмауэр

Было бы лучше, если бы вы могли применить брандмауэр. Большинство принтеров предоставляют соответствующие функции.

Краткое содержание

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

Кстати, протоколы серии Discovery Service на многих принтерах зачастую уязвимы. Если вы хотите найти уязвимости в принтерах или других устройствах Интернета вещей, вы можете посмотреть в этом направлении.

Продолжение следует

Мы также обнаружили несколько уязвимостей в серии принтеров на Pwn2Own Toronto 2022 в прошлом году. Скоро мы опубликуем подробную информацию, так что следите за Частью II.

Ссылка