| 概要 |
Linuxカーネルにおいて、以下の脆弱性が修正されました。bpf/bondingにおいて、XDPが読み込まれている場合にvlan+srcmacのxmit_hash_policyへの変更が拒否されます。bond_option_mode_set()はbond_xdp_check()を通じて、読み込まれたXDPプログラムと互換性のないモード変更をすでに拒否しています。しかし、bond_option_xmit_hash_policy_set()にはそのような保護がありませんでした。802.3adおよびbalance-xorモードでは、通常ハードウェアオフロードにより802.1qペイロードが存在しないため、bond_xdp_check()はxmit_hash_policyがvlan+srcmacの場合にfalseを返します。これにより、ユーザーは以下の操作を行うことが可能でした。1. 互換性のあるxmit_hash_policy(例えばlayer2+3)で802.3ad/balance-xorモードのbondにネイティブXDPプログラムをアタッチする。2. XDPが読み込まれている状態でxmit_hash_policyをvlan+srcmacに変更する。これによってbond-xdp_progは設定されたままになりますが、同じデバイスに対してbond_xdp_check()はfalseを返す状態となります。bondが後に破棄される際、dev_xdp_uninstall()はbond_xdp_set(dev, NULL, NULL)を呼び出しプログラムを削除しようとしますが、bond_xdp_check()のガードにより-EOPNOTSUPPを返し、以下の警告が発生します。WARN_ON(dev_xdp_install(dev, mode, bpf_op, NULL, 0, NULL))。この問題を修正するために、802.3adまたはbalance-xorモードのbondでXDPプログラムが読み込まれている場合に、xmit_hash_policyがvlan+srcmacに変更されることを拒否するようにしました。コミット39a0876d595b("net, bonding: Disallow vlan+srcmac with XDP")でbond_xdp_check()が導入され、xmit_hash_policyがvlan+srcmacの場合に802.3ad/balance-xorモードでfalseを返すようになりました。このチェックはbond_xdp_set()に組み込まれ、互換性のないポリシーでのXDPアタッチメントを拒否しますが、同様にXDP読み込み後に互換性のない値にxmit_hash_policyを変更する処理はbond_option_xmit_hash_policy_set()で保護されていませんでした。注意として、コミット094ee6017ea0("bonding: check xdp prog when set bond mode")で後にbond_option_mode_set()に同様の保護が追加されましたが、bond_option_xmit_hash_policy_set()には依然として保護がありませんでした。
|