
MikroTik RouterOS のサービス拒否脆弱性
MikroTik RouterOS の脆弱性により、認証されていないリモート攻撃者がルーターを強制的に再起動させることができます。これは、IP プロトコル 97 を使用して RouterOS の IPv6 アドレスに 1 バイトのサイズのパケットを送信することで行われます。EoIPv6 をサポートするすべてのバージョンの RouterOS がこの攻撃に対して脆弱である可能性があります。この攻撃には、ターゲットシステムで IPv6 が有効であり、かつ少なくとも 1 つのトンネルインターフェースが存在する必要があります。
INPUT をブロックする IPv6 フィルタールールがないこと。EoIPv6 (Ethernet over IPv6) は MikroTik RouterOS のレイヤー2 トンネリングプロトコルです。EoIPv6 プロトコルは、イーサネットフレームを修正された EtherIP (IP プロトコル 97) パケットにカプセル化します。
MikroTik の EoIPv6 実装は、EtherIP の予約済み 12 ビットを使用してトンネル ID を保存します。さらに、MikroTik は EtherIP ヘッダーの最初の 4 ビットと次の 4 ビットを入れ替えています。
トンネル ID を取得してパケットを検証するために、RouterOS はプロトコル 97 で受信したパケットに対して上記のビット入れ替えを行います。この処理は、システムにトンネルインターフェースが存在する限り (無効になっている場合でも) 実行されます。RouterOS はこの処理中にペイロードサイズをチェックしません。そのため、プロトコル 97 の 1 バイトのパケットによって破損が生じます (トンネル 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 (リリース候補) がテストされ、執筆時点ではすべてがこの攻撃に対して脆弱です。この脆弱性は、EoIPv6 をサポートする古いバージョンの RouterOS にも存在する可能性があります。
MikroTik フォーラムの このスレッド を参照してください。