Пинг смерти! FreeBSD исправляет краш-статическую ошибку в сетевом инструменте PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Пинг смерти! FreeBSD исправляет аварийную ошибку в сетевом инструменте

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

Названная в честь одноименного звукового эффекта из любой сцены из старых фильмов о войне с участием подводных лодок, команда является метафорическим эхом (видите, что мы там делали?) подводной версии RADAR, известной как SONAR.

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

Любопытно, что вы, вероятно, слышали аббревиатуру TCP/IP, используемую в качестве общего описания связующего протокола, на котором работает Интернет. ping технически вообще не использует TCP/IP.

На самом деле, TCP/IP — это сокращение от протокол управления передачей по интернет-протоколу, и относится к довольно высокоуровневому механизму отправки данных через Интернет таким образом, что сама сеть вводит много вопросов «а это действительно работало правильно?» усилия для вас.

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

Кроме того, даже если разные фрагменты данных в конечном итоге используют разные маршруты в Интернете (например, из-за балансировки нагрузки, временных сбоев или других исправимых ошибок) и даже если некоторые фрагменты доставляются дольше, чем другие, данные TCP будут правильно буферизованы. и представлены в правильном порядке на другом конце.

Пинг разный

Ассоциация ping Команда, однако, обычно используется для проверки того, находится ли интересующий вас компьютер в сети вообще, особенно если он не принимает высокоуровневые TCP-соединения, которые вы ожидаете, такие как получение электронной почты или разрешение входа в систему SSH.

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

В результате ping использует протокол гораздо более низкого уровня, чем TCP.

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

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

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

Обычно обрабатывается прямо в ядре операционной системы, так что пакеты ICMP/IP почти наверняка пройдут, даже если никакое сетевое программное обеспечение более высокого уровня не работает корректно. ICMP, в частности, включает два специальных типа сообщений:

  • Введите 0x08. Официально называется ICMP Echo, это вид пакета обычно называется эхо-запросом. Это то, что ping программа отправляет для проверки активных компьютеров в сети.
  • Введите 0x00. Официально называется ICMP Echo Reply, этот тип пакета именно то, что он говорит. Предполагается, что компьютер, который находится в рабочем состоянии, подключен к сети и не настроен на блокировку трафика ICMP Echo, должен отправить такой пакет прямо обратно на компьютер, который его запросил.

НРАВИТСЯ:

$ ping -c 3 -p 4E414B45445345435552495459 nudesecurity.sophos.com ШАБЛОН: 0x4e414b45445345435552495459 PING news-sophos.go-vip.net (192.0.66.227) 56 (84) байт данных. 64 байта из 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 мс 64 байта из 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 мс 64 байта из 192.0.66.227 192.0.66.227 (3): icmp_seq=53 ttl=84.8 time=3 мс --- статистика пинга news-sophos.go-vip.net --- 3 пакета переданы, 0 получены, потеря пакетов 2004%, время 84.025 мс rtt мин/ среднее/макс/мотв = 84.644/85.062/0.446/XNUMX мс

Чтобы увидеть ping в действии на более низком уровне мы будем использовать код Lua, который вы можете найти в конце статьи, для создания собственного эхо-пакета ICMP и для чтения возвращаемого ответа, если он есть:

$ sudo luax ping.lua nudesecurity.sophos.com Отправка запроса ICMP ECHO на номер 192.0.66.227 --> 00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |....Zo.PingRequ| 00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6| 00000020 46 31 44 |F1D | Вернулся --> 00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping| 00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |Запрос сообщения B| 00000030 42 35 41 36 46 31 44 |B5A6F1D |

Кстати, нам нужно было использовать sudo выше, чтобы запустить наш скрипт с привилегиями суперпользователя, потому что мы создали то, что известно как необработанный IP-сокет — тот, который можно преобразовать в любой базовый формат, который нам нравится, включая TCP, UDP и, если необходимо, ICMP.

Во многих системах Linux/Unix ping команда, предоставляемая вашим дистрибутивом, работает без явных привилегий root, обычно потому, что она установлена ​​с особыми возможностями безопасности или с ее setuid флаг установлен, что означает, что он начинается с запуска под другой учетной записью пользователя, чем пользователь, который его запустил.

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

Мы опустили этот код, отключающий привилегии, в нашем образце сценария для краткости. Вы можете использовать posix.unistd.setpid() для переключения на непривилегированную учетную запись после создания сокета, но перед отправкой или получением каких-либо данных.

Изучение ответа

Как вы могли заметить в дампе данных из нашего скрипта выше, функция сетевого сокета, которую мы используем для считывания данных с отвечающего сервера, включает не только данные ICMP Echo Reply, но и низкоуровневый IP-адрес (заголовки интернет-протокола). в базовом пакете.

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

