Use After Free Affecting kernel-debuginfo-common-aarch64 package, versions <0:6.1.66-91.160.amzn2023


Severity

Recommended
high

Based on Amazon Linux security rating.

Threat Intelligence

EPSS
0.04% (12th percentile)

Do your applications use this vulnerable package?

In a few clicks we can analyze your entire application and see what components are vulnerable in your application, and suggest you quick fixes.

Test your applications

Snyk Learn

Learn about Use After Free vulnerabilities in an interactive lesson.

Start learning
  • Snyk IDSNYK-AMZN2023-KERNELDEBUGINFOCOMMONAARCH64-8494277
  • published11 Dec 2024
  • disclosed21 May 2024

Introduced: 21 May 2024

CVE-2023-52854  (opens in a new tab)
CWE-416  (opens in a new tab)

How to fix?

Upgrade Amazon-Linux:2023 kernel-debuginfo-common-aarch64 to version 0:6.1.66-91.160.amzn2023 or higher.
This issue was patched in ALAS2023-2023-461.

NVD Description

Note: Versions mentioned in the description apply only to the upstream kernel-debuginfo-common-aarch64 package and not the kernel-debuginfo-common-aarch64 package as distributed by Amazon-Linux. See How to fix? for Amazon-Linux:2023 relevant fixed versions and status.

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

padata: Fix refcnt handling in padata_free_shell()

In a high-load arm64 environment, the pcrypt_aead01 test in LTP can lead to system UAF (Use-After-Free) issues. Due to the lengthy analysis of the pcrypt_aead01 function call, I'll describe the problem scenario using a simplified model:

Suppose there's a user of padata named user_function that adheres to the padata requirement of calling padata_free_shell after serial() has been invoked, as demonstrated in the following code:

struct request {
    struct padata_priv padata;
    struct completion *done;
};

void parallel(struct padata_priv *padata) { do_something(); }

void serial(struct padata_priv *padata) { struct request *request = container_of(padata, struct request, padata); complete(request-&gt;done); }

void user_function() { DECLARE_COMPLETION(done) padata-&gt;parallel = parallel; padata-&gt;serial = serial; padata_do_parallel(); wait_for_completion(&amp;done); padata_free_shell(); }

In the corresponding padata.c file, there's the following code:

static void padata_serial_worker(struct work_struct *serial_work) {
    ...
    cnt = 0;

while (!list_empty(&amp;amp;local_list)) {
    ...
    padata-&amp;gt;serial(padata);
    cnt++;
}

local_bh_enable();

if (refcount_sub_and_test(cnt, &amp;amp;pd-&amp;gt;refcnt))
    padata_free_pd(pd);

}

Because of the high system load and the accumulation of unexecuted softirq at this moment, local_bh_enable() in padata takes longer to execute than usual. Subsequently, when accessing pd-&gt;refcnt, pd has already been released by padata_free_shell(), resulting in a UAF issue with pd-&gt;refcnt.

The fix is straightforward: add refcount_dec_and_test before calling padata_free_pd in padata_free_shell.

CVSS Scores

version 3.1