Модуль, содержащий группу из 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).

Ниже на диаграмме красные прямоугольники – это интерфейсные функции, которые могут являться поверхностью атаки.

Розовые прямоугольники – это интерфейсные функции, которые могут являться поверхностью атаки при вызовах из пользовательского пространства.

Темно-серые прямоугольники – это интерфейсные функции, которые не оперируют сетевыми данными и не является поверхностью атаки.

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

802

Сводная таблица результатов анализа

Имя подмодуля или функцииНазначениеПоверхность атаки
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, потенциально опасные с точки зрения проведения атак со стороны пользовательского уровня.