Если же линия индикатора ping каким-либо образом отклонен, эхо-ответ обычно включает не только собственные заголовки IP (как показано выше), но также эталонную копию заголовков IP и данные ICMP, которые появились в исходном исходящем запросе.

Заголовки пакетов IPv4 обычно выглядят так же, как вы видите выше, где заголовки IP начинаются с 45 00 00 37... и продолжайте в общей сложности 20 байтов, включая байты, показанные как ...XX XX XX XX, который является IP-адресом моего ноутбука.

НРАВИТСЯ:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.| 00000010 XX XX XX XX |.... | Версия IP и длина заголовка: 0x45 (4 = IPv4, 5 = пять 32-битных слов, т.е. 20 байт. Тип службы и данные о перегрузке: 0x00 Общая длина пакета: 0x0037 (десятичное 55). Информация о последовательности: F6 AF 00 00 Время до -live (прыжки слева): 0x35 (десятичное 53) Тип протокола: 0x01 (ICMP) Контрольная сумма: 0x947F (десятичное 38015) IP-номер отправляющего компьютера: C0 00 42 E3 (192.0.66.227 = nudesecurity.sophos.com) IP-адрес получателя (мой) ноутбук): XX XX XX XX (УДАЛЕНО = мой собственный IP-номер)

FreeBSD ping программисты, по-видимому, предполагали, что заголовки такого рода действительно всегда будут иметь длину ровно 20 байтов, основываясь на этом значении длины заголовка в первом байте 0x45, обозначая IPv4 (0x4?) с 5-DWORD (0x?5) или 20-байтовый заголовок.

Имея всего 20 байтов для беспокойства, программисты выделили буферы фиксированного размера в стеке, где они могли хранить копию заголовков IP в ответе, а также любые встроенные заголовки IP из исходного запроса, если возникала ошибка, которую необходимо обработать. .

Вы можете догадаться, куда это идет.

Этот первый байт в заголовке IPv4 по закону может иметь любое значение от 0x45 (минимальный размер заголовка 5 DWORD или 20 байт, как показано) до 0x4F (обозначая 15 DWORD, потому что 0xF — это десятичное число 15 или всего 60 байтов данных заголовка), таким образом аккуратно допуская дополнительные 40 байтов данных заголовка.

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

Остерегайтесь киберпреступников, которые подвергают вас испытанию

Как вы можете себе представить, учитывая, что эти дополнительные поля почти никогда не используются, вы можете никогда не увидеть пакет IPv4 с чем-либо, кроме 0x45 в начале и всего с 20 байтами данных заголовка, если только вы не столкнулись с кучей киберпреступников, готовых подвергнуть вас испытанию.

К сожалению, мало что может помешать злоумышленнику настроить сервер, который угадывает, используете ли вы FreeBSD, и преднамеренно генерирует пакеты ICMP/IP Echo Reply слишком большого размера, чтобы спровоцировать переполнение стекового буфера Внутри вашей ping программу.

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

В лучшем случае ваш ping программа вылетает; в худшем случае, как великодушно признает совет по безопасности FreeBSD, «Вредоносный хост может запустить удаленное выполнение кода в ping».

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

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

Примечательно, что ping программа не только заблокирована в песочнице, но и не запускается от имени пользователя root, когда код с ошибкой обнаруживается, как подтверждается в бюллетене по безопасности: "Когда ping запускается, он создает необработанный сокет, необходимый для выполнения своей работы, а затем отменяет свои повышенные привилегии».

Как описано выше, полномочия суперпользователя требуются только для получения необработанного IP-сокета от операционной системы, а не для использования sendto() и recvfrom() функции на этом сокете впоследствии.

Этой ошибке присвоен официальный идентификатор CVE-2022-23093; это задокументировано в рекомендациях по безопасности FreeBSD-SA-22:15.ping.

Что делать?

  • Если вы пользователь FreeBSD, просто обновите затронутые выпуски (FreeBSD 12 и FreeBSD 13) до их последних версий, в которых эта ошибка исправлена.
  • Если вы сетевой программист, всегда следите за тем, чтобы вы учитывали заголовки пакетов, которые могут указывать на необычные изменения размера. Тот факт, что вы сами никогда не видели никаких вариаций, не останавливает вас от того, что завтра вы столкнетесь с необычным, но совершенно законным пакетом.
  • Если вы сетевой менеджер, рассмотрите возможность блокировки пакетов IPv4 с заголовками IP размером менее 20 байт. Если вам действительно необходимо разрешить некоторым программным продуктам использовать необычные параметры заголовка IPv4, рассмотрите возможность регистрации этих необычных пакетов, чтобы узнать, почему.

Будьте осторожны там!


ПРИМЕР КОДА ДЛЯ ДЕМОНСТРАЦИИ PING-ТРАФИКА


Отметка времени:

Больше от Голая Безопасность