MikroTik RouterOS 中存在一个漏洞,允许未经身份验证的远程攻击者强制路由器重启。攻击方式是通过 IP 协议号 97 向 RouterOS 的 IPv6 地址发送一个 1 字节的数据包。所有支持 EoIPv6 的 RouterOS 版本均可能受此攻击影响。该攻击要求目标系统已启用 IPv6 并且至少存在一个隧道接口。
INPUT 数据的 IPv6 过滤规则。EoIPv6(基于 IPv6 的以太网)是 MikroTik RouterOS 的第二层隧道协议。EoIPv6 协议将以太网帧封装在修改后的 EtherIP(IP 协议号 97)数据包中。
MikroTik 对 EoIPv6 的实现使用了 EtherIP 中保留的 12 位来存储隧道 ID。MikroTik 还交换了 EtherIP 头部的前 4 位和后 4 位。
为了获取隧道 ID 并验证数据包,RouterOS 会对接收到的协议号 97 数据包执行上述位交换操作。只要系统中存在隧道接口(即使接口已禁用),该过程就会进行。RouterOS 在此过程中不检查载荷大小。因此,一个 1 字节的协议号 97 数据包会破坏该过程(因为缺少构建隧道 ID 所需的其余位)。
在 RouterOS 上添加一个 IPv6 地址:
/ipv6 address add interface=ether1 address=fd00::1/64 advertise=no
并添加一个隧道(任意类型):
/interface ipip add remote-address=127.0.0.1
运行漏洞利用程序(仓库中的 exploit.c):
./exploit fd00::1
RouterOS 将在利用程序运行后几秒内自动重启。重启后可以看到以下日志:
jan/20/2018 10:28:36 system,error,critical router was rebooted without proper shutdown
已测试 RouterOS 6.39.3(仅修复版)、6.41(当前版)和 6.42rc11(候选版),在撰写本文时,所有这些版本均受此攻击影响。较早版本的 RouterOS(支持 EoIPv6)也可能存在此漏洞。
请参阅 MikroTik 论坛上的此帖子。