Lucene search

K
cve416baaa9-dc9f-4396-8d5f-8c081fb06d67CVE-2023-52452
HistoryFeb 22, 2024 - 5:15 p.m.

CVE-2023-52452

2024-02-2217:15:08
CWE-665
416baaa9-dc9f-4396-8d5f-8c081fb06d67
web.nvd.nist.gov
289
linux kernel
bpf
vulnerability
fix
security
cve-2023-52452
stack memory
uninitialized
access
privilege escalation

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

LOW

User Interaction

NONE

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

6.2 Medium

AI Score

Confidence

Low

0.0004 Low

EPSS

Percentile

5.1%

In the Linux kernel, the following vulnerability has been resolved:

bpf: Fix accesses to uninit stack slots

Privileged programs are supposed to be able to read uninitialized stack
memory (ever since 6715df8d5) but, before this patch, these accesses
were permitted inconsistently. In particular, accesses were permitted
above state->allocated_stack, but not below it. In other words, if the
stack was already “large enough”, the access was permitted, but
otherwise the access was rejected instead of being allowed to “grow the
stack”. This undesired rejection was happening in two places:

  • in check_stack_slot_within_bounds()
  • in check_stack_range_initialized()
    This patch arranges for these accesses to be permitted. A bunch of tests
    that were relying on the old rejection had to change; all of them were
    changed to add also run unprivileged, in which case the old behavior
    persists. One tests couldn’t be updated - global_func16 - because it
    can’t run unprivileged for other reasons.

This patch also fixes the tracking of the stack size for variable-offset
reads. This second fix is bundled in the same commit as the first one
because they’re inter-related. Before this patch, writes to the stack
using registers containing a variable offset (as opposed to registers
with fixed, known values) were not properly contributing to the
function’s needed stack size. As a result, it was possible for a program
to verify, but then to attempt to read out-of-bounds data at runtime
because a too small stack had been allocated for it.

Each function tracks the size of the stack it needs in
bpf_subprog_info.stack_depth, which is maintained by
update_stack_depth(). For regular memory accesses, check_mem_access()
was calling update_state_depth() but it was passing in only the fixed
part of the offset register, ignoring the variable offset. This was
incorrect; the minimum possible value of that register should be used
instead.

This tracking is now fixed by centralizing the tracking of stack size in
grow_stack_state(), and by lifting the calls to grow_stack_state() to
check_stack_access_within_bounds() as suggested by Andrii. The code is
now simpler and more convincingly tracks the correct maximum stack size.
check_stack_range_initialized() can now rely on enough stack having been
allocated for the access; this helps with the fix for the first issue.

A few tests were changed to also check the stack depth computation. The
one that fails without this patch is verifier_var_off:stack_write_priv_vs_unpriv.

Affected configurations

Vulners
NVD
Node
linuxlinux_kernelRange5.126.6.14
OR
linuxlinux_kernelRange6.7.06.7.2
OR
linuxlinux_kernelRange6.8.0
VendorProductVersionCPE
linuxlinux_kernel*cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
linuxlinux_kernel*cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
linuxlinux_kernel*cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*

CNA Affected

[
  {
    "product": "Linux",
    "vendor": "Linux",
    "defaultStatus": "unaffected",
    "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
    "programFiles": [
      "kernel/bpf/verifier.c",
      "tools/testing/selftests/bpf/progs/iters.c",
      "tools/testing/selftests/bpf/progs/test_global_func16.c",
      "tools/testing/selftests/bpf/progs/verifier_basic_stack.c",
      "tools/testing/selftests/bpf/progs/verifier_int_ptr.c",
      "tools/testing/selftests/bpf/progs/verifier_raw_stack.c",
      "tools/testing/selftests/bpf/progs/verifier_var_off.c",
      "tools/testing/selftests/bpf/verifier/atomic_cmpxchg.c",
      "tools/testing/selftests/bpf/verifier/calls.c"
    ],
    "versions": [
      {
        "version": "01f810ace9ed",
        "lessThan": "0954982db828",
        "status": "affected",
        "versionType": "git"
      },
      {
        "version": "01f810ace9ed",
        "lessThan": "fbcf372c8eda",
        "status": "affected",
        "versionType": "git"
      },
      {
        "version": "01f810ace9ed",
        "lessThan": "6b4a64bafd10",
        "status": "affected",
        "versionType": "git"
      }
    ]
  },
  {
    "product": "Linux",
    "vendor": "Linux",
    "defaultStatus": "affected",
    "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
    "programFiles": [
      "kernel/bpf/verifier.c",
      "tools/testing/selftests/bpf/progs/iters.c",
      "tools/testing/selftests/bpf/progs/test_global_func16.c",
      "tools/testing/selftests/bpf/progs/verifier_basic_stack.c",
      "tools/testing/selftests/bpf/progs/verifier_int_ptr.c",
      "tools/testing/selftests/bpf/progs/verifier_raw_stack.c",
      "tools/testing/selftests/bpf/progs/verifier_var_off.c",
      "tools/testing/selftests/bpf/verifier/atomic_cmpxchg.c",
      "tools/testing/selftests/bpf/verifier/calls.c"
    ],
    "versions": [
      {
        "version": "5.12",
        "status": "affected"
      },
      {
        "version": "0",
        "lessThan": "5.12",
        "status": "unaffected",
        "versionType": "custom"
      },
      {
        "version": "6.6.14",
        "lessThanOrEqual": "6.6.*",
        "status": "unaffected",
        "versionType": "custom"
      },
      {
        "version": "6.7.2",
        "lessThanOrEqual": "6.7.*",
        "status": "unaffected",
        "versionType": "custom"
      },
      {
        "version": "6.8",
        "lessThanOrEqual": "*",
        "status": "unaffected",
        "versionType": "original_commit_for_fix"
      }
    ]
  }
]

7.8 High

CVSS3

Attack Vector

LOCAL

Attack Complexity

LOW

Privileges Required

LOW

User Interaction

NONE

Scope

UNCHANGED

Confidentiality Impact

HIGH

Integrity Impact

HIGH

Availability Impact

HIGH

CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

6.2 Medium

AI Score

Confidence

Low

0.0004 Low

EPSS

Percentile

5.1%