информационная безопасность
без паники и всерьез
 подробно о проекте
Rambler's Top100Spanning Tree Protocol: недокументированное применениеВсе любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / библиотека / книги / spanning tree / введение в spanning tree протокол
SPANNING TREE
титул
содержание
введение в spanning tree протокол
STP & VLANs
STP в гетерогенных средах
замечания, вытекающие из анализа RFC 2878
комментарии к написанию кода
возможные схемы атак
получение дополнительной информации о сети
особенности реализации у различных производителей
замечания по поводу Linux bridging project
замечания по поводу GARP и GVRP
обзор атак на 2 уровне OSI
уязвимые продукты
примеры уязвимых сетей
как администраторы могут противостоять атакам
как IDS могут обнаружить STP атаки
корни проблемы, или "откуда ноги растут"
что делать производителям
эпилог
благодарности
ссылки
список литературы
глоссарий
программа формирования ST пакетов
сценарий для запуска программы




Подписка:
BuqTraq: Обзор
RSN
БСК
Закон есть закон




1. Введение в Spanning Tree протокол

Этой статьей авторы хотели бы не столько объяснить, что такое Spanning Tree Protocol, сколько рассказать о недокументированных возможностях его применения, которые, возможно, не принимались во внимание разработчиками протокола. Поэтому, несмотря на то, что в статье в общих чертах приводится описание протокола Spanning Tree и его назначения, она не претендует на статус материала, который следует использовать для изучения этого протокола с нуля - предполагается, что вы уже читали какие-либо материалы на эту тему, а это введение лишь освежит вашу память. Если же вы вообще не знакомы с этим протоколом и (или) это введение показалось вам недостаточно вразумительным - рекомендуем обратиться к многочисленным описаниям STP в литературе, на сайтах ведущих компаний производителей интеллектуальных LAN-устройств (например, поискать материалы на http://www.cisco.com) и, разумеется, к IEEE стандарту, описывающему этот протокол [1]. Также в разделе "ссылки" есть, возможно, достаточный для составления полной картины набор url.

Основное назначение протокола Spanning Tree - построение топологии ЛВС без избыточного дублирования соединений или закольцовывания, недопустимых в силу логики построения ЛВС. STP позволяет организовать в сети, построенной при помощи мостов (bridges), отказоустойчивую архитектуру.
На данный момент поддержка Spaning Tree Protocol встречается не только в переключательном оборудовании (коммутаторы, они же свитчи или, в частном случае, мосты), но и в маршрутизирующем оборудовании, которое снабжено возможностью коммутировать пакеты между интерфейсами. Так, если рассматривать, например, Cisco, то в результате поддержки маршрутизатором Bridging Virtual Interface (например, модель 3640 и др.) становится логичной поддержка STP.

Используя STP, вы можете построить сеть, в которой существует несколько параллельных путей, и гарантировать при этом, что:

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

Например, на рисунке 1 показана сеть, построенная на четырех коммутаторах, поддерживающих протокол STP. Это обстоятельство позволяет соединить их избыточным количеством линков, которые в обычных условиях создали бы петли и привели к неработоспособности сети. Однако, при инициализации сети STP обнаруживает дублирующие пути и оставляет на каждое направление только один, переводя остальные задействованные в линках порты в состояние "blocking" (на рисунке соответствующие линки зачеркнуты). При нарушении основного канала передачи (например, в следствие отключения одного из коммутаторов), STP обнаруживает этот факт и задействует запасной маршрут.


Рис.1. Принцип работы STP

Протокол разработан в начале 90-х годов XX века (ANSI/IEEE 802.1D 1993 Edition) и дорабатывался в 1996 и 1998 годах. В качестве модели используется граф в виде дерева. Построение дерева сети начинается с корня (root) -- устройства, выигравшего выборы корневого (designated root). Designated root -- это просто отправная точка для построения активной незакольцованной топологии, в которой физические кольца не дают логических колец (см. главы 8 и 9 [1]). Иными словами, это логическое понятие.

Важно заметить, что Spanning Tree Protocol определен для различных сред передачи данных (MAC, Media Access Control). Далее в тексте рассматриваются примеры сетей в основном на базе Ethernet, как наиболее распространенной.

BPDU - это именно пакеты, а не фреймы. Это ясно из [1], 8.3.2, стр.61. BPDU пакеты инкапсулируются в используемый данной топологией тип фрейма с мультикастным MAC адресом в поле назначения, что обуславливает передачу этих пакетов через неинтеллектуальное оборудование, не знающее о существовании Spanning Tree.

Работа STP подразумевает выполнение следующих условий:

  1. Возможность передачи информации между мостами, что осуществляется путем передачи каждым STP-совместимым устройством специальных блоков данных - Bridge Protocol Data Units (BPDU). Эти блоки данных передаются в пакетах с определенным групповым адресом назначения (multicast address), зарезервированным в
  2. Один из мостов функционирует как "ведущее" устройство, называемое Designated Root Bridge.

Designated root присутствует всегда, даже когда топология не содержит физических колец. Если в сети только одно STP-совместимое устройство - до тех пор, пока STP не выключен, оно будет анонсировать себя. Каждое STP-совместимое устройство начинает работу, считая себя designated root, так что в сети с единственным STP-совместимым устройством оно и является Designated Root Bridge.
В данном случае авторы позволяют себе некоторую вольность, поскольку [1] рассматривает исключительно мосты (или свитчи, коммутаторы, поскольку коммутатор -- это многопортовый мост). Начиная от этого момента и далее, речь идет об абстрактном "устройстве", которое, в частном случае, может быть как коммутатором, так и маршрутизатором, а равно и другим интеллектуальным устройством.

Если же в сети присутствует более устройства, поддерживающего STP, то Designated Root Bridge выбирается путем голосования (выборов) на основе значения параметра Bridge Identifier, обычно являющегося комбинацией уникального MAC-адреса моста и устанавливаемого для моста приоритета (см. [1], главы 8 и 9). На роль Designated Root Bridge назначается мост с наименьшим значением Bridge Identifier.

Для всех остальных мостов в сети определяется Root Port, т.е. порт моста, ближайший к Root Bridge. От других портов, соединенных с root bridge непосредственно или через другие мосты, он отличается своим идентификатором, который содержит его номер и "вес", который может быть задан администратором.

Другой величиной, влияющей на процесс выборов, является Root Path Cost. Она состоит из стоимости пути до Root Port данного моста плюс стоимость путей до Root Port мостов по всему маршруту до Root Bridge.

Помимо Designated Root Bridge в STP вводится логическое понятие Designated Bridge. Владелец этого статуса считается главным в обслуживании данного сегмента ЛВС. Статус Designated Bridge также является выборным и может переходить от одного устройства к другому.

Аналогичным образом вводится выборное логическое понятие Designated Port - порта, который обслуживает данный сегмент сети. Для Designated Port вводится понятие Designated cost, описывающее стоимость пути ([1], 8.5.5.5).

В зависимости от содержимого получаемых от соседних устройств конфигурационных пакетов то или иное устройство перестает оспаривать статус Designated Root Bridge и начинает анонсировать устройство, выигравшее этот статус в процессе выборов. Так происходит до тех пор, пока ситуация не придет к завершающей стадии, которая характеризуется следующим образом:

  1. В сети только одно устройство, считающее себя корнем, а остальные устройства периодически анонсируют его как корень, что поддерживает статус кво, обновляя таймеры на всех STP-совместимых устройствах.
  2. Root Bridge периодически посылает во все свои порты пакеты с BPDU. Интервал времени, через который происходит посылка, называется Hello Time.
  3. В каждом сегменте сети имеется единственный Designated Bridge Port - порт, через который проходит обмен трафиком с Root Bridge. Этот порт имеет наименьшее значение Root Path Cost по сравнению с другими портами в сегменте, либо меньший bridge ID.
  4. BPDU принимаются и отправляются STP-совместимым устройством на всех его портах, даже на тех, которые были "выключены" работой STP. Однако BPDU не принимаются на портах, которые были "выключены" администратором.
  5. Каждый мост осуществляет пересылку (forwarding) пакетов только между Root Port и портами, которые являются Designated Bridge Port для соответствующего сегмента. Все остальные порты находятся в состоянии "Blocking".

Как уже говорилось, корень не несет на себе иных обязанностей, кроме анонса своих параметров согласно спецификации Spanning Tree протокола, а это, в частности, значит, что в сети, не содержащей физических колец или избыточных соединений, от изменения владельца статуса Designated Root Bridge пути пакетов, пересылаемых между двумя произвольными станциями не изменится.

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

К числу ситуаций, в которых возникают выборы как минимум одного из параметров, относятся:

  • подключение в сеть нового STP-совместимого устройства;
  • устаревание имеющихся данных (например, в результате выхода из строя или отключения одного из устройств, участвовавших в создании дерева);
  • административная акция, изменяющая топологию сети.

В качестве параметров при выборах используются следующие величины:

  1. Постоянные величины:
    root path cost
    стоимость пути к корневому устройству. Чем меньше значение, тем выше приоритет ([1], 8.5.1.2);
    bridge identifier
    идентификатор устройства. Чем меньше значение, тем больше приоритет ([1], 8.5.1.3);
    port identifier
    идентификатор порта. Чем меньше значение, тем выше приоритет ([1], 8.5.1.4).
  2. Выборные величины:
    designated port
    назначенный порт ([1], 8.5.5.7);
    designated root
    назначенный корень ([1], 8.5.5.4);
    designated cost
    назначенная стоимость ([1], 8.5.5.5).

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

Согласно спецификации выборные величины, в зависимости от контекста, могут принимать участие в различных выборах, например, designated cost может принимать участие как в выборах назначенного моста, так и в выборах корневого моста.

Смещение Название Размер
1 Protocol Identifier 2 bytes
Protocol Version Identifier 1 bytes
BPDU type 1 bytes
Flags 1 bytes
Root Identifier 8 bytes
Root Path Cost 4 bytes
Bridge Identifier 8 bytes
Port Identifier 2 bytes
Message Age 2 bytes
Max Age 2 bytes
Hello Time 2 bytes
35 Forward Delay 2 bytes

Таблица 1. Структура C-BPDU

typedef struct {
	Bpdu_type type;
	Identifier root_id;
	Cost root_path_cost;
	Identifier bridge_id;
	Port_id port_id;
	Time message_age;
	Time max_age;
	Time hello_time;
	Time forward_delay;
	Flag topology_change_acknowledgement;
	Flag topology_change;
} Config_bpdu;
Рис.2. Структура C-BPDU на языке C


Название Размер
Protocol Identifier 2 bytes
Protocol Version Identifier 1 bytes
BPDU type 1 bytes

Таблица 2. Структура TCN-BPDU

typedef struct {
	Bpdu_type type;
} Tcn_bpdu;
Рис.3. Структура TCN-BPDU на языке C

Во время работы устройства анонсируют себя и параметры своих портов через Configuration BPDU (далее называемые c-bpdu). Формат c-bpdu приведен в таблице 1 (согласно [1], 9.3.1, рисунок 9-1) и на рисунке 2 (согласно [1], 8.9.1).

Для сообщения об изменениях в топологии используются topology change notification BPDUs, формат которых приведен в таблице 2 и на рисунке 3 (согласно [1], параграф 8.3.5, стр. 63, последний абзац).

Собственно информации передается совсем немного - только статус. По факту прихода такого BPDU любой коммутатор уменьшает время жизни записей в своей таблице коммутации до минимума, определенного стандартом [1].

В момент получения конфигурационного bpdu STP-совместимый мост может определить, что пришедшая информация должна обновить имеющуюся у него информацию. В этом случае устройство изменяет содержимое анонсируемых им bpdu так, чтобы анонсировать выигравшее устройство, а не себя. Обратите внимание, что BPDU не проходят сквозь устройства, которые поддерживают STP - они лишь, при определенных условиях, инициируют на "промежуточном" устройстве посылку собственных BPDU ([1], 8.3.2) и/или изменение содержимого BPDU посылаемых "промежуточным" устройством.

В момент обновления конфигурации STP-совместимое устройство изменяет состояние своих портов - они поочередно принимают одно из следующих возможных значений ([1], 8.4):

блокирован (Blocking)
Заблокирован. Однако, фреймы содержащие STP пакеты (bpdu), принимаются и обрабатываются, в отличие от пользовательских фреймов ([1], 8.4.1);
слушает (Listening)
Первый этап подготовки к состоянию Forwarding. Фреймы, содержащие STP пакеты (bpdu), принимаются и обрабатываются, в отличие от пользовательских фреймов ([1], 8.4.2);
обучается (Learning)
Второй этап подготовки к состоянию Forwarding. Фреймы, содержащие STP пакеты (bpdu), принимаются и обрабатываются, в отличие от пользовательских фреймов ([1], 8.4.3);
передает (forwarding)
Рабочее состояние портов устройства. Передаются как фреймы, содержащие STP пакеты, так и фреймы пользовательских протоколов ([1], 8.4.4).

Время, на которое порт попадает в то или иное состояние, определяется значениями пауз, которые передаются посредством C-BPDU вместе с остальными параметрами (см. раздел 6.4.7).

Согласно стандарту, во время нахождения в состояниях Blocking, Listening и Learning пересылка не-STP пакетов не разрешена ([1], 8.4.1-8.4.3). В то же время, bpdu-пакеты не обрабатываются только в случае если порт выключен администратором ([1], 8.4.5). Это говорит о том, что если порты находятся в режимах Blocking, Listening или Learning - сеть работает только на STP протокол, но не на пользователя. Этим можно воспользоваться для организации атаки "отказ в обслуживании" (Denial of Service, DoS), в терминах [3].

Собственно, причина, по которой протокол работает именно таким образом ([1], 8.3.4), проста - все так организовано для того, чтобы избежать хаотичного дублирования и/или размножения пакетов в различные сегменты сети в момент перестройки ее топологии. Дублирование и/или размножение пакетов возможно, например, за счет возникновения временных колец, возникающих в процессе переключения состояния того или иного линка. Описание DoS атаки, а также величины параметров, необходимые для максимальной ее эффективности, см. в разделе 6.

В силу того, что топология сети определяется при участии протокола STP возможна атака по схеме ложный объект РВС с навязыванием ложного пути (в терминологии [3]). Подробности см. в разделе 6.5.

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

Вообще говоря, описываемые на примере Ethernet уязвимости протокола относятся (часть может быть применена практически без изменений алгоритма) к любым топологиям, на которых может работать STP. Как следствие, протокол и рассматриваемые атаки, требующие включенной поддержки STP, могут быть применены на любых сетевых топологиях, не допускающих логических колец). В [1] специально обращено внимание на то, что STP может ходить не только поверх Ethernet, но и поверх других сетей с другим принципом MAC.

Для большей наглядности и лучшего понимания работы STP авторы включили примеры, изображенные на рисунках 1 и 4. Комментарии к рисунку 1 расположены в самом начале этой главы. Рассмотрим теперь работу STP более подробно, для чего обратимся к рисунку 2.


Рис.4. STP в действии}

Каждый порт каждого моста имеет свою величину Path Cost, обозначенную как PC=XXX. Мост A является Root Bridge, т.к. имеет наименьшее значение Bridge Identifier. Для сети A (LAN A) Designated Bridge Port является порт 1 моста А. Один из портов каждого из четырех оставшихся мостов является Root Port (это порт, ближайший к Root Bridge).

Мосты X и B предоставляют доступ к сети B с одинаковым параметром Path Cost. Однако, в данном случае, порт моста B выбран в качестве Designated Bridge Port, т.к. этот мост имеет меньшее значение Bridge Identifier.

Порт моста C выбран в качестве Designated Bridge Port для сети C, т.к. он предоставляет более "дешевый" доступ к этой сети (стоимость пути через мосты C и B равна 200, а через мосты Y и B - 300).

В стабильном состоянии все мосты ожидают периодической посылки Root Bridge специальных пакетов - Hello BPDU. Если в течение промежутка времени, определяемого значением Max Age Time, таких пакетов от Root Bridge не поступает, мост считает, что либо между ним и Root Bridge нарушена связь, либо последний отключен. В этом случае мост инициирует реконфигурацию топологии сети. Путем установки соответствующих параметров можно регулировать, насколько быстро мосты будут обнаруживать изменения в топологии и задействовать запасные маршруты. На практике с регулировкой значений STP приходится сталкиваться в основном в двух случаях - если в силу обстоятельств STP переводит в режим "запасного" более быстрый линк и если сеть имеет плохую сходимость на значениях по умолчанию из-за большого количества устройств.




Rambler's Top100
Рейтинг@Mail.ru



назад «     » вперед


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach