| From 5689a0b03138eaa6f1efe31c4d0b30c5daa136d6 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 5 Feb 2026 08:07:55 +0100 |
| Subject: bpf: Require frozen map for calculating map hash |
| |
| From: KP Singh <kpsingh@kernel.org> |
| |
| [ Upstream commit a2c86aa621c22f2a7e26c654f936d65cfff0aa91 ] |
| |
| Currently, bpf_map_get_info_by_fd calculates and caches the hash of the |
| map regardless of the map's frozen state. |
| |
| This leads to a TOCTOU bug where userspace can call |
| BPF_OBJ_GET_INFO_BY_FD to cache the hash and then modify the map |
| contents before freezing. |
| |
| Therefore, a trusted loader can be tricked into verifying the stale hash |
| while loading the modified contents. |
| |
| Fix this by returning -EPERM if the map is not frozen when the hash is |
| requested. This ensures the hash is only generated for the final, |
| immutable state of the map. |
| |
| Fixes: ea2e6467ac36 ("bpf: Return hashes of maps in BPF_OBJ_GET_INFO_BY_FD") |
| Reported-by: Toshi Piazza <toshi.piazza@microsoft.com> |
| Signed-off-by: KP Singh <kpsingh@kernel.org> |
| Acked-by: Daniel Borkmann <daniel@iogearbox.net> |
| Link: https://lore.kernel.org/r/20260205070755.695776-1-kpsingh@kernel.org |
| Signed-off-by: Alexei Starovoitov <ast@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| kernel/bpf/syscall.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c |
| index 2649e0472dfe0..586ece78f783a 100644 |
| --- a/kernel/bpf/syscall.c |
| +++ b/kernel/bpf/syscall.c |
| @@ -5303,6 +5303,9 @@ static int bpf_map_get_info_by_fd(struct file *file, |
| if (info.hash_size != SHA256_DIGEST_SIZE) |
| return -EINVAL; |
| |
| + if (!READ_ONCE(map->frozen)) |
| + return -EPERM; |
| + |
| err = map->ops->map_get_hash(map, SHA256_DIGEST_SIZE, map->sha); |
| if (err != 0) |
| return err; |
| -- |
| 2.51.0 |
| |