ping
– одна из самых базовых
сетевых утилит. По сути она позволяет проверить доступность компьютера
в сети. Принцип работы очень прост: посылаешь специальный сетевой пакет,
его принимает адресат и отправляет ответ назад с необходимой информацией.
Это не единственный вариант, как можно применять ping и сам протокол ICMP,
но, пожалуй, самый частый.
Немного о "пингах смерти" 90-х
Сегодняшняя новость имеет мало общего с "пингом смерти" (ping of death), который использовался для сетевых атак в 90-ые годы. Однако, именно эта "связь веков" у меня и вызвала улыбку.
Тогда, на заре развития сети Интернет многие пользователи "разыгрывали" своих сетевых друзей, использовавших, например Windows 95. Достаточно было знать IP "жертвы": посылался запрос
ping -l 65510 {{ IP }}
И компьютер по ту сторону уходил в BSOD (синий экран смерти).
Если не вдаваться в детали, "65510" – это длина дополнительных данных в пакете запроса. С учётом необходимых данных для пинга, размер пакета переваливал за размер буфера – происходило переполнение на ПК адресата, какие-то другие важные данные перетирались и происходила ошибка.
"Обратный пинг смерти", наши дни
Что же происходит в наши дни с утилитой ping? Ситуация, на самом деле, похожая. В рамках уязвимости CVE-2022-23093 атаке подвергается уже отправитель запроса.
Если коротко: можно в ответ на пинг отправить пакет с ответом, содержащим дополнительные данные между IP и ICMP заголовками. Данные будут скопированы в буфер меньшего размера, следовательно, переполнение. Всё это делается при помощи raw-сокетов, с привилегиями root-а.
На самом деле атакующий сможет записать так только 40 байт в стек. Но сам факт того, что это опять ping, опять переполнение буфера, но в этот раз "наоборот", меня сильно повеселил.
И да, исправление уже добавлено в FreeBSD 13.1-RELEASE-p5, 12.4-RC2-p2 и 12.3-RELEASE-p10. Не забывайте обновляться!