bpf: Add length check for SK_DIAG_BPF_STORAGE_REQ_MAP_FD parsing
[ Upstream commitbcc29b7f5a] 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:1ed4d92458("bpf: INET_DIAG support in bpf_sk_storage") Suggested-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Lin Ma <linma@zju.edu.cn> Reviewed-by: Jakub Kicinski <kuba@kernel.org> Link: https://lore.kernel.org/r/20230725023330.422856-1-linma@zju.edu.cn Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
2cf6791207
commit
6b93c51068
@@ -446,8 +446,11 @@ 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(sizeof(*diag) + sizeof(diag->maps[0]) * nr_maps,
|
diag = kzalloc(sizeof(*diag) + sizeof(diag->maps[0]) * nr_maps,
|
||||||
|
|||||||
Reference in New Issue
Block a user