CVE-2023-40791 - Uncovering the Linux Kernel Vulnerability in extract_user_to_sg Function

CVE-2023-40791 is a critical memory management vulnerability in the Linux kernel that has the potential to seriously impact system security. In this in-depth post, we will discuss the technical details of this vulnerability, understand the code snippets involved, and explore potential exploits and their ramifications. We will also provide links to relevant sources for further research.

The vulnerability exists in the extract_user_to_sg function in lib/scatterlist.c file of the Linux kernel before version 6.4.12. The function fails to unpin pages in a specific situation, which may result in a kernel-level warning for try_grab_page.

Vulnerability Details

The extract_user_to_sg function primarily deals with the process of copying user pages from the Scatterlist (SG). Scatterlist is a data structure used by the kernel to manage contiguous memory pages that are linked together. The vulnerability occurs when the function fails to unpin the pages, leading to a system warning. This could potentially lead to memory leaks or other adverse effects on system operations.

The following code snippet is from the vulnerable function in lib/scatterlist.c (prior to patched kernel 6.4.12):

int extract_user_to_sg(struct sg_mapping_iter *sgmiter, void __user *upage,
			size_t sz, bool copy)
{
	struct sg_mapping_pg *mappg;
	struct scatterlist *sg;
	unsigned long offset;

	sg = sgmiter->suspend.sg;
	offset = sg_dma_address(sg) + sgmiter->suspend.pgidx * PAGE_SIZE;

	for (mappg = mappg_stack; mappg < mappg_top; mappg++) {
		if (mappg->pg == sg_page(sg)) {
			if (copy)
				copy_page(mappg->mapped, upage);
			return ;
		}
	}

	return __extract_user_to_sg(sgmiter, upage, offset, sz, copy);
}

The issue lies in the fact that the function fails to unpin the pages at the end, which may result in a kernel warning for try_grab_page.

Exploitation

An attacker with local access to a vulnerable Linux machine can potentially trigger this vulnerability by running a malicious program that manipulates memory mappings and pages in a way that causes the extract_user_to_sg function to fail to unpin the pages correctly.

The potential effects of a successful exploit for this vulnerability include resource exhaustion, memory leaks, and possible system failures, which could potentially be used for further compromise of the affected system. It is worth noting that the vulnerability in its current form does not directly allow for remote code execution, as the attacker must be able to execute a program on the target machine.

References and Additional Reading

For further information regarding the technical details of this vulnerability and the associated patch, please refer to the following sources:

1. Linux kernel source code (lib/scatterlist.c): https://github.com/torvalds/linux/blob/master/lib/scatterlist.c
2. Patch committing the fix for this issue: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=2744d08302d44d18e2b44883901c5eeb197a2a5
3. Detailed information about Scatterlist from the Linux Documentation Project: https://www.kernel.org/doc/html/latest/core-api/sg.html
4. More information about the try_grab_page function and its warning messages: https://elixir.bootlin.com/linux/v5.16.12/source/mm/rmap.c#L966

Conclusion

CVE-2023-40791 is a serious vulnerability in the Linux kernel that affects the memory management system by failing to unpin pages in a specific situation in the extract_user_to_sg function. While this vulnerability does not allow for remote code execution, it highlights the importance of diligent patching and keeping your systems up to date to mitigate potential security issues. We encourage all users to upgrade their Linux kernels to version 6.4.12 or later to be protected from this issue.

Timeline

Published on: 10/16/2023 03:15:09 UTC
Last modified on: 11/10/2023 18:15:08 UTC