Как стать автором
Поиск
Написать публикацию
Обновить

«Пакет смерти» для сетевых карт Intel

Время на прочтение2 мин
Количество просмотров139K
Сетевой инженер Кристиан Кильхофнер (Kristian Kielhofner), купив новые серверы для обработки VoIP-трафика, столкнулся с неприятной проблемой. Серверы периодически падали без видимой причины. Но самое странное, что на серверах иногда отключался Ethernet-контроллер. Отключался в прямом смысле: система некоторое время работала нормально, но после обработки определённого количества трафика интерфейс выдавал аппаратную ошибку и обрывал связь, а восстановление работы было возможно только после холодной перезагрузки.

Кристиан провёл небольшое исследование и нашёл ряд сообщений о том, что у других пользователей тоже бывают проблемы с контроллерами Intel 82574L, говорили, что у них баги в EEPROM, ASPM и т.д. Кристиан с коллегами потратил несколько месяцев на поиск причин, почему в их случае контроллеры выдавали ошибку. В конце концов, им удалось докопаться до сути.

Инженер начал исследовать с помощью Wireshark содержимое пакетов, которые проходили через сетевую карту непосредственно перед отключением интерфейса — и обнаружил некоторую закономерность. Последний пакет всегда был ответом 100 Trying по протоколу SIP, он всегда был определённой длины и всегда поступал после запроса INVITE конкретного производителя IP-телефонов.

Кристиан говорит, что в пятницу вечером поднял на уши спецов из компании, продавшей ему телефоны этой марки. Он предоставил им доказательства и потребовал ответа. Они собрались все вместе, чтобы проверить баг, сделали тестовую конфигурацию на разных серверах и разных моделях телефонов — и смогли воспроизвести его! Правда, баг проявлялся не на всех моделях серверов и телефонов. После долгого анализа, в конце концов, всё-таки удалось выявить конкретный пакет, из-за которого падал интерфейс Ethernet. Это оказался полученный INVITE, а не 100 Trying.

Для проверки взяли программу tcpreplay, изолировали INVITE от телефона — и отправили этот пакет на сетевую карту. Трюк сработал.

Каждый может проверить работу «пакета смерти» на своей сетевой карте Intel, установив виртуальную машину и отправив оттуда пакет с помощью tcpreplay, или можно это сделать с другого компьютера по локальной сети. «Пакет смерти» срабатывает под любыми ОС, независимо от настроек файрвола, если только файрвол не блокирует на уровне OSI 2/3.

Содержимое пакета

Кстати, Кристиан довёл анализ до логического завершения и выяснил, какие конкретно байты превращают любой пакет в «пакет смерти» для Ethernet-карты Intel.

Отключение интерфейса происходит, если по адресу 0x47f находится значение 2 или 3.

Байт 0x47f = 32 HEX (2 ASCII)
Байт 0x47f = 33 HEX (3 ASCII)



Если там 4, то всё OK.



Подходит любой пакет: HTTP POST, ICMP echo-request и проч. например, на веб-сервере можно сконфигурировать ответ 200 таким образом, что он будет «убивать» сетевые интерфейсы на клиентских машинах.

Кристиан Кильхофнер говорит, что занимается сетями 15 лет и никогда не видел ничего подобного. Он уже связался с инженерами Intel, и они подтвердили, что действительно, это баг в прошивке EEPROM на контроллерах 82574L.

UPD 09.02. Intel выдвинула версию, что проблема ограничена одним из производителей материнских плат, который записал неправильный образ EEPROM в процессе производства. Название производителя не сообщается.
Теги:
Хабы:
Всего голосов 161: ↑157 и ↓4+153
Комментарии147

Публикации

Ближайшие события