Linuxカーネルにおいて、以下の脆弱性が修正されました。ipv6_rpl_srh_rcv()はRFC 6554のソースルーティングヘッダーを展開し、次のセグメントをipv6_hdr-daddrに入れ替えた上で再圧縮し、古いヘッダーを取り除いて新しいヘッダーとIPv6ヘッダーを戻します。再圧縮されたSRHが拡大する際にmac_lenのヘッドルームを確保します。入れ替えによりセグメントがdaddrと共有する共通プレフィックス長が減る場合(CmprI=0, CmprE0, seg[0][0] != daddr[0]の場合は最大+8バイトまで)再圧縮したヘッダーが受信時より大きくなる可能性があります。pskb_expand_head()はsegments_left == 0のときにのみ実行されていたため、初期のセグメントではプッシュ時に未検査のヘッドルームを消費していました。skb_push()がデータ前にskb-mac_lenバイト未満を残してしまうと、skb_mac_header_rebuild()内のskb_set_mac_header(skb, -skb-mac_len)が(data - head) - mac_lenをu16 mac_headerフィールドに格納し、オーバーフローして約65530となり、その後のmemmove()がskb-headから約64KiB先までmac_lenバイトを書き込みます。この脆弱性は、CmprI=0, CmprE=15の二つのセグメントを持つタイプ3 SRHを含むAF_INET6/SOCK_RAW/IPV6_HDRINCLパケットをloデバイスで送信すると、一回通過後にヘッドルームが8に達し、KASANによってipv6_rthdr_rcvで14バイトの範囲外書き込みが報告される問題です。この問題は、残りの空き容量がプッシュサイズとmac_lenの合計より少ない場合にヘッドを拡張し、再構築後のMACヘッダーが収まるように十分な追加領域を要求することで修正されました。
|