Linuxカーネルにおいて、以下の脆弱性が解決されました。netfilter: bridge: ebt_snatのARP書き換えを可能にするebtablesのSNATターゲットは、Ethernetソースアドレスの書き換えをskb_ensure_writable(skb, 0)の背後で保持しています。これは意図的なものであり、ブリッジのebtablesフックではEthernetヘッダーがskb_mac_header()やeth_hdr()を通して参照される一方で、skb->dataはEthernetペイロードを指しています。skb_ensure_writable()にETH_HLENバイト数を要求するとペイロードが検査され、Ethernetヘッダーではなく、コミット63137bc5882aで修正された小さいパケットの後退が再び発生してしまいます。しかし、任意のARP送信元ハードウェアアドレスの書き換えは異なります。これはskb->dataを基準にしたオフセットでskb_store_bits()を通じて書き込みます。具体的には、 skb_store_bits(skb, sizeof(struct arphdr), info->mac, ETH_ALEN)が使われます。skb_header_pointer()はARPヘッダーのみを安全に読み取りますが、その後の送信元ハードウェアアドレス範囲をwritableにはしません。その範囲がまだspliceでインポートされたファイルページに裏付けられた非線形skbフラグメント内にある場合、skb_store_bits()はフラグメントのページをマップし、新しいMACアドレスを直接コピーします。ARPのSHA範囲を、ARPヘッダーを読む前およびskb_store_bits()を呼び出す前に書き込み可能にすることが保証されます。
|