| Summary |
Linuxカーネルにおいて、以下の脆弱性が修正されました。tunデバイスの分離されたNAPIキューに対するメモリリークの問題です。syzkallerによってTUNデバイスに関連するskおよびskbのメモリリークが報告されましたが、再現できませんでした。しかし、以下の手順で容易に再現可能です。struct ifreq ifr = {}; int fd_tun, fd_tmp; char buf[4] = {}; fd_tun = openat(AT_FDCWD, "/dev/net/tun", O_WRONLY, 0); ifr.ifr_flags = IFF_TUN | IFF_NAPI | IFF_MULTI_QUEUE; ioctl(fd_tun, TUNSETIFF, &ifr); ifr.ifr_flags = IFF_DETACH_QUEUE; ioctl(fd_tun, TUNSETQUEUE, &ifr); fd_tmp = socket(AF_PACKET, SOCK_PACKET, 0); ifr.ifr_flags = IFF_UP; ioctl(fd_tmp, SIOCSIFFLAGS, &ifr); write(fd_tun, buf, sizeof(buf)); close(fd_tun); TUNデバイスでNAPIおよびマルチキューを有効にすると、キューが分離された後でもskbをtfile-sk.sk_write_queueに挿入可能になる事象が発生します。これを防ぐためには、skbをキューに入れる前にtfile-detachedをチェックすべきです。この処理はwrite()とioctl(IFF_DETACH_QUEUE)が同時に実行され得るため、tfile-sk.sk_write_queue.lockの下で行う必要があります。そうしなければ、write()がtfile-detachedをfalseと判定してskbをキューに入れた直後にioctl()がtfile-detachedをtrueにしキューを消去するという小さな競合状態が発生します。もう一つの解決策としては、切断されたキューを閉じて再接続する際にtun_queue_purge()を呼び出す方法がありますが、それは他の問題を覆い隠す可能性があります。また、同様のテストはIFF_NAPI_FRAGSについても実施しています。
|