{"id":56544,"date":"2024-07-11T18:37:01","date_gmt":"2024-07-11T18:37:01","guid":{"rendered":"https:\/\/packetstormsecurity.com\/news\/view\/36095\/Introducing-A-New-Vulnerability-Class-False-File-Immutability.html"},"modified":"2024-07-11T18:37:01","modified_gmt":"2024-07-11T18:37:01","slug":"introducing-a-new-vulnerability-class-false-file-immutability","status":"publish","type":"post","link":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/","title":{"rendered":"Introducing A New Vulnerability Class: False File Immutability"},"content":{"rendered":"<p>This article will discuss a previously-unnamed vulnerability class in Windows, showing how long-standing incorrect assumptions in the design of core Windows features can result in both undefined behavior and security vulnerabilities. We will demonstrate how one such vulnerability in the Windows 11 kernel can be exploited to achieve arbitrary code execution with kernel privileges.<\/p>\n<p>When an application opens a file on Windows, it typically uses some form of the Win32 <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/fileapi\/nf-fileapi-createfilew\"><strong>CreateFile<\/strong><\/a> API.<\/p>\n<pre><code>HANDLE CreateFileW( [in] LPCWSTR lpFileName, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, [in] DWORD dwCreationDisposition, [in] DWORD dwFlagsAndAttributes, [in, optional] HANDLE hTemplateFile\n);<\/code><\/pre>\n<p>Callers of <strong>CreateFile<\/strong> specify the access they want in <strong>dwDesiredAccess<\/strong>. For example, a caller would pass <strong>FILE_READ_DATA<\/strong> to be able to read data, or <strong>FILE_WRITE_DATA<\/strong> to be able to write data. The full set of access rights are <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/fileio\/file-access-rights-constants\">documented<\/a> on the Microsoft Learn website.<\/p>\n<p>In addition to passing <strong>dwDesiredAccess<\/strong>, callers must pass a \u201csharing mode\u201d in <strong>dwShareMode<\/strong>, which consists of zero or more of <strong>FILE_SHARE_READ<\/strong>, <strong>FILE_SHARE_WRITE<\/strong>, and <strong>FILE_SHARE_DELETE<\/strong>. You can think of a sharing mode as the caller declaring \u201cI\u2019m okay with others doing X to this file while I\u2019m using it,\u201d where X could be reading, writing, or renaming. For example, a caller that passes <strong>FILE_SHARE_WRITE<\/strong> allows others to write the file while they are working with it.<\/p>\n<p>As a file is opened, the caller\u2019s <strong>dwDesiredAccess<\/strong> is tested against the <strong>dwShareMode<\/strong> of all existing file handles. Simultaneously, the caller\u2019s <strong>dwShareMode<\/strong> is tested against the previously-granted <strong>dwDesiredAccess<\/strong> of all existing handles to that file. If either of these tests fail, then <strong>CreateFile<\/strong> fails with a sharing violation.<\/p>\n<p>Sharing isn\u2019t mandatory. Callers can pass a share mode of zero to obtain exclusive access. Per Microsoft <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/fileio\/creating-and-opening-files\">documentation<\/a>:<\/p>\n<blockquote readability=\"9\">\n<p>An open file that is not shared (dwShareMode set to zero) cannot be opened again, either by the application that opened it or by another application, until its handle has been closed. This is also referred to as exclusive access.<\/p>\n<\/blockquote>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"sharing-enforcement\" class=\"absolute -top-32\"><\/span>Sharing enforcement<\/h2>\n<p>In the kernel, sharing is enforced by filesystem drivers. As a file is opened, it\u2019s the responsibility of the filesystem driver to call <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/wdm\/nf-wdm-iocheckshareaccess\"><strong>IoCheckShareAccess<\/strong><\/a> or <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/wdm\/nf-wdm-iochecklinkshareaccess\"><strong>IoCheckLinkShareAccess<\/strong><\/a> to see whether the requested <strong>DesiredAccess<\/strong>\/<strong>ShareMode<\/strong> tuple is compatible with any existing handles to the file being opened. <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-server\/storage\/file-server\/ntfs-overview\">NTFS<\/a> is the primary filesystem on Windows, but it\u2019s closed-source, so for illustrative purposes we\u2019ll instead look at Microsoft\u2019s FastFAT sample code performing <a href=\"https:\/\/github.com\/Microsoft\/Windows-driver-samples\/blob\/622212c3fff587f23f6490a9da939fb85968f651\/filesys\/fastfat\/create.c#L6822-L6884\">the same check<\/a>. Unlike an IDA decompilation, it even comes with comments!<\/p>\n<pre><code>\/\/\n\/\/ Check if the Fcb has the proper share access.\n\/\/ return IoCheckShareAccess( *DesiredAccess, ShareAccess, FileObject, &amp;FcbOrDcb-&gt;ShareAccess, FALSE );<\/code><\/pre>\n<p>In addition to traditional read\/write file operations, Windows lets applications map files into memory. Before we go deeper, it\u2019s important to understand that <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/kernel\/section-objects-and-views\">section objects<\/a> are kernel parlance for <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/memory\/file-mapping\">file mappings<\/a>; they are the same thing. This article focuses on the kernel, so it will primarily refer to them as section objects.<\/p>\n<p>There are two types of section objects &#8211; data sections and executable image sections. Data sections are direct 1:1 mappings of files into memory. The file\u2019s contents will appear in memory exactly as they do on disk. Data sections also have uniform memory permissions for the entire memory range. With respect to the underlying file, data sections can be either read-only or read-write. A read-write view of a file enables a process to read or write the file\u2019s contents by reading\/writing memory within its own address space.<\/p>\n<p>Executable image sections (sometimes abbreviated to image sections) prepare <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/debug\/pe-format\">PE files<\/a> to be executed. Image sections must be created from PE files. Examples of PE files include EXE, DLL, SYS, CPL, SCR, and OCX files. The kernel processes the PEs specially to prepare them to be executed. Different PE regions will be mapped in memory with different page permissions, depending on their metadata. Image views are <a href=\"https:\/\/en.wikipedia.org\/wiki\/Copy-on-write\">copy-on-write<\/a>, meaning any changes in memory will be saved to the process\u2019s private working set \u2014 never written to the backing PE.<\/p>\n<p>Let\u2019s say application A wants to map a file into memory with a data section. First, it opens that file with an API such as <strong>ZwCreateFile<\/strong>, which returns a file handle. Next, it passes this file handle to an API such as <strong>ZwCreateSection<\/strong> which creates a section object that describes how the file will be mapped into memory; this yields a section handle. The process then uses the section handle to map a \u201cview\u201d of that section into the process address space, completing the memory mapping.<\/p>\n<figure><img alt=\"Diagram showing how a file is mapped into memory\" loading=\"lazy\" width=\"1468\" height=\"314\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=1920&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\"><figcaption>Diagram showing how a file is mapped into memory<\/figcaption><\/figure>\n<p>Once the file is successfully mapped, process A can close both the file and section handles, leaving zero open handles to the file. If process B later wants to use the file without the risk of it being modified externally, it would omit <strong>FILE_SHARE_WRITE<\/strong> when opening the file. <strong>IoCheckLinkShareAccess<\/strong> looks for open file handles, but since the handles were previously closed, it will not fail the operation.<\/p>\n<p>This creates a problem for file sharing. Process B thinks it has a file open without risk of external modification, but process A can modify it through the memory mapping. To account for this, the filesystem must also call <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/ntifs\/nf-ntifs-mmdoesfilehaveuserwritablereferences\"><strong>MmDoesFileHaveUserWritableReferences<\/strong><\/a>. This checks whether there are any active writable file mappings to the given file. We can see this check in the FastFAT example <a href=\"https:\/\/github.com\/Microsoft\/Windows-driver-samples\/blob\/622212c3fff587f23f6490a9da939fb85968f651\/filesys\/fastfat\/create.c#L6858-L6870\">here<\/a>:<\/p>\n<pre><code>\/\/\n\/\/ Do an extra test for writeable user sections if the user did not allow\n\/\/ write sharing - this is neccessary since a section may exist with no handles\n\/\/ open to the file its based against.\n\/\/ if ((NodeType( FcbOrDcb ) == FAT_NTC_FCB) &amp;&amp; !FlagOn( ShareAccess, FILE_SHARE_WRITE ) &amp;&amp; FlagOn( *DesiredAccess, FILE_EXECUTE | FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | DELETE | MAXIMUM_ALLOWED ) &amp;&amp; MmDoesFileHaveUserWritableReferences( &amp;FcbOrDcb-&gt;NonPaged-&gt;SectionObjectPointers )) { return STATUS_SHARING_VIOLATION;\n}<\/code><\/pre>\n<p>Windows requires PE files to be immutable (unmodifiable) while they are running. This prevents EXEs and DLLs from being changed on disk while they are running in memory. Filesystem drivers must use the <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ddi\/ntifs\/nf-ntifs-mmflushimagesection\"><strong>MmFlushImageSection<\/strong><\/a> function to check whether there are any active image mappings of a PE before allowing <strong>FILE_WRITE_DATA<\/strong> access. We can see this in the <a href=\"https:\/\/github.com\/Microsoft\/Windows-driver-samples\/blob\/622212c3fff587f23f6490a9da939fb85968f651\/filesys\/fastfat\/create.c#L3572-L3593\">FastFAT example code<\/a>, and on <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ifs\/executable-images\">Microsoft Learn<\/a>.<\/p>\n<pre><code>\/\/\n\/\/ If the user wants write access access to the file make sure there\n\/\/ is not a process mapping this file as an image. Any attempt to\n\/\/ delete the file will be stopped in fileinfo.c\n\/\/\n\/\/ If the user wants to delete on close, we must check at this\n\/\/ point though.\n\/\/ if (FlagOn(*DesiredAccess, FILE_WRITE_DATA) || DeleteOnClose) { Fcb-&gt;OpenCount += 1; DecrementFcbOpenCount = TRUE; if (!MmFlushImageSection( &amp;Fcb-&gt;NonPaged-&gt;SectionObjectPointers, MmFlushForWrite )) { Iosb.Status = DeleteOnClose ? STATUS_CANNOT_DELETE : STATUS_SHARING_VIOLATION; try_return( Iosb ); }\n}<\/code><\/pre>\n<p>Another way to think of this check is that <strong>ZwMapViewOfSection(SEC_IMAGE)<\/strong> implies no-write-sharing as long as the view exists.<\/p>\n<p>The <a href=\"https:\/\/download.microsoft.com\/download\/9\/c\/5\/9c5b2167-8017-4bae-9fde-d599bac8184a\/authenticode_pe.docx\">Windows Authenticode Specification<\/a> describes a way to employ cryptography to \u201csign\u201d PE files. A \u201cdigital signature\u201d cryptographically attests that the PE was produced by a particular entity. Digital signatures are tamper-evident, meaning that any material modification of signed files should be detectable because the digital signature will no longer match. Digital signatures are typically appended to the end of PE files.<\/p>\n<figure><img alt=\"Authenticode specification diagram showing a signature embedded within a PE\" loading=\"lazy\" width=\"864\" height=\"1024\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage19.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage19.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage19.png&amp;w=1920&amp;q=90\"><figcaption>Authenticode specification diagram showing a signature embedded within a PE<\/figcaption><\/figure>\n<p>Authenticode can\u2019t apply traditional hashing (e.g. <strong>sha256sum<\/strong>) in this case, because the act of appending the signature would change the file\u2019s hash, breaking the signature it just generated. Instead, the Authenticode specification describes an algorithm to skip specific portions of the PE file that will be changed during the signing process. This algorithm is called <strong>authentihash<\/strong>. You can use authentihash with any hashing algorithm, such as SHA256. When a PE file is digitally signed, the file\u2019s authentihash is what\u2019s actually signed.<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"code-integrity\" class=\"absolute -top-32\"><\/span>Code integrity<\/h2>\n<p>Windows has a few different ways to validate Authenticode signatures. User mode applications can call <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/wintrust\/nf-wintrust-winverifytrust\"><strong>WinVerifyTrust<\/strong><\/a> to validate a file\u2019s signature in user mode. The Code Integrity (CI) subsystem, residing in <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">ci.dll<\/code>, validates signatures in the kernel. If <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/bringup\/device-guard-and-credential-guard\">Hypervisor-Protected Code Integrity<\/a> is running, the Secure Kernel employs <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">skci.dll<\/code> to validate Authenticode. This article will focus on Code Integrity (<code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">ci.dll<\/code>) in the regular kernel.<\/p>\n<p>Code Integrity provides both Kernel Mode Code Integrity and User Mode Code Integrity, each serving a different set of functions.<\/p>\n<p>Kernel Mode Code Integrity (KMCI):<\/p>\n<p>User Mode Code Integrity (UMCI):<\/p>\n<p>KMCI and UMCI implement different policies for different scenarios. For example, the policy for Protected Processes is different from that of INTEGRITYCHECK.<\/p>\n<p>Microsoft <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/api\/fileapi\/nf-fileapi-createfilea\">documentation<\/a> implies that files successfully opened without write sharing can\u2019t be modified by another user or process.<\/p>\n<pre><code>FILE_SHARE_WRITE\n0x00000002\nEnables subsequent open operations on a file or device to request write access. Otherwise, other processes cannot open the file or device if they request write access.<\/code><\/pre>\n<p>If this flag is not specified, but the file or device has been opened for write access or has a file mapping with write access, the function fails.<\/p>\n<p><em>Above, we discussed how sharing is enforced by the filesystem, but what if the filesystem doesn\u2019t know that the file\u2019s been modified?<\/em><\/p>\n<p>Like most user mode memory, the Memory Manager (MM) in the kernel may page-out portions of file mappings when it deems necessary, such as when the system needs more free physical memory. Both data and executable image mappings may be paged-out. Executable image sections can never modify the backing file, so they\u2019re effectively treated as read-only with respect to the backing PE file. As mentioned before, image sections are copy-on-write, meaning any in-memory changes immediately create a private copy of the given page.<\/p>\n<p>When the memory manager needs to page-out a page from an image section, it can use the following decision tree:<\/p>\n<ul>\n<li>Never modified? Discard it. We can read the contents back from the immutable file on disk.<\/li>\n<li>Modified? Save private copy it to the pagefile.<!-- -->\n<ul>\n<li>Example: If a security product hooks a function in <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">ntdll.dll<\/code>, MM will create a private copy of each modified page. Upon page-out, private pages will be written to the pagefile.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>If those paged-out pages are later touched, the CPU will issue a page fault and the MM will restore the pages.<\/p>\n<ul>\n<li>Page never modified? Read the original contents back from the immutable file on disk.<\/li>\n<li>Page private? Read it from the pagefile.<\/li>\n<\/ul>\n<p>Note the following exception: The memory manager may treat PE-relocated pages as unmodified, dynamically reapplying relocations during page faults.<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"page-hashes\" class=\"absolute -top-32\"><\/span>Page hashes<\/h2>\n<p>Page hashes are a list of hashes of each 4KB page within a PE file. Since pages are 4KB, page faults typically occur on 4KB of data at a time. Full Authenticode verification requires the entire contiguous PE file, which isn\u2019t available during a page fault. Page hashes allow the MM to validate hashes of individual pages during page faults.<\/p>\n<p>There are two types of page hashes, which we\u2019ve coined static and dynamic. Static page hashes are stored within a PE\u2019s digital signature if the developer passes <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">\/ph<\/code> to <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/seccrypto\/signtool\"><code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">signtool<\/code><\/a>. By pre-computing these, they are immediately available to the MM and CI upon module load.<\/p>\n<p>CI can also compute them on-the-fly during signature validation, a mechanism we\u2019re calling dynamic page hashes. Dynamic page hashes give CI flexibility to enforce page hashes even for files that were never signed with them.<\/p>\n<p>Page hashes are not free &#8211; they use CPU and slow down page faults. They\u2019re not used in most cases.<\/p>\n<p>Imagine a scenario where a ransomware operator wants to ransom a hospital, so they send a phishing email to a hospital employee. The employee opens the email attachment and enables macros, running the ransomware. The ransomware employs a UAC bypass to immediately elevate to admin, then attempts to terminate any security software on the system so it can operate unhindered. Anti-Malware services run as <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/services\/protecting-anti-malware-services-\">Protected Process Light<\/a> (PPL), protecting them from tampering by malware with admin rights, so the ransomware can\u2019t terminate the Anti-Malware service.<\/p>\n<p>If the ransomware could also run as a PPL, it could terminate the Anti-Malware product. The ransomware can\u2019t launch itself directly as a PPL because UMCI prevents improperly-signed EXEs and DLLs from loading into PPL, as we discussed above. The ransomware might try to inject code into a PPL by modifying an EXE or DLL that\u2019s already running, but the aforementioned <strong>MmFlushImageSection<\/strong> ensures in-use PE files remain immutable, so this isn\u2019t possible.<\/p>\n<p>We previously discussed how the filesystem is responsible for sharing checks. <em>What would happen if an attacker were to move the filesystem to another machine?<\/em><\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/ifs\/what-is-a-network-redirector-\">Network redirectors<\/a> allow the use of network paths with any API that accepts file paths. This is very convenient, allowing users and applications to easily open and memory-map files over the network. Any resulting I\/O is transparently redirected to the remote machine. If a program is launched from a network drive, the executable images for the EXE and its DLLs will be transparently pulled from the network.<\/p>\n<p>When a network redirector is in use, the server on the other end of the pipe needn\u2019t be a Windows machine. It could be a Linux machine running <a href=\"https:\/\/en.wikipedia.org\/wiki\/Samba_(software)\">Samba<\/a>, or even a python <a href=\"https:\/\/github.com\/fortra\/impacket\/blob\/d71f4662eaf12c006c2ea7f5ec09b418d9495806\/examples\/smbserver.py\">impacket script<\/a> that \u201cspeaks\u201d the <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-server\/storage\/file-server\/file-server-smb-overview\">SMB network protocol<\/a>. This means the server doesn\u2019t have to honor Windows filesystem sharing semantics.<\/p>\n<p>An attacker can employ a network redirector to modify a PPL\u2019s DLL server-side, bypassing sharing restrictions. This means that PEs backing an executable image section are incorrectly assumed to be immutable. This is a class of vulnerability that we are calling <strong>False File Immutability<\/strong> (FFI).<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"paging-exploitation\" class=\"absolute -top-32\"><\/span>Paging exploitation<\/h2>\n<p>If an attacker successfully exploits False File Immutability to inject code into an in-use PE, wouldn\u2019t page hashes catch such an attack? The answer is: sometimes. If we look at the following table, we can see that page hashes are enforced kernel drivers and Protected Processes, but not for PPL, so let\u2019s pretend we\u2019re an attacker targeting PPL.<\/p>\n<div class=\"table-container\">\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Authenticode<\/th>\n<th>Page hashes<\/th>\n<\/tr>\n<\/thead>\n<tbody readability=\"2\">\n<tr>\n<td>Kernel drivers<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr readability=\"2\">\n<td>Protected Processes (PP-Full)<\/td>\n<td>\u2705<\/td>\n<td>\u2705<\/td>\n<\/tr>\n<tr readability=\"2\">\n<td>Protected Process Light (PPL)<\/td>\n<td>\u2705<\/td>\n<td>\u274c<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Last year at Black Hat Asia 2023 (<a href=\"https:\/\/www.blackhat.com\/asia-23\/briefings\/schedule\/#ppldump-is-dead-long-live-ppldump-31052\">abstract<\/a>, <a href=\"http:\/\/i.blackhat.com\/Asia-23\/AS-23-Landau-PPLdump-Is-Dead-Long-Live-PPLdump.pdf\">slides<\/a>, <a href=\"https:\/\/www.youtube.com\/watch?v=5xteW8Tm410\">recording<\/a>), we disclosed a vulnerability in the Windows kernel, showing how bad assumptions in paging can be exploited to inject code into PPL, defeating security features like <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-server\/security\/credentials-protection-and-management\/configuring-additional-lsa-protection\">LSA<\/a> &amp; <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/services\/protecting-anti-malware-services-\">Anti-Malware Process Protection<\/a>. The attack leveraged False File Immutability assumptions for DLLs in PPLs, as we just described, though we hadn\u2019t yet named the vulnerability class.<\/p>\n<figure><img alt=\"A diagram of the PPLFault exploit\" loading=\"lazy\" width=\"1334\" height=\"563\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage5.png&amp;w=1920&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage5.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage5.png&amp;w=3840&amp;q=90\"><figcaption>A diagram of the PPLFault exploit<\/figcaption><\/figure>\n<p>Alongside the presentation, we released the <a href=\"https:\/\/github.com\/gabriellandau\/PPLFault\">PPLFault exploit<\/a> which demonstrates the vulnerability by dumping the memory of an otherwise-protected PPL. We also released the GodFault exploit chain, which combines the PPLFault Admin-to-PPL exploit with the AngryOrchard PPL-to-kernel exploit to achieve full read\/write control of physical memory from user mode. We did this to motivate Microsoft to take action on a vulnerability that MSRC <a href=\"https:\/\/www.elastic.co\/security-labs\/forget-vulnerable-drivers-admin-is-all-you-need\">declined to fix<\/a> because it did not meet their <a href=\"https:\/\/www.microsoft.com\/en-us\/msrc\/windows-security-servicing-criteria\">servicing criteria<\/a>. Thankfully, the Windows Defender team at Microsoft stepped up, <a href=\"https:\/\/x.com\/GabrielLandau\/status\/1757818200127946922\">releasing a fix<\/a> in February 2024 that enforces dynamic page hashes for executable images loaded over network redirectors, breaking PPLFault.<\/p>\n<p>Above, we discussed Authenticode signatures embedded within PE files. In addition to embedded signatures, Windows supports a form of detached signature called a <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows-hardware\/drivers\/install\/catalog-files\">security catalog<\/a>. Security catalogs (.cat files) are essentially a list of signed authentihashes. Every PE with an authentihash in that list is considered to be signed by that signer. Windows keeps a large collection of catalog files in <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">C:\\Windows\\System32\\CatRoot<\/code> which CI loads, validates, and caches.<\/p>\n<figure><img alt=\"Simplified structure of a security catalog\" loading=\"lazy\" width=\"1499\" height=\"44\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage7.png&amp;w=1920&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage7.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage7.png&amp;w=3840&amp;q=90\"><figcaption>Simplified structure of a security catalog<\/figcaption><\/figure>\n<figure><img alt=\"A security catalog rendered through Windows Explorer\" loading=\"lazy\" width=\"810\" height=\"511\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage21.png&amp;w=828&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage21.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage21.png&amp;w=1920&amp;q=90\"><figcaption>A security catalog rendered through Windows Explorer<\/figcaption><\/figure>\n<p>A typical Windows system has over a thousand catalog files, many containing dozens or hundreds of authentihashes.<\/p>\n<figure><img alt=\"Security catalogs on a Windows 11 23H2 system\" loading=\"lazy\" width=\"1012\" height=\"502\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage16.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage16.png&amp;w=2048&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage16.png&amp;w=2048&amp;q=90\"><figcaption>Security catalogs on a Windows 11 23H2 system<\/figcaption><\/figure>\n<p>To use a security catalog, Code Integrity must first load it. This occurs in a few discrete steps. First, CI maps the file into kernel memory using <strong>ZwOpenFile<\/strong>, <strong>ZwCreateSection<\/strong>, and <strong>ZwMapViewOfSection<\/strong>. Once mapped, it validates the catalog\u2019s digital signature using <strong>CI!MinCrypK_VerifySignedDataKModeEx<\/strong>. If the signature is valid, it parses the hashes with <strong>CI!I_MapFileHashes<\/strong>.<\/p>\n<figure><img alt=\"The Code Integrity catalog parsing process\" loading=\"lazy\" width=\"1000\" height=\"402\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage10.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage10.png&amp;w=2048&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage10.png&amp;w=2048&amp;q=90\"><figcaption>The Code Integrity catalog parsing process<\/figcaption><\/figure>\n<p>Breaking this down, we see a few key insights. First, <strong>ZwCreateSection(SEC_COMMIT)<\/strong> tells us that CI is creating a data section, not an image section. This is important because there is no concept of page hashes for data sections.<\/p>\n<p>Next, the file is opened without <strong>FILE_SHARE_WRITE<\/strong>, meaning write sharing is denied. This is intended to prevent modification of the security catalog during processing. However, as we have shown above, this is a bad assumption and another example of False File Immutability. It should be possible, in theory, to perform a PPLFault-style attack on security catalog processing.<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"planning-the-attack\" class=\"absolute -top-32\"><\/span>Planning the attack<\/h2>\n<figure><img alt loading=\"lazy\" width=\"1794\" height=\"920\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage11.png&amp;w=1920&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage11.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage11.png&amp;w=3840&amp;q=90\"><\/figure>\n<p>The general flow of the attack is as follows:<\/p>\n<ol>\n<li>The attacker will plant a security catalog on a storage device that they control. They will install a symbolic link to this catalog in the <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">CatRoot<\/code> directory, so Windows knows where to find it.<\/li>\n<li>The attacker asks the kernel to load a malicious unsigned kernel driver.<\/li>\n<li>Code Integrity attempts to validate the driver, but it can\u2019t find a signature or trusted authentihash, so it re-scans the CatRoot directory and finds the attacker\u2019s new catalog.<\/li>\n<li>CI maps the catalog into kernel memory and validates its signature. This generates page faults which are sent to the attacker\u2019s storage device. The storage device returns a legitimate Microsoft-signed catalog.<\/li>\n<li>The attacker empties the system working set, forcing all the previously-fetched catalog pages to be discarded.<\/li>\n<li>CI begins parsing the catalog, generating new page faults. This time, the storage device injects the authentihash of their malicious driver.<\/li>\n<li>CI finds the malicious driver\u2019s authentihash in the catalog and loads the driver. At this point, the attacker has achieved arbitrary code execution in the kernel.<\/li>\n<\/ol>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"implementation-and-considerations\" class=\"absolute -top-32\"><\/span>Implementation and considerations<\/h2>\n<p>The plan is to use a PPLFault-style attack, but there are some important differences in this situation. PPLFault used an <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/fileio\/opportunistic-locks\">opportunistic lock<\/a> (oplock) to deterministically freeze the victim process\u2019s initialization. This gave the attacker time to switch over to the payload and flush the system working set. Unfortunately, we couldn\u2019t find any good opportunities for oplocks here. Instead, we\u2019re going to pursue a probabilistic approach: rapidly toggling the security catalog between the malicious and benign versions.<\/p>\n<figure><img alt=\"The catalog being toggled between benign and malicious versions; only one hash changes\" loading=\"lazy\" width=\"1051\" height=\"763\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage12.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage12.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage12.png&amp;w=3840&amp;q=90\"><figcaption>The catalog being toggled between benign and malicious versions; only one hash changes<\/figcaption><\/figure>\n<p>The verification step touches every page of the catalog, which means all of those pages will be resident in memory when parsing begins. If the attacker changes the catalog on their storage device, it won\u2019t be reflected in memory until after a subsequent page fault. To evict these pages from kernel memory, the attacker must empty the working set between <strong>MinCrypK_VerifySignedDataKModeEx<\/strong> and <strong>I_MapFileHashes<\/strong>.<\/p>\n<p>This approach is inherently a race condition. There\u2019s no built-in delays between signature verification and catalog parsing &#8211; it\u2019s a tight race. We\u2019ll need to employ several techniques to widen our window of opportunity.<\/p>\n<p>Most security catalogs on the system are small, a few kilobytes. By choosing a large 4MB catalog, we can greatly increase the amount of time that CI spends parsing. Assuming catalog parsing is linear, we can choose an authentihash near the end of the catalog to maximize the time between signature verification and when CI reaches our tampered page. Further, we will create threads for each CPU on the system whose sole purpose is to consume CPU cycles. These threads run at higher priority than CI, so CI will be starved of CPU time. There will be one thread dedicated to repeatedly flushing pages from the system\u2019s working set, and one thread repeatedly attempting to load the unsigned driver.<\/p>\n<p>This attack has two main failure modes. First, if the payload Authentihash is read during the signature check, then the signature will be invalid and the catalog will be rejected.<\/p>\n<figure><img alt=\"Code Integrity rejecting an tampered security catalog\" loading=\"lazy\" width=\"1495\" height=\"88\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage17.png&amp;w=1920&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage17.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage17.png&amp;w=3840&amp;q=90\"><figcaption>Code Integrity rejecting an tampered security catalog<\/figcaption><\/figure>\n<p>Next, if an even number of toggles occur (including zero) between signature validation and parsing, then CI will parse the benign hash and reject our driver.<\/p>\n<figure><img alt=\"Passing the signature check, but the benign catalog is parsed\" loading=\"lazy\" width=\"1113\" height=\"257\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage6.png&amp;w=1200&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage6.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage6.png&amp;w=3840&amp;q=90\"><figcaption>Passing the signature check, but the benign catalog is parsed<\/figcaption><\/figure>\n<p>The attacker wins if CI validates a benign catalog then parses a malicious one.<\/p>\n<figure><img alt=\"Code Integrity validating a benign catalog, then parsing a malicious one\" loading=\"lazy\" width=\"1112\" height=\"271\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage20.png&amp;w=1200&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage20.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage20.png&amp;w=3840&amp;q=90\"><figcaption>Code Integrity validating a benign catalog, then parsing a malicious one<\/figcaption><\/figure>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"exploit-demo\" class=\"absolute -top-32\"><\/span>Exploit demo<\/h2>\n<p>We named the exploit <strong>ItsNotASecurityBoundary<\/strong> as an homage to MSRC&#8217;s <a href=\"https:\/\/www.microsoft.com\/en-us\/msrc\/windows-security-servicing-criteria\">policy<\/a> that &#8220;Administrator-to-kernel is not a security boundary.\u201d The code is in GitHub <a href=\"https:\/\/github.com\/gabriellandau\/ItsNotASecurityBoundary\">here<\/a>.<\/p>\n<p>Demo video <a href=\"https:\/\/drive.google.com\/file\/d\/13Uw38ZrNeYwfoIuD76qlLgyXP8kRc8Nz\/view?usp=sharing\">here<\/a>.<\/p>\n<p>In order to properly defend against these vulnerabilities, we first need to understand them better.<\/p>\n<p>A double-read (aka double-fetch) vulnerability can occur when victim code reads the same value out of an attacker-controlled buffer more than once. The attacker may change the value of this buffer between the reads, resulting in unexpected victim behavior.<\/p>\n<p>Imagine there is a page of memory shared between two processes for an IPC mechanism. The client and server send data back and forth using the following struct. To send an IPC request, a client first writes a request struct into the shared memory page, then signals an event to notify the server of a pending request.<\/p>\n<pre><code>struct IPC_PACKET\n{ SIZE_T length; UCHAR data[];\n};<\/code><\/pre>\n<p>A double-read attack could look something like this:<\/p>\n<figure><img alt=\"An example of a double-read exploit using shared memory\" loading=\"lazy\" width=\"1137\" height=\"557\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage18.png&amp;w=1200&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage18.png&amp;w=3840&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage18.png&amp;w=3840&amp;q=90\"><figcaption>An example of a double-read exploit using shared memory<\/figcaption><\/figure>\n<p>First, the attacking client sets a packet\u2019s structure\u2019s length field to 16 bytes, then signals the server to indicate that a packet is ready for processing. The victim server wakes up and allocates a 16-byte buffer using <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">malloc(pPacket-&gt;length)<\/code>. Immediately afterwards, the victim changes the length field to 32. Next, the victim server attempts to copy the packet\u2019s contents into the the new buffer by calling <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">memcpy(pBuffer, pPacket-&gt;data, pPacket-&gt;length)<\/code>, re-reading the value in <code class=\"px-1.5 py-1 rounded not-prose bg-[var(--tw-prose-invert-pre-bg)] whitespace-break-spaces text-[85%] text-emerald-600\">pPacket-&gt;length<\/code>, which is now 32. The victim ends up copying 32 bytes into a 16-byte buffer, overflowing it.<\/p>\n<p>Double-read vulnerabilities frequently apply to shared-memory scenarios. They commonly occur in drivers that operate on user-writable buffers. Due to False File Immutability, developers need to be aware that their scope is actually much wider, and includes all files writable by attackers. Denying write sharing does not necessarily prevent file modification.<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"affected-operations\" class=\"absolute -top-32\"><\/span>Affected Operations<\/h2>\n<p>What types of operations are affected by False File Immutability?<\/p>\n<div class=\"table-container\">\n<table>\n<thead>\n<tr>\n<th>Operation<\/th>\n<th>API<\/th>\n<th>Mitigations<\/th>\n<\/tr>\n<\/thead>\n<tbody readability=\"4.5\">\n<tr readability=\"2\">\n<td>Image Sections<\/td>\n<td><strong>CreateProcess<\/strong> <strong>LoadLibrary<\/strong><\/td>\n<td>1. Enable Page Hashes<\/td>\n<\/tr>\n<tr readability=\"5\">\n<td>Data Sections<\/td>\n<td><strong>MapViewOfFile<\/strong> <strong>ZwMapViewOfSection<\/strong><\/td>\n<td>1. Avoid double reads\\ 2. Copy the file to a heap buffer before processing\\ 3. Prevent paging via MmProbeAndLockPages\/VirtualLock<\/td>\n<\/tr>\n<tr readability=\"2\">\n<td>Regular I\/O<\/td>\n<td><strong>ReadFile<\/strong> <strong>ZwReadFile<\/strong><\/td>\n<td>1. Avoid double reads\\ 2. Copy the file to a heap buffer before processing<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"what-else-could-be-vulnerable\" class=\"absolute -top-32\"><\/span>What else could be vulnerable?<\/h2>\n<p>Looking for potentially-vulnerable calls to <strong>ZwMapViewOfSection<\/strong> in the NT kernel yields quite a few interesting functions:<\/p>\n<figure><img alt=\"Potentially-vulnerable uses of ZwMapViewOfSection within the NT kernel\" loading=\"lazy\" width=\"710\" height=\"485\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage8.png&amp;w=750&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage8.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage8.png&amp;w=1920&amp;q=90\"><figcaption>Potentially-vulnerable uses of ZwMapViewOfSection within the NT kernel<\/figcaption><\/figure>\n<p>If we expand our search to regular file I\/O, we find even more candidates. An important caveat, however, is that <strong>ZwReadFile<\/strong> may be used for more than just files. Only uses on files (or those which could be coerced into operating on files) could be vulnerable.<\/p>\n<figure><img alt=\"Potentially-vulnerable uses of ZwReadFile within the NT kernel\" loading=\"lazy\" width=\"711\" height=\"520\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage14.png&amp;w=750&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage14.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage14.png&amp;w=1920&amp;q=90\"><figcaption>Potentially-vulnerable uses of ZwReadFile within the NT kernel<\/figcaption><\/figure>\n<p>Looking outside of the NT kernel, we can find other drivers to investigate:<\/p>\n<figure><img alt=\"Potentially-vulnerable uses of ZwReadFile in Windows 11 kernel drivers\" loading=\"lazy\" width=\"579\" height=\"606\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage2.png&amp;w=640&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage2.png&amp;w=1200&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage2.png&amp;w=1200&amp;q=90\"><figcaption>Potentially-vulnerable uses of ZwReadFile in Windows 11 kernel drivers<\/figcaption><\/figure>\n<figure><img alt=\"Potentially-vulnerable uses of ZwMapViewOfSection in Windows 11 kernel drivers\" loading=\"lazy\" width=\"651\" height=\"340\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage1.png&amp;w=750&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage1.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage1.png&amp;w=1920&amp;q=90\"><figcaption>Potentially-vulnerable uses of ZwMapViewOfSection in Windows 11 kernel drivers<\/figcaption><\/figure>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"dont-forget-about-user-mode\" class=\"absolute -top-32\"><\/span>Don\u2019t forget about user mode<\/h2>\n<p>We\u2019ve mostly been discussing the kernel up to this point, but it\u2019s important to note that any user mode application that calls <strong>ReadFile<\/strong>, <strong>MapViewOfFile<\/strong>, or <strong>LoadLibrary<\/strong> on an attacker-controllable file, denying write sharing for immutability, may be vulnerable. Here\u2019s a few hypothetical examples.<\/p>\n<h3 class=\"font-bold leading-tight text-xl md:text-3xl relative\"><span id=\"mapviewoffile\" class=\"absolute -top-32\"><\/span>MapViewOfFile<\/h3>\n<p>Imagine an application that is split into two components &#8211; a low-privileged worker process with network access, and a privileged service that installs updates. The worker downloads updates and stages them to a specific folder. When the privileged service sees a new update staged, it first validates the signature before installing the update. An attacker could abuse FFI to modify the update after the signature check.<\/p>\n<h3 class=\"font-bold leading-tight text-xl md:text-3xl relative\"><span id=\"readfile\" class=\"absolute -top-32\"><\/span>ReadFile<\/h3>\n<p>Since files are subject to double-read vulnerabilities, anything that parses complex file formats may be vulnerable, including antivirus engines and search indexers.<\/p>\n<h3 class=\"font-bold leading-tight text-xl md:text-3xl relative\"><span id=\"loadlibrary\" class=\"absolute -top-32\"><\/span>LoadLibrary<\/h3>\n<p>Some applications rely on UMCI to prevent attackers from loading malicious DLLs into their processes. As we\u2019ve shown with PPLFault, FFI can defeat UMCI.<\/p>\n<p>Per their official servicing guidelines, MSRC won\u2019t service Admin -&gt; Kernel vulnerabilities by default. In this parlance, servicing means \u201cfix via security update.\u201d This type of vulnerability, however, allows malware to bypass <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/services\/protecting-anti-malware-services-\">AV Process Protections<\/a>, leaving AV and EDR vulnerable to instant-kill attacks.<\/p>\n<p>As a third-party, we can\u2019t patch Code Integrity, so what can we do to protect our customers? To mitigate <strong>ItsNotASecurityBoundary<\/strong>, we created <strong>FineButWeCanStillEasilyStopIt<\/strong>, a filesystem minifilter driver that prevents Code Integrity from opening security catalogs over network redirectors. You can find it on GitHub <a href=\"https:\/\/github.com\/gabriellandau\/ItsNotASecurityBoundary\/tree\/main\/FineButWeCanStillEasilyStopIt\">here<\/a>.<\/p>\n<p>FineButWeCanStillEasilyStopIt has to jump through some hoops to correctly identify the problematic behavior while minimizing false positives. Ideally, CI itself could be fixed with a few small changes. Let\u2019s look at what that would take.<\/p>\n<figure><img alt=\"Fixing catalog processing by copying the catalog to the heap\" loading=\"lazy\" width=\"1000\" height=\"494\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage13.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage13.png&amp;w=2048&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage13.png&amp;w=2048&amp;q=90\"><figcaption>Fixing catalog processing by copying the catalog to the heap<\/figcaption><\/figure>\n<p>As mentioned above in the Affected Operations section, applications can mitigate double-read vulnerabilities by copying the file contents out of the file mapping into the heap, and exclusively using that heap copy for all subsequent operations. The kernel heap is called the <a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/memory\/memory-pools\">pool<\/a>, and the corresponding allocation function is <strong>ExAllocatePool<\/strong>.<\/p>\n<figure><img alt=\"Fixing catalog processing by locking the pages into RAM\" loading=\"lazy\" width=\"1000\" height=\"493\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage15.png&amp;w=1080&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage15.png&amp;w=2048&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage15.png&amp;w=2048&amp;q=90\"><figcaption>Fixing catalog processing by locking the pages into RAM<\/figcaption><\/figure>\n<p>An alternative mitigation strategy to break these types of exploits is to pin the pages of the file mapping into physical memory using an API such as <strong>MmProbeAndLockPages<\/strong>. This prevents eviction of those pages when the attacker empties the working set.<\/p>\n<h2 class=\"font-bold text-2xl md:text-4xl relative\"><span id=\"end-user-detection-and-mitigation\" class=\"absolute -top-32\"><\/span>End-user detection and mitigation<\/h2>\n<p>Fortunately, there is a way for end-users to mitigate this exploit without changes from Microsoft \u2013 Hypervisor Protected Code Integrity (HVCI). If HVCI is enabled, CI.dll doesn\u2019t do catalog parsing at all. Instead, it sends the catalog contents to the Secure Kernel, which runs in a separate virtual machine on the same host. The Secure Kernel stores the received catalog contents in its own heap, from which signature validation and parsing are performed. Just like with the <strong>ExAllocatePool<\/strong> mitigation described above, the exploit is mitigated because file changes have no effect on the heap copy.<\/p>\n<p>The probabilistic nature of this attack means that there are likely many failed attempts. Windows records these failures in the <strong>Microsoft-Windows-CodeIntegrity\/Operational<\/strong> event log. Users can check this log for evidence of exploitation.<\/p>\n<figure><img alt=\"Microsoft-Windows-CodeIntegrity\/Operational event log showing an invalid driver signature\" loading=\"lazy\" width=\"626\" height=\"438\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage23.png&amp;w=640&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage23.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage23.png&amp;w=1920&amp;q=90\"><figcaption>Microsoft-Windows-CodeIntegrity\/Operational event log showing an invalid driver signature<\/figcaption><\/figure>\n<figure><img alt=\"Microsoft-Windows-CodeIntegrity\/Operational event log showing an invalid security catalog\" loading=\"lazy\" width=\"626\" height=\"438\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage4.png&amp;w=640&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage4.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage4.png&amp;w=1920&amp;q=90\"><figcaption>Microsoft-Windows-CodeIntegrity\/Operational event log showing an invalid security catalog<\/figcaption><\/figure>\n<p>The disclosure timeline is as follows:<\/p>\n<ul>\n<li>2024-02-14: We reported ItsNotASecurityBoundary and FineButWeCanStillEasilyStopIt to MSRC as VULN-119340, suggesting <strong>ExAllocatePool<\/strong> and <strong>MmProbeAndLockPages<\/strong> as simple low-risk fixes<\/li>\n<li>2024-02-29: The Windows Defender team reached out to coordinate disclosure<\/li>\n<li>2024-04-23: Microsoft releases <a href=\"https:\/\/support.microsoft.com\/en-us\/topic\/april-23-2024-kb5036980-os-builds-22621-3527-and-22631-3527-preview-5a0d6c49-e42e-4eb4-8541-33a7139281ed\">KB5036980<\/a> Preview with the <strong>MmProbeAndLockPages<\/strong> fix<\/li>\n<li>2024-05-14: Fix reaches GA for Windows 11 23H2 as <a href=\"https:\/\/support.microsoft.com\/en-us\/topic\/may-14-2024-kb5037771-os-builds-22621-3593-and-22631-3593-e633ff2f-a021-4abb-bd2e-7f3687f166fe\">KB5037771<\/a>; we have not tested any other platforms (Win10, Server, etc).<\/li>\n<li>2024-06-14: MSRC closed the case, stating &#8220;We have completed our investigation and determined that the case doesn&#8217;t meet our bar for servicing at this time. As a result, we have opened a next-version candidate bug for the issue, and it will be evaluated for upcoming releases. Thanks, again, for sharing this report with us.&#8221;<\/li>\n<\/ul>\n<p>Looking at the original implementation of <strong>CI!I_MapAndSizeDataFile<\/strong>, we can see the legacy code calling <strong>ZwCreateSection<\/strong> and <strong>ZwMapViewOfSection<\/strong>:<\/p>\n<figure><img alt=\"The vulnerable CI!I_MapAndSizeDataFile implementation\" loading=\"lazy\" width=\"682\" height=\"556\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage22.png&amp;w=750&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage22.png&amp;w=1920&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage22.png&amp;w=1920&amp;q=90\"><figcaption>The vulnerable CI!I_MapAndSizeDataFile implementation<\/figcaption><\/figure>\n<p>Contrast that with the new <strong>CI!CipMapAndSizeDataFileWithMDL<\/strong>, which follows that up with <strong>MmProbeAndLockPages<\/strong>:<\/p>\n<figure><img alt=\"The new CI!CipMapAndSizeDataFileWithMDL has a mitigation\" loading=\"lazy\" width=\"394\" height=\"501\" decoding=\"async\" data-nimg=\"1\" class=\"cursor-zoom-in\" srcset=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage3.png&amp;w=640&amp;q=90 1x, https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage3.png&amp;w=828&amp;q=90 2x\" src=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage3.png&amp;w=828&amp;q=90\"><figcaption>The new CI!CipMapAndSizeDataFileWithMDL has a mitigation<\/figcaption><\/figure>\n<p>Today we discussed and named a bug class: <strong>False File Immutability<\/strong>. We are aware of two public exploits that leverage it, PPLFault and ItsNotASecurityBoundary.<\/p>\n<p><a href=\"https:\/\/github.com\/gabriellandau\/PPLFault\">PPLFault<\/a>: Admin -&gt; PPL [-&gt; Kernel via GodFault]<\/p>\n<ul>\n<li>Exploits bad immutability assumptions about image section in CI\/MM<\/li>\n<li>Reported September 2022<\/li>\n<li>Patched February 2024 (~510 days later)<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/gabriellandau\/ItsNotASecurityBoundary\">ItsNotASecurityBoundary<\/a>: Admin -&gt; Kernel<\/p>\n<ul>\n<li>Exploits bad immutability assumptions about data sections in CI<\/li>\n<li>Reported February 2024<\/li>\n<li>Patched May 2024 (~90 days later)<\/li>\n<\/ul>\n<p>If you are writing Windows code that operates on files, you need to be aware of the fact these files may be modified while you are working on them, even if you deny write sharing. See the Affected Operations section above for guidance on how to protect yourselves and your customers against these types of attacks.<\/p>\n<p>ItsNotASecurityBoundary is not the end of FFI. There are other exploitable FFI vulnerabilities out there. My colleagues and I at Elastic Security Labs will continue exploring and reporting on FFI and beyond. We encourage you to follow along on X <a href=\"https:\/\/x.com\/GabrielLandau\">@GabrielLandau<\/a> and <a href=\"https:\/\/x.com\/elasticseclabs\">@ElasticSecLabs<\/a>.<\/p>\n<p>READ MORE <a href=\"https:\/\/packetstormsecurity.com\/news\/view\/36095\/Introducing-A-New-Vulnerability-Class-False-File-Immutability.html\">HERE<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>READ MORE HERE&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[60],"tags":[235],"class_list":["post-56544","post","type-post","status-publish","format-standard","hentry","category-packet-storm","tag-headlinemicrosoftflaw"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News<\/title>\n<meta name=\"description\" content=\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security &amp; Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News\" \/>\n<meta property=\"og:description\" content=\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security &amp; Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/\" \/>\n<meta property=\"og:site_name\" content=\"ThreatsHub Cybersecurity News\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-11T18:37:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\" \/>\n<meta name=\"author\" content=\"TH Author\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@threatshub\" \/>\n<meta name=\"twitter:site\" content=\"@threatshub\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"TH Author\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/\"},\"author\":{\"name\":\"TH Author\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/person\\\/12e0a8671ff89a863584f193e7062476\"},\"headline\":\"Introducing A New Vulnerability Class: False File Immutability\",\"datePublished\":\"2024-07-11T18:37:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/\"},\"wordCount\":4509,\"publisher\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.elastic.co\\\/security-labs\\\/_next\\\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\",\"keywords\":[\"headline,microsoft,flaw\"],\"articleSection\":[\"Packet Storm\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/\",\"name\":\"Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.elastic.co\\\/security-labs\\\/_next\\\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\",\"datePublished\":\"2024-07-11T18:37:01+00:00\",\"description\":\"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.elastic.co\\\/security-labs\\\/_next\\\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\",\"contentUrl\":\"https:\\\/\\\/www.elastic.co\\\/security-labs\\\/_next\\\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/introducing-a-new-vulnerability-class-false-file-immutability\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"headline,microsoft,flaw\",\"item\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/tag\\\/headlinemicrosoftflaw\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Introducing A New Vulnerability Class: False File Immutability\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\",\"name\":\"ThreatsHub Cybersecurity News\",\"description\":\"%%focuskw%% Threat Intel \u2013 Threat Intel Services \u2013 CyberIntelligence \u2013 Cyber Threat Intelligence - Threat Intelligence Feeds - Threat Intelligence Reports - CyberSecurity Report \u2013 Cyber Security PDF \u2013 Cybersecurity Trends - Cloud Sandbox \u2013- Threat IntelligencePortal \u2013 Incident Response \u2013 Threat Hunting \u2013 IOC - Yara - Security Operations Center \u2013 SecurityOperation Center \u2013 Security SOC \u2013 SOC Services - Advanced Threat - Threat Detection - TargetedAttack \u2013 APT \u2013 Anti-APT \u2013 Advanced Protection \u2013 Cyber Security Services \u2013 Cybersecurity Services -Threat Intelligence Platform\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\"},\"alternateName\":\"Threatshub.org\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#organization\",\"name\":\"ThreatsHub.org\",\"alternateName\":\"Threatshub.org\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Threatshub_Favicon1.jpg\",\"contentUrl\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/05\\\/Threatshub_Favicon1.jpg\",\"width\":432,\"height\":435,\"caption\":\"ThreatsHub.org\"},\"image\":{\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/threatshub\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.threatshub.org\\\/blog\\\/#\\\/schema\\\/person\\\/12e0a8671ff89a863584f193e7062476\",\"name\":\"TH Author\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g\",\"caption\":\"TH Author\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News","description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/","og_locale":"en_US","og_type":"article","og_title":"Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News","og_description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","og_url":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/","og_site_name":"ThreatsHub Cybersecurity News","article_published_time":"2024-07-11T18:37:01+00:00","og_image":[{"url":"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90","type":"","width":"","height":""}],"author":"TH Author","twitter_card":"summary_large_image","twitter_creator":"@threatshub","twitter_site":"@threatshub","twitter_misc":{"Written by":"TH Author","Est. reading time":"24 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#article","isPartOf":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/"},"author":{"name":"TH Author","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/person\/12e0a8671ff89a863584f193e7062476"},"headline":"Introducing A New Vulnerability Class: False File Immutability","datePublished":"2024-07-11T18:37:01+00:00","mainEntityOfPage":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/"},"wordCount":4509,"publisher":{"@id":"https:\/\/www.threatshub.org\/blog\/#organization"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90","keywords":["headline,microsoft,flaw"],"articleSection":["Packet Storm"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/","url":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/","name":"Introducing A New Vulnerability Class: False File Immutability 2026 | ThreatsHub Cybersecurity News","isPartOf":{"@id":"https:\/\/www.threatshub.org\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#primaryimage"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#primaryimage"},"thumbnailUrl":"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90","datePublished":"2024-07-11T18:37:01+00:00","description":"ThreatsHub Cybersecurity News | ThreatsHub.org | Cloud Security & Cyber Threats Analysis Hub. 100% Free OSINT Threat Intelligent and Cybersecurity News.","breadcrumb":{"@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#primaryimage","url":"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90","contentUrl":"https:\/\/www.elastic.co\/security-labs\/_next\/image?url=%2Fsecurity-labs%2Fassets%2Fimages%2Ffalse-file-immutability%2Fimage9.png&amp;w=3840&amp;q=90"},{"@type":"BreadcrumbList","@id":"https:\/\/www.threatshub.org\/blog\/introducing-a-new-vulnerability-class-false-file-immutability\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.threatshub.org\/blog\/"},{"@type":"ListItem","position":2,"name":"headline,microsoft,flaw","item":"https:\/\/www.threatshub.org\/blog\/tag\/headlinemicrosoftflaw\/"},{"@type":"ListItem","position":3,"name":"Introducing A New Vulnerability Class: False File Immutability"}]},{"@type":"WebSite","@id":"https:\/\/www.threatshub.org\/blog\/#website","url":"https:\/\/www.threatshub.org\/blog\/","name":"ThreatsHub Cybersecurity News","description":"%%focuskw%% Threat Intel \u2013 Threat Intel Services \u2013 CyberIntelligence \u2013 Cyber Threat Intelligence - Threat Intelligence Feeds - Threat Intelligence Reports - CyberSecurity Report \u2013 Cyber Security PDF \u2013 Cybersecurity Trends - Cloud Sandbox \u2013- Threat IntelligencePortal \u2013 Incident Response \u2013 Threat Hunting \u2013 IOC - Yara - Security Operations Center \u2013 SecurityOperation Center \u2013 Security SOC \u2013 SOC Services - Advanced Threat - Threat Detection - TargetedAttack \u2013 APT \u2013 Anti-APT \u2013 Advanced Protection \u2013 Cyber Security Services \u2013 Cybersecurity Services -Threat Intelligence Platform","publisher":{"@id":"https:\/\/www.threatshub.org\/blog\/#organization"},"alternateName":"Threatshub.org","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.threatshub.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.threatshub.org\/blog\/#organization","name":"ThreatsHub.org","alternateName":"Threatshub.org","url":"https:\/\/www.threatshub.org\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2025\/05\/Threatshub_Favicon1.jpg","contentUrl":"https:\/\/www.threatshub.org\/blog\/coredata\/uploads\/2025\/05\/Threatshub_Favicon1.jpg","width":432,"height":435,"caption":"ThreatsHub.org"},"image":{"@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/threatshub"]},{"@type":"Person","@id":"https:\/\/www.threatshub.org\/blog\/#\/schema\/person\/12e0a8671ff89a863584f193e7062476","name":"TH Author","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/066276f086d5155df79c850206a779ad368418a844da0182ce43f9cd5b506c3d?s=96&d=mm&r=g","caption":"TH Author"}}]}},"_links":{"self":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts\/56544","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/comments?post=56544"}],"version-history":[{"count":0,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/posts\/56544\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/media?parent=56544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/categories?post=56544"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.threatshub.org\/blog\/wp-json\/wp\/v2\/tags?post=56544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}