Skip to content

Commit bfa64de

Browse files
pchaignoKernel Patches Daemon
authored andcommitted
bpf: Explicitly check accesses to bpf_sock_addr
Syzkaller found a kernel warning on the following sock_addr program: 0: r0 = 0 1: r2 = *(u32 *)(r1 +60) 2: exit which triggers: verifier bug: error during ctx access conversion (0) This is happening because offset 60 in bpf_sock_addr corresponds to an implicit padding of 4 bytes, right after msg_src_ip4. Access to this padding isn't rejected in sock_addr_is_valid_access and it thus later fails to convert the access. This patch fixes it by explicitly checking the various fields of bpf_sock_addr in sock_addr_is_valid_access. I checked the other ctx structures and is_valid_access functions and didn't find any other similar cases. Other cases of (properly handled) padding are covered in new tests in a subsequent patch. Fixes: 1cedee1 ("bpf: Hooks for sys_sendmsg") Reported-by: [email protected] Closes: https://syzkaller.appspot.com/bug?extid=136ca59d411f92e821b7 Signed-off-by: Paul Chaignon <[email protected]> Acked-by: Eduard Zingerman <[email protected]>
1 parent 5134863 commit bfa64de

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

net/core/filter.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9284,13 +9284,19 @@ static bool sock_addr_is_valid_access(int off, int size,
92849284
return false;
92859285
info->reg_type = PTR_TO_SOCKET;
92869286
break;
9287-
default:
9287+
case bpf_ctx_range(struct bpf_sock_addr, user_family):
9288+
case bpf_ctx_range(struct bpf_sock_addr, family):
9289+
case bpf_ctx_range(struct bpf_sock_addr, type):
9290+
case bpf_ctx_range(struct bpf_sock_addr, protocol):
92889291
if (type == BPF_READ) {
92899292
if (size != size_default)
92909293
return false;
92919294
} else {
92929295
return false;
92939296
}
9297+
break;
9298+
default:
9299+
return false;
92949300
}
92959301

92969302
return true;

0 commit comments

Comments
 (0)