CVE-2023-52854 padata: Fix refcnt handling in padata_free_shell()

High 7.8 Published Updated

A use-after-free vulnerability in the Linux kernel padata subsystem allows attackers to cause system crashes or potentially execute code under high load.

Exploited in the wild
Not known
Login needed
Any signed-in user
Attackable
Local or same network only
Victim action needed
Not needed
Fix
Available

What is CVE-2023-52854?

CVE-2023-52854 is a high-severity use after free vulnerability in Linux kernel, published on 21 May 2024. It can only be exploited from the same machine or local network, with no action from the victim.

Official description

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:

```c 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->done); }

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

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

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

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

local_bh_enable();

if (refcount_sub_and_test(cnt, &pd->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->refcnt`, `pd` has already been released by `padata_free_shell()`, resulting in a UAF issue with `pd->refcnt`.

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

Weakness: CWE-416

Which versions are affected by CVE-2023-52854?

It affects 1 product.

Products include Linux kernel.

How do I fix CVE-2023-52854?

Apply the vendor's patch.

Upgrade to the fixed version. These bugs are found with fuzzing and sanitisers and avoided by memory-safe languages. More about Use after free.

Is CVE-2023-52854 being exploited?

There is no known exploitation of CVE-2023-52854 in the wild and no public exploit code.

All Linux kernel vulnerabilities

Sources

Also known as BELL-CVE-2023-52854, DEBIAN-CVE-2023-52854, GHSA-gj4h-wmhg-vp66, UBUNTU-CVE-2023-52854.

Is CVE-2023-52854 in your software?

Upload an SBOM and sbomify checks it against every vulnerability here, every day.

Check your SBOMs for free