Bug 2265657 (CVE-2024-26589) - CVE-2024-26589 kernel: bpf: Reject variable offset alu on PTR_TO_FLOW_KEYS
Summary: CVE-2024-26589 kernel: bpf: Reject variable offset alu on PTR_TO_FLOW_KEYS
Keywords:
Status: NEW
Alias: CVE-2024-26589
Product: Security Response
Classification: Other
Component: vulnerability
Version: unspecified
Hardware: All
OS: Linux
medium
medium
Target Milestone: ---
Assignee: Product Security
QA Contact:
URL:
Whiteboard:
Depends On: 2265666
Blocks: 2265643
TreeView+ depends on / blocked
 
Reported: 2024-02-23 13:58 UTC by Patrick Del Bello
Modified: 2024-04-22 14:22 UTC (History)
49 users (show)

Fixed In Version:
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed:
Embargoed:


Attachments (Terms of Use)

Description Patrick Del Bello 2024-02-23 13:58:04 UTC
bpf: Reject variable offset alu on PTR_TO_FLOW_KEYS

For PTR_TO_FLOW_KEYS, check_flow_keys_access() only uses fixed off
for validation. However, variable offset ptr alu is not prohibited
for this ptr kind. So the variable offset is not checked.

The following prog is accepted:

  func#0 @0
  0: R1=ctx() R10=fp0
  0: (bf) r6 = r1                       ; R1=ctx() R6_w=ctx()
  1: (79) r7 = *(u64 *)(r6 +144)        ; R6_w=ctx() R7_w=flow_keys()
  2: (b7) r8 = 1024                     ; R8_w=1024
  3: (37) r8 /= 1                       ; R8_w=scalar()
  4: (57) r8 &= 1024                    ; R8_w=scalar(smin=smin32=0,
  smax=umax=smax32=umax32=1024,var_off=(0x0; 0x400))
  5: (0f) r7 += r8
  mark_precise: frame0: last_idx 5 first_idx 0 subseq_idx -1
  mark_precise: frame0: regs=r8 stack= before 4: (57) r8 &= 1024
  mark_precise: frame0: regs=r8 stack= before 3: (37) r8 /= 1
  mark_precise: frame0: regs=r8 stack= before 2: (b7) r8 = 1024
  6: R7_w=flow_keys(smin=smin32=0,smax=umax=smax32=umax32=1024,var_off
  =(0x0; 0x400)) R8_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=1024,
  var_off=(0x0; 0x400))
  6: (79) r0 = *(u64 *)(r7 +0)          ; R0_w=scalar()
  7: (95) exit

This prog loads flow_keys to r7, and adds the variable offset r8
to r7, and finally causes out-of-bounds access:

  BUG: unable to handle page fault for address: ffffc90014c80038
  [...]
  Call Trace:
   <TASK>
   bpf_dispatcher_nop_func include/linux/bpf.h:1231 [inline]
   __bpf_prog_run include/linux/filter.h:651 [inline]
   bpf_prog_run include/linux/filter.h:658 [inline]
   bpf_prog_run_pin_on_cpu include/linux/filter.h:675 [inline]
   bpf_flow_dissect+0x15f/0x350 net/core/flow_dissector.c:991
   bpf_prog_test_run_flow_dissector+0x39d/0x620 net/bpf/test_run.c:1359
   bpf_prog_test_run kernel/bpf/syscall.c:4107 [inline]
   __sys_bpf+0xf8f/0x4560 kernel/bpf/syscall.c:5475
   __do_sys_bpf kernel/bpf/syscall.c:5561 [inline]
   __se_sys_bpf kernel/bpf/syscall.c:5559 [inline]
   __x64_sys_bpf+0x73/0xb0 kernel/bpf/syscall.c:5559
   do_syscall_x64 arch/x86/entry/common.c:52 [inline]
   do_syscall_64+0x3f/0x110 arch/x86/entry/common.c:83
   entry_SYSCALL_64_after_hwframe+0x63/0x6b

Fix this by rejecting ptr alu with variable offset on flow_keys.
Applying the patch rejects the program with "R7 pointer arithmetic
on flow_keys prohibited".

Comment 1 Patrick Del Bello 2024-02-23 14:38:40 UTC
Created kernel tracking bugs for this issue:

Affects: fedora-all [bug 2265666]

Comment 3 Justin M. Forbes 2024-02-27 00:31:35 UTC
	Issue introduced in 4.20 with commit d58e468b1112 and fixed in 5.15.148 with commit 29ffa63f21bc
	Issue introduced in 4.20 with commit d58e468b1112 and fixed in 6.1.75 with commit 4108b86e324d
	Issue introduced in 4.20 with commit d58e468b1112 and fixed in 6.6.14 with commit e8d3872b617c
	Issue introduced in 4.20 with commit d58e468b1112 and fixed in 6.7.2 with commit 1b500d5d6cec
	Issue introduced in 4.20 with commit d58e468b1112 and fixed in 6.8-rc1 with commit 22c7fa171a02

Comment 4 Justin M. Forbes 2024-02-27 00:31:51 UTC
This was fixed for Fedora with the 6.6.14 stable kernel updates.


Note You need to log in before you can comment on or make changes to this bug.