Skip to content

Commit e19c5ed

Browse files
xu-langgregkh
authored andcommitted
bpf: Fix OOB in pcpu_init_value
[ Upstream commit 576afdd ] An out-of-bounds read occurs when copying element from a BPF_MAP_TYPE_CGROUP_STORAGE map to another pcpu map with the same value_size that is not rounded up to 8 bytes. The issue happens when: 1. A CGROUP_STORAGE map is created with value_size not aligned to 8 bytes (e.g., 4 bytes) 2. A pcpu map is created with the same value_size (e.g., 4 bytes) 3. Update element in 2 with data in 1 pcpu_init_value assumes that all sources are rounded up to 8 bytes, and invokes copy_map_value_long to make a data copy, However, the assumption doesn't stand since there are some cases where the source may not be rounded up to 8 bytes, e.g., CGROUP_STORAGE, skb->data. the verifier verifies exactly the size that the source claims, not the size rounded up to 8 bytes by kernel, an OOB happens when the source has only 4 bytes while the copy size(4) is rounded up to 8. Fixes: d3bec01 ("bpf: Zero-fill re-used per-cpu map element") Reported-by: Kaiyan Mei <kaiyanm@hust.edu.cn> Closes: https://lore.kernel.org/all/14e6c70c.6c121.19c0399d948.Coremail.kaiyanm@hust.edu.cn/ Link: https://lore.kernel.org/r/420FEEDDC768A4BE+20260402074236.2187154-1-xulang@uniontech.com Signed-off-by: Lang Xu <xulang@uniontech.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 0703530 commit e19c5ed

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

kernel/bpf/hashtab.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -991,7 +991,7 @@ static void pcpu_init_value(struct bpf_htab *htab, void __percpu *pptr,
991991

992992
for_each_possible_cpu(cpu) {
993993
if (cpu == current_cpu)
994-
copy_map_value_long(&htab->map, per_cpu_ptr(pptr, cpu), value);
994+
copy_map_value(&htab->map, per_cpu_ptr(pptr, cpu), value);
995995
else /* Since elem is preallocated, we cannot touch special fields */
996996
zero_map_value(&htab->map, per_cpu_ptr(pptr, cpu));
997997
}

0 commit comments

Comments
 (0)