Commit bcc29b7f authored by Lin Ma's avatar Lin Ma Committed by Martin KaFai Lau

bpf: Add length check for SK_DIAG_BPF_STORAGE_REQ_MAP_FD parsing

The nla_for_each_nested parsing in function bpf_sk_storage_diag_alloc
does not check the length of the nested attribute. This can lead to an
out-of-attribute read and allow a malformed nlattr (e.g., length 0) to
be viewed as a 4 byte integer.

This patch adds an additional check when the nlattr is getting counted.
This makes sure the latter nla_get_u32 can access the attributes with
the correct length.

Fixes: 1ed4d924 ("bpf: INET_DIAG support in bpf_sk_storage")
Suggested-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarLin Ma <linma@zju.edu.cn>
Reviewed-by: default avatarJakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20230725023330.422856-1-linma@zju.edu.cnSigned-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
parent aa89592f
...@@ -496,9 +496,12 @@ bpf_sk_storage_diag_alloc(const struct nlattr *nla_stgs) ...@@ -496,9 +496,12 @@ bpf_sk_storage_diag_alloc(const struct nlattr *nla_stgs)
return ERR_PTR(-EPERM); return ERR_PTR(-EPERM);
nla_for_each_nested(nla, nla_stgs, rem) { nla_for_each_nested(nla, nla_stgs, rem) {
if (nla_type(nla) == SK_DIAG_BPF_STORAGE_REQ_MAP_FD) if (nla_type(nla) == SK_DIAG_BPF_STORAGE_REQ_MAP_FD) {
if (nla_len(nla) != sizeof(u32))
return ERR_PTR(-EINVAL);
nr_maps++; nr_maps++;
} }
}
diag = kzalloc(struct_size(diag, maps, nr_maps), GFP_KERNEL); diag = kzalloc(struct_size(diag, maps, nr_maps), GFP_KERNEL);
if (!diag) if (!diag)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment