The FreeBSD team has announced their operating system was detected to contain critical vulnerabilities that could be exploited to conduct DoS attacks, escalate user privileges, and disclose important data.
SCTP ICMPv6 error processing vulnerability (CVE-2016-1879)
SCTP (stream control transmission protocol) is a transport-layer protocol designed to transfer signaling messages in an IP environment. As a rule, mobile operators use this protocol in technological networks.
This vulnerability threatens FreeBSD systems (versions 9.3, 10.1, and 10.2) if they support SCTP and IPv6 (default configuration). To exploit this flaw, a malefactor needs to send a specially crafted ICMPv6 message. And if he succeeds, he can conduct a DoS attack.
Denial of service is caused by improper check of the length of an SCTP packet header received from the ICMPv6 error message. If the target recipient is unavailable, the router can generate an error message and send it to the sender via ICMPv6.
This ICMPv6 packet includes the original IPv6 packet where the Next Header field indicates how SCTP is encapsulated.
When the kernel receives the error message via ICMPv6, it transfers the upper-level protocol packet to a necessary parser (sctp6_ctlinput()). The SCTP parser considers the incoming header has the required length, tries to copy it using m_copydata(), which has offset values and the number of bytes. Since a twelve-byte chunk is expected, if the attacker sends a packet with an eleven-byte header, a NULL pointer is dereferenced causing kernel panic.
There is no need for an open SCTP socket to successfully exploit this vulnerability. Scapy can help to create an ICMPv6 packet.
argparse scapy.all * parser = argparse.ArgumentParser(description= * , epilog= * ) parser.add_argument(, , type=str, help=) parser.add_argument(, , type=str, help=) parser.add_argument(, , type=str, help=) options = parser.parse_args() options.dst_mac options.dst_ipv6 : parser.print_help() exit() options __name__ == : options = get_args() sendp(Ether(dst=options.dst_mac) / IPv6(dst=options.dst_ipv6) / ICMPv6DestUnreach() / IPv6(nh=, src=options.dst_ipv6, dst=), iface=options.iface)
Below is the video demonstration of the attack.
To protect your system from this flaw, we recommend that you perform the following:
- Disable IPv6 addressing if not necessary
- Block ICMPv6 or IPv6 traffic on the firewall
- Disable the SCTP stack support in the OS kernel if it is not needed (kernel recompilation is required)
To fix the vulnerability, you can use the vendor's patch, which installs additional checks for processing SCTP ICMPv6 messages. The kernel recompilation is required.
And that's not the half of it
The system was also detected to include other severe vulnerabilities. The FreeBSD developers released several patches to close these flaws:
- A vulnerability that allows for a DoS attack via exploiting TCP connections if TCP_MD5SIG and TCP_NOOPT are enabled. A hacker needs to open a listening socket with the TCP_NOOPT option enabled to exploit this flaw (CVE-2016-1882, the patch).
- A vulnerability that allows for user privilege escalation or DoS. It is caused by an access control error that makes it possible to rewrite random memory fields using Linux setgroups(2) (CVE-2016-1881, the patch).
- A Linux Robust Futex error allows for system memory data disclosure (CVE-2016-1880, the patch).
- Insecure default settings that allow access to the daemon configuration file “/etc/bsnmpd.conf” (CVE-2015-5677, the patch).
To protect your systems from exploitation of these vulnerabilities, Positive Technologies recommend that you use IPv6 addressing only if it is strongly required, install security patches timely, and use special tools to control system security (e.g. MaxPatrol).