netfilter: nf_tables: validate variable length element extension
Update template to validate variable length extensions. This patch adds
a new .ext_len[id] field to the template to store the expected extension
length. This is used to sanity check the initialization of the variable
length extension.
Use PTR_ERR() in nft_set_elem_init() to report errors since, after this
update, there are two reason why this might fail, either because of
ENOMEM or insufficient room in the extension field (EINVAL).
Kernels up until 7e6bc1f6ca ("netfilter: nf_tables: stricter
validation of element data") allowed to copy more data to the extension
than was allocated. This ext_len field allows to validate if the
destination has the correct size as additional check.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
This commit is contained in:
parent
b8c3bf0ed2
commit
34aae2c2fb
3 changed files with 73 additions and 17 deletions
|
|
@ -651,6 +651,7 @@ extern const struct nft_set_ext_type nft_set_ext_types[];
|
|||
struct nft_set_ext_tmpl {
|
||||
u16 len;
|
||||
u8 offset[NFT_SET_EXT_NUM];
|
||||
u8 ext_len[NFT_SET_EXT_NUM];
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -680,7 +681,8 @@ static inline int nft_set_ext_add_length(struct nft_set_ext_tmpl *tmpl, u8 id,
|
|||
return -EINVAL;
|
||||
|
||||
tmpl->offset[id] = tmpl->len;
|
||||
tmpl->len += nft_set_ext_types[id].len + len;
|
||||
tmpl->ext_len[id] = nft_set_ext_types[id].len + len;
|
||||
tmpl->len += tmpl->ext_len[id];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue