Description
In the Linux kernel, the following vulnerability has been resolved: bpf: Fix effective prog array index with BPF_F_PREORDER replace_effective_prog() and purge_effective_progs() located the slot in the effective array by walking the program hlist and counting entries linearly. That count does not match the array layout: compute_effective_ progs() places BPF_F_PREORDER programs at the front (ancestor cgroup first, attach order within a cgroup) and the rest after them (descendant cgroup first). So when a preorder program is present, the linear hlist position no longer equals the program's index in the effective array. For replace_effective_prog() (bpf_link_update()) this overwrote the wrong slot, corrupting the effective order. For purge_effective_progs(), it could dummy out a slot belonging to a different program and leave the detached program in the array while bpf_prog_put() drops its reference, i.e. a use-after-free. Fix both by replaying compute_effective_progs()'s placement (including the per-cgroup preorder reversal) in a shared effective_prog_pos() helper. Identify the entry by its struct bpf_prog_list pointer rather than by (prog, link) value, so the lookup resolves to exactly the attachment the syscall selected even when the same bpf_prog is attached to several cgroups in the hierarchy.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
bc8023ef3b11410682e5d4990e05e5bc2d3e1c94 to < 525e408c27ae714e538b8c608c3a974df3ab6c92affected555c0b713ca83968d3c843cb15485b9ba3367b1b to < 41b4320b84fdafe1ab586b06453d30d50415db59affected4b82b181a26cff8bf7adc3a85a88d121d92edeaf to < 9697db03e010391c55ae75192cbdf30c5a72c114affected4b82b181a26cff8bf7adc3a85a88d121d92edeaf to < b584f107ab90222bd825dcb4c5977326ff684109affected4b82b181a26cff8bf7adc3a85a88d121d92edeaf to < f08aaee3152d0dfc578b3f2586932d82062701ddaffected4707ad649cf662add3058bff47430817811b048daffected6.6.93 to < 6.6.145affected6.12.31 to < 6.12.97affected6.14.9 to < 6.15affected
Linux Linux
Default version status: affected
6.15affected0 to < 6.15unaffected6.6.145 to ≤ 6.6.*unaffected6.12.97 to ≤ 6.12.*unaffected6.18.40 to ≤ 6.18.*unaffected7.1.5 to ≤ 7.1.*unaffected7.2 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/525e408c27ae714e538b8c608c3a974df3ab6c92 ↗
- https://git.kernel.org/stable/c/41b4320b84fdafe1ab586b06453d30d50415db59 ↗
- https://git.kernel.org/stable/c/9697db03e010391c55ae75192cbdf30c5a72c114 ↗
- https://git.kernel.org/stable/c/b584f107ab90222bd825dcb4c5977326ff684109 ↗
- https://git.kernel.org/stable/c/f08aaee3152d0dfc578b3f2586932d82062701dd ↗