Кристиан провёл небольшое исследование и нашёл ряд сообщений о том, что у других пользователей тоже бывают проблемы с контроллерами Intel 82574L, говорили, что у них баги в EEPROM, ASPM и т.д. Кристиан с коллегами потратил несколько месяцев на поиск причин, почему в их случае контроллеры выдавали ошибку. В конце концов, им удалось докопаться до сути.
Инженер начал исследовать с помощью Wireshark содержимое пакетов, которые проходили через сетевую карту непосредственно перед отключением интерфейса — и обнаружил некоторую закономерность. Последний пакет всегда был ответом 100 Trying по протоколу SIP, он всегда был определённой длины и всегда поступал после запроса INVITE конкретного производителя IP-телефонов.
Кристиан говорит, что в пятницу вечером поднял на уши спецом из компании, которые продали ему телефон этой марки. Он предоставил им доказательства и потребовал ответа. Они собрались все вместе, чтобы проверить баг, сделали тестовую конфигурацию на разных серверах и разных моделях телефонов — и смогли воспроизвести его! Правда, баг проявлялся не на всех моделях серверов и телефонов. После долгого анализа, в конце концов, всё-таки удалось выявить конкретный пакет, из-за которого падал интерфейс Ethernet. Это оказался полученный INVITE, а не 100 Trying.
Для проверки взяли программу tcpreplay, изолировали INVITE от телефона — и отправили этот пакет на сетевую карту. Трюк сработал.
Каждый может проверить работу «пакета смерти» на своей сетевой карте Intel, установив виртуальную машину и отправив оттуда пакет с помощью tcpreplay, или можно это сделать с другого компьютера по локальной сети.
Кстати, Кристиан довёл анализ до логического завершения и выяснил, какие конкретно байты превращают любой пакет в «пакет смерти» для Ethernet-карты Intel.
Отключение интерфейса происходит, если по адресу 0x47f находится значение 2 или 3.
Байт 0x47f = 32 HEX (2 ASCII)
Байт 0x47f = 33 HEX (3 ASCII)
Если там 1 или 4, то всё OK.
Подходит любой пакет: HTTP POST, ICMP echo-request и проч. например, на веб-сервере можно сконфигурировать ответ 200 таким образом, что он будет «убивать» сетевые интерфейсы на клиентских машинах.
Кристиан Кильхофнер говорит, что занимается сетями 15 лет и никогда не видел ничего подобного. Он уже связался с инженерами Intel, и они подтвердили, что действительно, это баг в прошивке EEPROM на контроллерах 82574L.
ссылка на оригинал статьи http://habrahabr.ru/post/168607/
Добавить комментарий