Модуль, содержащий группу из 9 слабосвязанных подсистем, так или иначе относящихся к протоколам семейства IEEE 802 (net/802)
Ниже представлены результаты анализа поверхности атаки для модуля 802 с точки зрения зависимости от сетевого трафика.
Модуль состоит из 9 самостоятельных подсистем.
- Наборы функций для управления устройствами соответствующих типов:
fc(Fibre Channel),fddi(Fiber Distributed Data Interface),hippi(High Performance Parallel Interface).
p8022– демультиплексирование протоколов 802.2, на основе полей SSAP / DSAP, и их отправка соответствующим зарегистрированным обработчикам.p8023– поддержка протокола Raw 802.3 / IPX (модуль удален из ядра в версии 5.15).psnap– реализация функциональности протокола SNAP (Subnetwork Access Protocol, протокол доступа к подсетям). SNAP является дополнением заголовка IEEE 802.2 LLC.stp– реализация функциональности протокола STP (Spanning Tree Protocol), предназначенного для автоматического удаления циклов (петель коммутации) из топологии сети на канальном уровне в сетях ethernet.garp– реализация функциональности протокола IEEE 802.1D GARP (Generic Attribute Registration Protocol).mrp– реализация функциональности протокола IEEE 802.1Q MRP (Multiple Registration Protocol).
Ниже на диаграмме красные прямоугольники – это интерфейсные функции, которые могут являться поверхностью атаки.
Розовые прямоугольники – это интерфейсные функции, которые могут являться поверхностью атаки при вызовах из пользовательского пространства.
Темно-серые прямоугольники – это интерфейсные функции, которые не оперируют сетевыми данными и не является поверхностью атаки.
Зеленые ромбы на диаграммах - это элемент некоторой структуры, который является указателем на функцию. Если из ромба выходит стрелка, значит элементу соответствующей структуры присвоено имя функции, на которую указывает стрелка. Если стрелка входит в ромб из функции, значит в этой функции имеется вызов функции по соответствующему указателю. Зеленые прямоугольники – это структуры, переопределяющие структуру обозначенную зеленым ромбом.

