In the Linux kernel, the following vulnerability has been resolved:
eventpoll: Fix semi-unbounded recursion
Ensure that epoll instances can never form a graph deeper than EP_MAX_NESTS+1 links.
Currently, ep_loop_check_proc() ensures that the graph is loop-free and does some recursion depth checks, but those recursion depth checks don't limit the depth of the resulting tree for two reasons:
Essentially, the current recursion depth check in ep_loop_check_proc() just serves to prevent it from recursing too deeply while checking for loops.
A more thorough check is done in reverse_path_check() after the new graph edge has already been created; this checks, among other things, that no paths going upwards from any non-epoll file with a length of more than 5 edges exist. However, this check does not apply to non-epoll files.
As a result, it is possible to recurse to a depth of at least roughly 500, tested on v6.15. (I am unsure if deeper recursion is possible; and this may have changed with commit 8c44dac8add7 ("eventpoll: Fix priority inversion problem").)
To fix it:
| Software | From | Fixed in |
|---|---|---|
| linux / linux_kernel | 2.6.32.30 | 2.6.33 |
| linux / linux_kernel | 2.6.33.8 | 2.6.34 |
| linux / linux_kernel | 2.6.34.10 | 2.6.35 |
| linux / linux_kernel | 2.6.35.12 | 2.6.36 |
| linux / linux_kernel | 2.6.37.3 | 2.6.38 |
| linux / linux_kernel | 2.6.38.1 | 5.15.190 |
| linux / linux_kernel | 5.16 | 6.1.149 |
| linux / linux_kernel | 6.2 | 6.6.103 |
| linux / linux_kernel | 6.7 | 6.12.43 |
| linux / linux_kernel | 6.13 | 6.15.11 |
| linux / linux_kernel | 6.16 | 6.16.1 |
| linux / linux_kernel | 2.6.38 | 2.6.38.x |
| linux / linux_kernel | 2.6.38-rc7 | 2.6.38-rc7.x |
| linux / linux_kernel | 2.6.38-rc8 | 2.6.38-rc8.x |
| debian / debian_linux | 11.0 | 11.0.x |