netfilter: nf_tables: reject QUEUE/DROP verdict parameters
commit f342de4e2f33e0e39165d8639387aa6c19dff660 upstream. This reverts commite0abdadcc6
. core.c:nf_hook_slow assumes that the upper 16 bits of NF_DROP verdicts contain a valid errno, i.e. -EPERM, -EHOSTUNREACH or similar, or 0. Due to the reverted commit, its possible to provide a positive value, e.g. NF_ACCEPT (1), which results in use-after-free. Its not clear to me why this commit was made. NF_QUEUE is not used by nftables; "queue" rules in nftables will result in use of "nft_queue" expression. If we later need to allow specifiying errno values from userspace (do not know why), this has to call NF_DROP_GETERR and check that "err <= 0" holds true. Fixes:e0abdadcc6
("netfilter: nf_tables: accept QUEUE/DROP verdict parameters") Cc: stable@vger.kernel.org Reported-by: Notselwyn <notselwyn@pwning.tech> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Fuhai Wang <fuhaiwang@tencent.com> Signed-off-by: caelli <caelli@tencent.com>
This commit is contained in:
parent
0baa807ed7
commit
47f0d31be8
|
@ -7500,16 +7500,10 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
|
||||||
data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
|
data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE]));
|
||||||
|
|
||||||
switch (data->verdict.code) {
|
switch (data->verdict.code) {
|
||||||
default:
|
case NF_ACCEPT:
|
||||||
switch (data->verdict.code & NF_VERDICT_MASK) {
|
case NF_DROP:
|
||||||
case NF_ACCEPT:
|
case NF_QUEUE:
|
||||||
case NF_DROP:
|
break;
|
||||||
case NF_QUEUE:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
/* fall through */
|
|
||||||
case NFT_CONTINUE:
|
case NFT_CONTINUE:
|
||||||
case NFT_BREAK:
|
case NFT_BREAK:
|
||||||
case NFT_RETURN:
|
case NFT_RETURN:
|
||||||
|
@ -7528,6 +7522,8 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data,
|
||||||
chain->use++;
|
chain->use++;
|
||||||
data->verdict.chain = chain;
|
data->verdict.chain = chain;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
desc->len = sizeof(data->verdict);
|
desc->len = sizeof(data->verdict);
|
||||||
|
|
Loading…
Reference in New Issue