Сводная таблица результатов анализа
| Имя подмодуля или функции | Назначение | Поверхность атаки |
|---|---|---|
| fc.c | Управление FC устройствами | |
| fc_header | Создание заголовка FC пакета | Да |
| fddi.c | Управление FDDI устройствами | |
| fddi_header | Создает заголовок FDDI пакета для протоколов любого уровня | Да |
| fddi_type_trans | Определяет тип протокола пакета | Да |
| hippi.c | Управление FDDI устройствами | |
| hippi_header | Создает заголовок HIPPI пакета для протоколов любого уровня | Да |
| hippi_type_trans | Определяет тип протокола пакета | Да |
| p8022.c | Демультиплексирование протоколов 802.2 | |
| p8022_request | Добавление заголовка канального уровня и отправка пакета | Да |
| p8023.c | Протокол Raw 802.3 / IPX | |
| p8023_request | Добавление заголовка канального уровня и отправка пакета | Да |
| pspan.c | Протокол SNAP | |
| snap_rcv | Обработчик входящих пакетов данного протокола | Да |
| snap_request | Добавление SNAP заголовка и отправка пакета | Да |
| stp.c | Протокол STP | |
| stp_pdu_rcv | Демультиплексор полей SAP во входящих STP пакетах | Да |
| garp.c | Протокол GARP | |
| garp_pdu_rcv | Да | |
| garp_request_join, garp_request_leave, garp_uninit_applicant, garp_join_timer | Возможно | |
| mrp.c | Протокол MRP | |
| mrp_rcv | Да | |
| mrp_request_join, mrp_request_leave, mrp_uninit_applicant, mrp_join_timer, mrp_periodic_timer | Возможна |
Распределение функций, являющихся поверхностью атаки, по направлению трафика
| Имя функции | Направление трафика |
|---|---|
| fc.c | |
| fc_header | В обе стороны |
| fddi.c | |
| fddi_header | В обе стороны |
| fddi_type_trans | Входящий |
| hippi.c | |
| hippi_header | В обе стороны |
| hippi_type_trans | Входящий |
| p8022.c | |
| p8022_request | Исходящий |
| p8023.c | |
| p8023_request | Исходящий |
| pspan.c | |
| snap_rcv | Входящий |
| snap_request | Исходящий |
| stp.c | |
| stp_pdu_rcv | Входящий |
| garp.c | |
| garp_pdu_rcv | Входящий |
| garp_request_join, garp_request_leave, garp_uninit_applicant, garp_join_timer | Исходящий |
| mrp.c | |
| mrp_rcv | Входящий |
| mrp_request_join, mrp_request_leave, mrp_uninit_applicant, mrp_join_timer, mrp_periodic_timer | Исходящий |
Ниже перечислены все файлы и функции, доступные для вызова вне модуля.
fc.c
Регистрация нового устройства типа FC (Fibre Channel):
struct net_device *alloc_fcdev(int sizeof_priv)
С сетевыми данными работает функция fc_header, которая создает заголовок пакета FC:
static int fc_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, const void *daddr,
const void *saddr, unsigned int len)
static const struct header_ops fc_header_ops = {
.create = fc_header,
};
fddi.c
Регистрация устройства FDDI:
struct net_device *alloc_fddidev(int sizeof_priv)
С сетевыми данными работают две функции:
fddi_headerсоздает заголовок пакета FDDI для протоколов любого уровня,fddi_type_transопределяет тип протокола пакета.
static int fddi_header(struct sk_buff *skb, struct net_device *dev, unsigned short type, const void *daddr,
const void *saddr, unsigned int len)
static const struct header_ops fddi_header_ops = {
.create = fddi_header,
};
__be16 fddi_type_trans(struct sk_buff *skb, struct net_device *dev)
hippi.c
Регистрация устройства HIPPI:
struct net_device *alloc_hippi_dev(int sizeof_priv)
static int hippi_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
const void *daddr, const void *saddr, unsigned int len)
static const struct header_ops hippi_header_ops = {
.create = hippi_header,
};
__be16 hippi_type_trans(struct sk_buff *skb, struct net_device *dev)
int hippi_mac_addr(struct net_device *dev, void *p)
int hippi_neigh_setup_dev(struct net_device *dev, struct neigh_parms *p)
С сетевыми данными работают две функции:
hippi_headerсоздает заголовок HIPPI пакета для протоколов любого уровня,hippi_type_transопределяет тип протокола пакета.
p8022.c
static int p8022_request(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest)
struct datalink_proto *register_8022_client(unsigned char type,
int (*func)(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
struct net_device *orig_dev))
void unregister_8022_client(struct datalink_proto *proto)
С сетевыми данными работает единственная функция p8022_request, которая просто вызывает функцию из другого модуля llc_build_and_send_ui_pkt для отправки пакета по протоколу 802.2:
llc_build_and_send_ui_pkt(dl->sap, skb, dest, dl->sap->laddr.lsap)
p8023.c
static int p8023_request(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest_node)
struct datalink_proto *make_8023_client(void)
void destroy_8023_client(struct datalink_proto *dl)
С сетевыми данными работает единственная функция p8023_request, отвечающая за добавление к пакету соответствующего заголовка канального уровня и отправку пакета.
psnap.c
static int snap_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
struct net_device *orig_dev)
static int snap_request(struct datalink_proto *dl, struct sk_buff *skb, u8 *dest)
struct datalink_proto *register_snap_client(const unsigned char *desc,
int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *,
struct net_device *))
void unregister_snap_client(struct datalink_proto *proto)
С сетевыми данными работают две функции:
snap_rcv– обработчик входящих пакетов данного протокола,snap_requestдобавляет к пакету заголовок SNAP и передает управление упомянутой выше функцииllc_build_and_send_ui_pktдля отправки пакета.
stp.c
static int stp_pdu_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
struct net_device *orig_dev)
int stp_proto_register(const struct stp_proto *proto)
void stp_proto_unregister(const struct stp_proto *proto)
С сетевыми данными работает единственная функция stp_pdu_rcv – демультиплексор полей SAP во входящих STP пакетах.
garp.c
int garp_request_join(const struct net_device *dev, const struct garp_application *appl,
const void *data, u8 len, u8 type)
void garp_request_leave(const struct net_device *dev, const struct garp_application *appl,
const void *data, u8 len, u8 type)
static void garp_join_timer(struct timer_list *t)
static void garp_pdu_rcv(const struct stp_proto *proto, struct sk_buff *skb, struct net_device *dev)
int garp_init_applicant(struct net_device *dev, struct garp_application *appl)
void garp_uninit_applicant(struct net_device *dev, struct garp_application *appl)
int garp_register_application(struct garp_application *appl)
void garp_unregister_application(struct garp_application *appl)
С сетевыми данными работает единственная функция garp_pdu_rcv – обработчик входящих сообщений.
Также стоит обратить внимание на четыре функции, которые отвечают за отправку сообщений данного протокола:
- garp_request_join,
- garp_request_leave,
- garp_uninit_applicant,
- garp_join_timer.
Протокол GARP (как и пришедший ему на смену MRP, см. ниже) позволяет коммутаторам (или другим аналогичным устройствам), объединенным в группу, обмениваться сигнальной информацией в автоматическом режиме без участия администратора. Поэтому, хотя данный протокол не работает с пользовательскими пакетами, его сообщения влияют на внутреннее состояние и настройки конфигурации всех участников группы, а значит могут использоваться для атаки со стороны пользовательского уровня на сетевую инфраструктуру.
mrp.c
int mrp_request_join(const struct net_device *dev, const struct mrp_application *appl,
const void *value, u8 len, u8 type)
void mrp_request_leave(const struct net_device *dev, const struct mrp_application *appl,
const void *value, u8 len, u8 type)
static void mrp_join_timer(struct timer_list *t)
static void mrp_periodic_timer(struct timer_list *t)
static int mrp_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt,
struct net_device *orig_dev)
int mrp_init_applicant(struct net_device *dev, struct mrp_application *appl)
void mrp_uninit_applicant(struct net_device *dev, struct mrp_application *appl)
int mrp_register_application(struct mrp_application *appl)
void mrp_unregister_application(struct mrp_application *appl)
С сетевыми данными работает единственная функция mrp_rcv – обработчик входящих сообщений.
Аналогично протоколу GARP, здесь также стоит обратить внимание на пять функций, отвечающих за отправку сообщений данного протокола:
mrp_request_join,mrp_request_leave,mrp_uninit_applicant,mrp_join_timer,mrp_periodic_timer.
Заключение
Проведенный анализ модуля 802 (net/802) показал, что 12 функций этого модуля представляют поверхность атаки для сетевого трафика: 3 используется для исходящего трафика, 6 – для входящего, 3 могут использоваться в обоих направлениях. Кроме этого 9 функций, реализующих протоколы GARP и MRP, потенциально опасные с точки зрения проведения атак со стороны пользовательского уровня.