Комментарии 19
<sarcasm> Видимо эту закладку сделал Гугл, чтобы была возможность отключить всех кто при любой возможности пингует 8.8.8.8, а то "пингуют тут всякие" </sarcasm>
И кто-то ещё уверяет, что на C имеет смысл писать прикладной софт.
Так это проблема рантайма. На расте такое получить тоже можно...
Разница в том, что в Rust для того, чтобы получить такое поведение, ещё постараться надо, а в C небезопасный код по умолчанию. И упование на программиста не помогло, судя по тому, как много лет этот баг оставался незамеченным.
Я писал статью о таких ошибках. Их полно. И дело не в raw сокетах.
(Как-будто что-то поменяется, если использовать обычные сокеты, а не raw)
Я не смотрел код ping. Пишу просто предположение. Наверняка можно с помощью комбинаций "размера ip и размеров icmp" , вызвать проблему.
Я уже давно писал, что проблему можно решить на уровне сишных библиотек разделением стеков для адресов возврата и для временных данных (сейчас это один и тот же стек, поэтому и возможны такие атаки). Но кто ж хочет решить проблему....
А это, разве, не проблема архитектуры x86? Как бы регистр SP - указатель стека, инструкции PUSH/POP/RET умеют использовать только его. А это означает что локальные переменные и адреса возврата перемешаны.
Берём, скажем, BP в качестве «SP для локальных переменных», на входе в функцию делаем SUB BP, размер_локальных_переменных (а ещё лучше - ADD, пусть этот стек растёт вверх, тогда определённые разновидности переполнений вообще ничего ценного не перезапишут), не пользуемся PUSH/POP, работаем через MOV [BP+смещение]. Некоторые компиляторы и сейчас так и делают (MOV вместо PUSH/POP), только в общем стеке.
На некоторых архитектурах (Infineon C166 к примеру) такой подход был заложен в стандарты ABI изначально.
На х86-64 давно есть shadow stack (отдельный скрытый стек только для адресов возврата). Только вот я не в курсе, используется ли он в какой-нибудь ОС.
Полагаю какие то костыли сломаются.
Напомню, что tcp/ip стэк BSD в своё время позаимствовали в винду, и дырявым как решето он был всегда. Во времена винды 9х и общажной локалки мы развлекались ping of death, который вызывал переполнение буфера и bsod на пингуемой машине, сейчас обнаружилось то же самое, но на клиенте.
В винде сетевой стэк давно переписали, а в BSD ... и так сойдёт.
Интересно, зацепило ли macOS.
Разработчики FreeBSD выпустили экстренный патч безопасности против критической уязвимости в утилите ping