<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Parag Mali - tag: bitlocker</title><description>Posts tagged bitlocker.</description><link>https://paragmali.com/</link><language>en-US</language><lastBuildDate>Thu, 18 Jun 2026 02:11:07 GMT</lastBuildDate><atom:link href="https://paragmali.com/tags/bitlocker/rss.xml" rel="self" type="application/rss+xml"/><item><title>Beyond BitLocker: The Three File-Level Encryption Layers Microsoft Hides in Plain Sight</title><link>https://paragmali.com/blog/beyond-bitlocker-the-three-file-level-encryption-layers-micr/</link><guid isPermaLink="true">https://paragmali.com/blog/beyond-bitlocker-the-three-file-level-encryption-layers-micr/</guid><description>BitLocker is one layer of four. EFS, Personal Data Encryption, and Purview sensitivity labels close gaps BitLocker structurally cannot -- three roots, three threat models, by design.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><content:encoded>
**&quot;BitLocker is on&quot; is a misleading shorthand.** BitLocker encrypts the volume, but the volume is decrypted to the running OS the moment the TPM unseals -- which happens before any human authenticates. Three above-BitLocker layers close different gaps: the Encrypting File System (legacy per-user per-file, sealed by classic DPAPI), Personal Data Encryption (Hello-bound per-file, released through DPAPI-NG), and Microsoft Purview sensitivity labels (envelope encryption via Azure Rights Management, travels with the file across tenants). Three layers, three protection-key roots, three threat models -- by design, not by accident.
&lt;h2&gt;1. &quot;BitLocker Is On&quot;&lt;/h2&gt;
&lt;p&gt;A Windows 11 laptop sits on a desk at the user&apos;s lock screen. TPM-only &lt;a href=&quot;https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/&quot; rel=&quot;noopener&quot;&gt;BitLocker&lt;/a&gt;, secure boot clean, automatic login disabled. The owner stepped away to take a call.&lt;/p&gt;
&lt;p&gt;An attacker with physical access boots it normally. The &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM&lt;/a&gt; unseals the volume master key against PCR[7] and PCR[11].Microsoft Learn states the Secure Boot anchor verbatim: &lt;em&gt;&quot;By default, BitLocker provides integrity protection for Secure Boot by utilizing the TPM PCR[7] measurement&quot;&lt;/em&gt; [@ms-bitlocker-countermeasures]. PCR[11] is widely documented in TCG-aware BitLocker references as the boot-manager / BitLocker access-control measurement; the cited Wikipedia BitLocker article confirms TPM-PCR sealing in general terms [@wikipedia-bitlocker]. The point that matters is that TPM-only BitLocker seals against a subset of platform-state PCRs, and the unseal happens automatically when the boot chain has not been tampered with. NTFS mounts. The login prompt appears. The attacker now stands in front of a fully decrypted volume without having authenticated as any user.&lt;/p&gt;
&lt;p&gt;What is, and what is not, still protected at this exact instant?&lt;/p&gt;
&lt;p&gt;The expected reaction is &lt;em&gt;&quot;the data on disk is plaintext to whoever can read the running kernel; isn&apos;t that the whole point of why people add a PIN to BitLocker?&quot;&lt;/em&gt; That reaction is half right. The volume is plaintext, yes. But not every file on it is readable.&lt;/p&gt;
&lt;p&gt;Files marked with the EFS attribute are still encrypted. Files inside a Personal Data Encryption (PDE) protected folder are still encrypted. A DOCX labelled &quot;Confidential - All Employees&quot; by a Purview sensitivity label is still encrypted. Three different cryptographic mechanisms, three different protection-key roots, three different reasons the attacker is staring at ciphertext while the volume is mounted.&lt;/p&gt;
&lt;p&gt;This is the gap the rest of the article walks. It is the gap most security architects know exists in the abstract -- &quot;BitLocker is on&quot; does not mean &quot;every file is locked&quot; -- and which most do not know is closed by three structurally distinct technologies that have been hiding in plain sight since 2000.&lt;/p&gt;

Adding a pre-boot PIN closes part of this gap by requiring user input before the TPM releases the volume master key. That is genuinely useful. But TPM+PIN does not give per-user isolation on a shared device -- everyone with the PIN sees everyone else&apos;s files. It does not travel with the file when that file is emailed, copied to OneDrive, or saved on a USB stick. And it does not bind the on-disk key to any particular human identity. Pre-boot authentication and above-volume encryption solve different problems. The three layers in this article sit *on top* of TPM+PIN BitLocker, not in place of it.
&lt;p&gt;Three layers, three reasons, three different roots, three different attack surfaces. That is the article.&lt;/p&gt;

sequenceDiagram
    participant Hardware as TPM and PCRs
    participant Boot as Boot Manager
    participant OS as Windows Kernel
    participant User as Human at Keyboard
    Hardware-&amp;gt;&amp;gt;Boot: PCR[7], PCR[11] match
    Boot-&amp;gt;&amp;gt;OS: VMK released, NTFS mounts
    OS-&amp;gt;&amp;gt;OS: Volume now plaintext to kernel
    OS-&amp;gt;&amp;gt;User: Lock screen presented
    Note over OS,User: Attacker stands here, with a plaintext volume and no authenticated user
    User--&amp;gt;&amp;gt;OS: Hello PIN or biometric (eventually)
    OS-&amp;gt;&amp;gt;OS: Per-user secrets unseal
&lt;h2&gt;2. Historical Origins: Windows 2000 and the Birth of EFS&lt;/h2&gt;
&lt;p&gt;It is 1999. Laptops are appearing on every executive&apos;s desk. Theft is rising. The only protection NTFS offers against an attacker who walks off with a machine is the access control list, and the ACL is checked by the kernel of the operating system that mounted the disk. Boot a different operating system off floppy or CD, mount the NTFS volume as a foreign filesystem, and the ACL is just metadata to be ignored. The cryptographic protection of the data is exactly nothing.&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s NTFS team responded by adding the first cryptographic primitive to the filesystem itself. Windows 2000 reached general availability on February 17, 2000 (after a December 15, 1999 release-to-manufacturing milestone) and shipped the Encrypting File System -- EFS [@wikipedia-windows2000]. The mechanism is documented in the 1999 Microsoft technical paper &lt;em&gt;Encrypting File System for Windows 2000&lt;/em&gt; [@efs-1999-paper].The original Microsoft Research URL for this paper now returns HTTP 404. A binary PDF mirror is preserved at cypherspace.org, but the PDF is image-streamed and the body text is not retrievable for direct quotation. The Microsoft author list could not be verified against the primary text, so this article cites the paper anonymously. The Microsoft Learn EFS Win32 reference, still on the docs site today, states the design plainly: &lt;em&gt;&quot;The Encrypted File System (EFS) provides an additional level of security for files and directories. It provides cryptographic protection of individual files on NTFS file system volumes using a public-key system&quot;&lt;/em&gt; [@ms-efs-win32].&lt;/p&gt;
&lt;p&gt;That sentence carries three design choices the rest of EFS hangs from. &lt;em&gt;File-level&lt;/em&gt;, not volume-level. &lt;em&gt;NTFS attribute&lt;/em&gt;, not separate database. &lt;em&gt;Public-key system&lt;/em&gt;, not symmetric password. Each of those choices was deliberate. Each fixes a problem the architects of NTFS in 1999 actively worried about.&lt;/p&gt;
&lt;p&gt;The file-level choice answered the &quot;what if BitLocker is on&quot; question seventeen years before BitLocker existed. NTFS already protected files at the access-control layer; what the team wanted was a way to make a particular file unreadable to a different user account on the same machine, not just to a foreign operating system. Volume encryption could not do that. The volume is one thing; users are many. So encryption belonged on the file.&lt;/p&gt;
&lt;p&gt;The NTFS-attribute choice answered the integration question. EFS encryption lives in a named stream attached to the file, &lt;code&gt;$EFS&lt;/code&gt;. The Windows API surface stays the same: &lt;code&gt;CreateFile&lt;/code&gt;, &lt;code&gt;ReadFile&lt;/code&gt;, &lt;code&gt;WriteFile&lt;/code&gt;, &lt;code&gt;CopyFile&lt;/code&gt; all work transparently against an encrypted file when called by an authorised user. Microsoft Learn is explicit about how the integration works: &lt;em&gt;&quot;When the source file is encrypted, CopyFile and CopyFileEx rely on the EFS service (hosted in lsass.exe) to create the target file and apply keys used in encryption of the source file&quot;&lt;/em&gt; [@ms-efs-win32]. Encryption was made invisible to existing applications. That was the only way a 1999 enterprise was going to deploy it.&lt;/p&gt;
&lt;p&gt;The public-key choice answered the recovery question. Public-key crypto lets the file have multiple wrappers around the same symmetric content key -- one for the user, one or more for designated recovery agents. An organisation that lost the user&apos;s private key (employee leaves, password forgotten, hard drive moved to a different machine) could still recover the file using a recovery agent the IT team controlled. The first Microsoft response to &lt;em&gt;&quot;what happens when a user forgets their password?&quot;&lt;/em&gt; was Group-Policy-enforced Data Recovery Agents (DRAs) [@wikipedia-efs]. In Windows 2000, the default DRA was the local Administrator account. From day one, EFS encryption was meant to be reversible by &lt;em&gt;someone&lt;/em&gt; other than the file owner.&lt;/p&gt;
&lt;p&gt;EFS is on the disk now. So what does the encrypted file actually look like? What does NTFS store, and where does the key live?&lt;/p&gt;
&lt;h2&gt;3. How EFS Works -- And Why It Was Always Per-User&lt;/h2&gt;
&lt;p&gt;The EFS key chain is the most important diagram in this article. Read it once carefully; every limitation of EFS that practitioners hit in production drops mechanically out of these arrows.&lt;/p&gt;

flowchart TD
    Plain[Plaintext file] --&amp;gt;|AES with FEK| Cipher[Ciphertext on NTFS]
    FEK[Per-file FEK, symmetric] --&amp;gt;|RSA-wrap| W1[Wrapper for user public key]
    FEK --&amp;gt;|RSA-wrap| W2[Wrapper for DRA public key]
    W1 --&amp;gt; EFSAttr[EFS named stream on the file]
    W2 --&amp;gt; EFSAttr
    UserPriv[User EFS RSA private key] --&amp;gt;|stored in| Profile[APPDATA Microsoft Crypto RSA SID directory]
    Profile --&amp;gt;|sealed by| ClassicDPAPI[classic DPAPI master key]
    ClassicDPAPI --&amp;gt;|derived from| Logon[User logon secret, NTLM hash plus salt]
&lt;p&gt;The chain has four layers. The bottom layer is the file contents themselves, encrypted with a freshly generated symmetric key called the File Encryption Key.&lt;/p&gt;

A per-file symmetric key, generated at the moment a file is first encrypted, used to encrypt the file body. Wikipedia summarises the design: *&quot;EFS works by encrypting a file with a bulk symmetric key, also known as the File Encryption Key, or FEK&quot;* [@wikipedia-efs]. The FEK never leaves the file system in plaintext; it is RSA-wrapped to every authorised principal before being stored in the file&apos;s `$EFS` attribute.
&lt;p&gt;The FEK is symmetric for performance: AES on the file body, not RSA. The Wikipedia EFS article notes that &lt;em&gt;&quot;the FEK (the symmetric key that is used to encrypt the file) is then encrypted with a public key that is associated with the user who encrypted the file, and this encrypted FEK is stored in the &lt;code&gt;$EFS&lt;/code&gt; alternative data stream of the encrypted file&quot;&lt;/em&gt; [@wikipedia-efs]. The same paragraph adds the second wrapper, the one without which enterprise EFS deployments would not work.&lt;/p&gt;

A second principal whose public key is RSA-wrapped around the FEK at encryption time, so that the recovery agent can decrypt the file even if the owning user is unavailable. Wikipedia notes that *&quot;In Windows 2000, the local administrator is the default Data Recovery Agent, capable of decrypting all files encrypted with EFS by any local user&quot;* [@wikipedia-efs]. Group Policy still ships DRA configuration in modern Windows.
&lt;p&gt;The cipher inside the FEK has not been static. EFS shipped with one default cipher in Windows 2000 and has moved several times since; the precise Windows 2000 default is disputed across secondary sources. Rather than commit to a version we cannot verify, this article notes that the FEK cipher has changed across releases. AES has been the default since Windows XP SP1 [@wikipedia-efs]; a later Windows 10 release moved the default key size from AES-128 to AES-256.Microsoft Group Policy / FIPS-compliance guidance documents the AES-128 to AES-256 default-key-size change at Windows 10 1709, but the cited Wikipedia EFS article&apos;s algorithm table lists only &quot;AES&quot; without a specific key size, so this article hedges on the exact version while keeping the AES-since-XP-SP1 anchor verbatim from Wikipedia.&lt;/p&gt;
&lt;p&gt;Now look at the top of the chain. The user&apos;s EFS RSA &lt;em&gt;private&lt;/em&gt; key sits in the user&apos;s roaming profile, in the path &lt;code&gt;%APPDATA%\Microsoft\Crypto\RSA\&amp;lt;SID&amp;gt;\&lt;/code&gt;.This same directory is where &lt;code&gt;cipher.exe /R&lt;/code&gt; writes self-signed DRA certificates and where &lt;code&gt;cipher.exe /K&lt;/code&gt; writes the user&apos;s own EFS keypair if one does not yet exist. Operational confusion lives here, because the same directory holds both per-user EFS keypairs and any recovery-agent certificates the user has imported. The private key is not stored in the clear. It is sealed by &lt;a href=&quot;https://paragmali.com/blog/dpapi-and-dpapi-ng-the-credential-vault-under-everything/&quot; rel=&quot;noopener&quot;&gt;classic Data Protection API (DPAPI)&lt;/a&gt;, Microsoft&apos;s per-user key-derivation system that wraps user-scoped secrets with a master key derived from the user&apos;s logon credential.&lt;/p&gt;

*Classic DPAPI* is the original Windows Data Protection API. Microsoft Learn describes the original pair: *&quot;Microsoft introduced the data protection application programming interface (DPAPI) in Windows. The API consists of two functions, CryptProtectData and CryptUnprotectData.&quot;* [@ms-dpapi-ng] It is per-user and per-machine: the master key is derived from the user&apos;s logon secret, so decrypting works only when the user is logged on locally. *DPAPI-NG* (Data Protection API &quot;Next Generation&quot;) was added in Windows 8 to extend the same idea to cloud scenarios where content encrypted on one machine must be decrypted on another, or where the unwrap should require a specific authentication factor. Microsoft Learn states the motivation: *&quot;Cloud computing, however, often requires that content encrypted on one computer be decrypted on another. Therefore, beginning with Windows 8, Microsoft extended the idea of using a relatively ... API to encompass cloud scenarios.&quot;* [@ms-dpapi-ng] EFS uses classic DPAPI. PDE, as we will see, uses DPAPI-NG.
&lt;p&gt;Wikipedia&apos;s EFS article states the consequence in one terse sentence: &lt;em&gt;&quot;In Windows 2000, XP or later, the user&apos;s RSA private key is encrypted using a hash of the user&apos;s NTLM password hash plus the user name ... any compromise of the user&apos;s password automatically leads to access to that data&quot;&lt;/em&gt; [@wikipedia-efs]. The cryptographic identity of the file&apos;s owner &lt;em&gt;is&lt;/em&gt; the user&apos;s logon credential, by construction.&lt;/p&gt;
&lt;p&gt;That is the design. Now mechanically derive the consequences.&lt;/p&gt;
&lt;h3&gt;Per-user, not per-process&lt;/h3&gt;
&lt;p&gt;The unwrapping principal of the EFS chain is the user SID. There is no place in the chain where an application identity could insert itself as a separate consumer. If you log on as Alice, every process running as Alice can ask the EFS service in &lt;code&gt;lsass.exe&lt;/code&gt; to unwrap any file Alice owns. The EFS service is a single user-mode endpoint; it does not gate on the calling process.&lt;/p&gt;
&lt;p&gt;Contrast this with &lt;a href=&quot;https://paragmali.com/blog/the-empty-hash-credential-guard-the-lsaiso-trustlet-and-the-/&quot; rel=&quot;noopener&quot;&gt;Credential Guard&lt;/a&gt; and the LSAIso enclave, which deliberately move secret material into a Virtualization-Based Security enclave that even a kernel-mode caller in the host VTL cannot read. EFS is per-user; LSAIso is per-process-with-attestation. Different threat models, different mechanics.Credential Guard&apos;s LSAIso isolation is the kernel-mode equivalent of &quot;the application sees plaintext only if the application is the right application.&quot; EFS predates this design vocabulary by a decade and a half; its arrows simply do not include an application-identity step.&lt;/p&gt;
&lt;h3&gt;Password reset destroys access&lt;/h3&gt;
&lt;p&gt;If the only thing protecting the user&apos;s EFS RSA private key is classic DPAPI keyed off the user&apos;s password, then anything that breaks the user-password-to-master-key derivation also breaks the user&apos;s access to every EFS-encrypted file they own. Resetting a user&apos;s password from a domain administrator account does exactly this. Wikipedia warns in plain terms: &lt;em&gt;&quot;any compromise of the user&apos;s password automatically leads to access to that data&quot;&lt;/em&gt; [@wikipedia-efs] -- which is the same statement read the other way. Lose the password, lose the data. The DRA exists precisely so that the &lt;em&gt;organisation&lt;/em&gt; still has access; the user, however, is locked out.&lt;/p&gt;
&lt;h3&gt;Decryption on cross-volume or cross-protocol copy&lt;/h3&gt;
&lt;p&gt;EFS is bound to NTFS. When a file is copied to a different filesystem -- FAT32, exFAT, or pre-24H2 ReFS -- the destination cannot store the &lt;code&gt;$EFS&lt;/code&gt; stream, and the file is decrypted in transit. Wikipedia again: &lt;em&gt;&quot;Files and folders are decrypted before being copied to a volume formatted with another file system, like FAT32. Finally, when encrypted files are copied over the network using the SMB/CIFS protocol, the files are decrypted before they are sent over the network&quot;&lt;/em&gt; [@wikipedia-efs].&lt;/p&gt;
&lt;p&gt;This is not an EFS bug; it is what falls out when the encryption is implemented as a filesystem attribute and the destination filesystem has no equivalent. The cryptography ends where the attribute ends.&lt;/p&gt;
&lt;h3&gt;Opt-in, per file&lt;/h3&gt;
&lt;p&gt;EFS is enabled by setting the encrypt-attribute on a file or folder via right-click &lt;code&gt;Properties &amp;gt; Advanced &amp;gt; Encrypt contents to secure data&lt;/code&gt;, or via &lt;code&gt;cipher.exe /e&lt;/code&gt;. The user has to remember to do it. The volume default is unprotected. That is the entire mechanism: there is no &quot;encrypt every file Alice creates in her profile&quot; policy in classic EFS. PDE, twenty-two years later, finally addresses this.&lt;/p&gt;
&lt;h3&gt;Mutually exclusive with PDE&lt;/h3&gt;
&lt;p&gt;Microsoft Learn states the mutual exclusion plainly: &lt;em&gt;&quot;No, Personal Data Encryption and EFS are mutually exclusive&quot;&lt;/em&gt; [@ms-pde-faq]. A file cannot have both an EFS wrapper and a PDE wrapper at the same time. We will see why in §5; for now, register that the two layers compete at this layer of the stack, not compose.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Every limitation of EFS drops mechanically out of one design decision: the protection root is the user&apos;s logon secret. EFS is per-user because the cryptographic identity is the user. To close the gaps EFS leaves, you cannot keep using the user&apos;s logon secret as the root. You need a different root.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;{`
// Illustrative only. Real EFS uses CNG primitives inside the EFS service in lsass.exe.
// Do not run this against real keys or files.&lt;/p&gt;
&lt;p&gt;function encryptFileWithEFS(plaintext, userPublicKey, draPublicKeys) {
  // 1. Generate a per-file symmetric File Encryption Key (FEK).
  const fek = randomBytes(32); // AES-256 since Windows 10 1709&lt;/p&gt;
&lt;p&gt;  // 2. Encrypt the file body with the FEK.
  const ciphertext = aesEncrypt(plaintext, fek);&lt;/p&gt;
&lt;p&gt;  // 3. RSA-wrap the FEK to every authorised principal.
  const wrappers = [];
  wrappers.push({ sid: &apos;user-sid&apos;, wrappedFek: rsaWrap(fek, userPublicKey) });
  for (const dra of draPublicKeys) {
    wrappers.push({ sid: dra.sid, wrappedFek: rsaWrap(fek, dra.publicKey) });
  }&lt;/p&gt;
&lt;p&gt;  // 4. Store wrappers in the file&apos;s $EFS attribute. Body is on disk.
  return { body: ciphertext, efsAttribute: wrappers };
}&lt;/p&gt;
&lt;p&gt;// Decryption is the reverse: locate the wrapper for the calling user&apos;s SID,
// unwrap the FEK with the user&apos;s EFS private key (loaded from
// %APPDATA%\Microsoft\Crypto\RSA\\ and unsealed by classic DPAPI from
// the user&apos;s logon secret), then AES-decrypt the body.
console.log(&apos;EFS encryption shape: one FEK, multiple RSA wrappers&apos;);
`}&lt;/p&gt;
&lt;p&gt;EFS is per-user because the cryptographic identity is the user. To close the gaps EFS leaves, you have to change the root. That is what the next twenty-six years of Windows file-data protection do, one root at a time.&lt;/p&gt;
&lt;h2&gt;4. Six Generations of Closing Each Other&apos;s Gaps&lt;/h2&gt;
&lt;p&gt;Each generation of Windows file-data protection is engineered to close a gap left by the previous one, and each new layer introduces a different protection-key root because each gap has a different threat model. Here is the twenty-six-year sequence.&lt;/p&gt;

timeline
    title Windows file-data protection generations
    2000 : EFS ships with Windows 2000
         : Per-user per-file, RSA wrap, classic DPAPI root
    2003 : RMS ships with Windows Server 2003
         : Per-content envelope, identity service authorization
    2006 : BitLocker ships with Windows Vista
         : Volume-level, TPM-sealed VMK
    2013-2014 : Azure RMS reaches general availability
         : Tenant key in Azure, cross-organisation default
    2018-2019 : Microsoft Information Protection unifies labels
         : Same RMS engine, single labelling plane
    2022 : Microsoft Purview brand consolidation
         : MIP becomes Microsoft Purview Information Protection
    2022 : Personal Data Encryption ships in 22H2
         : Hello-bound DEK via DPAPI-NG
    2022 : Windows Information Protection sunsets
         : &quot;Honest employees&quot; tool retired
    2024 : PDE for known folders ships in 24H2
         : Desktop, Documents, Pictures auto-encrypted
&lt;p&gt;Each year row in this diagram is anchored to a primary source cited inline in the corresponding generation section below: the Windows 2000 EFS milestone [@wikipedia-windows2000], the Windows Server 2003 RMS debut and lineage [@wikipedia-adrms], the November 30, 2006 BitLocker release [@wikipedia-bitlocker], the Azure Rights Management general-availability lineage [@ms-azure-rms], the Microsoft Information Protection brand and its April 2022 consolidation into Microsoft Purview [@ms-purview-launch], the Windows 11 22H2 / 24H2 Personal Data Encryption rollout [@ms-pde-overview], and the Windows Information Protection sunset [@ms-wip-deprecation]. Mermaid syntax does not accept pandoc inline citations inside the diagram body, so the citations live in the prose immediately after.&lt;/p&gt;
&lt;h3&gt;Generation 1 -- EFS (2000)&lt;/h3&gt;
&lt;p&gt;Covered in §2 and §3. One paragraph recap: per-user, per-file, opt-in, RSA-wrapped FEK, user EFS RSA private key sealed by classic DPAPI from the user&apos;s logon secret. Root: the user&apos;s password. Threat model: a different user on the same machine, or a foreign operating system that mounts NTFS without honouring ACLs.&lt;/p&gt;
&lt;h3&gt;Generation 2 -- BitLocker (2006)&lt;/h3&gt;
&lt;p&gt;Six years after EFS, Microsoft moved encryption &lt;em&gt;off&lt;/em&gt; the file and &lt;em&gt;down&lt;/em&gt; to the volume. BitLocker shipped with Windows Vista on November 30, 2006 [@wikipedia-bitlocker]; the consumer launch of Vista that included it followed on January 30, 2007 [@wikipedia-bitlocker]. The cipher in the first BitLocker release was AES-CBC with Niels Ferguson&apos;s Elephant Diffuser, a manipulation-resistance construction documented in the 2006 Microsoft technical paper &lt;em&gt;AES-CBC + Elephant Diffuser: A Disk Encryption Algorithm for Windows Vista&lt;/em&gt; [@ferguson-2006].Niels Ferguson is the named cryptographer behind BitLocker&apos;s original cipher mode. He is the only individual this article names with primary-source confidence. Most other work in this space ships team-attributed.&lt;/p&gt;
&lt;p&gt;Later releases moved to XTS-AES with 128-bit or 256-bit keys; XTS-AES has been the default since a Windows 10 release in the mid-2010s [@wikipedia-bitlocker].&lt;/p&gt;
&lt;p&gt;The cipher mode is not the point. The point is what changed in the &lt;em&gt;root&lt;/em&gt;. BitLocker&apos;s Volume Master Key (VMK) is sealed in the TPM against a set of Platform Configuration Registers, and released automatically when the registers match the expected boot state.&lt;/p&gt;

A key-encrypting key that wraps the Full Volume Encryption Key. If a user changes their password or a new recovery key is escrowed, only the VMK wrappings change -- the entire volume does not need re-encryption. The VMK itself is sealed in the TPM against the platform&apos;s boot-state PCRs and released at boot when the PCRs match [@wikipedia-bitlocker].
&lt;p&gt;The human is removed from the encrypt-this-file decision. There is no per-file opt-in; the volume protects everything, including system files, swap, and hibernation. There is no per-user wrapping; the VMK is one thing, the volume is one thing.&lt;/p&gt;
&lt;p&gt;This is why BitLocker does not subsume EFS. The two layers protect different things. BitLocker protects the volume at rest, before the OS boots; EFS protects per-file per-user &lt;em&gt;after&lt;/em&gt; the OS has mounted the volume and a particular user has logged on. The &quot;BitLocker is on&quot; vignette in §1 is exactly the gap BitLocker structurally cannot close: BitLocker is unlocked the moment the TPM unseals, and the unseal happens before any human authenticates.&lt;/p&gt;

A dedicated BitLocker article on this site covers volume-internal mechanics in depth -- VMK, FVEK, recovery key escrow, TPM+PIN configuration, cipher migration. This article assumes that BitLocker knowledge and concentrates on the *above-volume* layers. The reader who wants the volume internals should read that article alongside this one.
&lt;h3&gt;Generation 3 -- RMS and Azure RMS (2003, 2013-2014)&lt;/h3&gt;
&lt;p&gt;Three years after EFS, Microsoft shipped a completely different shape of file encryption with Windows Server 2003: Rights Management Services. Wikipedia traces the lineage: &lt;em&gt;&quot;Active Directory Rights Management Services (AD RMS, known as Rights Management Services or RMS before Windows Server 2008) is a server software for information rights management shipped with Windows Server&quot;&lt;/em&gt; and &lt;em&gt;&quot;RMS debuted in Windows Server 2003, with client API libraries made available for Windows 2000 and later&quot;&lt;/em&gt; [@wikipedia-adrms].&lt;/p&gt;
&lt;p&gt;RMS solved a different problem from EFS or BitLocker. The question was: &lt;em&gt;can a document remain encrypted when emailed outside the organisation, or copied to a USB stick, or stored in a shared folder a different user has read access to?&lt;/em&gt; EFS could not -- decrypted on cross-protocol copy. BitLocker could not -- the volume is unlocked. RMS introduced a different shape: each protected document carries an envelope that includes a wrapped Content Encryption Key and a policy reference, and decryption requires the consumer to obtain a use license from the RMS service against an authenticated identity.&lt;/p&gt;

A per-content symmetric key generated when a document is protected with a Purview sensitivity label that applies encryption. The CEK is wrapped by the tenant root key (or by the customer-held DKE key, where Double Key Encryption is configured) and travels embedded in the document file alongside policy metadata. Microsoft Learn describes the topology: *&quot;The Azure Rights Management tenant key is your organization&apos;s root key for the main encryption service for Microsoft Purview Information Protection. Other keys can be derived from this root key, including user keys, computer keys, or document encryption keys&quot;* [@ms-byok].

A short-lived authorization artifact issued by the Azure Rights Management service to a specific authenticated user, granting them the rights expressed by the document&apos;s policy (view, edit, print, copy, forward). Microsoft Learn states the cross-organisation default: *&quot;By default, collaboration with other organizations that already have a Microsoft 365 or a Microsoft Entra directory is automatically supported&quot;* [@ms-azure-rms]. A user without a valid use license cannot decrypt the CEK, even if they possess the file.
&lt;p&gt;A few years after AD RMS shipped, Microsoft moved the RMS engine to the cloud as Azure RMS. The protection topology stayed the same: per-content CEK, tenant root key, use-license issuance against an identity service. What changed is that the identity service is now Microsoft Entra ID and the root key sits in Azure (or, with Bring Your Own Key, in an Azure Key Vault customer hold) instead of on a Windows Server. Microsoft Learn defines Azure RMS as &lt;em&gt;&quot;the main cloud-based encryption service from Microsoft Purview Information Protection&quot;&lt;/em&gt; and notes that &lt;em&gt;&quot;Encryption settings remain with your data, even when it leaves your organization&apos;s boundaries&quot;&lt;/em&gt; [@ms-azure-rms].&lt;/p&gt;
&lt;p&gt;This is the &quot;travels with the file&quot; generation. Email a CEK-wrapped DOCX to an external recipient; the recipient still needs a use license from Azure RMS; the document does not become plaintext just because it changed hands.&lt;/p&gt;
&lt;h3&gt;Generation 4 -- MIP, then Microsoft Purview Information Protection (late 2010s, 2022)&lt;/h3&gt;
&lt;p&gt;The late-2010s reorganisation is fundamentally a &lt;em&gt;policy-plane&lt;/em&gt; unification, not a new engine. Azure Information Protection&apos;s classification and labelling, the Office unified labelling client, and a growing set of policy controls were brought together under the Microsoft Information Protection (MIP) name in the late 2010s. The encryption engine underneath stayed Azure RMS.&lt;/p&gt;
&lt;p&gt;In April 2022, the entire compliance, classification, and information-protection portfolio got a single brand: Microsoft Purview. The April 19, 2022 launch blog post explained the consolidation: &lt;em&gt;&quot;To meet the challenges of today&apos;s decentralized, data-rich workplace, we&apos;re introducing Microsoft Purview ... that help you govern, protect, and manage your entire data estate&quot;&lt;/em&gt; [@ms-purview-launch]. The same post&apos;s product-naming table mapped &lt;em&gt;&quot;Microsoft Information Protection&quot;&lt;/em&gt; to &lt;em&gt;&quot;Microsoft Purview Information Protection&quot;&lt;/em&gt; directly. Same engine. Same envelope shape. New name.&lt;/p&gt;
&lt;p&gt;For the practitioner, this matters less than it looks. The on-disk artifact of a Purview-labelled document is the same CEK-wrapped envelope it was under MIP, AIP, and AD RMS. The label is metadata; whether the label &lt;em&gt;applies&lt;/em&gt; encryption depends on the label&apos;s settings. Microsoft Learn states the engine plainly: &lt;em&gt;&quot;Unless you&apos;re using S/MIME for Outlook, encryption that&apos;s applied by sensitivity labels to documents, emails, and meeting invites all use the Azure Rights Management service from Microsoft Purview Information Protection&quot;&lt;/em&gt; [@ms-purview-labels].&lt;/p&gt;
&lt;h3&gt;Generation 5 -- PDE (December 2022)&lt;/h3&gt;
&lt;p&gt;December 8, 2022. Microsoft announced Personal Data Encryption in a Tech Community post with a title that telegraphs the threat model: &lt;em&gt;Introducing Personal Data Encryption, securing user data before login and under lock&lt;/em&gt; [@ms-pde-announcement]. The verbatim contrast with BitLocker, from the same post, is the cleanest statement of the gap PDE closes:&lt;/p&gt;

Bitlocker provides full volume encryption and Bitlocker protected data is available when the device boots up, whereas PDE protected data is available only after the user authenticates to Windows Hello for Business at login or to unlock the screen.
&lt;p&gt;That sentence carries the entire design. BitLocker unlocks at boot. PDE unlocks at Hello sign-in. The post-boot pre-logon window the §1 vignette dwelled in is exactly the window PDE was built to close. PDE shipped with Windows 11 22H2 [@ms-pde-overview]. The cipher is AES-CBC with a 256-bit key [@ms-pde-overview]. The protector binds to a &lt;a href=&quot;https://paragmali.com/blog/your-face-is-not-your-password-inside-windows-hellos-hardwar/&quot; rel=&quot;noopener&quot;&gt;Windows Hello for Business&lt;/a&gt; credential, not to a password.&lt;/p&gt;
&lt;p&gt;The PDE FAQ adds the second key constraint: &lt;em&gt;&quot;the keys used by Personal Data Encryption to encrypt content are protected by Windows Hello credentials and can only be unlocked when signing on with Windows Hello (PIN or biometrics)&quot;&lt;/em&gt; [@ms-pde-faq]. Password sign-in does not unlock PDE content. RDP does not unlock it. Other users on the same machine do not unlock it. We will walk the full mechanism in §5 and §6; for now, register that the root is Windows Hello for Business, not the user&apos;s password.&lt;/p&gt;
&lt;h3&gt;Generation 6 -- PDE for Known Folders (Windows 11 24H2)&lt;/h3&gt;
&lt;p&gt;The 22H2 release of PDE was API-only [@ms-pde-announcement]. Applications could call &lt;code&gt;Windows.Security.DataProtection.UserDataProtectionManager.ProtectStorageItemAsync&lt;/code&gt; to wrap an individual file, but Windows itself did not encrypt anything by default. That changed with Windows 11 24H2.&lt;/p&gt;
&lt;p&gt;Microsoft Learn describes the 24H2 addition: &lt;em&gt;&quot;Starting in Windows 11, version 24H2, Personal Data Encryption is further enhanced with Personal Data Encryption for known folders. Once enabled, the Windows folders Desktop, Documents, and Pictures, along with their contents, are automatically encrypted&quot;&lt;/em&gt; [@ms-pde-overview]. The CSP node tree (configured via Intune or any MDM that speaks &lt;code&gt;./User/Vendor/MSFT/PDE&lt;/code&gt;) gained &lt;code&gt;ProtectFolders/ProtectDesktop&lt;/code&gt;, &lt;code&gt;ProtectFolders/ProtectDocuments&lt;/code&gt;, and &lt;code&gt;ProtectFolders/ProtectPictures&lt;/code&gt; for this purpose [@ms-pde-csp]. The PDE CSP itself was added in 22H2 (build 10.0.22621), while the known-folder nodes are gated to 24H2 (build 10.0.26100) and later [@ms-pde-csp].&lt;/p&gt;
&lt;p&gt;For the first time since EFS, Windows shipped a per-user file-encryption mechanism that did not require the user to opt every individual file in. The default for the three best-known per-user folders -- if the administrator enables it -- is encrypted.&lt;/p&gt;
&lt;h3&gt;The dead-end branch -- Windows Information Protection (2016 to mid-2022)&lt;/h3&gt;
&lt;p&gt;One more entry belongs on the timeline. Windows Information Protection, originally Enterprise Data Protection, was Microsoft&apos;s mid-2010s attempt at &quot;container-style&quot; data separation: corporate files in a container, personal files outside the container, copy-paste between them gated by policy. Microsoft Learn&apos;s &lt;code&gt;/previous-versions/&lt;/code&gt; landing page for WIP states the design intent: &lt;em&gt;&quot;Windows Information Protection (WIP), previously known as enterprise data protection (EDP), helps to protect against this potential data leakage without otherwise interfering with the employee experience&quot;&lt;/em&gt; [@ms-wip-deprecation].&lt;/p&gt;
&lt;p&gt;The same page is candid about the limit: &lt;em&gt;&quot;While Windows Information Protection can stop accidental data leaks from honest employees, it is not intended to stop malicious insiders from removing enterprise data&quot;&lt;/em&gt; [@ms-wip-deprecation]. WIP was sunset in mid-2022 and the recommended replacement was the Microsoft Purview Information Protection plus Microsoft Purview Data Loss Prevention combination [@ms-wip-deprecation].&lt;/p&gt;
&lt;p&gt;Each generation chose a different protection-key root. That is the most important observation in the article -- and it has been hiding in plain sight since 2003.&lt;/p&gt;
&lt;h2&gt;5. Three Layers, Three Roots, Three Threat Models&lt;/h2&gt;
&lt;p&gt;BitLocker, EFS, PDE, and Purview sensitivity labels use four different protection-key roots because each one closes a different gap, and each gap has a different threat model. That is by design.&lt;/p&gt;
&lt;p&gt;The four roots:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Protection-key root&lt;/th&gt;
&lt;th&gt;Sealed by&lt;/th&gt;
&lt;th&gt;Unlocked at&lt;/th&gt;
&lt;th&gt;Granularity&lt;/th&gt;
&lt;th&gt;Travels with file&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;BitLocker&lt;/td&gt;
&lt;td&gt;TPM-sealed VMK&lt;/td&gt;
&lt;td&gt;TPM, against PCRs&lt;/td&gt;
&lt;td&gt;Boot, when PCRs match&lt;/td&gt;
&lt;td&gt;Volume&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFS&lt;/td&gt;
&lt;td&gt;User EFS RSA private key&lt;/td&gt;
&lt;td&gt;classic DPAPI from logon secret&lt;/td&gt;
&lt;td&gt;First file access in logon session&lt;/td&gt;
&lt;td&gt;File, per-user&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDE&lt;/td&gt;
&lt;td&gt;DEK bound to Hello credential&lt;/td&gt;
&lt;td&gt;DPAPI-NG protection descriptor&lt;/td&gt;
&lt;td&gt;Hello sign-in (PIN or biometric)&lt;/td&gt;
&lt;td&gt;File, per-Hello-user&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purview labels&lt;/td&gt;
&lt;td&gt;Per-content CEK wrapped by tenant key&lt;/td&gt;
&lt;td&gt;Azure Key Vault (Microsoft, BYOK, or DKE)&lt;/td&gt;
&lt;td&gt;Use-license issuance by Azure RMS against Entra ID&lt;/td&gt;
&lt;td&gt;Per-content envelope&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Let us walk each root one at a time. The story changes at every row.&lt;/p&gt;

flowchart LR
    subgraph BitLocker
        BL_VMK[VMK] --&amp;gt; BL_TPM[TPM, sealed against PCRs]
    end
    subgraph EFS
        EFS_FEK[Per-file FEK] --&amp;gt; EFS_Priv[User EFS RSA private key]
        EFS_Priv --&amp;gt; EFS_DPAPI[classic DPAPI master key]
        EFS_DPAPI --&amp;gt; EFS_Logon[User logon secret]
    end
    subgraph PDE
        PDE_DEK[Per-file DEK] --&amp;gt; PDE_DPAPING[DPAPI-NG protector]
        PDE_DPAPING --&amp;gt; PDE_Hello[Windows Hello for Business credential]
    end
    subgraph Purview
        P_CEK[Per-content CEK] --&amp;gt; P_Tenant[Tenant root key]
        P_Tenant --&amp;gt; P_KV[Azure Key Vault, BYOK or DKE]
        P_License[Use license] --&amp;gt; P_Entra[Microsoft Entra ID authorization]
    end
&lt;h3&gt;Root 1 -- BitLocker, the TPM-sealed VMK&lt;/h3&gt;
&lt;p&gt;BitLocker terminates at the TPM. The VMK wraps the Full Volume Encryption Key; the TPM seals the VMK against the platform&apos;s PCR measurements; if the boot chain has not been tampered with, the TPM releases the VMK without any human input. That is the entire mechanism, and it is exactly why &quot;BitLocker is on&quot; leaves the gap the §1 vignette walks through. The threat BitLocker addresses is &lt;em&gt;the powered-off device on a thief&apos;s workbench&lt;/em&gt;. It is mute against everything that happens after the OS has booted.&lt;/p&gt;
&lt;h3&gt;Root 2 -- EFS, the user EFS RSA private key sealed by classic DPAPI&lt;/h3&gt;
&lt;p&gt;EFS terminates at the user&apos;s logon credential. Microsoft Learn defines the EFS service surface as a public-key system for individual files [@ms-efs-win32]. Wikipedia walks the chain end to end: per-file FEK, RSA-wrapped to the user&apos;s EFS public key, private key sealed by classic DPAPI from the user&apos;s logon secret [@wikipedia-efs].&lt;/p&gt;
&lt;p&gt;The threat EFS addresses is &lt;em&gt;a different user on the same machine, after both have signed on at one point or another&lt;/em&gt;. It is mute against three other things: the user&apos;s own ransomware (which runs as the user and can decrypt every EFS file the user owns), password reset (which destroys the DPAPI derivation and locks the user out unless a DRA is configured), and cross-protocol copy (decrypted before SMB transit).&lt;/p&gt;
&lt;h3&gt;Root 3 -- PDE, a DPAPI-NG protector bound to a Windows Hello credential&lt;/h3&gt;
&lt;p&gt;PDE terminates at Windows Hello for Business. Microsoft Learn states the binding directly: &lt;em&gt;&quot;Personal Data Encryption is a security feature that provides file-based data encryption capabilities to Windows. It utilizes Windows Hello for Business to link data encryption keys with user credentials&quot;&lt;/em&gt; [@ms-pde-overview]. The PDE FAQ confirms the unlock condition: &lt;em&gt;&quot;the keys used by Personal Data Encryption to encrypt content are protected by Windows Hello credentials and can only be unlocked when signing on with Windows Hello (PIN or biometrics)&quot;&lt;/em&gt; [@ms-pde-faq].&lt;/p&gt;
&lt;p&gt;The likely engineering mechanism is a DPAPI-NG protection descriptor. DPAPI-NG (Microsoft&apos;s &quot;Next Generation&quot; Data Protection API, in Windows 8 and later) is the only Windows API surface that publicly documents Hello-bound key release. Its protection-descriptor grammar accepts a small set of principal types, documented at Microsoft Learn: &lt;code&gt;SID=&lt;/code&gt;, &lt;code&gt;SDDL=&lt;/code&gt;, &lt;code&gt;LOCAL=user&lt;/code&gt;, &lt;code&gt;LOCAL=machine&lt;/code&gt;, &lt;code&gt;WEBCREDENTIALS=&lt;/code&gt;, &lt;code&gt;CERTIFICATE=HashID:sha1_hash_of_certificate&lt;/code&gt;, and &lt;code&gt;CERTIFICATE=CertBlob:base64String&lt;/code&gt; [@ms-protection-descriptors]. Microsoft&apos;s own protection-descriptor reference adds: &lt;em&gt;&quot;The protection descriptor you specify automatically determines which key protection provider is used&quot;&lt;/em&gt; [@ms-protection-descriptors].&lt;/p&gt;

The rule string passed to `NCryptCreateProtectionDescriptor` that names the principal or principals whose authentication will be required to unwrap a protected blob. The protection descriptor is the place in DPAPI-NG where &quot;encrypted only for this Hello-bound principal&quot; is expressed. Microsoft Learn documents the rule grammar (SID, SDDL, LOCAL, WEBCREDENTIALS, CERTIFICATE) and the use of `AND` and `OR` connectors to combine principals [@ms-protection-descriptors].
&lt;p&gt;Microsoft has not published a mechanism document that says, in those words, &lt;em&gt;&quot;PDE uses &lt;code&gt;NCryptProtectSecret&lt;/code&gt; with a protection descriptor naming the Windows Hello for Business credential.&quot;&lt;/em&gt; What Microsoft has published is the binding (&quot;it utilizes Windows Hello for Business to link data encryption keys with user credentials&quot;) and the API surface (&quot;DPAPI-NG, with Hello-aware protectors&quot;). The two compose in exactly one way that fits the verified primaries. Treat the protection-descriptor binding as the likely engineering mechanism rather than the directly-stated one.The DPAPI-NG protection-descriptor grammar is broader than just Hello. The same API surface backs WinRT user-profile secrets, web-credentials-vault items, and certificate-protected blobs. PDE is one consumer; the API itself is general.&lt;/p&gt;

flowchart TD
    Plain[Plaintext file] --&amp;gt;|AES-CBC 256-bit| Cipher[Ciphertext on NTFS]
    DEK[Per-file Data Encryption Key] --&amp;gt;|wrap| DPAPING[DPAPI-NG NCryptProtectSecret]
    DPAPING --&amp;gt;|protection descriptor| Desc[&quot;Hello-bound principal, likely SID or LOCAL=user&quot;]
    Desc --&amp;gt; HelloKey[Hello-bound asymmetric key in TPM]
    HelloKey --&amp;gt;|released by| Auth[Windows Hello PIN or biometric sign-in]
&lt;p&gt;The arrows above are the cleanest single-page summary of PDE. From Microsoft Learn: the file body uses &lt;em&gt;&quot;AES-CBC with a 256-bit key&quot;&lt;/em&gt; [@ms-pde-overview]. From the PDE FAQ: &lt;em&gt;&quot;the keys used by Personal Data Encryption to encrypt content are protected by Windows Hello credentials and can only be unlocked when signing on with Windows Hello (PIN or biometrics)&quot;&lt;/em&gt; [@ms-pde-faq]. From the DPAPI-NG reference: the API surface includes &lt;code&gt;NCryptCreateProtectionDescriptor&lt;/code&gt;, &lt;code&gt;NCryptProtectSecret&lt;/code&gt;, and &lt;code&gt;NCryptUnprotectSecret&lt;/code&gt; for exactly this purpose [@ms-dpapi-ng]. From the protection-descriptor reference: the rule grammar accepts principal types that include SID and LOCAL principals, which is where the Hello-bound binding lives [@ms-protection-descriptors].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; PDE uses AES-CBC, not an authenticated mode like AES-GCM. CBC is malleable: an attacker who can modify ciphertext on disk can flip predictable bits in plaintext. The argument that closes this gap is composition: PDE expects to run on top of BitLocker, whose modern default is XTS-AES [@wikipedia-bitlocker]. PDE&apos;s CBC mode by itself has no manipulation resistance; PDE composed with BitLocker inherits BitLocker&apos;s XTS-AES floor. This composition is intentional. Microsoft&apos;s own recommendation is to run PDE under BitLocker: &lt;em&gt;&quot;it&apos;s recommended to encrypt all volumes with BitLocker Drive Encryption for increased security&quot;&lt;/em&gt; [@ms-pde-faq].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The threat PDE addresses is &lt;em&gt;the laptop at the lock screen with a plaintext volume, in the user&apos;s own absence&lt;/em&gt;. PDE files are unreadable until the user re-authenticates to Hello, even though BitLocker has long since released the volume.&lt;/p&gt;
&lt;p&gt;This is, importantly, the &lt;em&gt;only&lt;/em&gt; place in the four-layer story where &quot;DPAPI-NG is involved&quot; is true. EFS uses classic DPAPI, not DPAPI-NG. Purview labels use Azure RMS, not DPAPI-NG. BitLocker uses neither. The folk-knowledge framing &quot;DPAPI-NG under everything&quot; collapses three different roots into one and obscures the actual architecture.&lt;/p&gt;
&lt;h3&gt;Root 4 -- Purview labels, the Azure RMS tenant key plus Entra ID authorization&lt;/h3&gt;
&lt;p&gt;Purview sensitivity labels (where the label applies encryption) terminate at the Azure Rights Management tenant key and at Microsoft Entra ID. Microsoft Learn states the engine: &lt;em&gt;&quot;Unless you&apos;re using S/MIME for Outlook, encryption that&apos;s applied by sensitivity labels to documents, emails, and meeting invites all use the Azure Rights Management service from Microsoft Purview Information Protection&quot;&lt;/em&gt; [@ms-purview-labels].&lt;/p&gt;
&lt;p&gt;The on-disk envelope contains the wrapped CEK and policy metadata, &lt;em&gt;and the wrapped CEK can be re-issued to any authorised principal&lt;/em&gt;. When Bob in Contoso emails an &quot;Internal&quot; labelled DOCX to Alice in Fabrikam, Azure RMS issues Alice a use license against her Entra ID identity, provided that the document&apos;s policy admits her. The cross-organisation default is on by default [@ms-azure-rms].&lt;/p&gt;
&lt;p&gt;The tenant root can vary. Microsoft Learn describes the topology: &lt;em&gt;&quot;The root key for your Azure Rights Management service can either be: Generated by Microsoft ... Generated by customers with Bring Your Own Key (BYOK)&quot;&lt;/em&gt; [@ms-byok]. Above BYOK sits Double Key Encryption, which puts a customer-controlled key in series with the Azure-held key.&lt;/p&gt;

A two-key model on top of Purview&apos;s tenant root, in which decryption requires both an Azure-held key and an on-premises customer-held key. Microsoft Learn states the design: *&quot;DKE lets you maintain control of your encryption keys. It uses two keys to protect data; one key in your control and a second key you store securely in Microsoft Azure. You maintain control of one of your keys using the Double Key Encryption service. Viewing data protected with Double Key Encryption requires access to both keys&quot;* [@ms-dke]. The same page adds the operational consequence: *&quot;DKE encrypted data isn&apos;t accessible at rest to Microsoft 365 services including Copilot&quot;* [@ms-dke].
&lt;p&gt;The threat Purview labels address is &lt;em&gt;the file that leaves the organisation&lt;/em&gt;. A Purview-encrypted file emailed to a personal Gmail account, copied to a USB stick, uploaded to a third-party SaaS -- still encrypted, still requires a use license from Azure RMS against an authenticated identity, still subject to the policy the original author attached. BitLocker, EFS, and PDE all stop at the local volume or local user; Purview labels are the only one of the four that follows the file across machines, tenants, and protocols.&lt;/p&gt;
&lt;h3&gt;The asymmetry is the design&lt;/h3&gt;
&lt;p&gt;A single unifying root would have collapsed real distinctions. If everything terminated at the TPM, no protection could survive the file leaving the device. If everything terminated at the user&apos;s password, no per-content cross-tenant story would be possible. If everything terminated at Entra ID, the offline laptop at a lock screen would have no answer when the network is unreachable. The four-root architecture is what it is because the four threats are what they are.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Three layers, three protection-key roots, three threat models. The asymmetry is the point: each root exists precisely because the threats are different. A single unified root would not be an improvement -- it would collapse real distinctions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now that you know the roots, you can ask the right questions about the state of the art: what does each layer ship today, and how do you compose them?&lt;/p&gt;
&lt;h2&gt;6. State of the Art: Each Layer in 2026&lt;/h2&gt;
&lt;p&gt;Each layer ships today, supported, documented, and deployed. Here is what each one actually looks like as of mid-2026.&lt;/p&gt;
&lt;h3&gt;EFS in 2026&lt;/h3&gt;
&lt;p&gt;EFS still ships in Windows 11 and Windows Server 2025. It is documented at the Win32 file-encryption reference [@ms-efs-win32]. It is deprecated for new development -- the recommended replacement for new per-file scenarios on Entra-joined Hello-using devices is PDE [@ms-pde-faq] -- but the implementation is intact, Group Policy still ships DRA configuration, and existing EFS-encrypted files continue to work.&lt;/p&gt;
&lt;p&gt;What EFS does not work on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ReFS before 24H2&lt;/em&gt;. Historically the &lt;code&gt;$EFS&lt;/code&gt; attribute had no home on ReFS, so EFS-protected files were decrypted in transit when copied to a ReFS volume. Windows 11 24H2 and Windows Server 2025 added file-system-encryption support to ReFS [@wikipedia-efs], so the absolute &quot;no home&quot; framing is now out of date; on older ReFS, the cryptography still ends at the volume boundary.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;FAT32 / exFAT on legacy Windows&lt;/em&gt;. Wikipedia notes that &lt;em&gt;&quot;Files and folders are decrypted before being copied to a volume formatted with another file system, like FAT32&quot;&lt;/em&gt; [@wikipedia-efs]. Windows 10 1607 and Windows Server 2016 added EFS support on FAT and exFAT [@wikipedia-efs], which softens the absolute version of that statement; the cryptography still ends at SMB transit and at any destination the source EFS service does not recognise as compatible.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;System files and root directories&lt;/em&gt;. Not encryptable; the chicken-and-egg problem of needing to read the user&apos;s profile before the user has authenticated.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Compressed files&lt;/em&gt;. EFS and NTFS file compression are mutually exclusive on the same file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The default cipher inside the FEK has been AES since Windows XP SP1 [@wikipedia-efs]; the default key size moved from AES-128 to AES-256 in a later Windows 10 release. Operationally, the most common source of confusion is &lt;code&gt;cipher.exe /K&lt;/code&gt;, which generates a fresh self-signed EFS certificate for the current user if one does not already exist; the certificate goes into the user&apos;s personal store, the private key into &lt;code&gt;%APPDATA%\Microsoft\Crypto\RSA\&amp;lt;SID&amp;gt;\&lt;/code&gt;, and the EFS service in &lt;code&gt;lsass.exe&lt;/code&gt; from then on prefers the new certificate for new wraps. Existing EFS files do not rewrap themselves.&lt;/p&gt;
&lt;p&gt;The DRA story works cleanly only in classic AD-domain deployments where Group Policy can push a recovery-agent certificate to every machine and the EFS service knows to add the DRA wrapper at encryption time. In an Entra-joined-only environment, the AD-domain DRA story does not transplant cleanly; this is one of the seven live operational problems we will catalogue in §9.&lt;/p&gt;
&lt;h3&gt;PDE in 2026&lt;/h3&gt;
&lt;p&gt;Personal Data Encryption ships on Windows 11 22H2 and later, in Enterprise and Education SKUs [@ms-pde-overview]. As of Windows 11 24H2, the known-folder auto-encryption mode brings Desktop, Documents, and Pictures under PDE without requiring per-file API calls [@ms-pde-overview].&lt;/p&gt;
&lt;p&gt;The prerequisites are strict, and they are spelled out on the PDE overview page: &lt;em&gt;&quot;The devices must be Microsoft Entra joined or Microsoft Entra hybrid joined. Domain-joined devices aren&apos;t supported&quot;&lt;/em&gt; and &lt;em&gt;&quot;Automatic Restart Sign On (ARSO) must be disabled&quot;&lt;/em&gt; [@ms-pde-overview]. The configure page emphasises the ARSO point: &lt;em&gt;&quot;Winlogon automatic restart sign-on (ARSO) isn&apos;t supported for use with Personal Data Encryption. To use Personal Data Encryption, ARSO must be disabled&quot;&lt;/em&gt; [@ms-pde-configure].&lt;/p&gt;
&lt;p&gt;PDE has two protection levels, defined by how long after sign-in the content remains decrypted in memory. The original announcement explains both:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Level 1(L1) security protects contents during the early boot stage -- from the time that the machines boots, until the user logs in using Windows Hello for Business credentials. Level 2(L2) security protects data from the time the user&apos;s device locks till the device is unlocked using Windows Hello for Business credentials.&quot;&lt;/em&gt; [@ms-pde-announcement]&lt;/p&gt;
&lt;p&gt;L1 is &quot;protected from boot until first sign-in.&quot; L2 is &quot;protected from lock until next unlock.&quot; L1 is the default; L2 is opt-in and stricter, because re-decrypting on every unlock is more disruptive to apps that hold open file handles.&lt;/p&gt;
&lt;p&gt;The Configuration Service Provider node tree:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./User/Vendor/MSFT/PDE/EnablePersonalDataEncryption&lt;/code&gt; -- introduced in 22H2, build 10.0.22621 [@ms-pde-csp].&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectDesktop&lt;/code&gt; -- introduced in 24H2, build 10.0.26100 [@ms-pde-csp].&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectDocuments&lt;/code&gt; -- 24H2 [@ms-pde-csp].&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectPictures&lt;/code&gt; -- 24H2 [@ms-pde-csp].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;An earlier draft of this article&apos;s research wrote these paths without the &lt;code&gt;ProtectFolders&lt;/code&gt; parent node, and so do several blog posts on the public web. The Microsoft Learn CSP reference is authoritative: the folder-protection nodes nest under &lt;code&gt;ProtectFolders&lt;/code&gt;. Practitioners running CSP queries against the un-nested path will see them return no value.&lt;/p&gt;
&lt;p&gt;For per-file application use, the WinRT API is &lt;code&gt;Windows.Security.DataProtection.UserDataProtectionManager.ProtectStorageItemAsync&lt;/code&gt; [@ms-userdataprotectionmgr]. The class provides static methods to obtain an instance for the current or a provided user, and instance methods that include &lt;code&gt;GetStorageItemProtectionInfoAsync&lt;/code&gt;, &lt;code&gt;ProtectBufferAsync&lt;/code&gt;, &lt;code&gt;ProtectStorageItemAsync&lt;/code&gt;, &lt;code&gt;TryGetDefault&lt;/code&gt;, &lt;code&gt;TryGetForUser&lt;/code&gt;, and &lt;code&gt;UnprotectBufferAsync&lt;/code&gt;, along with the &lt;code&gt;DataAvailabilityStateChanged&lt;/code&gt; event [@ms-userdataprotectionmgr].The &lt;code&gt;UserDataProtectionManager&lt;/code&gt; API was introduced in Windows 10 1903 (build 10.0.18362), under &lt;code&gt;Windows.Foundation.UniversalApiContract&lt;/code&gt; v8.0 -- predating the 22H2 ship of PDE itself by three years.&lt;/p&gt;
&lt;p&gt;The gotchas list is long enough that the PDE FAQ enumerates each one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Password sign-in fails&lt;/em&gt;. Hello-only release; a user who signs in with a password (e.g., via Ctrl-Alt-Del fallback after a Hello failure) cannot read PDE content.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;RDP fails&lt;/em&gt;. Microsoft Learn states it explicitly: &lt;em&gt;&quot;No, it&apos;s not supported to access protected content over RDP&quot;&lt;/em&gt; [@ms-pde-faq].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Other-user fails&lt;/em&gt;. Each user&apos;s PDE content is bound to their own Hello credential.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mutually exclusive with EFS&lt;/em&gt;. PDE and EFS are mutually exclusive on the same file (see §3).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;OneDrive sync sees plaintext&lt;/em&gt;. &lt;em&gt;&quot;Personal Data Encryption&apos;s encryption only applies to local data saved to the disk. Applications accessing the files, including OneDrive when it syncs data, get cleartext data&quot;&lt;/em&gt; [@ms-pde-faq]. This is the price of &quot;transparent decryption&quot; for the calling user&apos;s processes.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Memory dumps can expose keys&lt;/em&gt;. &lt;em&gt;&quot;Kernel-mode crash dumps and live dumps can potentially cause the keys used by Personal Data Encryption to protect content to be exposed&quot;&lt;/em&gt; / &lt;em&gt;&quot;Hibernation files can potentially cause the keys used by Personal Data Encryption to protect content to be exposed&quot;&lt;/em&gt; [@ms-pde-configure].&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; EFS has a Data Recovery Agent model. BitLocker has recovery-key escrow (to Microsoft account, to Active Directory, to Microsoft Entra ID, to a printout). Purview has tenant-key escrow plus a super-user role. PDE has &lt;em&gt;none&lt;/em&gt; of these. The PDE FAQ is explicit: OneDrive is recommended as a &quot;second copy&quot;, not as a key-recovery mechanism, and &lt;em&gt;&quot;Personal Data Encryption doesn&apos;t have a requirement for a backup provider, including OneDrive in Microsoft 365. However, backups are recommended in case the keys used by Personal Data Encryption to protect files are lost&quot;&lt;/em&gt; [@ms-pde-faq]. Plan for this before deploying PDE at scale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Microsoft Purview Information Protection in 2026&lt;/h3&gt;
&lt;p&gt;Purview&apos;s labelling and encryption story is the most operationally distinct of the four, because the encryption is enforced by a cloud service. Microsoft Learn enumerates the four guarantees the engine makes for a label-encrypted file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&quot;Can be decrypted only by users authorized by the label&apos;s encryption settings&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Remains encrypted no matter where it resides, inside or outside your organization, even if the file&apos;s renamed&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Is encrypted both at rest (for example, in a OneDrive account) and in transit (for example, email as it traverses the internet)&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Encryption is applied automatically by the chosen label settings [@ms-purview-labels].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where the tenant root key sits is configurable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Microsoft-managed by default&lt;/em&gt;. The root key is generated and held by Microsoft in Azure. This is the default for most tenants and the lowest-friction option.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;BYOK&lt;/em&gt;. The customer generates the root key (typically in a Thales HSM or equivalent), uploads it to an Azure Key Vault under their control, and Azure RMS uses the customer&apos;s Azure-held key as the tenant root [@ms-byok].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;DKE&lt;/em&gt;. Two keys, one held by Microsoft and one held on-premises by the customer, both required for decryption [@ms-dke]. The DKE path narrows what Microsoft can do for the customer in exchange for the strongest possible client-side root.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Microsoft Learn frames DKE as a high-end option: &lt;em&gt;&quot;Highly sensitive (about 5% of data)&quot;&lt;/em&gt; is the documentation&apos;s own scoping language [@ms-dke]. The page makes the trade-off candid: &lt;em&gt;&quot;DKE encrypted data isn&apos;t accessible at rest to Microsoft 365 services including Copilot&quot;&lt;/em&gt; [@ms-dke]. DKE is the &quot;crown jewels&quot; tier; using it for everything would blind every Microsoft 365 server-side service from search to Copilot to compliance.&lt;/p&gt;
&lt;p&gt;Labels are applied to documents in three ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Manually&lt;/em&gt;, by users in Office desktop, Office on the web, or Outlook, via the Sensitivity menu.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Automatically&lt;/em&gt;, when a Purview auto-labelling policy matches a trainable classifier or content-inspection rule.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;On the wire&lt;/em&gt;, via Exchange transport rules that label messages as they leave the organisation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once applied, the label&apos;s encryption settings (if any) determine which authorised principals can request a use license. Microsoft Learn states the cross-organisation default: &lt;em&gt;&quot;By default, collaboration with other organizations that already have a Microsoft 365 or a Microsoft Entra directory is automatically supported&quot;&lt;/em&gt; [@ms-azure-rms]. The travels-with-file guarantee is enforced precisely because the file&apos;s wire format embeds the wrapped CEK and the policy reference: a recipient who has the file but cannot obtain a use license from Azure RMS holds ciphertext.&lt;/p&gt;
&lt;p&gt;Those are the layers you compose. But the practitioner reasonably asks: what about everything else? What about WIP, macOS, Linux, third-party DRM?&lt;/p&gt;
&lt;h2&gt;7. Competing Approaches Within and Beyond Windows&lt;/h2&gt;
&lt;p&gt;Four within-Windows alternatives and three cross-platform alternatives the reader will ask about. Two of them are dead ends.&lt;/p&gt;
&lt;h3&gt;Group Policy plus NTFS ACLs&lt;/h3&gt;
&lt;p&gt;NTFS ACLs are not encryption. They are OS-enforced access control: the kernel checks the ACL before satisfying a &lt;code&gt;ReadFile&lt;/code&gt;. Boot a different operating system that does not honour NTFS ACLs and the protection is gone. EFS exists because ACLs alone are not enough; nothing in this article displaces ACLs, but ACLs alone do not appear on any of the four roots above.&lt;/p&gt;
&lt;h3&gt;BitLocker To Go&lt;/h3&gt;
&lt;p&gt;BitLocker To Go is BitLocker for removable media -- USB sticks, external drives. It uses the same XTS-AES cipher and the same VMK/FVEK topology, with the recovery key delivered to Active Directory, Entra ID, a Microsoft account, or a printout depending on the policy [@wikipedia-bitlocker]. Treat it as the same Generation 2 root as BitLocker proper, restricted to removable storage.&lt;/p&gt;
&lt;h3&gt;Windows Information Protection -- the dead branch&lt;/h3&gt;
&lt;p&gt;Already named in §4. Microsoft Learn&apos;s &lt;code&gt;/previous-versions/&lt;/code&gt; page is the canonical citation for the deprecation [@ms-wip-deprecation]. The same page is candid about why WIP did not survive: &lt;em&gt;&quot;While Windows Information Protection can stop accidental data leaks from honest employees, it is not intended to stop malicious insiders from removing enterprise data&quot;&lt;/em&gt; [@ms-wip-deprecation]. The honest-employees framing is the most precise statement of WIP&apos;s threat model -- and of its limit. The recommended replacement is the Microsoft Purview Information Protection plus Microsoft Purview Data Loss Prevention combination. Do not deploy WIP in 2026.&lt;/p&gt;
&lt;h3&gt;macOS FileVault 2&lt;/h3&gt;
&lt;p&gt;Apple Platform Security documents the cipher and the key location succinctly: &lt;em&gt;&quot;FileVault uses the AES-XTS data encryption algorithm to protect full volumes on internal and removable storage devices&quot;&lt;/em&gt; and &lt;em&gt;&quot;All FileVault key handling occurs in the Secure Enclave; encryption keys are never directly exposed to the CPU&quot;&lt;/em&gt; [@apple-filevault]. Architecturally, FileVault 2 is BitLocker&apos;s analogue: volume-level, hardware-rooted, automatic at boot. There is no per-file user-bound layer in macOS that maps cleanly to PDE or EFS. The cross-platform reader looking for a PDE analogue on macOS will not find one in the OS itself; the equivalent has to come from per-application sandboxing (the Data Vault APIs, the App Sandbox container) or from Purview labels applied via Office for Mac.&lt;/p&gt;
&lt;h3&gt;Linux LUKS and fscrypt&lt;/h3&gt;
&lt;p&gt;LUKS is volume-level full-disk encryption, analogous to BitLocker. fscrypt is per-directory file encryption on ext4, F2FS, UBIFS, and CephFS; the kernel documentation states the supported filesystems explicitly: &lt;em&gt;&quot;currently ext4, F2FS, UBIFS, and CephFS&quot;&lt;/em&gt; [@fscrypt-kernel]. Architecturally, fscrypt is closer to PDE than to EFS: per-directory keying, key wrapping by a user-bound credential, designed so that different files can have different keys. The kernel docs also state the bound that matters most for our purposes: &lt;em&gt;&quot;Unlike dm-crypt, fscrypt operates at the filesystem level rather than at the block device level. This allows it to encrypt different files with different keys&quot;&lt;/em&gt; [@fscrypt-kernel]. The Linux stack has had a PDE-shaped tool for years; what it does not have is Hello-equivalent identity infrastructure baked in.&lt;/p&gt;
&lt;h3&gt;Third-party DRM&lt;/h3&gt;
&lt;p&gt;Commercial information-rights-management products from various vendors occupy roughly the same architectural slot as Purview labels: per-content envelope encryption, policy enforced at the rendering application against an identity service. The trade-offs differ on tenant ownership, identity binding, and Office integration; the architectural shape is the same.&lt;/p&gt;
&lt;p&gt;Those are the alternatives. None of them changes the fact that on Windows, the three above-BitLocker layers we have catalogued are the layers you actually pick from. So how far can those layers actually go? What is the theoretical ceiling?&lt;/p&gt;
&lt;h2&gt;8. Where Cryptography Ends and Trust Begins&lt;/h2&gt;
&lt;p&gt;Three bounds. Each is structural. Each tells you something about where cryptography unavoidably terminates.&lt;/p&gt;
&lt;h3&gt;Bound 1 -- At-rest encryption cannot protect plaintext in use&lt;/h3&gt;
&lt;p&gt;Every layer this article catalogues encrypts data &lt;em&gt;at rest&lt;/em&gt;. None of them encrypts data while it is in use by the application that opened it. The plaintext must materialise in process address space for the application to read it; once it is there, the same operating system that handed the application the plaintext also exposes that address space to debuggers, to dump-on-crash, to memory-scrapers, to anything with &lt;code&gt;PROCESS_VM_READ&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The Linux fscrypt kernel documentation states this property explicitly:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;After an encryption key has been added, fscrypt does not hide the plaintext file contents or filenames from other users on the same system. Instead, existing access control mechanisms such as file mode bits, POSIX ACLs, LSMs, or namespaces should be used for this purpose.&quot;&lt;/em&gt; [@fscrypt-kernel]&lt;/p&gt;
&lt;p&gt;The same property holds for BitLocker, EFS, PDE, and Purview labels. Once unlocked, the bytes are bytes. The protection against &quot;another process running as the same user&quot; is the operating system&apos;s access-control layer, not the encryption.&lt;/p&gt;
&lt;h3&gt;Bound 2 -- Authorised-reader exfiltration is unbounded&lt;/h3&gt;
&lt;p&gt;A user who is &lt;em&gt;authorised&lt;/em&gt; to view a file can do anything with the displayed pixels. They can screen-capture, photograph the screen with a phone, dictate the contents aloud, retype them into an unprotected document, paste them into Notepad. This is the &quot;rendezvous problem&quot;, or in older folk vocabulary the &quot;analog hole&quot;.Both &quot;rendezvous problem&quot; and &quot;analog hole&quot; are folk-knowledge terms used descriptively in industry; they are not citations to a named published conjecture, and we do not assert that any particular paper coined either. No cipher can prevent it, because the cipher&apos;s correctness requires that the authorised viewer &lt;em&gt;can&lt;/em&gt; read the plaintext.&lt;/p&gt;
&lt;p&gt;Microsoft itself is candid about where this leaves the RMS family of technologies. The Wikipedia AD RMS article quotes Microsoft&apos;s policy-enforcement framing:&lt;/p&gt;

the differentiation between different usage rights for authorized users is considered part of its policy enforcement capabilities, which Microsoft claims to be implemented as &apos;best effort&apos;, so it is not considered by Microsoft to be a security issue but a policy enforcement limitation. [@wikipedia-adrms]
&lt;p&gt;The &quot;do not print&quot; rights bit on an RMS document is not cryptographically enforced. It is enforced by Microsoft Word, by Outlook, by the rendering applications that the use license names. A user who controls the rendering application can ignore the bit. The cipher protects against &lt;em&gt;unauthorised&lt;/em&gt; readers; it cannot constrain &lt;em&gt;authorised&lt;/em&gt; readers.&lt;/p&gt;
&lt;h3&gt;Bound 3 -- The key-binding root limits the protection ceiling&lt;/h3&gt;
&lt;p&gt;The third bound is the cleanest restatement of the article&apos;s thesis. No layer can be stronger than its root.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;EFS&lt;/em&gt;. The root is the user&apos;s logon secret, via classic DPAPI. The Wikipedia EFS article states the ceiling: &lt;em&gt;&quot;In Windows 2000, XP or later, the user&apos;s RSA private key is encrypted using a hash of the user&apos;s NTLM password hash plus the user name ... any compromise of the user&apos;s password automatically leads to access to that data&quot;&lt;/em&gt; [@wikipedia-efs]. EFS cannot be stronger than the user&apos;s password hygiene.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;PDE&lt;/em&gt;. The root is Windows Hello for Business. PDE cannot be stronger than Hello&apos;s own ceiling: TPM-bound asymmetric keys plus user PIN or biometric, with all the assumptions about anti-hammering, TPM attestation, and ARSO-off that the PDE configure page enumerates [@ms-pde-configure].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purview labels&lt;/em&gt;. The root is the Azure Rights Management tenant key, plus Microsoft Entra ID for authorization. The ceiling is Azure Key Vault custodial security plus Entra authorization correctness. DKE raises the ceiling by adding a customer-held key in series with the Azure-held key [@ms-dke], at the cost of blinding Microsoft 365 service-side processing of that content [@ms-dke].&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of the three roots is unconditionally stronger than the others. Each makes a trade-off that is sensible for the threat model it addresses. EFS optimises for &quot;this exact user account, this exact machine, after both have signed on.&quot; PDE optimises for &quot;this Hello-authenticated user, this exact device, even across boot-and-lock.&quot; Purview labels optimise for &quot;this Entra-authenticated user, across organisations, across protocols, across time.&quot; There is no fourth option that is simply &quot;stronger.&quot; There is only the choice of &lt;em&gt;which&lt;/em&gt; root the data is bound to, made deliberately.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Cryptography pushes the trust boundary up but cannot eliminate it. Every layer terminates at &quot;the application has the plaintext and the application can do anything.&quot; What changes between layers is &lt;em&gt;where&lt;/em&gt; that boundary sits, not whether it exists.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Theoretically impossible&lt;/th&gt;
&lt;th&gt;Current best on Windows&lt;/th&gt;
&lt;th&gt;Remaining gap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Per-process gating&lt;/td&gt;
&lt;td&gt;No (with attestation, e.g., LSAIso)&lt;/td&gt;
&lt;td&gt;Credential Guard / LSAIso for credentials; not extended to user files&lt;/td&gt;
&lt;td&gt;No file-encryption layer gates at app identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorised-reader exfiltration&lt;/td&gt;
&lt;td&gt;Yes (analog hole)&lt;/td&gt;
&lt;td&gt;RMS &quot;best effort&quot; policy enforcement [@wikipedia-adrms]&lt;/td&gt;
&lt;td&gt;Cannot be closed by cipher; closed only by hardware DRM / endpoint controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pre-logon file protection&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;PDE L1 [@ms-pde-announcement]&lt;/td&gt;
&lt;td&gt;Limited to known folders, Hello, Entra-join, 24H2+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-tenant per-content protection&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Purview labels via Azure RMS [@ms-purview-labels]&lt;/td&gt;
&lt;td&gt;Cross-tenant policy and revocation are per-tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Those are the structural limits. The operational limits -- the things Microsoft has not yet shipped a fix for -- are different. Let&apos;s look at those next.&lt;/p&gt;
&lt;h2&gt;9. Open Problems Microsoft Has Not Yet Shipped&lt;/h2&gt;
&lt;p&gt;Seven live operational problems. None of them is academic. Each is a question your CISO is asking, and none of them has a Microsoft-shipped answer as of May 2026.&lt;/p&gt;
&lt;h3&gt;1. PDE has no DRA-equivalent&lt;/h3&gt;
&lt;p&gt;EFS has a Data Recovery Agent. BitLocker has recovery-key escrow to Active Directory, Entra ID, a Microsoft account, or a printout. Purview has tenant-key escrow and a super-user role. PDE has none of these. The PDE FAQ does not equivocate: &lt;em&gt;&quot;Personal Data Encryption doesn&apos;t have a requirement for a backup provider, including OneDrive in Microsoft 365. However, backups are recommended in case the keys used by Personal Data Encryption to protect files are lost&quot;&lt;/em&gt; [@ms-pde-faq]. &quot;Backups&quot; here means a second copy of the plaintext, made before the keys were lost; it is not key recovery. A user whose Hello credential is irrecoverably reset, and who had no second copy at the time, has unreadable files.&lt;/p&gt;
&lt;h3&gt;2. EFS in an Entra-only world&lt;/h3&gt;
&lt;p&gt;The DRA story works because Group Policy in a classic Active Directory deployment can push a recovery-agent certificate to every machine. In an Entra-joined-only environment, there is no equivalent shipped configuration. The EFS Win32 reference still documents EFS [@ms-efs-win32]; what it does not document is &quot;how to maintain an organisational EFS DRA on a fleet of Entra-joined-only devices in 2026.&quot; The migration path -- whether the answer is &quot;stop using EFS for new files and move to PDE&quot; (which the PDE FAQ implies [@ms-pde-faq]) or &quot;configure DRA via Intune&quot; (which is not a documented Intune-shipped flow) -- is not in Microsoft Learn.&lt;/p&gt;
&lt;h3&gt;3. Cross-tenant sensitivity-label collaboration&lt;/h3&gt;
&lt;p&gt;Cross-organisation sharing of Purview-encrypted content works for documents emailed or shared with a recipient whose tenant is configured to accept the policy [@ms-azure-rms]. Cross-organisation revocation is harder. A use license issued to an external recipient is bound to the issuing tenant&apos;s RMS service; revoking the recipient&apos;s access requires the issuing tenant to act, not the recipient&apos;s. Cross-tenant collaboration policies need explicit configuration, and revocation is per-tenant, not per-policy [@ms-purview-labels]. CISOs running federation-heavy programmes ask about this every week; the answer is &quot;configure explicitly, audit explicitly, accept that the recipient tenant has its own controls.&quot;&lt;/p&gt;
&lt;h3&gt;4. PDE composition with Windows Recall&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://paragmali.com/blog/microsoft-recall-2024-2026-re-architecture/&quot; rel=&quot;noopener&quot;&gt;Windows Recall&lt;/a&gt; (the AI-driven on-device timeline of screenshots and OCR text, shipping under Copilot+ PC programmes) introduces a new question for PDE: when Recall captures a screenshot of a PDE-protected document open on screen, does the resulting Recall snapshot inherit PDE protection, or is it merely VBS-enclave-protected? Microsoft&apos;s Recall documentation describes the VBS-enclave protection model and a separate set of opt-outs for &quot;sensitive content&quot;; what is &lt;em&gt;not&lt;/em&gt; documented is whether a Recall snapshot of a PDE-protected file is itself a PDE-protected file. This is a live design question.&lt;/p&gt;
&lt;h3&gt;5. DPAPI-NG protector revocation at Hello rotation&lt;/h3&gt;
&lt;p&gt;If a user enrols a new device into Entra ID, the Hello credential on that new device is a different credential -- a fresh asymmetric key in the new device&apos;s TPM, attested at a fresh enrolment event. PDE files encrypted under the &lt;em&gt;old&lt;/em&gt; device&apos;s Hello protector cannot be unwrapped on the new device, unless a recovery mechanism re-issues the wrap. There is no shipped recovery mechanism (see problem 1 above), so the question is operational: what does the user do with PDE files synced via OneDrive -- which sees plaintext, per the PDE FAQ [@ms-pde-faq] -- when they move to a new device? The answer is &quot;OneDrive re-encrypts them under the new device&apos;s Hello on first access, because OneDrive saw plaintext.&quot; That works, and it tells you something about how thin PDE&apos;s &quot;encryption that travels&quot; story is.&lt;/p&gt;
&lt;h3&gt;6. Per-process cryptographic gating&lt;/h3&gt;
&lt;p&gt;None of the four layers gates at the &lt;em&gt;application&lt;/em&gt; identity. EFS, PDE, Purview labels all release plaintext to any process running as the authorised user (or any process holding a valid use license, in Purview&apos;s case). The CISO question that has no answer in the file-encryption stack today is &lt;em&gt;&quot;can I keep ransomware running as Alice from encrypting Alice&apos;s labelled files?&quot;&lt;/em&gt; Credential Guard and LSAIso show that per-process gating with attestation is technically feasible for credentials; nothing in the file-encryption layers extends that mechanism to user files. This is the single most asked open question in the working-architect audience.&lt;/p&gt;
&lt;h3&gt;7. Cipher-mode modernisation&lt;/h3&gt;
&lt;p&gt;PDE&apos;s choice of AES-CBC is deliberate, but it is also old. AEAD modes -- GCM, OCB3, ChaCha20-Poly1305 -- bundle integrity and confidentiality together; CBC does not. PDE composed with BitLocker XTS-AES is acceptable in practice [@wikipedia-bitlocker], but the PDE layer in isolation has no integrity guarantee. Whether Microsoft will modernise the PDE cipher in a future Windows release (and what the file-format compatibility story would look like if they did) is unanswered as of May 2026.&lt;/p&gt;
&lt;p&gt;Those are the open problems. The article&apos;s last sections turn from research into action: how does a working architect actually use these layers?&lt;/p&gt;
&lt;h2&gt;10. Composing the Layers: A Practical Guide&lt;/h2&gt;
&lt;p&gt;A decision tree. Then the common implementation pitfalls. Then an audit checklist for the layered architecture you should be aiming for.&lt;/p&gt;
&lt;h3&gt;The decision tree&lt;/h3&gt;

flowchart TD
    H[NTFS on hardware]
    BL[BitLocker XTS-AES, TPM+PIN protector]
    PDE_KF[PDE known folders: Desktop, Documents, Pictures]
    EFS_Legacy[EFS legacy files only, no new EFS]
    Purview[Purview sensitivity labels with encryption]
    Apps[Office, Outlook, OneDrive sync clients]
    H --&amp;gt; BL
    BL --&amp;gt; PDE_KF
    BL --&amp;gt; EFS_Legacy
    PDE_KF --&amp;gt; Apps
    EFS_Legacy --&amp;gt; Apps
    Purview --&amp;gt; Apps
&lt;p&gt;The decision tree, walked once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Need to protect the volume at rest, against a powered-off-device thief?&lt;/em&gt; BitLocker. Configure TPM+PIN protector to close the post-boot pre-logon gap at the boot layer where you can.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Need to protect per-user on a shared device, including the post-boot pre-logon window?&lt;/em&gt; PDE, on Windows 11 22H2 or later, with Entra-join, Hello, ARSO disabled. For Windows 11 24H2, prefer the known-folder mode (Desktop, Documents, Pictures auto-encrypted).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Have legacy &lt;code&gt;$EFS&lt;/code&gt; files inherited from a previous Windows generation?&lt;/em&gt; Leave EFS for those legacy files; do not encrypt new files with EFS on devices that can run PDE. Choose PDE or EFS per file, not both (mutual exclusion; §3).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Need protection that travels with the file across machines, tenants, and protocols?&lt;/em&gt; Purview sensitivity labels with encryption settings. Use Microsoft-managed tenant keys by default; BYOK for tenants that need customer-controlled keys; DKE for the ~5% of crown-jewel content where Microsoft 365 service-side processing must be blinded [@ms-dke].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;All of the above, on the same file, on a modern Entra-joined Windows 11 24H2 Enterprise device?&lt;/em&gt; Yes. BitLocker + PDE-known-folders + Purview label is the modern default. EFS is the legacy slot.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For most Entra-joined Windows 11 24H2 deployments: BitLocker (TPM+PIN) under PDE (known-folder mode) under Purview sensitivity labels. EFS legacy only. The three above-BitLocker layers compose; the four roots stay distinct; the threat coverage adds up. Nothing in this composition needs DKE -- save DKE for the ~5% of content where Copilot blinding is desired.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Common implementation pitfalls&lt;/h3&gt;
&lt;p&gt;Seven pitfalls, in order from &quot;easy to miss&quot; to &quot;easy to misdiagnose.&quot;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Forgetting to disable ARSO before enabling PDE&lt;/em&gt;. Microsoft Learn states the constraint twice: &lt;em&gt;&quot;Automatic Restart Sign On (ARSO) must be disabled&quot;&lt;/em&gt; [@ms-pde-overview] and &lt;em&gt;&quot;To use Personal Data Encryption, ARSO must be disabled&quot;&lt;/em&gt; [@ms-pde-configure]. Enabling &lt;code&gt;EnablePersonalDataEncryption=1&lt;/code&gt; while ARSO is still on does not produce a clean error.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Expecting &lt;code&gt;EnablePersonalDataEncryption=1&lt;/code&gt; to migrate existing files&lt;/em&gt;. It does not. The CSP value enables the API surface (and, on 24H2, the known-folder protection). Files that existed before PDE was enabled are not automatically wrapped. Plan a separate migration pass.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Letting kernel-mode crash dumps or hibernation expose PDE keys&lt;/em&gt;. Microsoft&apos;s PDE configure page is explicit: &lt;em&gt;&quot;Kernel-mode crash dumps and live dumps can potentially cause the keys used by Personal Data Encryption to protect content to be exposed&quot;&lt;/em&gt; and &lt;em&gt;&quot;Hibernation files can potentially cause the keys used by Personal Data Encryption to protect content to be exposed&quot;&lt;/em&gt; [@ms-pde-configure]. Configure dump policy alongside PDE; do not deploy PDE on devices that produce kernel-mode dumps to untrusted destinations.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Assuming OneDrive sync preserves PDE protection in the cloud&lt;/em&gt;. It does not. The PDE FAQ states it plainly: &lt;em&gt;&quot;Personal Data Encryption&apos;s encryption only applies to local data saved to the disk. Applications accessing the files, including OneDrive when it syncs data, get cleartext data&quot;&lt;/em&gt; [@ms-pde-faq]. Cloud-side protection is the labelling layer&apos;s job, not PDE&apos;s.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Deploying DKE everywhere&lt;/em&gt;. DKE breaks Microsoft 365 server-side service integration -- search, eDiscovery, transport rules, Copilot -- because Microsoft cannot decrypt content at rest. Microsoft Learn says it: &lt;em&gt;&quot;DKE encrypted data isn&apos;t accessible at rest to Microsoft 365 services including Copilot&quot;&lt;/em&gt; [@ms-dke]. DKE is for the ~5% of content explicitly scoped that way; deploying it more broadly produces a tenant where every server-side feature degrades.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Trying to use PDE over RDP&lt;/em&gt;. &lt;em&gt;&quot;No, it&apos;s not supported to access protected content over RDP&quot;&lt;/em&gt; [@ms-pde-faq]. PDE binds to local Hello sign-in; a remote desktop session is not that.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Treating EFS as a current-generation solution on new devices&lt;/em&gt;. The Microsoft replacement for new per-file scenarios is PDE [@ms-pde-faq]. Leaving EFS in place for legacy files is fine; encrypting new files with EFS on a device that could run PDE is not the recommended path.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Audit checklist&lt;/h3&gt;
&lt;p&gt;Five commands and CSP queries that establish where each layer actually stands on a given device.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;BitLocker&lt;/em&gt;. Run &lt;code&gt;manage-bde -status&lt;/code&gt; (PowerShell, elevated). Look at the protection status, encryption method (XTS-AES 128 or 256), and key protectors. A TPM+PIN protector closes the pre-logon gap at the volume layer.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;EFS&lt;/em&gt;. Run &lt;code&gt;cipher.exe /C &amp;lt;file&amp;gt;&lt;/code&gt; to inspect the EFS attribute on a given file -- it prints the user SIDs and DRA SIDs that hold wrappers. Run &lt;code&gt;cipher.exe /U /N&lt;/code&gt; to enumerate every encrypted file on the volume without changing anything. The output tells you whether legacy EFS state actually exists.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;PDE -- top-level enablement&lt;/em&gt;. Query the CSP node &lt;code&gt;./User/Vendor/MSFT/PDE/EnablePersonalDataEncryption&lt;/code&gt;. A value of 1 means the PDE API surface is on; 0 (or absent) means it is off [@ms-pde-csp].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;PDE -- known folders&lt;/em&gt;. Query &lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectDesktop&lt;/code&gt;, &lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectDocuments&lt;/code&gt;, &lt;code&gt;./User/Vendor/MSFT/PDE/ProtectFolders/ProtectPictures&lt;/code&gt;. Note the &lt;code&gt;ProtectFolders&lt;/code&gt; parent node; the un-nested form will return nothing [@ms-pde-csp].&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Purview labels&lt;/em&gt;. From Exchange Online PowerShell (after &lt;code&gt;Connect-IPPSSession&lt;/code&gt;), &lt;code&gt;Get-Label&lt;/code&gt; enumerates the sensitivity labels published in the tenant, including their encryption settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &quot;what BitLocker on its own buys you&quot; table closes the audit out:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;BitLocker alone&lt;/th&gt;
&lt;th&gt;EFS adds&lt;/th&gt;
&lt;th&gt;PDE adds&lt;/th&gt;
&lt;th&gt;Purview label adds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Powered-off device at rest&lt;/td&gt;
&lt;td&gt;Protected&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device on lock screen, post-boot pre-logon&lt;/td&gt;
&lt;td&gt;Plaintext to OS&lt;/td&gt;
&lt;td&gt;Plaintext (no logon)&lt;/td&gt;
&lt;td&gt;Encrypted, Hello-bound&lt;/td&gt;
&lt;td&gt;Encrypted, requires use license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-user on the same device&lt;/td&gt;
&lt;td&gt;Plaintext to OS&lt;/td&gt;
&lt;td&gt;Per-user wrapping&lt;/td&gt;
&lt;td&gt;Per-Hello-user wrapping&lt;/td&gt;
&lt;td&gt;Per-policy wrapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File emailed outside the tenant&lt;/td&gt;
&lt;td&gt;Plaintext&lt;/td&gt;
&lt;td&gt;Decrypted on SMB / cross-FS copy&lt;/td&gt;
&lt;td&gt;Plaintext on cross-protocol egress&lt;/td&gt;
&lt;td&gt;Encrypted, travels with file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

The four layers map (loosely; this is not a regulatory opinion) to different regulatory expectations. BitLocker is the typical anchor for &quot;data at rest&quot; baselines in HIPAA, PCI DSS, and GDPR Article 32 (security of processing). Purview labels are where cross-organisation handling and Article 30 records-of-processing find a tractable enforcement story, because the policy travels with the data. PDE is the modern interpretation of &quot;user-bound access&quot; for shared devices and pre-logon scenarios. None of these regulatory frameworks names any specific layer; the practitioner&apos;s job is to map controls to expectations, not to ship a checklist of vendor features.
&lt;p&gt;{`
// Illustrative composition check. Given the per-layer status flags this device
// reports, identify which protection gaps remain. Run mentally over your device.&lt;/p&gt;
&lt;p&gt;function evaluateLayerCoverage(state) {
  const gaps = [];&lt;/p&gt;
&lt;p&gt;  if (!state.bitlockerEnabled) {
    gaps.push(&apos;BitLocker is OFF: volume is plaintext at rest&apos;);
  } else if (!state.bitlockerHasPIN) {
    gaps.push(&apos;BitLocker is on, but TPM-only: post-boot pre-logon window is open&apos;);
  }&lt;/p&gt;
&lt;p&gt;  if (!state.pdeEnabled) {
    gaps.push(&apos;PDE is OFF: per-user pre-logon and post-lock window not closed&apos;);
  } else if (!state.pdeKnownFoldersOn) {
    gaps.push(&apos;PDE enabled but no known-folder protection: user files not auto-encrypted&apos;);
  }&lt;/p&gt;
&lt;p&gt;  if (state.pdeEnabled &amp;amp;&amp;amp; state.efsLegacyFilesPresent) {
    gaps.push(&apos;Legacy EFS files coexist with PDE: mutually exclusive per file, migrate carefully&apos;);
  }&lt;/p&gt;
&lt;p&gt;  if (!state.purviewLabelsPublished) {
    gaps.push(&apos;No Purview labels published: no travels-with-file protection&apos;);
  }&lt;/p&gt;
&lt;p&gt;  if (state.dkeEverywhere) {
    gaps.push(&apos;DKE applied broadly: Microsoft 365 service-side processing will degrade&apos;);
  }&lt;/p&gt;
&lt;p&gt;  return gaps.length === 0
    ? &apos;Composition complete: all four layers configured with no obvious conflicts.&apos;
    : gaps;
}&lt;/p&gt;
&lt;p&gt;// Example: a modern Entra-joined Windows 11 24H2 Enterprise device with proper config.
const exampleDevice = {
  bitlockerEnabled: true,
  bitlockerHasPIN: true,
  pdeEnabled: true,
  pdeKnownFoldersOn: true,
  efsLegacyFilesPresent: false,
  purviewLabelsPublished: true,
  dkeEverywhere: false
};
console.log(evaluateLayerCoverage(exampleDevice));
`}&lt;/p&gt;

PowerShell (elevated) on the target device:&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;manage-bde -status C:
cipher.exe /C &quot;C:\Users\alice\Documents\sample.txt&quot;
# CSP queries via the Settings &amp;gt; Accounts &amp;gt; Access work or school export, or via
# the Intune CSP report for the device, against the nodes listed above.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;From an Exchange Online PowerShell session:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Connect-IPPSSession
Get-Label | Format-Table -AutoSize
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Composed correctly, those layers give you the threat coverage no single layer can. But the practitioner still has questions.&lt;/p&gt;
&lt;h2&gt;11. Frequently Asked Questions&lt;/h2&gt;
&lt;p&gt;Five questions. Each addresses a misconception or operational concern the audit checklist exposes.&lt;/p&gt;

No. The two recovery models do not compose. BitLocker&apos;s recovery key unwraps the Volume Master Key against the TPM&apos;s seal; once the volume is unlocked, every plain NTFS file is readable again. PDE files sit *above* the volume layer, sealed by a DPAPI-NG protector bound to Windows Hello, not to the VMK. The PDE FAQ is explicit that PDE has no key-recovery model analogous to BitLocker&apos;s: *&quot;Personal Data Encryption doesn&apos;t have a requirement for a backup provider, including OneDrive in Microsoft 365. However, backups are recommended in case the keys used by Personal Data Encryption to protect files are lost&quot;* [@ms-pde-faq]. If the user&apos;s Hello credential is irrecoverably reset and there is no second-copy backup of the plaintext, BitLocker recovery does not help.

No -- not directly. EFS files are encrypted with a per-file symmetric File Encryption Key (FEK), which is RSA-wrapped to the user&apos;s EFS public key (and to one or more Data Recovery Agent public keys). The user&apos;s EFS RSA *private* key is stored in `%APPDATA%\Microsoft\Crypto\RSA\\` and is sealed by classic DPAPI from the user&apos;s logon secret [@wikipedia-efs]. So the password protects the *private key that unwraps the FEK*, not the file body. The Wikipedia EFS article puts the resulting ceiling sharply: any compromise of the user&apos;s password automatically leads to access to that data [@wikipedia-efs].

Partially. On Entra-joined Windows 11 22H2 or later devices with Windows Hello for Business, PDE is the recommended replacement for new per-file encryption scenarios, and Microsoft Learn states the mutual exclusion: PDE and EFS are mutually exclusive on the same file [@ms-pde-faq]. EFS continues to ship -- legacy `$EFS` files still decrypt, the Win32 API surface still works, Group Policy DRA configuration still functions [@ms-efs-win32]. PDE is the forward direction; EFS is the legacy slot. Plan for both during transition.

Labels are metadata. A *label that applies encryption* is metadata that triggers the Azure Rights Management service to encrypt the file with a per-content key and embed the wrapped key and policy reference in the file&apos;s wire format [@ms-purview-labels]. A label that applies only marking, watermarking, or DLP triggers is policy without encryption. The label itself is a classification; the encryption (if any) is a property attached to the label&apos;s settings.

Yes, with one caveat. The default modern composition for an Entra-joined Windows 11 24H2 Enterprise device is BitLocker (TPM+PIN) plus PDE (known-folder mode) plus a Purview sensitivity label that applies encryption [@ms-pde-faq] [@ms-purview-labels]. The caveat is the PDE / EFS mutual exclusion -- a given file is either PDE-wrapped or EFS-wrapped, not both [@ms-pde-faq]. So the rule is: BitLocker + (PDE OR EFS, mutually exclusive) + Purview label. That is the maximum legal composition.
&lt;p&gt;The answer the article opened with was the journey, not the destination. The destination is one sentence: three above-BitLocker layers, three protection-key roots, three threat models, by design. EFS exists because some files have to be unreadable to a different person sitting at the keyboard. PDE exists because some files have to be unreadable to the running OS itself, between boot and Hello sign-in. Purview labels exist because some files have to stay encrypted no matter which machine or protocol carries them next.&lt;/p&gt;
&lt;p&gt;When you next see a security document that asserts &quot;the data is protected because BitLocker is on,&quot; you now know exactly which threats that covers, and which it does not. The four roots compose. They do not compete. The asymmetry -- the very thing that makes the architecture look untidy from a distance -- is what lets each layer do what no other layer can.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;beyond-bitlocker-efs-pde-purview&quot; keyTerms={[
  { term: &quot;FEK&quot;, definition: &quot;File Encryption Key. The per-file symmetric key EFS uses to encrypt the file body; itself RSA-wrapped to each authorised principal.&quot; },
  { term: &quot;DRA&quot;, definition: &quot;Data Recovery Agent. A second principal whose public key is wrapped around the EFS FEK so the organisation can decrypt the file even if the user is unavailable.&quot; },
  { term: &quot;VMK&quot;, definition: &quot;Volume Master Key. The BitLocker key-encrypting key wrapping the Full Volume Encryption Key; sealed in the TPM against PCRs.&quot; },
  { term: &quot;CEK&quot;, definition: &quot;Content Encryption Key. The per-content symmetric key used by Azure Rights Management to encrypt a Purview-labelled document; embedded in the document, wrapped by the tenant root key.&quot; },
  { term: &quot;Use license&quot;, definition: &quot;A short-lived authorization artifact issued by Azure RMS to a specific authenticated user, granting decryption and policy-defined rights for a particular protected document.&quot; },
  { term: &quot;Protection descriptor&quot;, definition: &quot;The DPAPI-NG rule string that names the principal whose authentication will be required to unwrap a protected blob; supports SID, SDDL, LOCAL, WEBCREDENTIALS, and CERTIFICATE principal types.&quot; },
  { term: &quot;DKE&quot;, definition: &quot;Double Key Encryption. A two-key model in which Purview-protected content requires both an Azure-held key and a customer-on-premises-held key to decrypt; blinds Microsoft 365 service-side processing.&quot; },
  { term: &quot;classic DPAPI&quot;, definition: &quot;The original Windows Data Protection API; per-user wrapping derived from the user&apos;s logon secret. EFS depends on classic DPAPI to seal the user&apos;s EFS RSA private key.&quot; },
  { term: &quot;DPAPI-NG&quot;, definition: &quot;The Windows 8+ Data Protection API extension that supports cross-machine and identity-aware protectors via protection descriptors; PDE is built on this surface.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>windows-security</category><category>bitlocker</category><category>encryption</category><category>personal-data-encryption</category><category>microsoft-purview</category><category>encrypting-file-system</category><category>dpapi</category><category>sensitivity-labels</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>BitUnlocker: When Microsoft&apos;s Recovery Environment Becomes the Master Key</title><link>https://paragmali.com/blog/bitunlocker-when-microsofts-recovery-environment-becomes-the/</link><guid isPermaLink="true">https://paragmali.com/blog/bitunlocker-when-microsofts-recovery-environment-becomes-the/</guid><description>In July 2025, Microsoft&apos;s internal red team chained four CVEs in WinRE to bypass TPM-only BitLocker in under five minutes -- and the structural lesson is older than Windows 11.</description><pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate><content:encoded>
**In July 2025, Microsoft&apos;s own internal red team disclosed a four-CVE chain called BitUnlocker that bypasses TPM-only BitLocker in under five minutes from a USB stick, regardless of whether the device uses a discrete TPM, fTPM, or Pluton.** The attack works because the Windows Recovery Environment is given the BitLocker auto-unlock state legitimately during repair operations, and STORM found four parsers inside that trust boundary whose flaws let an attacker *be* the recovery environment. Patches shipped in KB5062553, but until the Secure Boot revocation infrastructure removes the pre-patch boot manager from the trust set, the chain remains exploitable on most fielded Windows 11 devices. The only mitigation that changes the threat model independently of patch state is the same recommendation Microsoft has been making since Vista: enable a pre-boot PIN.
&lt;h2&gt;1. Hold Shift, click Restart, lose your disk&lt;/h2&gt;
&lt;p&gt;Hold Shift. Click Restart. Plug in a USB stick carrying a pre-patch boot manager [@ms-winre-ref] [@garatc-poc]. Under five minutes later, on any device whose Secure Boot trust set still includes the 2011 root, the encrypted drive that protected your laptop is mounted in plaintext. No PIN ever entered. The &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM&lt;/a&gt; none the wiser. The researchers who showed how to do this work at Microsoft.&lt;/p&gt;
&lt;p&gt;This is not a hypothetical. The proof of concept is on GitHub [@garatc-poc]. The end-to-end attack takes less than five minutes against a fully patched Windows 11 device that has not yet deployed the &lt;a href=&quot;https://paragmali.com/blog/secure-boot-in-windows-the-chain-from-sector-zero-to-userini/&quot; rel=&quot;noopener&quot;&gt;Secure Boot&lt;/a&gt; revocation infrastructure -- which is to say, most of them.&lt;/p&gt;
&lt;p&gt;The attack is called BitUnlocker. It is a four-CVE chain disclosed and patched by Microsoft on July 8, 2025 in cumulative update KB5062553 [@kb5062553], then presented to the public a month later at Black Hat USA 2025 and DEF CON 33 with a Microsoft Security Blog write-up published August 13 to 14, 2025 [@ms-bitunlocker]. The four vulnerabilities are CVE-2025-48804 (System Deployment Image parsing) [@nvd-cve-2025-48804], CVE-2025-48800 (&lt;code&gt;tttracer.exe&lt;/code&gt; offline scanning) [@nvd-cve-2025-48800], CVE-2025-48003 (&lt;code&gt;SetupPlatform.exe&lt;/code&gt; and a Shift+F10 hotkey) [@nvd-cve-2025-48003], and CVE-2025-48818 (Boot Configuration Data target-OS impersonation) [@nvd-cve-2025-48818].&lt;/p&gt;
&lt;p&gt;The researchers are Netanel Ben Simon and Alon Leviev of STORM, Microsoft&apos;s internal red team [@itnews-bitunlocker]. Leviev is the same researcher who disclosed &lt;a href=&quot;https://paragmali.com/blog/windows-downdate-when-the-update-itself-is-the-attack/&quot; rel=&quot;noopener&quot;&gt;Windows Downdate&lt;/a&gt; at Black Hat USA 2024 [@safebreach-downdate], so the line of work has provenance: a Microsoft engineer who understands the Windows update pipeline well enough to undo it, now turned on the recovery pipeline that runs when the update pipeline fails.&lt;/p&gt;
&lt;p&gt;A five-minute physical bypass against BitLocker is not a research curiosity in 2026. ShrinkLocker, the BitLocker-as-ransomware-payload family disclosed by Kaspersky in May 2024, was used to extort organisations in Mexico, Indonesia, and Jordan [@kaspersky-shrinklocker]. APT41 paired ProxyLogon access with BitLocker as the workstation-encryption layer of a 2021 ransomware operation [@cymulate-apt41]. Romania&apos;s national water authority lost about 1,000 systems to a BitLocker-based ransomware incident over a December 2025 weekend [@therecord-romania-water]. BitLocker&apos;s installed base is where the defensive stakes live. BitUnlocker is what the offensive stakes look like.&lt;/p&gt;
&lt;p&gt;STORM stands for &lt;em&gt;Security Testing and Offensive Research at Microsoft&lt;/em&gt; [@itnews-bitunlocker]. It is the internal red team that publishes coordinated disclosures against Microsoft&apos;s own products.&lt;/p&gt;

The default BitLocker configuration on Windows 11 consumer and most enterprise installs. The Trusted Platform Module releases the Volume Master Key automatically at boot when the Platform Configuration Registers match an expected profile, with no human interaction. There is no pre-boot PIN, no startup key, no challenge -- the only authentication is the boot chain&apos;s measurement.
&lt;p&gt;The pre-boot PIN configuration -- TPM+PIN, in Microsoft&apos;s terminology -- defeats every attack in this article, including BitUnlocker. Microsoft has been recommending TPM+PIN in some form since BitLocker shipped with Windows Vista on its January 30, 2007 consumer general-availability date [@ms-bitlocker-countermeasures] [@ms-vista-launch]. Eighteen years later, that recommendation has not changed.&lt;/p&gt;
&lt;p&gt;What has changed is the consequence of ignoring it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; TPM-only BitLocker assumes the boot chain is trustworthy. The boot chain has been the dominant BitLocker attack surface for three years and counting. The Windows Recovery Environment is part of the boot chain.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The July 8, 2025 patches close the four code paths inside WinRE. They do not, by themselves, revoke the pre-patch boot manager that BitUnlocker downgrades to. Until the Secure Boot revocation under KB5025885 (the &quot;REVISE&quot; rollout) is deployed on a device, the BitUnlocker entry vector remains usable [@neodyme-bitpixie-no-fix] [@kb5025885].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To understand why a four-CVE chain inside the recovery environment is enough to mount the entire encrypted volume in plaintext, we have to go back to a design decision Microsoft made in 2006. That decision is still shipping in every copy of Windows.&lt;/p&gt;
&lt;h2&gt;2. Why the recovery environment has the keys&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/&quot; rel=&quot;noopener&quot;&gt;BitLocker&lt;/a&gt; shipped with Windows Vista on its consumer general-availability date, January 30, 2007 [@ms-bitlocker-countermeasures] [@ms-vista-launch]. Niels Ferguson&apos;s August 2006 cipher specification described the cryptographic core -- AES in CBC mode plus a custom diffuser called Elephant, designed to resist exactly the kind of disk-sector chosen-plaintext games that an attacker with full-disk read/write access could otherwise play [@ms-ferguson-cipher] [@archive-ferguson]. Four protector modes shipped with Vista: TPM-only, TPM+PIN, TPM plus a USB startup key, and TPM plus startup key plus PIN [@ms-bitlocker-countermeasures]. Each successive mode added a pre-boot human-presence check that the TPM-only default deliberately omitted.&lt;/p&gt;
&lt;p&gt;The cipher specification is the public part of the design. The part that mattered for the rest of the story is the part that is barely documented at all: how recovery works.&lt;/p&gt;

The key-encrypting key that wraps the Full Volume Encryption Key. When a user changes their password or recovery configuration, only the VMK wrapping changes -- the entire volume does not need re-encryption. The TPM seals the VMK to a profile of boot-time measurements.

The symmetric key that encrypts each sector of the BitLocker-protected volume. The FVEK is never directly handled by the user; it sits behind the VMK and is rewrapped only during operations like algorithm change or full re-encryption.

A small bootable image, based on Windows PE, that the boot manager hands off to when normal Windows fails. WinRE provides Push Button Reset, Startup Repair, System Image Recovery, Reset This PC, and the offline scanning tools that the rest of this article will treat as a trust boundary [@ms-winre-ref].
&lt;p&gt;The recovery problem Microsoft was solving in 2006 was unromantic but unavoidable. If full-disk encryption is to be default-on for an operating system that ships on a billion devices, the recovery environment has to read the OS volume during a repair pass without re-prompting the user for a recovery key every time a Windows update hiccups. The 24x7 help desk for a Fortune 500 cannot dispatch a forty-eight-character recovery key to every user whose system needs Startup Repair. So the Windows boot manager passes the unlock state along to &lt;a href=&quot;https://paragmali.com/blog/the-day-85-million-devices-couldnt-boot----and-how-microsoft/&quot; rel=&quot;noopener&quot;&gt;WinRE&lt;/a&gt;, which inherits the ability to mount the encrypted volume during legitimate recovery operations [@ms-winre-ref].&lt;/p&gt;
&lt;p&gt;The behavior is documented in every WinRE technical reference Microsoft has shipped since Vista. The &lt;em&gt;rationale&lt;/em&gt; -- the original engineering memo about why auto-unlock is the right answer, given the help-desk requirement -- is not public. That gap matters because the rationale is the load-bearing wall of the threat model. The choice is consistent with every Microsoft document about WinRE; the engineering decision itself is folk knowledge.&lt;/p&gt;

The trade-off that runs through this entire article is simple to state. If the recovery environment can mount the volume without user input, the recovery environment is part of the encryption&apos;s trust boundary. If the recovery environment requires user authentication on every entry, you have effectively re-implemented the pre-boot PIN -- you have just moved its name. Microsoft picked the first option in 2006 because the second option breaks help-desk recoverability. Eighteen years later, that is still the choice. BitUnlocker is what the bill looks like.
&lt;p&gt;Windows 8 removed the Elephant diffuser but kept AES-CBC alone. XTS-AES did not become BitLocker&apos;s default for new fixed drives until Windows 10 v1511 in November 2015 [@ms-bitlocker-configure]. The two-key VMK/FVEK hierarchy survived every cipher transition. So did WinRE&apos;s auto-unlock behavior.&lt;/p&gt;
&lt;p&gt;Twenty months after Vista shipped, a Princeton research group would discover that &quot;powered off&quot; did not actually mean &quot;key gone.&quot; The published attack literature against BitLocker was about to begin.&lt;/p&gt;
&lt;h2&gt;3. Eighteen years, six generations, one recommendation&lt;/h2&gt;
&lt;p&gt;The first attack specifically demonstrated against BitLocker as the named target appeared in 2008, the year after Vista&apos;s general availability -- though earlier generic memory primitives like FireWire DMA (Ruxcon 2006) became applicable to BitLocker as soon as Vista shipped. The most recent pre-2022 BitLocker bypass appeared in February 2024, when a four-dollar microcontroller pulled the keys off a Lenovo ThinkPad in 43 seconds [@hackaday-pico]. Between those two endpoints sit six attack generations. Each one moved one layer up the trust stack. Each one was answered by Microsoft with the same operational recommendation.&lt;/p&gt;

gantt
    title BitLocker bypass generations, 2006-2025
    dateFormat YYYY-MM
    axisFormat %Y&lt;pre&gt;&lt;code&gt;section Hardware-adjacent
Cold boot (Halderman et al)        :2008-07, 60d
FireWire/PCI DMA (Boileau, Inception) :2006-10, 1825d
TPM bus sniff (marcan, Andzakovic)   :2019-01, 365d
Pi Pico TPM sniff (StackSmashing)    :2024-02, 30d
TPM+PIN bus bypass (SCRT, Compass)   :2024-02, 270d

section Software boot chain
Stoned, Vbootkit 2                   :2009-07, 90d
Self-Encrypting Deception (Meijer)   :2018-11, 180d
Bitpixie discovery (Rairii)          :2022-08, 30d
Bitpixie disclosure (CVE-2023-21563) :2023-02, 30d
BlackLotus (CVE-2022-21894)          :2023-03, 90d
BitUnlocker (KB5062553)              :2025-07, 60d

section Paradigms
Evil Maid framing (Rutkowska)        :2009-10, 30d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The structural reading of that timeline matters more than any individual entry, so here is the layer-by-layer walk:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 1 -- Cold boot (2008).&lt;/strong&gt; J. Alex Halderman and collaborators at Princeton and the EFF showed that DRAM retains its contents for seconds to minutes after power loss, longer if chilled with canned air. The AES key schedule has enough redundancy to be reconstructed from a partial dump, which means a powered-off BitLocker laptop with a still-warm DIMM is not actually at rest [@halderman-coldboot] [@halderman-coldboot-pdf]. Microsoft&apos;s structural answer was the Memory Overwrite Request (MOR) bit [@ms-bitlocker-countermeasures] and the eventual move to DDR generations that lose state faster. The user-facing answer was a pre-boot PIN [@ms-bitlocker-countermeasures].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 2 -- FireWire and PCI DMA (2006 onward).&lt;/strong&gt; Adam Boileau demonstrated at Ruxcon 2006 -- in a talk titled &lt;em&gt;Hit By A Bus: Physical Access Attacks With Firewire&lt;/em&gt; -- that any host with an active FireWire port would let an unauthenticated peripheral read or write physical memory without involving the CPU [@boileau-ruxcon-2006]. Carsten Maartmann-Moe productionised the primitive as Inception, extending it to Thunderbolt, ExpressCard, and any other PCI-bus port that did not gate DMA behind the IOMMU [@inception-readme]. Microsoft&apos;s structural answer accumulated in stages: DMA-related Group Policy controls during the Windows 8.1 era, then a named Kernel DMA Protection feature shipped with Windows 10 1803 -- with the explicit exclusion that 1394 FireWire is not covered by KDP, so the legacy bus has to be disabled in firmware [@ms-kdp]. The user-facing answer was a pre-boot PIN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 3 -- Classical bootkits (2009).&lt;/strong&gt; Peter Kleissner&apos;s Stoned and the Kumar brothers&apos; Vbootkit 2, both presented at Black Hat USA 2009, showed that a Master Boot Record bootkit could load above the BitLocker pre-boot environment, hook the key-release path, and never trip the TPM&apos;s Platform Configuration Registers because nothing had measured the MBR yet [@wack0-taxonomy]. Microsoft&apos;s structural answer was UEFI Secure Boot plus &lt;a href=&quot;https://paragmali.com/blog/measured-boot-the-tcg-event-log-from-srtm-to-pcr-bound-bitlo/&quot; rel=&quot;noopener&quot;&gt;Measured Boot&lt;/a&gt;&apos;s PCR 7, which moved the trust anchor from the MBR into the firmware. The user-facing answer was a pre-boot PIN.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Threat-model rename -- Evil Maid (2009).&lt;/strong&gt; Joanna Rutkowska and Alex Tereshkin published a one-minute USB-stick infector against TrueCrypt that established a threat-model name rather than a primitive [@rutkowska-evilmaid]. Rutkowska&apos;s earlier January 2009 post had already named BitLocker as the disk encryption she missed after moving to macOS [@rutkowska-miss-bitlocker]; her October 2009 follow-up named the category of attacks that everybody now calls Evil Maid. The Microsoft Countermeasures page now uses the same threat-model tier she articulated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 4 -- Self-Encrypting Deception (2018-2019).&lt;/strong&gt; Carlo Meijer and Bernard van Gastel showed at IEEE S&amp;amp;P 2019 that BitLocker had been silently delegating cryptography to the SSD firmware on self-encrypting drives -- and that the firmware was broken across several major vendor families, with Samsung 840/850 EVO and Samsung T3/T5 among the affected lines [@meijer-sed] [@researchr-meijer]. Microsoft&apos;s structural answer (KB4516071) was to stop delegating. This is the rare frontier Microsoft &lt;em&gt;closed&lt;/em&gt; rather than mitigated incrementally: software encryption became the default again, and the &quot;trust the drive&quot; path was retired.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 5 -- TPM bus sniffing (2019-2024).&lt;/strong&gt; On a discrete TPM, the LPC or SPI bus between the CPU and the TPM chip carries the unsealed VMK in cleartext for a few microseconds. Hector Martin (marcan) first demonstrated extraction in January 2019 [@syss-tpm-sniffer]; Denis Andzakovic published the first written technical account later in 2019 [@andzakovic-tpmsniff] [@zdnet-bitlocker-attack] [@wack0-taxonomy]. StackSmashing&apos;s February 2024 Raspberry Pi Pico kit reproduced the same primitive against a Lenovo ThinkPad X1 Carbon for under ten dollars of hardware in 43 seconds of wall clock [@hackaday-pico] [@stacksmashing-pico]. Microsoft&apos;s structural answer was firmware TPM (AMD fTPM, Intel PTT) on modern CPUs and &lt;a href=&quot;https://paragmali.com/blog/pluton-a-tpm-on-silicon-microsoft-can-patch/&quot; rel=&quot;noopener&quot;&gt;Pluton&lt;/a&gt; on Pluton-equipped chipsets [@ms-pluton]. The user-facing answer was a pre-boot PIN.&lt;/p&gt;
&lt;p&gt;The Pi Pico reproduction reduced the hardware cost by an order of magnitude from Andzakovic&apos;s 2019 FPGA setup [@andzakovic-tpmsniff] [@hackaday-pico]. Same primitive; different price point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 5.5 -- TPM+PIN hardware bypass (2024).&lt;/strong&gt; SCRT in Switzerland and Compass Security independently published that even with TPM+PIN configured, the Intermediate Key released after PIN validation still traverses the bus in clear on discrete-TPM hardware [@scrt-tpm-pin] [@compass-2024]. The structural defeat is Pluton, where the bus does not exist on-die [@ms-pluton]. The user-facing answer for everyone else stayed: a pre-boot PIN, plus discrete-TPM replacement or BIOS-level TPM bus protection.&lt;/p&gt;

By default, Microsoft BitLocker protected OS drives can be accessed by sniffing the LPC bus, retrieving the volume master key when it&apos;s returned by the TPM, and using the retrieved VMK to decrypt the protected drive. -- Denis Andzakovic, Pulse Security, 2019 [@andzakovic-tpmsniff]
&lt;p&gt;Six generations. One recommendation. Pre-boot PIN. Microsoft has shipped real structural mitigations -- MOR, IOMMU, Secure Boot, Measured Boot, fTPM, Pluton, dbx revocation -- but the user-facing recommendation has not changed for eighteen years.&lt;/p&gt;
&lt;p&gt;All six generations attack the layer below the boot manager. The boot manager itself, signed by Microsoft, has been treated as the trust anchor. In 2022, the first attack to make the boot manager itself the surface arrived. Its name was Bitpixie, and it is BitUnlocker&apos;s immediate ancestor.&lt;/p&gt;
&lt;h2&gt;4. The boot manager itself becomes the surface (2022-2025)&lt;/h2&gt;
&lt;p&gt;In August 2022, an independent researcher posting under the handle Rairii discovered that the Microsoft-signed Windows boot manager itself had a logic flaw: under a specific PXE soft-reboot sequence, the BitLocker Volume Master Key remained in physical memory and was never zeroed when control transferred [@rairii-mastodon] [@martanne-bitpixie]. The bug was assigned CVE-2023-21563. The patch shipped in the January 10, 2023 Patch Tuesday cumulative [@nvd-cve-2023-21563] [@msrc-cve-2023-21563]; Rairii made the discovery public on Mastodon the following month [@rairii-mastodon]. The old signed binary remained chain-loadable. It still is.&lt;/p&gt;
&lt;p&gt;Thomas Lambertz of Neodyme published the canonical technical write-up of &quot;Bitpixie&quot; in late 2024, then presented the work at 38C3 in December 2024 [@neodyme-bitpixie] [@38c3-bitpixie]. His follow-up post asked an uncomfortable question -- &lt;em&gt;why no fix?&lt;/em&gt; -- and answered it: the patch closed the code path, but the pre-patch boot manager was signed under Microsoft&apos;s Windows Production CA 2011, and that certificate was still in the Secure Boot allow-list (&lt;code&gt;db&lt;/code&gt;) on most fielded Windows devices [@neodyme-bitpixie-no-fix]. A physically present attacker could supply an old, signed, vulnerable copy of &lt;code&gt;bootmgfw.efi&lt;/code&gt; and the firmware would still load it.&lt;/p&gt;

This article uses &quot;REVISE&quot; as a convenience handle for Microsoft&apos;s verbosely-named &quot;Windows Boot Manager revocations for Secure Boot changes associated with CVE-2023-24932&quot; rollout. Microsoft does not market the work under the REVISE name -- the technical content here is what matters. The UEFI `db` is the allow-list of trusted signing certificates and signed binary hashes; the `dbx` is the corresponding deny-list. KB5025885&apos;s current (April 2024+) approach is certificate-based: it adds the Windows Production PCA 2011 signing certificate to `dbx`, which untrusts every boot manager signed by it, and ships a new UEFI CA 2023 certificate to replace the 2011 root. (The original May 2023 mitigations used a hash-by-hash strategy against specific boot manager binaries that was superseded for being too narrow.) The rollout is opt-in across multiple phases (currently five) because pushing a `dbx` change at scale can brick devices [@kb5025885].

Microsoft Windows Production CA 2011. The intermediate certificate that signs the Windows boot manager and every other Microsoft-trusted EFI binary loaded under Secure Boot. The 2011 root is set to expire in waves starting June 2026, which is the structural reason REVISE / UEFI CA 2023 must complete before then [@kb5062553].
&lt;p&gt;The REVISE rollout under KB5025885 ships across opt-in phases (currently five: Initial Deployment, Second Deployment, Evaluation, Deployment, Enforcement), each gated by a registry-bitmask &lt;code&gt;AvailableUpdates&lt;/code&gt; opt-in.Within the currently-active Evaluation and Deployment phases, the mitigations roll out in three actions: (1) install the new UEFI CA 2023 cert into &lt;code&gt;db&lt;/code&gt; and trust-roll to the 2023-signed boot manager; (2) push the Windows Production PCA 2011 signing certificate into &lt;code&gt;dbx&lt;/code&gt; -- the moment that &quot;patched&quot; becomes &quot;revoked&quot; on that device; (3) write a Secure Version Number into the firmware so the boot manager can self-revoke older copies of itself [@kb5025885]. The named Phase 1 (Initial Deployment, May 9, 2023) used a now-superseded hash-by-hash revocation approach against specific boot manager binaries. Each phase is an irreversible state change once Secure Boot stays on, which is why Microsoft has gated the schedule on operator readiness rather than calendar pressure.&lt;/p&gt;
&lt;p&gt;Compass Security&apos;s May 2025 follow-up reproduced the Bitpixie exploit in a WinPE-based variant signed entirely by Microsoft components -- replacing the third-party Linux shim that secured-core PCs disable by default -- end-to-end in roughly five minutes via PXE [@compass-bitpixie-winpe]. Five minutes is a useful benchmark because BitUnlocker&apos;s USB-deliverable PoC clocks at the same number against the same chain-load downgrade primitive, with a different post-exploitation strategy and a different delivery vector.&lt;/p&gt;
&lt;p&gt;Two other 2022-2024 bootkits frame the era. ESET disclosed BlackLotus in March 2023, the first in-the-wild UEFI bootkit observed bypassing Secure Boot on a fully patched Windows 11 by abusing CVE-2022-21894 &quot;Baton Drop&quot; [@eset-blacklotus] [@msrc-cve-2022-21894]. ESET&apos;s November 2024 Bootkitty disclosure brought the first publicly analysed UEFI bootkit aimed at Linux, although ESET&apos;s follow-up note clarified the artefact was a Korean Best of Best student project rather than in-the-wild malware [@eset-bootkitty]. Both used the same observation that underwrites Bitpixie and BitUnlocker: a Microsoft-signed binary with a logic flaw stays trusted until Microsoft adds it to &lt;code&gt;dbx&lt;/code&gt;, which is a multi-year programme.&lt;/p&gt;

flowchart TD
    A[&quot;Microsoft-signed binary&lt;br /&gt;with a logic flaw&quot;] --&amp;gt; B[&quot;Stays trusted&lt;br /&gt;until dbx revokes its cert&lt;br /&gt;or its hash&quot;]
    B --&amp;gt; C1[&quot;Bitpixie (CVE-2023-21563)&lt;br /&gt;PXE soft-reboot leaks VMK&lt;br /&gt;from physical memory&quot;]
    B --&amp;gt; C2[&quot;BlackLotus (CVE-2022-21894)&lt;br /&gt;Baton Drop drops a&lt;br /&gt;UEFI bootkit&quot;]
    B --&amp;gt; C3[&quot;BitUnlocker (4 CVEs)&lt;br /&gt;Downgrade boot manager,&lt;br /&gt;be the recovery environment&quot;]
    C1 --&amp;gt; D[&quot;Patched is not revoked&quot;]
    C2 --&amp;gt; D
    C3 --&amp;gt; D
    D --&amp;gt; E[&quot;REVISE / UEFI CA 2023&lt;br /&gt;is the structural fix&quot;]
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Each of Bitpixie, BlackLotus, and BitUnlocker depends on the same lemma. Microsoft can ship a patch that fixes a Microsoft-signed binary. Until that binary&apos;s signing certificate lands in &lt;code&gt;dbx&lt;/code&gt;, the old signed copy keeps working on every Windows device whose Secure Boot policy still trusts PCA 2011 -- which, in mid-2026, is most of them. The dbx update is a separate, opt-in, multi-phase operation that has to complete before June 2026 because that is when PCA 2011 starts to expire on its own terms.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Same researcher, two pipelines: Leviev disclosed Windows Downdate at Black Hat USA 2024 and co-disclosed BitUnlocker at Black Hat USA 2025 [@safebreach-downdate]. Update pipeline one year, recovery pipeline the next.&lt;/p&gt;
&lt;p&gt;Bitpixie scavenges the VMK from RAM after a buggy soft reboot. BlackLotus drops a UEFI bootkit. Both depend on the same observation: a Microsoft-signed binary with a logic flaw stays trusted until Microsoft revokes it. In July 2025, four Microsoft engineers asked a sharper question. What if you do not have to find a logic flaw at all? What if the recovery environment is &lt;em&gt;given&lt;/em&gt; the keys legitimately, and all you have to do is &lt;em&gt;be&lt;/em&gt; the recovery environment?&lt;/p&gt;
&lt;h2&gt;5. Four parsers, one trust boundary&lt;/h2&gt;
&lt;p&gt;WinRE already has the keys. That is the design.&lt;/p&gt;
&lt;p&gt;STORM&apos;s insight was not to attack the seal. It was to observe that every parser inside WinRE sits inside the BitLocker auto-unlock trust boundary, and to ask which of those parsers is buggy. Once you reframe the problem from &quot;find a way to make the TPM release the key&quot; to &quot;the recovery environment is given the key by design, so make me the recovery environment,&quot; the question stops being cryptographic and becomes a code-audit question. STORM found four answers. There are almost certainly more.&lt;/p&gt;
&lt;p&gt;The four CVEs map to four parsers. The first is the entry vector; the next two are escalations inside the boundary; the fourth is the unconditional decryption finisher that turns the chain from a privileged shell into a permanently disabled BitLocker volume. Each subsection below follows the same template: what gets parsed, where the integrity check goes wrong, what falls out of the parser, why that primitive ends the chain.&lt;/p&gt;

sequenceDiagram
    participant U as Attacker (USB)
    participant FW as UEFI firmware
    participant BM as Pre-patch bootmgfw.efi (PCA 2011)
    participant SDI as Boot.sdi parser
    participant WRE as Malicious WinRE
    participant V as BitLocker volume
    U-&amp;gt;&amp;gt;FW: Boot USB stick
    FW-&amp;gt;&amp;gt;BM: Loads Microsoft-signed boot manager (downgraded)
    BM-&amp;gt;&amp;gt;SDI: Hash-and-execute SDI image
    SDI--&amp;gt;&amp;gt;SDI: Hash covers original bytes
    SDI--&amp;gt;&amp;gt;SDI: Execution targets appended WIM
    SDI-&amp;gt;&amp;gt;WRE: Hands control to malicious WinRE
    WRE-&amp;gt;&amp;gt;V: Inherits auto-unlock from boot context
    WRE-&amp;gt;&amp;gt;U: Shell on the cleartext volume
&lt;h3&gt;5.1 CVE-2025-48804 -- SDI parsing as the entry vector&lt;/h3&gt;
&lt;p&gt;WinRE boots from a System Deployment Image (&lt;code&gt;Boot.sdi&lt;/code&gt;) bundled with a Windows Imaging file (&lt;code&gt;.wim&lt;/code&gt;). The boot manager hashes the SDI for integrity before transferring control. STORM noticed that the integrity check covered the on-disk &lt;em&gt;original&lt;/em&gt; bytes of the SDI, but the runtime that consumed the image followed an internal offset pointer that the attacker could shift to point at &lt;em&gt;appended&lt;/em&gt; bytes after the hashed region [@nvd-cve-2025-48804] [@itnews-bitunlocker]. Append a malicious WIM at the tail of a legitimate SDI, manipulate the offset, and the hash still passes -- but execution targets your bytes.&lt;/p&gt;
&lt;p&gt;The garatc proof of concept assembles this into a USB-bootable payload that downgrades to a pre-patch &lt;code&gt;bootmgfw.efi&lt;/code&gt; signed under PCA 2011 (still trusted on most fielded devices), then parses an SDI of its own construction. Total prerequisites listed in the PoC README: physical access, TPM-only protector, PCR 7 plus PCR 11 trusted, and Microsoft Windows PCA 2011 in the Secure Boot &lt;code&gt;db&lt;/code&gt; [@garatc-poc]. The wall clock for end-to-end exploitation: under five minutes.&lt;/p&gt;
&lt;p&gt;{`
// Schematic of the CVE-2025-48804 integrity-vs-execution split.
// The hash covers the on-disk SDI bytes; execution follows an
// offset pointer that the attacker can move past the hashed region.&lt;/p&gt;
&lt;p&gt;const sdi = readFromDisk(&quot;Boot.sdi&quot;);
const hash = sha256(sdi);              // integrity check sees ORIGINAL bytes
if (hash !== expectedHash) throw &quot;abort&quot;;&lt;/p&gt;
&lt;p&gt;const offset = readOffsetFromHeader(sdi); // attacker-controlled in malicious SDI
const wim = sdi.slice(offset);            // points PAST the hashed region
executeWim(wim);                          // runs appended malicious WIM&lt;/p&gt;
&lt;p&gt;// Lesson: the hashed range and the executed range are not the same range.
// The fix in KB5062553 binds them so that execution can only target
// bytes that the integrity hash actually covered.
`}&lt;/p&gt;
&lt;p&gt;Once the malicious WinRE is running, it inherits the BitLocker auto-unlock state from the boot context. The encrypted volume is now mountable. The remaining three CVEs are about what an attacker can do &lt;em&gt;from within&lt;/em&gt; WinRE that the original threat model did not expect WinRE to enable.&lt;/p&gt;
&lt;h3&gt;5.2 CVE-2025-48800 -- tttracer.exe as a proxy executor&lt;/h3&gt;
&lt;p&gt;WinRE&apos;s Offline Scanning operation invokes antivirus tooling from within the recovery environment. The set of trusted binaries WinRE will execute during scan is enumerated in &lt;code&gt;ReAgent.xml&lt;/code&gt; -- WinRE&apos;s app-registry equivalent -- and includes Microsoft-signed diagnostic utilities. Among them is &lt;code&gt;tttracer.exe&lt;/code&gt;, Microsoft&apos;s Time Travel Tracing debugger, included because it is occasionally invoked during diagnostics [@nvd-cve-2025-48800].&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tttracer.exe&lt;/code&gt; is a proxy executor: by design, it launches an arbitrary process under tracing instrumentation. The LOLBAS project documents the exact invocation as &lt;code&gt;tttracer.exe {PATH_ABSOLUTE:.exe}&lt;/code&gt;, mapped to MITRE ATT&amp;amp;CK technique T1127, with the launched process running as a child of &lt;code&gt;tttracer.exe&lt;/code&gt; [@lolbas-tttracer]. Inside the WinRE auto-unlock boundary, with the live OS volume mounted, &quot;arbitrary process&quot; is the same primitive as &quot;shell on the cleartext volume.&quot; Combine an attacker-controlled &lt;code&gt;ReAgent.xml&lt;/code&gt; with &lt;code&gt;tttracer.exe&lt;/code&gt;&apos;s proxy-execution semantics and Offline Scanning becomes Offline Pwning.&lt;/p&gt;
&lt;p&gt;Time Travel Tracing is a Microsoft debugger most readers will not have seen named. It records process execution as a deterministic replayable trace and is a standard tool inside Microsoft&apos;s reliability engineering. Being on the WinRE trusted-app registry is a reasonable choice when the threat model is &quot;diagnose a broken boot,&quot; not &quot;an attacker is in the recovery environment.&quot;&lt;/p&gt;
&lt;h3&gt;5.3 CVE-2025-48003 -- SetupPlatform.exe and Shift+F10&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;SetupPlatform.exe&lt;/code&gt;, the Windows Setup host, remains on the WinRE trusted-app registry after upgrades and registers a Shift+F10 hotkey that opens &lt;code&gt;cmd.exe&lt;/code&gt;. The Shift+F10 chord has been a long-standing Windows Setup feature for OEM imaging and unattended diagnostics, where it is harmless because there is no encrypted volume mounted yet [@nvd-cve-2025-48003] [@hackacademy-bitunlocker].&lt;/p&gt;
&lt;p&gt;Inside WinRE, after auto-unlock has happened, Shift+F10 opens &lt;code&gt;cmd.exe&lt;/code&gt; &lt;em&gt;on the cleartext OS volume&lt;/em&gt;. STORM observed that manipulating the WinRE Apps Scheduled Operation entries in &lt;code&gt;ReAgent.xml&lt;/code&gt; creates an unbounded trigger window -- the hotkey stays armed long enough for an attacker to use it. The shell that opens has the privileges of SetupPlatform under WinRE, with the OS volume mounted underneath it.&lt;/p&gt;
&lt;h3&gt;5.4 CVE-2025-48818 -- BCD target-OS impersonation&lt;/h3&gt;
&lt;p&gt;The first three CVEs assume the attacker has gotten WinRE to boot. The fourth one closes the loop and turns the access from a privileged shell on the volume into an unconditional, persistent decryption -- without any further interaction.&lt;/p&gt;
&lt;p&gt;WinRE enumerates disk volumes in a specific order when deciding which Boot Configuration Data (BCD) store to consume as the description of the &quot;operating system to recover.&quot; STORM placed an attacker-controlled BCD store on the recovery partition that gets enumerated &lt;em&gt;before&lt;/em&gt; the legitimate one [@nvd-cve-2025-48818] [@hackacademy-bitunlocker]. WinRE treats the attacker volume as the trusted OS to recover, then invokes Push Button Reset with the &lt;code&gt;DecryptVolume&lt;/code&gt; directive -- a legitimate sub-operation of PBR that &lt;em&gt;disables&lt;/em&gt; BitLocker entirely. After Push Button Reset completes, BitLocker is not bypassed; it is &lt;em&gt;off&lt;/em&gt;.&lt;/p&gt;

A legitimate WinRE sub-operation invoked during recovery when the target volume must be fully decrypted before being re-imaged or returned to a clean state. The directive removes the BitLocker protectors and rewrites every sector of the volume in plaintext. When invoked by a legitimately-recovered OS, this is correct behavior. When invoked by an impersonated target-OS BCD entry, it is a permanent encryption removal.
&lt;h3&gt;5.5 The structural pattern&lt;/h3&gt;

flowchart TD
    subgraph WB[&quot;WinRE auto-unlock trust boundary&quot;]
        WP[&quot;Boot.sdi parser&quot;]
        RP[&quot;ReAgent.xml parser&quot;]
        BP[&quot;BCD store enumerator&quot;]
        TP[&quot;Trusted-app registry&quot;]
    end
    C1[&quot;CVE-2025-48804&lt;br /&gt;SDI offset confusion&quot;] --&amp;gt; WP
    C2[&quot;CVE-2025-48800&lt;br /&gt;tttracer.exe proxy&quot;] --&amp;gt; RP
    C2 --&amp;gt; TP
    C3[&quot;CVE-2025-48003&lt;br /&gt;SetupPlatform Shift+F10&quot;] --&amp;gt; RP
    C3 --&amp;gt; TP
    C4[&quot;CVE-2025-48818&lt;br /&gt;BCD impersonation&quot;] --&amp;gt; BP
    WB --&amp;gt; VMK[&quot;BitLocker VMK released&lt;br /&gt;to whatever runs inside&quot;]
&lt;p&gt;Four parsers; one boundary. The structural pattern reads:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Every CVE attacks a different parser. Every parser sits inside the same auto-unlock trust boundary. Patching individual parsers does not close the boundary; it shrinks it. The boundary is the bug class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; TPM bus sniffing fails against fTPM and Pluton because there is no exposed bus to sniff -- the seal is computed and released on-die. BitUnlocker does not attack the seal. The seal works exactly as designed: PCR 7 plus PCR 11 match the expected boot-chain measurements, and the TPM releases the VMK to the boot manager. The boot manager passes the unlock state into WinRE. WinRE then runs an attacker&apos;s code because one of its parsers had a bug. Nothing about fTPM or Pluton intervenes, because the entire attack is upstream of the silicon that the seal would protect.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft shipped patches for all four CVEs in KB5062553 on July 8, 2025 [@kb5062553]. The patches fixed the four code paths. They did not change the trust boundary. They did not, by themselves, even revoke the pre-patch boot manager that the chain depends on. To see what the July patches actually changed, and what they did not, we have to look at REVISE.&lt;/p&gt;
&lt;h2&gt;6. What KB5062553 changed, and what REVISE will&lt;/h2&gt;
&lt;p&gt;On the same Patch Tuesday that fixed BitUnlocker, Microsoft also reminded administrators that the Secure Boot certificate underwriting the entire Windows boot chain begins to expire in June 2026 [@kb5062553]. The two facts are not independent.&lt;/p&gt;
&lt;p&gt;KB5062553 closed the four BitUnlocker code paths inside the Windows 11 24H2 build 26100.4652 cumulative. The SDI parser was bound so that the integrity hash and the execution range now agree. The trusted-app registry semantics for &lt;code&gt;tttracer.exe&lt;/code&gt; and &lt;code&gt;SetupPlatform.exe&lt;/code&gt; were tightened so neither acts as a proxy executor inside WinRE. The BCD enumeration order was reworked so the recovery partition cannot present a target-OS impersonator before the legitimate one. Those are real fixes for real bugs.&lt;/p&gt;
&lt;p&gt;What KB5062553 did not change is the trust set. The pre-July-2025 &lt;code&gt;bootmgfw.efi&lt;/code&gt; is still signed under PCA 2011, and PCA 2011 is still in the Secure Boot &lt;code&gt;db&lt;/code&gt; on most fielded Windows devices. A physically present attacker can supply that old, signed, vulnerable boot manager from a USB stick. The firmware will load it. The four code paths are fixed in the new boot manager, but the old boot manager is still on the trust list. This is the same downgrade pattern that keeps Bitpixie exploitable [@neodyme-bitpixie-no-fix].&lt;/p&gt;
&lt;p&gt;The structural defence is REVISE, shipped under KB5025885 and the CVE-2023-24932 advisory [@kb5025885]. REVISE adds the Windows Production PCA 2011 signing certificate to the Secure Boot &lt;code&gt;dbx&lt;/code&gt;, which untrusts every boot manager signed by it, and ships a new UEFI CA 2023 certificate to replace the 2011 root. After REVISE deploys, the firmware refuses to load the pre-patch boot manager. The rollout is opt-in across multiple phases (currently five) because a &lt;code&gt;dbx&lt;/code&gt; update at fleet scale carries real brick risk: any device that ends up trying to boot a binary whose signing certificate has just been moved to the deny-list will not boot. KB5025885 explicitly warns that once the mitigation is enabled on a device, it cannot be reverted while Secure Boot remains on.&lt;/p&gt;

This lemma appears in three places already in this article -- Bitpixie, BlackLotus, and BitUnlocker -- and it is worth stating once explicitly.&lt;p&gt;A Microsoft-signed binary stays in the trust set as long as its signing certificate is in &lt;code&gt;db&lt;/code&gt; and neither its hash nor its signing certificate sits in &lt;code&gt;dbx&lt;/code&gt;. Microsoft can ship a code-path patch that supersedes the old binary, but nothing in the trust set changes automatically. The &lt;code&gt;dbx&lt;/code&gt; push is a separate operation, gated on a separate update, with its own opt-in semantics because pushing a wrong &lt;code&gt;dbx&lt;/code&gt; value bricks devices.&lt;/p&gt;
&lt;p&gt;The result is that &quot;the bug is patched in the latest cumulative&quot; and &quot;an attacker with physical presence can no longer load the vulnerable signed binary&quot; are not the same statement. The first is true after KB5062553. The second is true only after REVISE, only on devices where REVISE&apos;s dbx-revocation phase has run -- the phase that moves the PCA 2011 signing certificate into &lt;code&gt;dbx&lt;/code&gt; so the deny-list overrides the allow-list. The June 2026 PCA 2011 expiration is the natural backstop -- after that date, the certificate no longer signs anything new, and the migration completes on its own timetable.&lt;/p&gt;
&lt;p&gt;Until then, BitUnlocker&apos;s entry vector remains usable on every TPM-only device whose REVISE phase has not advanced.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

flowchart LR
    A[&quot;Pre-July-2025 bootmgfw.efi&lt;br /&gt;(PCA 2011 signed)&quot;] --&amp;gt; B[&quot;KB5062553 patches&lt;br /&gt;the four CVEs in the NEW&lt;br /&gt;boot manager&quot;]
    A --&amp;gt; C[&quot;REVISE adds PCA 2011&lt;br /&gt;signing cert to dbx&quot;]
    B --&amp;gt; D[&quot;New devices: closed code paths&quot;]
    C --&amp;gt; E[&quot;Firmware refuses to load&lt;br /&gt;the vulnerable signed binary&quot;]
    D --&amp;gt; F[&quot;BitUnlocker fixed on patched device&quot;]
    E --&amp;gt; G[&quot;BitUnlocker entry vector blocked&lt;br /&gt;across the fleet&quot;]
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; PCA 2011 begins to expire in waves starting June 2026 [@kb5062553]. The UEFI CA 2023 migration must complete before then. Administrators of devices that have not yet reached REVISE&apos;s dbx-revocation phase should treat the June 2026 date as a hard deadline, not a goal: any device that misses the migration risks losing Secure Boot trust entirely on its next firmware update.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Patches close code paths. REVISE closes trust. Neither closes the WinRE auto-unlock surface itself. That is a different question, and the comparison Microsoft never likes to make is what other desktop operating systems chose to do about it.&lt;/p&gt;
&lt;h2&gt;7. How other platforms make the same trade-off&lt;/h2&gt;
&lt;p&gt;Windows is the only major desktop operating system that ships an auto-unlocking recovery environment on a TPM-sealed key. The other three -- macOS, ChromeOS, and Linux with LUKS -- make different choices at the same trade-off point. Looking at those choices shows what is actually possible.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Recovery primitive&lt;/th&gt;
&lt;th&gt;Key availability during recovery&lt;/th&gt;
&lt;th&gt;Auto-unlock from physical-presence path&lt;/th&gt;
&lt;th&gt;Failure mode if compromised&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Windows + BitLocker + WinRE&lt;/td&gt;
&lt;td&gt;Push Button Reset, Startup Repair, Reset This PC&lt;/td&gt;
&lt;td&gt;VMK released by TPM, inherited by WinRE&lt;/td&gt;
&lt;td&gt;Yes -- Shift+Restart -&amp;gt; recovery menu&lt;/td&gt;
&lt;td&gt;BitUnlocker class: parser bugs leak the cleartext volume to attacker code running inside WinRE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;macOS + FileVault + macOS Recovery&lt;/td&gt;
&lt;td&gt;macOS Recovery (boot to recovery partition)&lt;/td&gt;
&lt;td&gt;Data Volume NOT mounted; user password or recovery key required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Recovery cannot read user data without authentication&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChromeOS + Verified Boot + Powerwash&lt;/td&gt;
&lt;td&gt;Recovery USB / &lt;code&gt;chrome://recovery&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None -- recovery wipes user data&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Recovery destroys the protected data set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linux + LUKS / dm-crypt&lt;/td&gt;
&lt;td&gt;initramfs / rescue shell&lt;/td&gt;
&lt;td&gt;None -- every boot prompts for passphrase&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Recovery cannot proceed without passphrase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Windows + BitLocker + WinRE is the only row in that table where the recovery environment can read user data without re-prompting the user. BitUnlocker is what the trade-off looks like once that property gets weaponised.&lt;/p&gt;
&lt;p&gt;macOS chose a different recovery model. FileVault encrypts the Data Volume; the signed System Volume Snapshot does not. macOS Recovery boots into the signed system volume and presents a Disk Utility view of the Data Volume that requires a user password or recovery key to mount. The recovery environment is &lt;em&gt;not&lt;/em&gt; given the keys. A macOS-side analogue of CVE-2025-48804 would still need to coerce Recovery into surfacing authentication UI -- the recovery primitive does not run with the user volume already mounted.&lt;/p&gt;
&lt;p&gt;ChromeOS chose the most aggressive recovery model. Verified Boot enforces signature chains all the way to the kernel; recovery from a corrupted state means powerwash, which wipes the user partition. There is no equivalent of WinRE that needs to read the encrypted volume. The trade-off is enforced by sacrificing the data, which is acceptable because user data on ChromeOS is mostly remote.&lt;/p&gt;
&lt;p&gt;LUKS / dm-crypt is the simplest model. Every boot, including recovery, prompts for the passphrase. There is no auto-unlock state to inherit. The trade-off is help-desk burden: a forgotten passphrase is a wiped drive. This is the model that the Microsoft Countermeasures page implicitly recommends for the &quot;skilled attacker with lengthy physical access&quot; threat tier when it suggests TPM+PIN [@ms-bitlocker-countermeasures].&lt;/p&gt;

Windows defines recovery as *transparent repair*. macOS defines it as *authenticated rebuild*. ChromeOS defines it as *wipe and restart*. LUKS defines it as *the same authentication you would do on a normal boot*. Each is internally consistent with the rest of its security model. None of them is wrong in isolation. They differ in what trade-off they make between fleet recoverability and recovery-environment exposure -- and BitUnlocker is what the most-usable-recovery choice costs.
&lt;p&gt;Recovery-key escrow to Microsoft Entra ID, Active Directory, or a local user account is a separate confidentiality boundary from the BitUnlocker surface. Forbes reported in January 2026 on a Guam FBI warrant served to Microsoft for BitLocker recovery keys, illustrating the legal-process pathway [@forbes-guam-bitlocker]. Different threat surface; same product.&lt;/p&gt;
&lt;p&gt;The trade-off Microsoft made in 2006 was the right one for a fleet that needs help-desk recoverability and the wrong one for a threat model with physical access. Eighteen years and seven attack generations later, the trade-off has not been revisited. The next section asks whether it can be.&lt;/p&gt;
&lt;h2&gt;8. Why patching cannot close the surface&lt;/h2&gt;
&lt;p&gt;In complexity theory, an impossibility result tells you what cannot be done no matter how hard you try. BitUnlocker is not that kind of result. It is the next thing over: a structural consequence of the threat model that no quantity of parser patches can close.&lt;/p&gt;
&lt;p&gt;State the recovery-versus-confidentiality dilemma carefully. &lt;em&gt;As long as a system auto-unlocks an encrypted volume for repair purposes without user-presence verification at the moment of recovery, the recovery environment&apos;s trust boundary equals the encryption&apos;s trust boundary.&lt;/em&gt; This is not a theorem in the published literature. It is the structural reading of the Microsoft Countermeasures threat-model tiers [@ms-bitlocker-countermeasures], and it follows almost mechanically from how the WinRE auto-unlock state is inherited.&lt;/p&gt;
&lt;p&gt;The dilemma admits exactly two engineering exits. The first is to deprecate WinRE auto-unlock and require a recovery key for every WinRE entry. Microsoft has not done this and will not do this, because the help-desk recoverability story collapses without it -- fleet administrators rely on WinRE entry being silent for routine repair. The second is to make TPM+PIN the default for non-Entra-enrolled devices, which forces a pre-boot human-presence check that WinRE structurally cannot satisfy. Microsoft has not done this either, presumably because of the help-desk cost of forgotten PINs at consumer scale.&lt;/p&gt;
&lt;p&gt;Until one of those two changes, the next BitUnlocker is a question of &lt;em&gt;when&lt;/em&gt;, not &lt;em&gt;whether&lt;/em&gt;. The four CVEs are an existence proof for the bug class &quot;Microsoft-signed binary on the WinRE trusted-app registry whose parsing of unsigned configuration data can be coerced.&quot; The cardinality of that bug class is not four. STORM found four. There are more.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; As long as a system auto-unlocks an encrypted volume for repair purposes without user-presence verification at the moment of recovery, the recovery environment&apos;s trust boundary equals the encryption&apos;s trust boundary. The bug class is not the parsers. The bug class is the boundary that contains them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You cannot have unattended recovery and confidentiality at the same time against an attacker with physical presence. Every desktop operating system that has tried has either added authentication to recovery (macOS) or has been broken at recovery (BitUnlocker, multiple times). The choice is a product decision, not a software bug.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft is not unaware of this. Quick Machine Recovery -- the cloud-orchestrated recovery primitive that reached general availability in 2025 -- extends the WinRE-equivalent surface rather than retracting it [@ms-qmr]. The trade-off pricing is ongoing. So is the audit.&lt;/p&gt;
&lt;p&gt;The next section is the question that follows from the boundary framing: what else is inside the boundary that STORM did not get to?&lt;/p&gt;
&lt;h2&gt;9. What STORM did not audit&lt;/h2&gt;
&lt;p&gt;STORM published four CVEs. The Windows Recovery Environment contains more than four parsers.&lt;/p&gt;
&lt;p&gt;Four open questions follow directly from the boundary framing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The remaining WinRE trusted-app surface.&lt;/strong&gt; STORM exploited &lt;code&gt;tttracer.exe&lt;/code&gt; and &lt;code&gt;SetupPlatform.exe&lt;/code&gt;. The WinRE Apps Scheduled Operation in &lt;code&gt;ReAgent.xml&lt;/code&gt; registers other Microsoft-signed binaries. None of those binaries was written under the assumption that an attacker would be the one calling them with the OS volume mounted. How many similar inheritances remain unaudited is unknown, and the population is the unstated denominator of every subsequent BitUnlocker-class CVE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PCA 2011 trust on most fielded devices.&lt;/strong&gt; Until REVISE deploys at fleet scale, the pre-July-2025 &lt;code&gt;bootmgfw.efi&lt;/code&gt; remains chain-loadable on any device that still trusts PCA 2011. The June 2026 PCA 2011 expiration is the structural milestone [@kb5062553]. Between mid-2025 and mid-2026, the BitUnlocker entry vector is a deployment question, not a code question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick Machine Recovery extending the WinRE-equivalent surface.&lt;/strong&gt; Cloud-orchestrated recovery on encrypted volumes occupies the same trust boundary as WinRE -- by design, since the point of QMR is to do silent fleet repair on devices that cannot reach a desk [@ms-qmr]. No published security audit comparable to STORM&apos;s BitUnlocker work has appeared for QMR. The next BitUnlocker-shaped CVE may live there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pluton hardware bypass.&lt;/strong&gt; No published practical hardware attack on Pluton exists in the open literature as of mid-2026. The SCRT/Compass-class TPM+PIN bypasses are limited to discrete-TPM hardware where the bus between CPU and TPM is exposed [@scrt-tpm-pin] [@compass-2024] [@ms-pluton]. Whether Pluton admits decapping, laser-fault-injection, or microarchitectural side-channel attacks is an open question that nobody outside Microsoft and a handful of three-letter agencies has the budget to answer at scale.&lt;/p&gt;
&lt;p&gt;Quick Machine Recovery&apos;s 2025 general availability puts it inside the BitUnlocker disclosure timeline [@ms-qmr]. Microsoft is expanding the WinRE-equivalent attack surface in the same calendar year that STORM is publishing the four CVEs.&lt;/p&gt;
&lt;p&gt;And one orthogonal question that every BitLocker survey is asked: who has the recovery key? A serious defender has to think about the recovery-key escrow surface too -- see below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Cloud escrow of the BitLocker recovery key is a confidentiality surface that BitUnlocker does not touch. BitUnlocker is a parser-level chain that gives a physically-present attacker the cleartext volume without ever needing the recovery key. The keyholder question is orthogonal. Both surfaces exist; both are worth thinking about; neither closes the other.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The open-problems list above is what is unaudited as of mid-2026. The actionable question -- &lt;em&gt;what do I, as an administrator, do tomorrow?&lt;/em&gt; -- is the subject of the next section.&lt;/p&gt;
&lt;h2&gt;10. Six things defenders should do this week&lt;/h2&gt;
&lt;p&gt;If you administer a Windows fleet, six concrete actions change the threat model. They are listed here in priority order, not severity order. The first one is the structural mitigation; the others are patch hygiene around it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Enable TPM+PIN.&lt;/strong&gt; The PowerShell-equivalent invocation is &lt;code&gt;manage-bde -protectors -add C: -tpmandpin&lt;/code&gt; [@ms-manage-bde]. This is the only mitigation that changes the threat model independently of patch state -- it forces a pre-boot human-presence check that WinRE structurally cannot satisfy. The honest trade-off: users forget PINs and help-desk burden goes up. The honest counterpoint: the recommendation has been in the Microsoft Countermeasures page in some form since Vista, and BitUnlocker is what eighteen years of ignoring it has produced [@ms-bitlocker-countermeasures].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;manage-bde -protectors -add C: -tpmandpin&lt;/code&gt; -- one PowerShell command, one PIN per user, one threat model permanently changed. This defeats Bitpixie, BitUnlocker, and any future BitUnlocker-class attack that lives upstream of the TPM seal. It does not defeat hardware TPM+PIN bus-sniff attacks on discrete TPMs [@scrt-tpm-pin] [@compass-2024], which are a separate class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2. Apply KB5062553 or any later cumulative.&lt;/strong&gt; The July 8, 2025 cumulative closes the four BitUnlocker code paths [@kb5062553]. By the time you read this, several later cumulatives have shipped; deploy the latest. This addresses the post-entry portion of the chain but not the entry vector.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Deploy REVISE / migrate Secure Boot to UEFI CA 2023.&lt;/strong&gt; This is the dbx-side defence that revokes the pre-patch &lt;code&gt;bootmgfw.efi&lt;/code&gt; [@kb5025885]. Until REVISE has run on a device, &quot;patched&quot; is not &quot;revoked.&quot; The deployment is opt-in across multiple phases (currently five) because a bad &lt;code&gt;dbx&lt;/code&gt; push at scale bricks devices; the June 2026 PCA 2011 expiration is the hard deadline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Restrict WinRE access where the threat model permits.&lt;/strong&gt; On kiosks, lab machines, lights-out servers, and other devices where there is no fleet-recovery requirement, &lt;code&gt;reagentc /disable&lt;/code&gt; closes the WinRE entry surface entirely. This costs you Push Button Reset and Startup Repair on those devices, which is acceptable for devices that are re-imaged centrally [@hackacademy-bitunlocker].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Harden the firmware delivery surface.&lt;/strong&gt; Enable Secure Boot, set a firmware password, disable USB and PXE boot in firmware on devices that are not expected to be re-imaged in the field [@hackacademy-bitunlocker]. This closes the delivery vector independently of the WinRE patch state. It does nothing against an attacker who can boot from internal disk, which is why this is one of six items rather than the first one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Surface BitLocker protection state in management telemetry.&lt;/strong&gt; Intune, Microsoft Defender for Endpoint, and Entra ID can all report on whether a device has a TPM-only or TPM+PIN protector and whether the CVE-2023-24932 dbx revocation has applied (the per-device Secure Boot dbx update status field surfaced in Intune / Defender for Endpoint). Make those fields first-class in your fleet dashboards. PIN-on / PIN-off and dbx-revoked / not-revoked should both be visible at the fleet level, not buried inside a per-device drill-down.&lt;/p&gt;
&lt;p&gt;{`
// Logical equivalent of: manage-bde -protectors -get C:
// Run this against the parsed output to confirm the
// device is using TPM+PIN rather than TPM-only.&lt;/p&gt;
&lt;p&gt;function classifyProtectors(protectorTypes) {
  const hasPIN = protectorTypes.includes(&apos;TpmPin&apos;) ||
                 protectorTypes.includes(&apos;TpmPinStartupKey&apos;);
  const hasTPM = protectorTypes.some((t) =&amp;gt; t.startsWith(&apos;Tpm&apos;));
  if (!hasTPM) return &apos;NoTPM -- not in scope of BitUnlocker&apos;;
  if (hasPIN)  return &apos;TPM+PIN -- defeats BitUnlocker entry vector&apos;;
  return &apos;TPM-only -- vulnerable to BitUnlocker entry vector&apos;;
}&lt;/p&gt;
&lt;p&gt;// Example: the default Windows 11 consumer configuration
console.log(classifyProtectors([&apos;Tpm&apos;, &apos;RecoveryPassword&apos;]));
// -&amp;gt; &quot;TPM-only -- vulnerable to BitUnlocker entry vector&quot;
`}&lt;/p&gt;

If you genuinely cannot deploy TPM+PIN (kiosks running unattended, OT workloads, accessibility-driven exemptions), the partial mitigation stack is REVISE&apos;s dbx-revocation phase + firmware password + USB/PXE disabled in firmware + Kernel DMA Protection. Together these close the BitUnlocker entry vector on the patched code paths *and* the downgrade path *and* the firmware delivery channel. None of them changes the WinRE auto-unlock boundary -- only TPM+PIN does that -- so the next BitUnlocker-class CVE may still be exploitable on these devices until the corresponding patch ships. Treat this stack as a temporary mitigation, not a permanent answer.
&lt;p&gt;None of these are new recommendations. The pre-boot PIN line in particular has been in the Microsoft Countermeasures page in some form since Vista [@ms-bitlocker-countermeasures]. What has changed is the operational consequence of not following it. BitUnlocker is what the consequence looks like today.&lt;/p&gt;
&lt;h2&gt;11. Frequently asked questions&lt;/h2&gt;
&lt;p&gt;BitUnlocker has produced a predictable list of misconceptions. Each question below names a common misconception about BitUnlocker and gives the correct framing -- because the wrong answers are where threat models get built quietly.&lt;/p&gt;

Yes against both -- the attack is upstream of the TPM seal, so the bus-elimination property of fTPM and Pluton does not help here. See §5.5 for the full mechanism and the contrast with TPM bus sniffing, which *does* fail against fTPM and Pluton because there is no exposed bus to sniff.

No. BitUnlocker was *patched* on July 8, 2025 in KB5062553 [@kb5062553]. It was *disclosed* at Black Hat USA 2025 and DEF CON 33 in early August 2025, with the Microsoft Security Blog write-up published August 13 to 14, 2025 [@ms-bitunlocker]. Coordinated disclosure timelines mean the patch ships before the talk. Useful date to remember: KB5062553 = fix, August 2025 = public technical detail.

Only against an attacker who cannot chain-load the pre-July-2025 `bootmgfw.efi`. Until REVISE / KB5025885 is deployed on a given device, the old signed boot manager remains trusted [@kb5025885] and the BitUnlocker entry vector remains usable from a USB stick. The patch closes the code paths in the new boot manager; the dbx update closes the old one&apos;s trust. They are different operations on different schedules.

Yes against the BitUnlocker CVE class. A pre-boot PIN forces a human-presence check that WinRE structurally cannot satisfy from a boot-time recovery context. The Compass Security and SCRT TPM+PIN bypasses [@compass-2024] [@scrt-tpm-pin] are a separate, hardware-physical class that targets the bus between CPU and discrete TPM; they do not apply to fTPM or Pluton. For a TPM+PIN on Pluton or fTPM, none of the published attacks in this article succeed.

No. The chain uses Microsoft-signed binaries throughout. The pre-patch `bootmgfw.efi` is Microsoft-signed under PCA 2011. `tttracer.exe`, `SetupPlatform.exe`, and the WinRE binaries inside the trust boundary are all Microsoft-signed. The bug class is logic flaws in the parsing of *unsigned data* (Boot.sdi, ReAgent.xml, BCD) by signed binaries. Secure Boot is doing exactly what it is designed to do; the boundary it enforces is not the boundary BitUnlocker crosses.

No. Bitpixie scavenges the VMK from RAM via a soft-reboot bug in the pre-patch `bootmgfw.efi` (CVE-2023-21563, discovered August 2022 by Rairii, disclosed February 2023) [@neodyme-bitpixie]. BitUnlocker boots a malicious WinRE that inherits auto-unlock on the live volume. The shared structural pattern is that both are upstream of the TPM seal, both are defeated by TPM+PIN, and both work against fTPM and Pluton. The mechanism is different; the lesson is identical.

STORM is the *Security Testing and Offensive Research at Microsoft* team -- Microsoft&apos;s internal red team. Alon Leviev, one of the BitUnlocker co-authors, also disclosed Windows Downdate at Black Hat USA 2024 [@safebreach-downdate]. The Downdate research showed that the Windows update pipeline could be coerced into installing older, vulnerable code paths. BitUnlocker is a different mechanism by the same researcher, one year later, on the recovery pipeline rather than the update pipeline.
&lt;p&gt;The Shift+Restart chord ships in every copy of Windows. The recommendation that defeats it -- enable a pre-boot PIN -- has been on the Microsoft Countermeasures page since Vista. STORM&apos;s contribution is not that they found four bugs. It is that they made what happens when the recommendation is ignored impossible to look away from. The next move is the reader&apos;s.&lt;/p&gt;

To defend against malicious reset attacks, BitLocker uses the TCG Reset Attack Mitigation, also known as MOR bit. -- Microsoft Learn, BitLocker Countermeasures [@ms-bitlocker-countermeasures]
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;bitunlocker-microsoft-just-bypassed-its-own-bitlocker&quot; keyTerms={[
  { term: &quot;TPM-only protector&quot;, definition: &quot;Default BitLocker mode that releases the VMK on boot-chain measurement match alone, with no pre-boot human presence check.&quot; },
  { term: &quot;Volume Master Key (VMK)&quot;, definition: &quot;Key-encrypting key that wraps the FVEK; sealed by the TPM to a PCR profile.&quot; },
  { term: &quot;Windows Recovery Environment (WinRE)&quot;, definition: &quot;Bootable image based on Windows PE that inherits BitLocker auto-unlock during legitimate recovery.&quot; },
  { term: &quot;PCA 2011&quot;, definition: &quot;Microsoft Windows Production CA 2011; signs pre-July-2025 boot managers and is still trusted on most fielded devices until REVISE migrates them to UEFI CA 2023.&quot; },
  { term: &quot;REVISE / dbx&quot;, definition: &quot;Secure Boot revocation infrastructure shipped under KB5025885 / CVE-2023-24932; the current Evaluation Phase adds the Windows Production PCA 2011 signing certificate to the dbx deny-list, which untrusts every boot manager signed by that certificate.&quot; },
  { term: &quot;Push Button Reset / DecryptVolume directive&quot;, definition: &quot;Legitimate WinRE sub-operation invoked by CVE-2025-48818 that disables BitLocker entirely after target-OS impersonation.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>bitlocker</category><category>winre</category><category>tpm</category><category>secure-boot</category><category>windows-security</category><category>full-disk-encryption</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>Measured Boot: The TCG Event Log from SRTM to PCR-Bound BitLocker</title><link>https://paragmali.com/blog/measured-boot-the-tcg-event-log-from-srtm-to-pcr-bound-bitlo/</link><guid isPermaLink="true">https://paragmali.com/blog/measured-boot-the-tcg-event-log-from-srtm-to-pcr-bound-bitlo/</guid><description>How Windows turns every byte of firmware, every signed boot manager, and every loaded driver into a single 32-byte hash that decides whether BitLocker unlocks your disk -- and why patching that chain breaks it.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>
**Measured Boot is the system that lets Windows prove what code ran from power-on to logon.** A small immutable block called the CRTM measures the next stage, extending a SHA-256 digest into a TPM register (a PCR); each stage measures its successor, building a hash chain whose final value is uniquely determined by the entire ordered sequence of code that ran. BitLocker seals its Volume Master Key to a subset of those PCRs, so any unexpected change -- firmware update, Secure Boot key rotation, boot-manager swap -- forces a 48-digit recovery prompt. This article walks the chain event by event, explains why bitpixie (CVE-2023-21563) was unstoppable on TPM-only deployments, and gives you the six commands that turn the theory into a Monday-morning operational practice.
&lt;h2&gt;1. Two PCs That Hash Differently&lt;/h2&gt;
&lt;p&gt;At 06:00 on a Tuesday in March 2024, a senior administrator at a 500-seat law firm finishes patching her fleet of Dell OptiPlex 7090s overnight. At 08:42 she has answered her 173rd help-desk ticket, all variations on the same theme: &lt;em&gt;Why is my laptop asking for a 48-digit BitLocker recovery key?&lt;/em&gt; The answer -- the answer the rest of this article exists to make obvious -- is that a single 32-byte SHA-256 register on every machine in her fleet now holds a different number than it did yesterday, and &lt;a href=&quot;https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/&quot; rel=&quot;noopener&quot;&gt;BitLocker&apos;s seal&lt;/a&gt; is bound to that number.&lt;/p&gt;
&lt;p&gt;The patch she applied to make the fleet safer is the patch that locked it out.&lt;/p&gt;
&lt;p&gt;Across town a second firm runs Secured-core PCs that ship with System Guard Secure Launch [@ms-learn-secured-core] enabled. Those machines absorb the same overnight UEFI delta without a single recovery prompt. Same vendor patch. Same Microsoft cumulative update. Same hour. Zero tickets. The difference is not the hardware; the difference is which subset of TPM registers BitLocker bound the disk-encryption key to.&lt;/p&gt;

A fixed-width append-only register inside a Trusted Platform Module. PCRs do not store; they *extend*. The TPM rewrites `PCR[N] := H(PCR[N] || measurement)`, where `H` is a cryptographic hash. PCRs reset to zero only at platform reset. A modern TPM 2.0 has 24 PCRs per hash bank, with banks for SHA-1, SHA-256, SHA-384, SHA-512, and SM3-256.

A boot mode in which every stage of platform initialisation hashes the next stage&apos;s code and configuration into one or more PCRs *before* transferring control. Measured Boot is *reporting*, not *enforcement* -- it records what ran, but does not refuse to run anything. Secure Boot is the enforcement counterpart that refuses unsigned code; the two cooperate. Microsoft&apos;s `Trusted Boot` [@ms-learn-boot-process] extends the measurement chain into the Windows kernel.
&lt;p&gt;By the end of this article you will be able to name every byte that went into that hash, predict whether any given administrative action will change it, and read the TCG event log on your own machine to confirm. You will see why the BitLocker seal is, in some configurations, a Faraday cage built on top of a fence the verifier never opened. You will learn that the chip Microsoft calls the &lt;em&gt;Trusted&lt;/em&gt; Platform Module knows nothing of trust -- only of arithmetic over hashes -- and that the verifier, which knows what good looks like, is always someone other than the chip.&lt;/p&gt;
&lt;p&gt;But first, the historical answer: how did a 32-byte register get into the position of deciding whether a PC boots cleanly or asks for a 48-digit key?&lt;/p&gt;
&lt;h2&gt;2. Origins: Arbaugh 1997 and the Chain-of-Hashes Axiom&lt;/h2&gt;
&lt;p&gt;The first paper to take the boot problem seriously is also one of the calmest. In 1997, three researchers at the University of Pennsylvania Distributed Systems Laboratory -- William A. Arbaugh, David J. Farber, and Jonathan M. Smith -- presented &lt;em&gt;A Secure and Reliable Bootstrap Architecture&lt;/em&gt; [@aegis-1997] at the IEEE Symposium on Security and Privacy in Oakland. They opened with a line that ages disconcertingly well: &quot;we find it surprising, given the great attention paid to operating system security that so little attention has been paid to the underpinnings required for secure operation, e.g., a secure bootstrapping phase for these operating systems.&quot;&lt;/p&gt;
&lt;p&gt;They built a working prototype. A Pentium-class PC. A modified BIOS. A small PROM expansion card with public-key certificates. And, threaded through everything, an inductive structure they called AEGIS.&lt;/p&gt;

An ordered sequence in which each stage of platform initialisation verifies the cryptographic identity of the next stage *before* it executes. If every link verifies its successor, an external observer who trusts the first link transitively trusts the chain, modulo the cryptographic strength of the verification primitive.
&lt;p&gt;AEGIS divided the boot into six levels (0 through 5). &lt;strong&gt;L0&lt;/strong&gt; was a small trusted ROM that ran the first POST phase, the signature-verification routines, and recovery code. &lt;strong&gt;L1&lt;/strong&gt; was the rest of the BIOS code plus CMOS. &lt;strong&gt;L2&lt;/strong&gt; was option-ROM expansion cards (the era&apos;s GPUs, network cards, SCSI controllers). &lt;strong&gt;L3&lt;/strong&gt; was the operating system boot block(s). &lt;strong&gt;L4&lt;/strong&gt; was the OS kernel. &lt;strong&gt;L5&lt;/strong&gt; was user programs and any network hosts the kernel reached. Each level verified the next before handing off; on a failed verification, L0 recovered the broken stage from a known-good network image. (The paper also presents a &quot;four levels of abstraction&quot; framing for one of its figures; the article uses the canonical six-level numbering.)&lt;/p&gt;

The smallest, lowest, most immutable code that runs after platform reset. It measures the next stage of firmware and extends that measurement into PCR[0] before transferring control. Modern PCs implement the CRTM in silicon -- Intel&apos;s Boot Guard Authenticated Code Module, AMD&apos;s Platform Security Processor firmware, or Microsoft&apos;s Pluton silicon -- because anything mutable is not actually a root of trust.
&lt;p&gt;The architectural axiom that survived 28 years of evolution is this: there is always a bottom layer you cannot verify yourself. AEGIS does not eliminate that layer; it reduces trust to &lt;em&gt;the smallest possible&lt;/em&gt; unverifiable thing. The L0 trusted ROM is the axiom; everything above it is provable from the axiom. Replace &quot;trusted ROM&quot; with &quot;Boot Guard ACM&quot; or &quot;PSP boot ROM&quot; or &quot;Pluton silicon firmware&quot; and the structure does not change.&lt;/p&gt;
&lt;p&gt;AEGIS could not, on its own, make the next pivot. It had no hardware-rooted endorsement key. It had no append-only register that could not be lied to. It had no remote-attestation primitive -- the L0 ROM trusted itself, but an external auditor was forced to trust the BIOS&apos;s own report of the bootstrap. The trick AEGIS could not pull off is the trick the Trusted Computing Platform Alliance was about to attempt: &lt;em&gt;make the root a chip&lt;/em&gt;.Arbaugh continued the work at the University of Maryland and later took a senior position at the National Security Agency. The bootstrap problem followed him; in 2005 he co-authored an early TPM-on-Linux survey that anticipates several of the PCR allocation conventions that PFP would formalise.&lt;/p&gt;
&lt;p&gt;The TCPA was founded on October 11, 1999 [@wiki-tcg] by Compaq, Hewlett-Packard, IBM, Intel, and Microsoft. Its first specification [@wiki-tcg] shipped January 30, 2001. The first hardware-TPM-equipped PC shipped on the IBM ThinkPad T30 in 2002 [@wiki-tcg] (with a TPM 1.1-class Infineon SLB chip); the TPM &lt;strong&gt;1.1b&lt;/strong&gt; revision deployed in volume the year after. In 2003 the TCPA was reorganised as the Trusted Computing Group, with AMD joining as a founding board member.&lt;/p&gt;
&lt;p&gt;The thing AEGIS could not do -- turn a chain of in-RAM hash comparisons into a record a remote party can trust -- is what the TPM became.&lt;/p&gt;
&lt;h2&gt;3. Early Approaches: TPM 1.1b, SHA-1, and the Original PCSI&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;&quot;The first TPM version that was deployed was 1.1b in 2003&quot;&lt;/em&gt; [@wiki-tpm] -- Wikipedia, drawing on the TCPA shipment record. A 24-pin chip in a tiny LPC-bus package, soldered to the motherboard of a ThinkPad T30. Sixteen PCRs. One hash bank: SHA-1, 20 bytes wide. A monotonic counter. An endorsement key, fused at manufacture. A storage root key, generated at first ownership. By 2010, hundreds of millions of business PCs shipped with one. By July 28, 2016, Microsoft&apos;s Windows 10 hardware logo programme required TPM 2.0 on every new OEM Windows 10 PC -- desktop, mobile, and server alike [@wiki-tpm].&lt;/p&gt;
&lt;p&gt;The mechanic that did all the work is one operation: &lt;code&gt;TPM_Extend&lt;/code&gt;. It takes a PCR index and a 20-byte digest. It produces a new PCR value defined as &lt;code&gt;PCR[N] := SHA1(PCR[N] || digest)&lt;/code&gt;.&lt;/p&gt;

The only writable mutation a TPM permits on a PCR. Given the current value `P` and a new measurement `M`, the TPM computes `H(P || M)` and writes the result back into the PCR. There is no `set`; there is no `clear` (PCRs reset only at platform reset, and some PCRs not even then). The hash chain is the *only* trace.
&lt;p&gt;That two-letter primitive -- &lt;em&gt;extend&lt;/em&gt; -- is doing more cryptographic work than its size suggests. A PCR is not a set of measurements; it is a &lt;em&gt;sequence&lt;/em&gt;. If three boot stages measure three values &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, &lt;code&gt;c&lt;/code&gt; into PCR[0] in that order, the resulting PCR encodes &lt;code&gt;H(H(H(0 || a) || b) || c)&lt;/code&gt;. Reorder the stages and the final hash differs. Repeat a stage and the final hash differs. &lt;em&gt;Skip&lt;/em&gt; a stage -- the move every rootkit dreams of -- and the final hash differs. Under collision-resistance of the underlying hash, producing the same final PCR via a different ordered sequence is computationally infeasible.&lt;/p&gt;

A naive design might use the PCR as a set: write each measurement into a separate slot, and let the verifier check that the set matches a known-good baseline. That design has two pathologies. First, an attacker who controls one stage can simply *not* report its measurement and let the verifier see a smaller set than ran. Second, order doesn&apos;t matter to a set; an attacker can rearrange the stages and slip a measured-but-vulnerable component in early, where its measurement still &quot;matches&quot; the baseline.&lt;p&gt;Extend solves both. You cannot omit a stage without changing the final hash. You cannot reorder. You cannot insert. The cost is that &lt;em&gt;the verifier cannot read the PCR as a list of measurements&lt;/em&gt; -- it has to be given the list (the TCG event log) separately and re-derive the final PCR by replaying the extends. This is the trade we&apos;ll meet in Section 8 as a fundamental limit.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The PC Client Specific Implementation (PCSI) specification carved up the 24 PCRs of &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM 1.2&lt;/a&gt; into eight indices that the world still uses today. PCR[0] holds the CRTM, the system firmware code, and the firmware host platform extensions. PCR[1] holds the host platform configuration (CMOS settings that change platform behaviour). PCR[2] holds the option ROM code. PCR[3] holds the option ROM configuration. PCR[4] holds the master boot record code (and on UEFI machines, the boot-loader image). PCR[5] holds the master boot record partition table (and on UEFI machines, the boot configuration). PCR[6] holds host platform manufacturer-specific events. PCR[7] holds host platform manufacturer events -- a category that, post-PFP, became Secure Boot policy.&lt;/p&gt;

A group of PCRs that share a hash algorithm. TPM 1.2 had one bank only (SHA-1). TPM 2.0 supports multiple banks simultaneously -- the same PCR index exists once per bank, with one digest per bank. A measurement into PCR[7] writes the same source bytes into every bank but produces algorithm-specific digests.
&lt;p&gt;TPM 1.2 also defined the first remote-attestation primitive in industry hardware: &lt;code&gt;TPM_Quote&lt;/code&gt;. The TPM signs a snapshot of selected PCR values plus a verifier-supplied nonce with a private key the chip alone holds (the attestation identity key, signed by a TCG-managed privacy CA). The verifier checks the signature, checks the nonce, checks the AIK certificate chain, and re-derives the expected PCR set from a TCG event log delivered separately. If the re-derivation matches the signed quote, the platform&apos;s boot history is authenticated.&lt;/p&gt;
&lt;p&gt;It worked. For a while. Then, on February 23, 2017, the SHAttered team -- Marc Stevens (CWI Amsterdam) and Pierre Karpman (Inria) with Elie Bursztein, Ange Albertini, and Yarik Markov (Google Research) -- published the first public SHA-1 collision [@wiki-sha1]. Two PDF files with identical SHA-1 hashes. The collision cost about 110 GPU-years of compute [@wiki-sha1]. The implication for TPM 1.2 was immediate: a 20-byte SHA-1 PCR can no longer be assumed unique under attacker-controlled input.The SHA-1 choice in 2003 was state-of-the-art at the time, not negligence. NIST&apos;s SHA-256 had been published in 2001 but was not yet broadly trusted; SHA-1 was the IETF-blessed default for X.509 and many TLS deployments. The SHAttered collision required compute that did not exist commercially in 2003. By 2017 it required compute that anyone with a Google Cloud account could buy.&lt;/p&gt;
&lt;p&gt;If the cryptographic floor is broken and you cannot re-floor in place -- a TPM 1.2 chip cannot grow a SHA-256 bank [@wiki-tpm] -- you replace the floor with one that can be moved. That is what TPM 2.0 became.&lt;/p&gt;
&lt;h2&gt;4. Evolution: TPM 2.0, Hash Agility, and the UEFI PFP&lt;/h2&gt;
&lt;p&gt;On April 9, 2014, the Trusted Computing Group announced the TPM Library Specification 2.0 [@wiki-tpm]. ISO ratified the result the following year as ISO/IEC 11889-1:2015 [@iso-11889-1-2015], and confirmed the standard as current in a 2021 review. The change set is large -- new algorithm framework, NV index ACLs, sessions, command authorization area, ECC primary keys -- but the line that matters for measurement is the simplest one: PCRs now exist in &lt;em&gt;banks&lt;/em&gt;.&lt;/p&gt;

A property of a security system that lets operators or vendors replace one hash function with another without changing the system&apos;s interfaces. TPM 2.0 implements hash agility for PCRs (multiple banks), HMAC keys (algorithm parameter on the key), and signature primitives (algorithm parameter on the signature). Hash agility is not free: every bank costs storage, every bank costs extend cost, and the verifier must agree with the prover on which bank to use.
&lt;p&gt;A TPM 2.0 chip can run a SHA-1 bank, a SHA-256 bank, and (often) a SHA-384 bank in parallel, plus optional SHA-512 and SM3-256. The same PCR index lives once per bank. A &lt;code&gt;TPM2_PCR_Extend&lt;/code&gt; call updates every active bank with bank-specific digests; the source bytes are identical but the output is per-algorithm. &lt;code&gt;TPM2_PCR_Allocate&lt;/code&gt; reconfigures the bank set at runtime, gated by platform authorization.&lt;/p&gt;
&lt;p&gt;The event log structure had to grow with the chip. The pre-2014 log format -- &lt;code&gt;TCG_PCR_EVENT&lt;/code&gt;, single SHA-1 digest -- could not carry per-bank digests. The PC Client PFP defined a new structure, &lt;code&gt;TCG_PCR_EVENT2&lt;/code&gt;. From Microsoft&apos;s &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; reference [@ms-tbs-get-tcg-log], the wire format is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;typedef struct {
    TCG_PCRINDEX        PCRIndex;
    TCG_EVENTTYPE       EventType;
    TPML_DIGEST_VALUES  Digests;
    UINT32              EventSize;
    UINT8               Event[EventSize];
} TCG_PCR_EVENT2;

typedef struct {
    UINT32   Count;
    TPMT_HA  Digests;  // Count copies, one per bank
} TPML_DIGEST_VALUES;

typedef struct {
    UINT16  HashAlg;
    UINT8   Digest[size_varies_with_algorithm];
} TPMT_HA;
&lt;/code&gt;&lt;/pre&gt;

An in-RAM ordered list of `TCG_PCR_EVENT2` records, populated by firmware and OS components in the exact order they extend digests into PCRs. The log is *unsigned* -- only the PCR values are signed when the verifier later requests a quote. A verifier replays the log to re-derive the PCR values and accepts the log if the re-derivation matches the signed quote.

The multi-bank digest container inside `TCG_PCR_EVENT2`. It holds a `Count` of `TPMT_HA` records, each carrying a hash-algorithm identifier (`HashAlg`, a TPM_ALG_ID) and the corresponding digest. A modern Windows log on a SHA-256-and-SHA-1 dual-bank TPM emits `Count = 2` per event with both digests of the same source bytes.
&lt;p&gt;The very first event in a TPM-2.0-format log is, deliberately, a TPM-1.2-format record. From Microsoft Learn verbatim [@ms-tbs-get-tcg-log]: &lt;em&gt;&quot;The Signature member of the TCG_EfiSpecIdEventStruct structure is set to a null-terminated ASCII string of &lt;code&gt;\&quot;Spec ID Event03\&quot;&lt;/code&gt;&quot;&lt;/em&gt;. That string is the self-describing handshake: a parser that doesn&apos;t know about banks reads the legacy event and either understands it (continuing as a 1.2 parser) or recognises the Spec ID handshake (and upgrades to the 2.0 parser). The cost of forward compatibility is precisely one event.The &quot;Event03&quot; suffix is not a typo. The TCG PC Client Platform Firmware Profile defines &lt;code&gt;TCG_EfiSpecIDEventStruct&lt;/code&gt; with &lt;code&gt;Signature[16]&lt;/code&gt; containing the ASCII string and a &lt;code&gt;specVersionMajor&lt;/code&gt;/&lt;code&gt;specVersionMinor&lt;/code&gt;/&lt;code&gt;specErrata&lt;/code&gt; triplet. The &quot;03&quot; denotes the third revision of the format. Earlier &quot;Spec ID Event02&quot; structures exist in pre-1.21 PFP firmware; they encode banks differently and are extremely rare in Windows-era machines.&lt;/p&gt;
&lt;p&gt;The bridge between the chip and the firmware is a UEFI protocol. &lt;code&gt;EFI_TCG2_PROTOCOL&lt;/code&gt; [@uefi-org-specs] (UEFI 2.5 and later) exposes three calls that matter: &lt;code&gt;HashLogExtendEvent&lt;/code&gt; (the one-shot &quot;hash this blob, log it, extend the PCR&quot; call), &lt;code&gt;GetEventLog&lt;/code&gt; (return the in-progress event log to a caller), and &lt;code&gt;GetCapability&lt;/code&gt; (which banks are active, which algorithms are supported). After &lt;code&gt;ExitBootServices&lt;/code&gt;, the firmware publishes the final log as a UEFI configuration table; the OS reads it from there.&lt;/p&gt;
&lt;p&gt;The Microsoft PFP-era PCR allocation is the table every modern Windows administrator should memorise.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCR&lt;/th&gt;
&lt;th&gt;TCG PFP definition&lt;/th&gt;
&lt;th&gt;Microsoft WBCL convention&lt;/th&gt;
&lt;th&gt;Linux IMA / shim convention&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;SRTM, BIOS, host platform extensions, embedded option ROMs&lt;/td&gt;
&lt;td&gt;Firmware version (&lt;code&gt;EV_S_CRTM_VERSION&lt;/code&gt;); platform firmware blob&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Host platform configuration&lt;/td&gt;
&lt;td&gt;BIOS setup data&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;UEFI driver and application code (option ROMs)&lt;/td&gt;
&lt;td&gt;Pluggable option ROM code&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UEFI driver and application configuration&lt;/td&gt;
&lt;td&gt;Option ROM data&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;UEFI boot manager and boot attempts&lt;/td&gt;
&lt;td&gt;&lt;code&gt;EV_EFI_BOOT_SERVICES_APPLICATION&lt;/code&gt; for &lt;code&gt;bootmgfw.efi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Same (shim/grub image)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Boot manager code and boot attempts&lt;/td&gt;
&lt;td&gt;Boot partition GPT, EFI variables loaded by boot manager&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Host platform manufacturer events&lt;/td&gt;
&lt;td&gt;Wake reason, S-state events&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Secure Boot policy&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SecureBoot&lt;/code&gt;/&lt;code&gt;PK&lt;/code&gt;/&lt;code&gt;KEK&lt;/code&gt;/&lt;code&gt;db&lt;/code&gt;/&lt;code&gt;dbx&lt;/code&gt; variable digests&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8-9&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Unused on Windows&lt;/td&gt;
&lt;td&gt;Linux kernel measurement (some distros)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Unused on Windows&lt;/td&gt;
&lt;td&gt;IMA file measurements (canonical)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Microsoft WBCL events (BitLocker control PCR)&lt;/td&gt;
&lt;td&gt;Unused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Boot environment configuration&lt;/td&gt;
&lt;td&gt;Unused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;ELAM driver hash and policy&lt;/td&gt;
&lt;td&gt;Unused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Boot-loader-authority events&lt;/td&gt;
&lt;td&gt;shim MOK certificate enrolment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;OS-loader reserved&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;Used during development&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17-22&lt;/td&gt;
&lt;td&gt;Dynamic OS (DRTM use only)&lt;/td&gt;
&lt;td&gt;Secure Launch, Authenticated Code Module&lt;/td&gt;
&lt;td&gt;TrenchBoot, tboot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;Application support&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;td&gt;Reserved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A small word on the index column: a 24-PCR TPM ranges from PCR[0] to PCR[23].The PFP allocates PCR[16] as a debug index that platform firmware may extend during development; the value resets to zero at TPM_Init, which is one of two PCRs (the other is PCR[23]) the platform may explicitly reset. Older PCSI-era documentation sometimes refers to PCR[24]; that is a historical artifact of an unsanctioned Infineon extension and is not part of the modern PFP allocation. The allocation itself is normative in the PFP, but it sits inside a wider policy frame: NIST SP 800-155 (BIOS Integrity Measurement Guidelines, December 2011 IPD) [@csrc-sp800-155-pdf] defined the federal procurement bar for &quot;BIOS integrity measurement&quot; -- a draft that, despite never finalising, became the de-facto procurement template for the SRTM measurement chain U.S. agencies require their suppliers to ship.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you click the canonical TPM 2.0 Library Specification link [@tcg-tpm-library] or the PC Client PFP link [@tcg-pfp], the trustedcomputinggroup.org host returns HTTP 403 to non-browser User-Agents and to some browser fingerprints. The specifications exist and are normative; we cite them by canonical URL. For verbatim struct definitions and the &lt;code&gt;&quot;Spec ID Event03&quot;&lt;/code&gt; string, Microsoft&apos;s &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; reference [@ms-tbs-get-tcg-log] reproduces them word-for-word; Wikipedia&apos;s TPM article [@wiki-tpm] corroborates the spec metadata.&lt;/p&gt;
&lt;/blockquote&gt;

gantt
    dateFormat YYYY
    title Five generations of measured boot
    section Generation 1
    AEGIS at UPenn (Arbaugh 1997)             :a1, 1997, 1y
    section Generation 2
    TCPA founded (1999) / TPM 1.1b (2003)     :a2, 1999, 11y
    TPM 1.2 PCSI defines PCR[0-7]             :a3, after a2, 11y
    section Generation 3
    TPM 2.0 announced (April 9, 2014)         :a4, 2014, 12y
    ISO/IEC 11889 (2015) / Hash agility       :a5, 2015, 11y
    section Generation 4
    Intel TXT GETSEC[SENTER] (2007)           :a6, 2007, 19y
    Microsoft Secure Launch (Win10 1809)      :a7, 2018, 8y
    section Generation 5
    Azure Attestation / Intune DHA            :a8, 2018, 8y
    PFP r2 / ML-DSA in flight                 :a9, 2025, 1y
&lt;p&gt;We now have a self-describing log, a hash-agile PCR set, and a verbatim ABI. Who actually writes the log? And who reads it?&lt;/p&gt;
&lt;h2&gt;5. The Breakthrough: One Log, Many Consumers&lt;/h2&gt;
&lt;p&gt;Every trust decision a modern Windows machine makes about its own boot ultimately consults the same record. BitLocker&apos;s seal release. Windows Defender System Guard runtime attestation [@ms-learn-sgsl]. Windows Hello for Business device-bound key attestation. Microsoft Azure Attestation [@ms-aa-overview] policy evaluation. Microsoft Intune Device Health Attestation. Conditional Access posture checks. All of them, ultimately, read the TCG event log -- and the PCR snapshot it replays into. One log; every feature.&lt;/p&gt;
&lt;p&gt;This is the article&apos;s structural insight. It is also the reason this specification has survived three generations of attacks: the cost of designing a new attestation feature on Windows is no longer &quot;design a new measurement plane,&quot; it is &quot;decide which PCRs your policy cares about.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; One log, many consumers. Every Windows trust decision about boot integrity -- BitLocker unseal, System Guard attestation, Hello for Business key attestation, Azure Attestation, Intune Device Health Attestation, Conditional Access -- ultimately consults the same TCG event log and the PCR snapshot it replays into. The cost of adding a new attestation feature is not a new measurement plane; it is a policy decision about which PCRs matter.&lt;/p&gt;
&lt;/blockquote&gt;

One log, every feature.
&lt;p&gt;The cooperative writers populate the log in pipeline order, following the Microsoft &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; PCR allocation [@ms-tbs-get-tcg-log]. Firmware -- the silicon root of trust and everything above it through the UEFI driver execution environment -- writes PCRs 0 through 7. The Microsoft boot manager &lt;code&gt;bootmgfw.efi&lt;/code&gt; writes additional events into PCRs 4, 11, and 12. The Windows OS loader &lt;code&gt;winload.efi&lt;/code&gt; writes into PCRs 11 and 13. Into PCR 13 specifically, &lt;code&gt;winload.efi&lt;/code&gt; writes the ELAM policy hash and the ELAM driver writes its own image digest (§6.5 walks the full PCR[13] cooperative sequence). The Windows kernel emits a &lt;code&gt;EV_SEPARATOR&lt;/code&gt; event on every measured PCR once the boot-time measurement phase is complete, freezing the boot-time slice of the log for verifiers.&lt;/p&gt;
&lt;p&gt;The unified reader path mirrors the writer fan-in. &lt;code&gt;EFI_TCG2_PROTOCOL.GetEventLog&lt;/code&gt; exposes the main log to firmware drivers and applications before &lt;code&gt;ExitBootServices&lt;/code&gt;; events measured after that call are published separately through the &lt;code&gt;EFI_TCG2_FINAL_EVENTS_TABLE&lt;/code&gt; configuration table. Windows reads both during boot and exposes the merged log -- the firmware portion plus the OS-loader extensions -- to user mode through &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; [@ms-tbs-get-tcg-log]. Operators read it with the inbox &lt;code&gt;tpmtool.exe&lt;/code&gt; or cross-platform &lt;code&gt;tpm2_eventlog&lt;/code&gt; [@gh-tpm2-eventlog-man]; §6.7 walks the full tool set.&lt;/p&gt;

flowchart TD
    subgraph FW[&quot;Firmware (CRTM / PEI / DXE / BDS)&quot;]
        F0[&quot;PCR[0]: CRTM, firmware blob&quot;]
        F1[&quot;PCR[1]: BIOS setup&quot;]
        F2[&quot;PCR[2]: option ROMs&quot;]
        F3[&quot;PCR[3]: option ROM config&quot;]
        F5[&quot;PCR[5]: GPT, EFI vars&quot;]
        F6[&quot;PCR[6]: wake reason&quot;]
        F7[&quot;PCR[7]: Secure Boot policy&quot;]
    end
    subgraph BM[&quot;bootmgfw.efi&quot;]
        B4[&quot;PCR[4]: boot mgr image (Authenticode)&quot;]
        B11A[&quot;PCR[11]: WBCL boot mgr events&quot;]
        B12[&quot;PCR[12]: boot config&quot;]
    end
    subgraph WL[&quot;winload.efi&quot;]
        W11[&quot;PCR[11]: kernel, HAL, boot-critical drivers&quot;]
        W13A[&quot;PCR[13]: ELAM policy hash&quot;]
    end
    subgraph ELAM[&quot;ELAM driver&quot;]
        E13[&quot;PCR[13]: ELAM driver hash&quot;]
    end
    subgraph K[&quot;Windows kernel&quot;]
        SEP[&quot;EV_SEPARATOR on every measured PCR (freeze)&quot;]
    end
    FW --&amp;gt; BM --&amp;gt; WL --&amp;gt; ELAM --&amp;gt; K
&lt;p&gt;A single canonical log eliminates per-feature reinvention. Azure Attestation does not have to parse a different log than BitLocker. Hello for Business does not have to extend its own PCRs. The verifier community -- the part that knows what &quot;good&quot; means -- builds policies on top of one shared substrate.&lt;/p&gt;
&lt;p&gt;We have named the log abstractly. What does an actual event look like, byte by byte, on the wire?&lt;/p&gt;
&lt;h2&gt;6. State of the Art: A Line-by-Line Walk Through the SRTM Chain&lt;/h2&gt;
&lt;p&gt;This is the section the practitioner audience came for. We walk the chain in the exact order events are logged on a modern UEFI Windows 11 24H2 machine. Reference: a Dell OptiPlex 7090 with Boot Guard, TPM 2.0 in SHA-256-only mode, Secure Boot enabled, BitLocker with TPM-only protector bound to the PFP-default UEFI profile.&lt;/p&gt;
&lt;p&gt;The first &lt;em&gt;measured&lt;/em&gt; event, after the initial &lt;code&gt;EV_NO_ACTION&lt;/code&gt; Spec ID record described above, is a &lt;code&gt;EV_S_CRTM_VERSION&lt;/code&gt; record. PCR index 0. Event type &lt;code&gt;0x00000008&lt;/code&gt;. Two SHA-256 digests (one per active bank if SHA-1 is also enabled). Event size 8. Event data: a little-endian UTF-16 string containing the firmware version, padded to 8 bytes. The CRTM extends &lt;em&gt;its own&lt;/em&gt; version into PCR[0] before measuring anything else. This is the foundation event.&lt;/p&gt;
&lt;h3&gt;6.1 The CRTM and PCR[0]&lt;/h3&gt;
&lt;p&gt;The very first instruction the CPU fetches after reset is not in DRAM. On a modern x86, it is in an immutable silicon region whose location and contents differ by silicon vendor.&lt;/p&gt;
&lt;p&gt;On AMD Zen-class platforms, the Platform Security Processor -- a 32-bit ARM core inside the SOC -- boots first, validates the platform firmware against a key fused into silicon, and only then releases the x86 cores from reset. On Intel platforms with Boot Guard, the Authenticated Code Module is loaded from firmware into the cache-as-RAM region, signed by a key whose hash is fused into Intel chipset OTP fuses, and verified by microcode before x86 main core start. On Microsoft Pluton SKUs, the &lt;a href=&quot;https://paragmali.com/blog/pluton-a-tpm-on-silicon-microsoft-can-patch/&quot; rel=&quot;noopener&quot;&gt;Pluton silicon firmware&lt;/a&gt; runs first; on AMD Ryzen 6000-series and later parts with Pluton enabled, Pluton is implemented as a Microsoft-co-designed firmware mode running on the existing AMD PSP coprocessor, not as a separate chip.&lt;/p&gt;
&lt;p&gt;In every case, that silicon-rooted CRTM measures the next stage of firmware before transferring control. From Microsoft&apos;s hardware-rooted trust documentation [@ms-learn-hwrot], verbatim: &lt;em&gt;&quot;This technique of measuring the static early boot UEFI components is called the Static Root of Trust for Measurement (SRTM).&quot;&lt;/em&gt; The SRTM extends PCR[0] with a chain of three early events: &lt;code&gt;EV_S_CRTM_VERSION&lt;/code&gt; (firmware version), &lt;code&gt;EV_S_CRTM_CONTENTS&lt;/code&gt; (the immutable CRTM code hash), and &lt;code&gt;EV_POST_CODE&lt;/code&gt; (the POST code region hash). Then, if the platform has a separable firmware volume, an &lt;code&gt;EV_EFI_PLATFORM_FIRMWARE_BLOB&lt;/code&gt; event covers the rest of the SPI flash region per the TCG PFP event-type registry surfaced in Microsoft&apos;s &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; reference [@ms-tbs-get-tcg-log]. The PFP closes PCR[0] with an &lt;code&gt;EV_SEPARATOR&lt;/code&gt; event at the BDS boundary.&lt;/p&gt;
&lt;p&gt;Where the firmware-version string differs, the SHA-256 digest of the &lt;code&gt;EV_S_CRTM_VERSION&lt;/code&gt; event data differs. Where the &lt;code&gt;EV_S_CRTM_VERSION&lt;/code&gt; digest differs, PCR[0] differs. That is the entire mechanism by which an overnight UEFI patch changes PCR[0]. Dell updated the firmware string from &quot;1.16.0&quot; to &quot;1.17.0&quot;; the bytes hashed; the PCR moved; the seal broke.&lt;/p&gt;
&lt;h3&gt;6.2 PEI/DXE, option ROMs, and PCR[1-3]&lt;/h3&gt;
&lt;p&gt;After the CRTM hands off, the Pre-EFI Initialisation (PEI) phase runs and the Driver Execution Environment (DXE) phase loads UEFI drivers. PEI does early silicon initialisation -- memory controller, cache topology, basic chipset config -- and DXE does device discovery, including option ROMs for plug-in cards.&lt;/p&gt;
&lt;p&gt;Each option ROM that runs is measured into PCR[2]. The option ROM&apos;s configuration -- card-specific NVRAM state that survives reboot -- is measured into PCR[3]. The PFP also reserves PCR[1] for the platform configuration: CMOS settings, the SMBIOS table contents, and any BIOS-setup-visible knob that affects platform behaviour per the PCR-allocation mapping surfaced in Microsoft&apos;s &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; documentation [@ms-tbs-get-tcg-log]. Changing your boot order in BIOS setup changes PCR[1]. Disabling a USB controller in firmware changes PCR[1]. Installing a discrete GPU adds an &lt;code&gt;EV_EFI_BOOT_SERVICES_DRIVER&lt;/code&gt; event into PCR[2] for the GPU&apos;s video BIOS.&lt;/p&gt;
&lt;h3&gt;6.3 Secure Boot variables and PCR[7]&lt;/h3&gt;
&lt;p&gt;PCR[7] is the Secure Boot policy PCR. It records the digests of the four variables that define &lt;a href=&quot;https://paragmali.com/blog/secure-boot-in-windows-the-chain-from-sector-zero-to-userini/&quot; rel=&quot;noopener&quot;&gt;Secure Boot identity&lt;/a&gt; -- &lt;code&gt;SecureBoot&lt;/code&gt; (the on/off flag), &lt;code&gt;PK&lt;/code&gt; (Platform Key), &lt;code&gt;KEK&lt;/code&gt; (Key Exchange Key), &lt;code&gt;db&lt;/code&gt; (allowed signers), and &lt;code&gt;dbx&lt;/code&gt; (revocation list) -- plus any signed program execution events the firmware logs to PCR[7] under &lt;code&gt;EV_EFI_VARIABLE_AUTHORITY&lt;/code&gt; [@gh-wack0-bitlocker].&lt;/p&gt;
&lt;p&gt;Each variable contributes one &lt;code&gt;EV_EFI_VARIABLE_DRIVER_CONFIG&lt;/code&gt; event whose Event field encodes &lt;code&gt;(VariableName GUID, UnicodeName, VariableDataLength, VariableData)&lt;/code&gt; and whose digest is the SHA-256 of that entire structure. &lt;em&gt;The digest is not over the variable data alone&lt;/em&gt;; it is over the GUID and name as well. This matters: when the May 2023 Microsoft &lt;code&gt;dbx&lt;/code&gt; update shipped under KB5025885 [@ms-kb5025885] added the BlackLotus-vulnerable boot manager hashes to the revocation list, the variable data length grew, the structure changed, and the resulting &lt;code&gt;EV_EFI_VARIABLE_DRIVER_CONFIG&lt;/code&gt; digest differed. Every UEFI Windows machine on Earth that consumed that &lt;code&gt;dbx&lt;/code&gt; update saw PCR[7] move.&lt;/p&gt;
&lt;p&gt;From the Wack0/bitlocker-attacks index [@gh-wack0-bitlocker], reproducing TCG EFI Platform Specification §6.4 verbatim: &lt;em&gt;&quot;If the platform provides a firmware debugger mode which may be used prior to the UEFI environment or if the platform provides a debugger for the UEFI environment, then the platform SHALL extend an EV_EFI_ACTION event into PCR[7] before allowing use of the debugger&quot;&lt;/em&gt;. The intent is clear: a debugged firmware is a different PCR[7] than a production firmware. The verifier can refuse to release a key to a debugged platform.&lt;/p&gt;
&lt;h3&gt;6.4 Boot manager (bootmgfw.efi) and PCR[4] + PCR[11]&lt;/h3&gt;
&lt;p&gt;The UEFI Boot Device Selection (BDS) phase locates &lt;code&gt;EFI/Microsoft/Boot/bootmgfw.efi&lt;/code&gt; on the EFI System Partition, computes its &lt;a href=&quot;https://paragmali.com/blog/windows-app-identity-33-year-reinvention/&quot; rel=&quot;noopener&quot;&gt;Authenticode digest&lt;/a&gt;, verifies the Authenticode signature against &lt;code&gt;db&lt;/code&gt; and &lt;code&gt;dbx&lt;/code&gt;, logs &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/win32/api/tbs/nf-tbs-tbsi_get_tcg_log&quot; rel=&quot;noopener&quot;&gt;an &lt;code&gt;EV_EFI_BOOT_SERVICES_APPLICATION&lt;/code&gt; event into PCR[4]&lt;/a&gt; with that digest, and transfers control. PCR[4] now binds to the boot manager&apos;s image content. A different boot manager binary -- a different version, a different language pack -- produces a different PCR[4].&lt;/p&gt;

Microsoft&apos;s Portable Executable signature format. The Authenticode digest is computed over the PE image *excluding* fields the loader rewrites (file offset bytes, the checksum field, the digital-signature pointer). Authenticode is not the same as a SHA-256 over the file -- two byte-identical .exe files can have different SHA-256 but the same Authenticode digest, and vice versa. Boot Guard, Secure Boot, and PCR[4] all hash the Authenticode digest, not the raw file.
&lt;p&gt;Once &lt;code&gt;bootmgfw.efi&lt;/code&gt; runs, it extends its own events into PCR[11]. These are Microsoft-specific Windows Boot Configuration Log (WBCL) records, not generic TCG events. They include the BCD store contents, the boot-environment configuration, and Microsoft-private telemetry about the boot manager&apos;s policy decisions. PCR[11] is the &lt;em&gt;BitLocker control PCR&lt;/em&gt; -- the index that captures Windows-side boot-time configuration.&lt;/p&gt;

The Microsoft-specific extension of the TCG event log carrying boot-manager, loader, and ELAM events. WBCL events use the TCG `EV_EVENT_TAG` event type with Microsoft-private sub-types. They are extended into PCR[11], PCR[12], and PCR[13]. WBCL is exposed by `Tbsi_Get_TCG_Log_Ex` and is what `tpmtool.exe getdeviceinformation` actually parses.
&lt;h3&gt;6.5 winload.efi and the ELAM handoff&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bootmgfw.efi&lt;/code&gt; chains to &lt;code&gt;winload.efi&lt;/code&gt;, the OS loader. &lt;code&gt;winload&lt;/code&gt; measures the Windows kernel image (&lt;code&gt;ntoskrnl.exe&lt;/code&gt;), the Hardware Abstraction Layer (&lt;code&gt;hal.dll&lt;/code&gt;), the OS configuration data (the boot manager&apos;s view of boot-critical drivers), and each boot-critical driver in load order -- each into PCR[11] as a WBCL record. The kernel binary itself is part of that chain; a kernel update changes PCR[11].&lt;/p&gt;
&lt;p&gt;The Early Launch Anti-Malware (ELAM) interface gives a vendor anti-malware driver a chance to run before all other drivers and approve or block subsequent driver load attempts. &lt;code&gt;winload&lt;/code&gt; measures the ELAM policy file hash into PCR[13]; the ELAM driver, when loaded, extends its own image digest into PCR[13]; the ELAM driver then returns its allow/deny verdict on each subsequent driver, and &lt;code&gt;winload&lt;/code&gt; logs those verdicts (also into PCR[13] under WBCL &lt;code&gt;EV_EVENT_TAG&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;6.6 Kernel and the final separator&lt;/h3&gt;
&lt;p&gt;Once the Windows kernel starts, it exposes the TCG event log through the TPM Base Services driver &lt;code&gt;Tbs.sys&lt;/code&gt;, which is consumed by Win32 callers through &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt;. The kernel emits a &lt;code&gt;EV_SEPARATOR&lt;/code&gt; event into every measured PCR -- the &quot;ready-to-boot&quot; marker. After the separator, no further measured-boot events occur for the current boot session. The WBCL is frozen. A verifier reading the log at this point sees the complete boot history.&lt;/p&gt;
&lt;h3&gt;6.7 Reading the log from user mode&lt;/h3&gt;
&lt;p&gt;On a Windows 11 24H2 machine, the simplest way to read the log is &lt;code&gt;tpmtool.exe getdeviceinformation&lt;/code&gt; from an elevated prompt -- it prints the parsed WBCL plus the current PCR values. For the raw binary log, &lt;code&gt;Get-TpmEndorsementKeyInfo&lt;/code&gt; from PowerShell returns the EK chain, and &lt;code&gt;MeasuredBootTool.exe -log &amp;lt;path&amp;gt;&lt;/code&gt; from the Windows HLK kit returns the raw binary log file written under &lt;code&gt;C:\Windows\Logs\MeasuredBoot\*.log&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cross-platform, &lt;code&gt;tpm2_eventlog&lt;/code&gt; [@gh-tpm2-eventlog-man] from the tpm2-tools suite [@gh-tpm2-tools] parses any binary log conforming to the PC Client PFP -- including Windows-saved logs, because the WBCL extension is structurally compatible. The man page is precise: &lt;em&gt;&quot;tpm2_eventlog(1) -- Parse a binary TPM2 event log... The format of this log documented in the &apos;TCG PC Client Platform Firmware Profile Specification&apos;.&quot;&lt;/em&gt; On Linux, the firmware-published log lives at &lt;code&gt;/sys/kernel/security/tpm0/binary_bios_measurements&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;{`
// Simulate three iterative SHA-256 extends into a single PCR.
// Initial PCR is 32 zero bytes. Each extend: PCR := SHA256(PCR || measurement).&lt;/p&gt;
&lt;p&gt;async function sha256(buffer) {
  const hash = await crypto.subtle.digest(&apos;SHA-256&apos;, buffer);
  return new Uint8Array(hash);
}&lt;/p&gt;
&lt;p&gt;function concat(a, b) {
  const out = new Uint8Array(a.length + b.length);
  out.set(a, 0);
  out.set(b, a.length);
  return out;
}&lt;/p&gt;
&lt;p&gt;function toHex(arr) {
  return Array.from(arr).map(b =&amp;gt; b.toString(16).padStart(2, &apos;0&apos;)).join(&apos;&apos;);
}&lt;/p&gt;
&lt;p&gt;async function extendChain(measurements) {
  let pcr = new Uint8Array(32); // 32 zero bytes
  for (const m of measurements) {
    pcr = await sha256(concat(pcr, m));
  }
  return toHex(pcr);
}&lt;/p&gt;
&lt;p&gt;const a = new TextEncoder().encode(&apos;firmware-v1.16&apos;);
const b = new TextEncoder().encode(&apos;bootmgfw-2024-03&apos;);
const c = new TextEncoder().encode(&apos;winload-26100.123&apos;);&lt;/p&gt;
&lt;p&gt;(async () =&amp;gt; {
  const abc = await extendChain([a, b, c]);
  const cba = await extendChain([c, b, a]);
  console.log(&apos;PCR after a,b,c =&apos;, abc);
  console.log(&apos;PCR after c,b,a =&apos;, cba);
  console.log(&apos;Same value?&apos;, abc === cba);
})();
`}&lt;/p&gt;
&lt;p&gt;Run that snippet and you will see two completely different 32-byte hex strings. The PCR encodes &lt;em&gt;the order&lt;/em&gt;. A verifier comparing your machine&apos;s PCR[11] against a known-good baseline is implicitly checking that the kernel, the HAL, and the boot-critical drivers all loaded in the expected sequence -- not just that they all loaded. Reorder the chain, even with identical inputs, and the PCR moves. This is the property that makes the chain-of-hashes axiom load-bearing.&lt;/p&gt;
&lt;h3&gt;6.8 The PCR allocation cheat sheet&lt;/h3&gt;
&lt;p&gt;Pin the table from Section 4 to your wall. Most operational questions reduce to &quot;which PCR is affected by this change, and is it in my BitLocker profile?&quot; Three quick rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Code changes go to even PCRs (0, 2, 4).&lt;/strong&gt; Firmware blob, option ROM, boot manager. A firmware update moves PCR[0]; a discrete GPU swap moves PCR[2]; a boot-manager update moves PCR[4].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration changes go to odd PCRs (1, 3, 5).&lt;/strong&gt; BIOS setup, option ROM config, EFI variables seen by the boot manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Policy and identity go to PCR[7].&lt;/strong&gt; Secure Boot keys. Any &lt;code&gt;dbx&lt;/code&gt; update moves PCR[7]. Disabling Secure Boot moves PCR[7]. Enrolling third-party &lt;code&gt;db&lt;/code&gt; entries moves PCR[7].&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PCR[11] is the OS-loader code chain on Windows (kernel, HAL, boot drivers). PCR[13] is the ELAM policy and driver. PCR[14] is, by Microsoft convention, boot-loader-authority events; by Linux shim convention, MOK enrolment. Same index; different ontology. Verifiers must pick a side.&lt;/p&gt;
&lt;h3&gt;6.9 BitLocker seal-binding&lt;/h3&gt;
&lt;p&gt;BitLocker&apos;s Volume Master Key is wrapped by a TPM-resident sealed blob whose policy is &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt; over a chosen &lt;em&gt;PCR profile&lt;/em&gt;. The default UEFI profile is the bitmask &lt;code&gt;0x00000080 | 0x00000800 = 0x880&lt;/code&gt; -- that is PCR[7] (bit 7 = &lt;code&gt;0x80&lt;/code&gt;) plus PCR[11] (bit 11 = &lt;code&gt;0x800&lt;/code&gt;) -- as documented in the BitLocker Group Policy reference [@ms-learn-bitlocker-gpo], which notes verbatim that &lt;em&gt;&quot;when Secure Boot State (PCR7) support is available, the default platform validation profile secures the encryption key using Secure Boot State (PCR 7) and the BitLocker access control (PCR 11).&quot;&lt;/em&gt; The legacy CSM/BIOS profile is &lt;code&gt;0x00000015 | 0x00000800 = 0x815&lt;/code&gt; -- that is PCR[0], PCR[2], PCR[4], plus PCR[11].&lt;/p&gt;
&lt;p&gt;At seal time (when BitLocker enables, or when a user changes the protector configuration), the TPM records the current PCR values into the policy. At every subsequent boot, the boot manager rebuilds the session, calls &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt; with the &lt;em&gt;current&lt;/em&gt; PCR values, and calls &lt;code&gt;TPM2_Unseal&lt;/code&gt;. If the current PCRs match the seal-time digest, the TPM releases the VMK and BitLocker unlocks transparently. If they don&apos;t match, the TPM refuses and Windows prompts for the 48-digit recovery key.&lt;/p&gt;
&lt;p&gt;From Microsoft&apos;s BitLocker countermeasures documentation [@ms-learn-bitlocker-counter]: &lt;em&gt;&quot;By default, BitLocker provides integrity protection for Secure Boot by using the TPM PCR[7] measurement. An unauthorized EFI firmware, EFI boot application, or bootloader can&apos;t run and acquire the BitLocker key&quot;&lt;/em&gt;. The PCR[7]-default choice is deliberate: PCR[7] is the &lt;em&gt;policy&lt;/em&gt; PCR, not the &lt;em&gt;code&lt;/em&gt; PCR. Firmware updates don&apos;t change a Secure-Boot-policy hash; only key-database updates do.&lt;/p&gt;

sequenceDiagram
    participant Firmware
    participant BootMgr as bootmgfw.efi
    participant TPM
    participant Winload as winload.efi
    Firmware-&amp;gt;&amp;gt;TPM: TPM2_PCR_Extend (PCR[0-7])
    BootMgr-&amp;gt;&amp;gt;TPM: TPM2_PCR_Extend (PCR[4], PCR[11], PCR[12])
    BootMgr-&amp;gt;&amp;gt;TPM: TPM2_StartAuthSession
    BootMgr-&amp;gt;&amp;gt;TPM: TPM2_PolicyPCR (selection = current profile)
    BootMgr-&amp;gt;&amp;gt;TPM: TPM2_Unseal (sealed VMK blob)
    alt PCRs match seal-time digest
        TPM--&amp;gt;&amp;gt;BootMgr: VMK plaintext
        BootMgr-&amp;gt;&amp;gt;Winload: hand off, VMK in protected memory
        Winload--&amp;gt;&amp;gt;Firmware: continue boot
    else PCRs do not match
        TPM--&amp;gt;&amp;gt;BootMgr: TPM_RC_POLICY_FAIL
        BootMgr--&amp;gt;&amp;gt;BootMgr: prompt for 48-digit recovery key
    end
&lt;p&gt;The on-disk registry path that records the profile choice is &lt;code&gt;HKLM\SOFTWARE\Policies\Microsoft\FVE\PlatformValidationProfileUEFI&lt;/code&gt; [@ms-learn-bitlocker-gpo]. The value is a 24-bit bitmask where bit &lt;code&gt;N&lt;/code&gt; selects PCR[N]. A device that sealed under the default &lt;code&gt;0x880&lt;/code&gt; profile and then has Group Policy changed to &lt;code&gt;0x815&lt;/code&gt; will &lt;em&gt;not&lt;/em&gt; automatically re-seal -- you must explicitly disable and re-enable the TPM protector with &lt;code&gt;manage-bde -protectors&lt;/code&gt; [@ms-manage-bde-protectors] to rotate the policy.&lt;/p&gt;
&lt;p&gt;A small utility decodes the bitmask:&lt;/p&gt;
&lt;p&gt;{`
function decodeProfile(mask) {
  const selected = [];
  for (let bit = 0; bit &amp;lt; 24; bit++) {
    if (mask &amp;amp; (1 &amp;lt;&amp;lt; bit)) selected.push(bit);
  }
  return selected;
}&lt;/p&gt;
&lt;p&gt;console.log(&apos;Default UEFI profile (0x880):&apos;, decodeProfile(0x880));
console.log(&apos;Legacy CSM profile (0x815):  &apos;, decodeProfile(0x815));
console.log(&apos;A more restrictive profile (0x8D5):&apos;, decodeProfile(0x8D5));&lt;/p&gt;
&lt;p&gt;// Output:
// Default UEFI profile (0x880): [7, 11]            (PCR[7]+PCR[11])
// Legacy CSM profile (0x815):   [0, 2, 4, 11]      (PCR[0]+PCR[2]+PCR[4]+PCR[11])
// A more restrictive profile (0x8D5): [0, 2, 4, 6, 7, 11]
`}&lt;/p&gt;
&lt;p&gt;Run it. Your machine&apos;s profile mask is one of those three (or close enough). If the mask includes PCR[0], every firmware update will trigger a recovery prompt. If it omits PCR[0] but includes PCR[7], only Secure Boot key changes (Microsoft&apos;s annual &lt;code&gt;dbx&lt;/code&gt; updates, third-party Linux enrolments, BIOS-setup Secure Boot toggles) will. The four canonical recovery-prompt causes follow directly:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cause&lt;/th&gt;
&lt;th&gt;PCR affected&lt;/th&gt;
&lt;th&gt;Mitigation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;UEFI firmware update&lt;/td&gt;
&lt;td&gt;PCR[0]&lt;/td&gt;
&lt;td&gt;Suspend BitLocker before update; legacy profile only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft &lt;code&gt;dbx&lt;/code&gt; update or Secure Boot key rotation&lt;/td&gt;
&lt;td&gt;PCR[7]&lt;/td&gt;
&lt;td&gt;Suspend BitLocker before patch Tuesday&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boot-manager binary swap (KB-driven update)&lt;/td&gt;
&lt;td&gt;PCR[4], PCR[11]&lt;/td&gt;
&lt;td&gt;Suspend BitLocker before cumulative update&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firmware setup change (virtualization toggle, device enable/disable)&lt;/td&gt;
&lt;td&gt;PCR[1]&lt;/td&gt;
&lt;td&gt;Suspend BitLocker before deliberate change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

flowchart LR
    CRTM[&quot;CRTM&lt;br /&gt;(Boot Guard ACM / PSP / Pluton)&quot;] --&amp;gt;|&quot;PCR[0] EV_S_CRTM_VERSION&quot;| PEI
    PEI[&quot;PEI&lt;br /&gt;(silicon init)&quot;] --&amp;gt;|&quot;PCR[0] EV_S_CRTM_CONTENTS&quot;| DXE
    DXE[&quot;DXE&lt;br /&gt;(driver execution)&quot;] --&amp;gt;|&quot;PCR[2] option ROM&lt;br /&gt;PCR[3] option ROM config&quot;| OPTROM
    OPTROM[&quot;option ROMs&quot;] --&amp;gt;|&quot;PCR[7] SecureBoot/PK/KEK/db/dbx&quot;| BDS
    BDS[&quot;BDS&lt;br /&gt;(boot device selection)&quot;] --&amp;gt;|&quot;PCR[4] Authenticode digest&quot;| BM
    BM[&quot;bootmgfw.efi&quot;] --&amp;gt;|&quot;PCR[11] WBCL boot mgr&lt;br /&gt;PCR[12] boot config&quot;| WL
    WL[&quot;winload.efi&quot;] --&amp;gt;|&quot;PCR[11] kernel/HAL/drivers&lt;br /&gt;PCR[13] ELAM policy&quot;| ELAM
    ELAM[&quot;ELAM driver&quot;] --&amp;gt;|&quot;PCR[13] driver hash&quot;| KERN
    KERN[&quot;Windows kernel&quot;] --&amp;gt;|&quot;EV_SEPARATOR on every measured PCR (freeze)&quot;| DONE[&quot;WBCL frozen&quot;]
&lt;p&gt;We have walked the chain. What about the chain we cannot trust -- the OEM-vendor-firmware-allowlist explosion that overwhelms remote verifiers?&lt;/p&gt;
&lt;h2&gt;7. Competing Approaches: DRTM, Late Launch, and Secure Launch&lt;/h2&gt;
&lt;p&gt;A quote from Microsoft&apos;s hardware-root-of-trust documentation [@ms-learn-hwrot] frames the problem precisely: &lt;em&gt;&quot;As there are thousands of PC vendors that produce many models with different UEFI BIOS versions, there becomes an incredibly large number of SRTM measurements upon bootup. Two techniques exist to establish trust here -- either maintain a list of known &apos;bad&apos; SRTM measurements (also known as a blocklist), or a list of known &apos;good&apos; SRTM measurements (also known as an allowlist).&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The allowlist explodes. Every OEM, every model, every firmware revision, every Secure Boot key generation produces a fresh PCR[0]/PCR[7]/PCR[11] tuple. A central verifier that wants to assert &quot;this fleet booted firmware Microsoft has signed off on&quot; has to maintain a database whose cardinality grows quadratically in (vendors x firmware versions). By 2017 the table size made the verifier policy ungovernable for general-purpose Windows fleets.&lt;/p&gt;
&lt;p&gt;The fix is structural: introduce a &lt;em&gt;second&lt;/em&gt; measurement plane that does not depend on the OEM. From the same Microsoft document: &lt;em&gt;&quot;System Guard Secure Launch, first introduced in Windows 10 version 1809, aims to alleviate these issues by using a technology known as the Dynamic Root of Trust for Measurement (DRTM).&quot;&lt;/em&gt; And: &lt;em&gt;&quot;Secure Launch simplifies management of SRTM measurements because the launch code is now unrelated to a specific hardware configuration.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;DRTM is a CPU primitive. On Intel, it is &lt;a href=&quot;https://www.felixcloutier.com/x86/senter&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GETSEC[SENTER]&lt;/code&gt;&lt;/a&gt;, introduced with Trusted Execution Technology in 2007. From the Intel SDM mirror, verbatim: &lt;em&gt;&quot;GETSEC[SENTER] / Launch a measured environment. EBX holds the SINIT authenticated code module physical base address. ECX holds the SINIT authenticated code module size (bytes).&quot;&lt;/em&gt; On AMD, the equivalent is the &lt;code&gt;SKINIT&lt;/code&gt; instruction from the AMD-V (SVM) family, introduced with the first AMD-V silicon in 2005-2006 [@wiki-x86-virt]. Microsoft&apos;s Secure Launch implementation [@ms-learn-sgsl] issues &lt;code&gt;SENTER&lt;/code&gt; or &lt;code&gt;SKINIT&lt;/code&gt; from a small Secure Kernel Loader (SKL) inside &lt;code&gt;winload.efi&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What &lt;code&gt;SENTER&lt;/code&gt; and &lt;code&gt;SKINIT&lt;/code&gt; do, at machine level, is roughly identical: they suspend all but one CPU, reset PCRs 17 through 22 in the TPM to a defined value (zero for SHA-256, all-ones for SHA-1 historically; the SHA-256 reset value is &lt;code&gt;UNVERIFIED_FETCH&lt;/code&gt; -- the TCG PFP returns HTTP 403 to non-browser agents), load the launch module (Intel verifies the signature on its SINIT Authenticated Code Module; AMD measures its Secure Loader Block rather than checking a signature), and atomically transfer control to it with interrupts disabled and the IOMMU active. The ACM/SLB&apos;s measurement gets extended into PCR[17]; the Measured Launch Environment (MLE) it loads -- on Windows, the &lt;a href=&quot;https://paragmali.com/blog/above-ring-zero-how-the-windows-hypervisor-became-a-security/&quot; rel=&quot;noopener&quot;&gt;Hyper-V hypervisor&lt;/a&gt; and the &lt;a href=&quot;https://paragmali.com/blog/the-windows-secure-kernel/&quot; rel=&quot;noopener&quot;&gt;secure kernel&lt;/a&gt; -- gets extended into PCR[18].&lt;/p&gt;

The code body that the DRTM primitive ($SENTER$/$SKINIT$) measures into PCR[18] after the Authenticated Code Module (Intel) or Secure Loader Block (AMD) has been measured into PCR[17] and verified. On Microsoft Secure Launch, the MLE is the hypervisor plus the secure kernel. On Linux+TrenchBoot, the MLE is the GRUB late-launch component plus the kernel.
&lt;p&gt;The reason &lt;code&gt;SENTER&lt;/code&gt; and &lt;code&gt;SKINIT&lt;/code&gt; matter, beyond the resetting of PCRs 17-22, is &lt;em&gt;what they don&apos;t measure&lt;/em&gt;. They do not measure the PEI/DXE firmware. They do not measure option ROMs. They do not measure the entire SRTM trail in PCRs 0-7. A verifier that consumes only PCRs 17-22 sees a uniform digest across every Intel platform (because every Intel platform runs the same Intel-signed ACM) and every Microsoft Secure-Launch-capable system (because every such system runs the same Microsoft-signed SKL). The OEM diversity is absorbed by ignoring the diverse measurements.&lt;/p&gt;
&lt;h3&gt;The Rutkowska / Wojtczuk SMM attack and the DRTM preconditions&lt;/h3&gt;
&lt;p&gt;Before &lt;code&gt;SENTER&lt;/code&gt; could be trusted, it had to survive a DMA attack class that Joanna Rutkowska and Rafal Wojtczuk demonstrated at Black Hat DC 2009 [@itl-attacking-txt-2009]. Their paper&apos;s abstract is direct: &lt;em&gt;&quot;We describe a practical attack that is capable of bypassing the TXT&apos;s trusted boot process&quot;&lt;/em&gt;. The mechanism: between the signature check on the SINIT ACM and its execution, a DMA-capable peripheral could overwrite the verified payload. Intel&apos;s response was architectural -- route SINIT through IOMMU-protected memory, and refuse to start &lt;code&gt;SENTER&lt;/code&gt; if the IOMMU is not on. The fix is enforced at the instruction level: &lt;a href=&quot;https://www.felixcloutier.com/x86/senter&quot; rel=&quot;noopener&quot;&gt;the SDM mirror&apos;s &lt;code&gt;GETSEC[SENTER]&lt;/code&gt; description&lt;/a&gt; lists the chipset and TPM preconditions GETSEC[SENTER] now checks before opening the measured-launch window. Every modern DRTM design rests on the assumption that the IOMMU is active at the late-launch instant.&lt;/p&gt;

DRTM does not replace SRTM; it layers on top. SRTM still measures everything pre-late-launch into PCRs 0-7 and 11-14. DRTM resets a separate slice (PCRs 17-22) and starts fresh. A verifier that wants the small OEM-invariant TCB consumes the DRTM slice and ignores PCRs 0-16. A verifier that wants the full pre-late-launch history consumes the SRTM slice and ignores 17-22. A verifier that wants both -- say, &quot;the firmware was on the allowlist *and* the secure kernel started cleanly&quot; -- consumes both. The cost is one extra `TPM2_Quote` selection mask. The benefit is that you can change attestation policy without changing the measurement plane.
&lt;h3&gt;Microsoft Secure Launch and the Secured-Core PC bar&lt;/h3&gt;
&lt;p&gt;Microsoft&apos;s Secured-core PC programme [@ms-learn-secured-core] packages Secure Launch with a set of other hardware requirements: SMM Supervisor, kernel DMA protection, Boot Guard or PSP firmware, Pluton or equivalent silicon root of trust, and Memory Integrity (HVCI) enabled by default. The Microsoft framing: &lt;em&gt;&quot;Microsoft is working closely with OEM partners and silicon vendors to build Secured-core PCs that features deeply integrated hardware, firmware and software to ensure enhanced security for devices, identities and data.&quot;&lt;/em&gt; The result is a tier-1 SKU set whose attestation evidence is the small OEM-invariant DRTM TCB, not the large SRTM history.&lt;/p&gt;
&lt;p&gt;Operationally, the Secured-Core flag enables the configuration block at &lt;code&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios&lt;/code&gt; per Microsoft&apos;s Secure Launch configuration guide [@ms-learn-sgsl]. When the registry flag is set and the silicon supports late launch, &lt;code&gt;winload.efi&lt;/code&gt; issues &lt;code&gt;SENTER&lt;/code&gt;/&lt;code&gt;SKINIT&lt;/code&gt; after measuring the early kernel, and the hypervisor launches inside the MLE.&lt;/p&gt;
&lt;h3&gt;TrenchBoot: open-source DRTM for Linux&lt;/h3&gt;
&lt;p&gt;DRTM is not Windows-only. The TrenchBoot project [@trenchboot-org] -- with contributors from Apertus Solutions, Oracle, and 3mdeb [@trenchboot-org] -- maintains an open-source DRTM stack for Linux and Xen on GRUB. From the TrenchBoot documentation repo [@gh-trenchboot-docs]: &lt;em&gt;&quot;TrenchBoot is a framework that allows individuals and projects to build security engines to perform launch integrity actions for their systems.&quot;&lt;/em&gt; The Linux side of the same primitive that Microsoft Secure Launch uses on Windows.&lt;/p&gt;

flowchart TD
    subgraph SRTM[&quot;SRTM chain (PCRs 0-7, 11-14)&quot;]
        S1[&quot;CRTM&quot;] --&amp;gt; S2[&quot;PEI/DXE&quot;] --&amp;gt; S3[&quot;option ROMs&quot;] --&amp;gt; S4[&quot;BDS&quot;]
        S4 --&amp;gt; S5[&quot;bootmgfw.efi&quot;] --&amp;gt; S6[&quot;winload.efi (early)&quot;]
    end
    subgraph DRTM[&quot;DRTM chain (PCRs 17-22)&quot;]
        D1[&quot;SKL issues SENTER / SKINIT&quot;] --&amp;gt; D2[&quot;CPU resets PCRs 17-22&quot;]
        D2 --&amp;gt; D3[&quot;ACM/SLB extended into PCR[17]&quot;]
        D3 --&amp;gt; D4[&quot;MLE (hypervisor + secure kernel) into PCR[18]&quot;]
        D4 --&amp;gt; D5[&quot;Secure kernel boots; IOMMU active&quot;]
    end
    S6 --&amp;gt; D1
&lt;p&gt;The comparison below synthesizes the TCG PFP PCR allocation surfaced in Microsoft&apos;s &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; reference [@ms-tbs-get-tcg-log] with the Microsoft hardware-root-of-trust documentation [@ms-learn-hwrot] and the BitLocker countermeasures unlock-mode enumeration [@ms-learn-bitlocker-counter]:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;SRTM (PCR[0-7,11-14])&lt;/th&gt;
&lt;th&gt;DRTM (PCR[17-22])&lt;/th&gt;
&lt;th&gt;TPM-only BitLocker (seal PCR[7,11])&lt;/th&gt;
&lt;th&gt;TPM+PIN&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Trust-anchor size&lt;/td&gt;
&lt;td&gt;OEM CRTM + firmware + option ROMs + drivers (large)&lt;/td&gt;
&lt;td&gt;Vendor ACM/SLB + MLE only (small)&lt;/td&gt;
&lt;td&gt;Same as SRTM&lt;/td&gt;
&lt;td&gt;Same + human PIN secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware required&lt;/td&gt;
&lt;td&gt;Any TPM 2.0 platform&lt;/td&gt;
&lt;td&gt;Intel TXT-capable or AMD SVM-capable + IOMMU&lt;/td&gt;
&lt;td&gt;Same as SRTM&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery prompts/year&lt;/td&gt;
&lt;td&gt;High (firmware + dbx + boot manager)&lt;/td&gt;
&lt;td&gt;Low (PCR[17-22] not in default profile)&lt;/td&gt;
&lt;td&gt;High on TPM-only profile&lt;/td&gt;
&lt;td&gt;Same as seal profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bitpixie-class attack&lt;/td&gt;
&lt;td&gt;Vulnerable&lt;/td&gt;
&lt;td&gt;Not directly mitigated&lt;/td&gt;
&lt;td&gt;Vulnerable&lt;/td&gt;
&lt;td&gt;Mitigated (PIN required)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verifier policy size&lt;/td&gt;
&lt;td&gt;O(vendors x versions)&lt;/td&gt;
&lt;td&gt;O(vendor)&lt;/td&gt;
&lt;td&gt;O(profile)&lt;/td&gt;
&lt;td&gt;O(profile + PIN policy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;DRTM solves the OEM diversity problem. It does not solve the problem that the log is unsigned, the measurement is a hash and not a &lt;em&gt;good&lt;/em&gt; hash, and the CRTM is an axiom. What can measurement never prove?&lt;/p&gt;
&lt;h2&gt;8. Theoretical Limits: What Measurement Can Never Prove&lt;/h2&gt;
&lt;p&gt;Restate the axiom from §2: the first hash in the chain is an axiom; the silicon that computes it is itself unmeasured. CRTM is the &lt;em&gt;Root of Trust for Measurement&lt;/em&gt;, not the &lt;em&gt;Root of Trust for Everything&lt;/em&gt;. The trust we can claim is that, &lt;em&gt;given&lt;/em&gt; the integrity of the silicon and the immutability of the embedded keys, the chain is a faithful record of what ran. The &quot;given&quot; is doing all the work.&lt;/p&gt;
&lt;p&gt;Three limits, each architectural and not implementational.&lt;/p&gt;
&lt;h3&gt;8.1 Trust on first measurement&lt;/h3&gt;
&lt;p&gt;The CRTM has nothing under it. If you compromise the silicon -- through a faulTPM-class SoC voltage glitch against an AMD fTPM, through SPI-bus sniffing of a discrete TPM, through a Pluton supply-chain tamper, through an Intel Boot Guard key extraction -- the rest of the chain is, formally, useless. The verifier asks the chip &quot;what ran?&quot;; the chip computes the answer using cryptographic primitives the chip itself implements; if the chip is malicious, every answer is consistent with whatever boot history the attacker wishes. The TPM&apos;s &lt;code&gt;TPM2_Quote&lt;/code&gt; signature is bound to the chip&apos;s own AIK; if the chip is the attacker, the signature is honest about a lie.&lt;/p&gt;
&lt;p&gt;This is not a flaw of TPM 2.0. It is a feature of mathematics. You cannot bootstrap trust from nothing. AEGIS knew this in 1997; the TCG accepted it in 1999; every silicon root of trust still depends on it in 2026. The only mitigations are (a) make the silicon as small and audited and physically resistant as the budget allows (which is why Pluton ships a separate sub-millimetre microcontroller), and (b) bind the chip&apos;s identity to a manufacturer-rooted certificate chain that an out-of-band auditor can verify -- which is why Hello for Business enrollment cross-checks the EK certificate against the OEM root before issuing the device-bound key.&lt;/p&gt;
&lt;h3&gt;8.2 A PCR value is a hash, not a &lt;em&gt;good&lt;/em&gt; hash&lt;/h3&gt;
&lt;p&gt;The TPM has no knowledge of what is good. PCR[0] holding &lt;code&gt;0xC4F7...&lt;/code&gt; is just a number. To the TPM it is no more or less suspicious than &lt;code&gt;0xA21E...&lt;/code&gt;. The TPM&apos;s job, during &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt;+&lt;code&gt;TPM2_Unseal&lt;/code&gt;, is to refuse the key release if the PCRs do not match the seal-time digest -- &lt;em&gt;regardless&lt;/em&gt; of whether the seal-time digest was a benign value or a malicious one.&lt;/p&gt;

A PCR value is a hash, not a *good* hash.
&lt;p&gt;This is why a sealed BitLocker VMK released on a successful &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt; match is &lt;em&gt;not&lt;/em&gt; a guarantee that the booted code was actually trustworthy. It is a guarantee that the booted code matched the seal-time digest. If at seal time the platform was running an older, signed, but vulnerable &lt;code&gt;bootmgfw.efi&lt;/code&gt;, the seal binds to &lt;em&gt;that&lt;/em&gt; boot manager&apos;s PCR[11]. Years later, when an attacker downgrades to that same older, signed boot manager, PCR[11] reproduces the seal-time digest exactly, and the TPM cheerfully releases the key. This is the mechanism that makes bitpixie work; we will meet it again in Section 9.&lt;/p&gt;
&lt;p&gt;The verifier -- BitLocker policy, Azure Attestation policy, Intune DHA, your fleet management tool -- is the only entity that knows what &lt;em&gt;good&lt;/em&gt; means. The TPM provides reporting infrastructure; the verifier provides policy infrastructure. &lt;em&gt;Measurement is reporting infrastructure, not policy infrastructure.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Measurement is reporting infrastructure, not policy infrastructure. The TPM knows what was measured; only the verifier knows what is good. Every BitLocker unseal, every Azure Attestation, every Intune DHA verdict is a &lt;em&gt;policy&lt;/em&gt; decision made by software outside the TPM, against a number the TPM merely reports.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A sealed VMK released on a successful &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt; match is &lt;em&gt;not&lt;/em&gt; a guarantee that the booted code was actually trustworthy. It is a guarantee that the booted code matched the seal-time digest. If seal time captured a vulnerable but signed binary, every subsequent boot of that same vulnerable signed binary will unseal cleanly. This is the architectural reason bitpixie works against TPM-only BitLocker even on fully patched 2025 firmware.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;8.3 The log is unsigned&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;TPM2_Quote&lt;/code&gt; signs only the PCR values plus the verifier&apos;s nonce. It does not sign the TCG event log. A malicious firmware can extend an honest digest into the TPM and report a &lt;em&gt;different&lt;/em&gt; event in the log it hands the OS. The PCR is correct; the log is a fabrication. Detection comes only from the verifier &lt;em&gt;replaying&lt;/em&gt; the log against the quoted PCRs and flagging a mismatch.&lt;/p&gt;
&lt;p&gt;In practice this is not a problem on benign firmware, because the firmware has no incentive to lie about its own events. It becomes a problem precisely in the cases where the firmware is the attacker -- BlackLotus-class implants that own the boot manager, faulTPM-class chip compromises that own the TPM. In those cases, a verifier that trusts both the log and the quote without replaying is trusting a forged document.&lt;/p&gt;
&lt;p&gt;The mitigation is structural and well-known: verifiers MUST replay. Azure Attestation, Intune DHA, and Microsoft&apos;s reference attestation library all replay the log against the quoted PCRs and refuse to issue a token on mismatch. Operators rolling their own attestation pipeline often skip the replay step, especially in early-prototype deployments. &lt;em&gt;Skip the replay and you have an unauthenticated event list dressed up as evidence.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;8.4 The cuckoo attestation class (Parno 2008)&lt;/h3&gt;
&lt;p&gt;There is a class of attack that no amount of replay or PCR profile tightening can stop. Bryan Parno&apos;s 2008 HotSec paper [@parno-hotsec-pdf] names the problem the &lt;em&gt;cuckoo attack&lt;/em&gt; and proposes the first formal model for establishing trust in a platform under that threat. The abstract, paraphrased lightly to fit this article&apos;s word-list: any naive approach falls victim to a cuckoo attack; the model, in Parno&apos;s own phrasing, &lt;em&gt;&quot;reveals the cuckoo attack problem&quot;&lt;/em&gt;.&lt;/p&gt;

An attestation-relay attack in which a verifier challenges a compromised device, the compromised device proxies the challenge to a separate, genuine, attested device elsewhere, the genuine device produces a valid signed quote, the compromised device returns that quote as if it were its own, and the verifier accepts. Without out-of-band identification of *this* device&apos;s endorsement key, the verifier cannot distinguish &quot;the EK that signed the quote&quot; from &quot;an EK in the world that signed a quote.&quot; Named by Bryan Parno in 2008 by analogy with the cuckoo bird&apos;s brood parasitism.

A TPM-resident asymmetric key whose certificate is signed by the platform&apos;s Endorsement Key certificate chain, used to sign `TPM2_Quote` responses. The verifier checks the AK&apos;s certificate chain to the OEM root before trusting the quote. If the EK chain is not pre-bound to *this* device&apos;s serial number (or some other out-of-band identifier), an attacker can relay the challenge to a different TPM and return a valid signature from that TPM&apos;s AK.
&lt;p&gt;The cuckoo class is closeable, but only by binding the AK to &lt;em&gt;this&lt;/em&gt; device&apos;s identity before trust is needed. Microsoft Autopilot [@ms-aa-tpm-concepts] and Windows Hello for Business do this transparently during device enrollment: the EK certificate chain is captured at first boot, cross-checked against the OEM root, and the resulting AK is bound to a specific Microsoft Entra ID device object. Ad-hoc attestation deployments that do not capture the EK chain at enrollment are vulnerable.&lt;/p&gt;
&lt;p&gt;Bryan Parno is now at Carnegie Mellon [@cmu-parno] and was on sabbatical at Amazon during 2025. The cuckoo paper remains, on its eighteenth birthday, the canonical reference for the class.&lt;/p&gt;
&lt;p&gt;Permanent limits accepted. What are people actively trying to fix that we have not solved yet?&lt;/p&gt;
&lt;h2&gt;9. Open Problems: bitpixie, the dbx-Update UX, and What&apos;s Next&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The fix is the breakage&lt;/em&gt;. The patch that closes the most dangerous BitLocker bypass of the decade is also the patch that drowns help-desks in 48-digit recovery prompts. The structural entanglement of these two facts is the central open problem of measured boot in 2026.&lt;/p&gt;
&lt;h3&gt;9.1 bitpixie (CVE-2023-21563)&lt;/h3&gt;
&lt;p&gt;An attacker reaches behind a fully-patched, BitLocker-enabled Windows 11 laptop. They plug in a LAN cable. They plug in a USB keyboard. They press F12 to boot from network. Within five minutes the disk encryption key is on their disk.&lt;/p&gt;
&lt;p&gt;That is bitpixie. From the Neodyme write-up [@neodyme-bitpixie]: &lt;em&gt;&quot;Thanks to a bug discovered by Rairii in August 2022, attackers can extract your disk encryption key on Windows&apos; default &apos;Device Encryption&apos; setup. This exploit, dubbed bitpixie, relies on downgrading the Windows Boot Manager. All an attacker needs is the ability to plug in a LAN cable and keyboard to decrypt the disk.&quot;&lt;/em&gt; The CVE is CVE-2023-21563 [@nvd-2023-21563], described as a &lt;em&gt;&quot;BitLocker Security Feature Bypass Vulnerability&quot;&lt;/em&gt; with the MSRC advisory at CVE-2023-21563 [@msrc-2023-21563].&lt;/p&gt;
&lt;p&gt;The mechanism is the second aha moment from Section 8 made operational. From SySS&apos;s bitpixie technical write-up [@syss-bitpixie]: &lt;em&gt;&quot;The bitpixie vulnerability in Windows Boot Manager is caused by a flaw in the PXE soft reboot feature, whereby the BitLocker key is not erased from memory. To exploit this vulnerability on up-to-date systems, a downgrade attack can be performed by loading an older, unpatched boot manager.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The chain in detail: (1) The attacker boots the target normally. The boot manager unseals the VMK, hands it to &lt;code&gt;winload.efi&lt;/code&gt;, and loads BitLocker into the boot path. (2) Before &lt;code&gt;winload.efi&lt;/code&gt; zeroes the VMK from RAM, the attacker triggers a PXE soft reboot (a feature of older boot manager versions) that returns control to the boot manager without a full platform reset. (3) The attacker now PXE-boots a Linux image that scans physical memory for the BitLocker FVE marker &lt;code&gt;-FVE-FS-&lt;/code&gt; and extracts the VMK. The platform reset never happened, the RAM never cleared, the TPM never re-quoted -- the VMK is just lying there in untouched physical memory.&lt;/p&gt;
&lt;p&gt;The downgrade: the older boot manager whose soft-reboot path leaks the VMK is still signed by the Microsoft 2011 production certificate, which is still in &lt;code&gt;db&lt;/code&gt; on every Secure Boot machine until that certificate&apos;s natural 2026 expiry. PCR[7] -- the policy PCR -- accepts the downgraded boot manager because &lt;em&gt;the boot manager is still validly signed&lt;/em&gt;. PCR[11] still matches the seal-time digest because, at seal time, that exact older boot manager was the one running. The TPM unseals. BitLocker unlocks. The attack proceeds.&lt;/p&gt;
&lt;p&gt;This is the third aha moment from the article&apos;s structure: &lt;em&gt;a PCR replay attack with a still-trusted older signed binary&lt;/em&gt;. The TPM is not malfunctioning. The policy is not misconfigured. The seal is doing exactly what it was sealed to do: release the key if the boot reproduces the boot it was sealed against. The attacker just produced the seal-time boot, in 2024, using a signed-but-vulnerable binary the verifier has not revoked.&lt;/p&gt;
&lt;p&gt;Public disclosure landed at the 38th Chaos Communication Congress in December 2024 [@38c3-bitpixie]. From the talk abstract verbatim: &lt;em&gt;&quot;since 2022, when Rairii discovered the bitpixie bug (CVE-2023-21563). While this bug is &apos;fixed&apos; since Nov. 2022 and publically known since 2023, we can still use it today with a downgrade attack to decrypt BitLocker.&quot;&lt;/em&gt; The full attack chain was demonstrated on stage by Thomas Lambertz of Neodyme. The proof-of-concept code is at github.com/martanne/bitpixie [@gh-martanne-bitpixie].The repository handle &lt;code&gt;martanne&lt;/code&gt; is the GitHub username; the discoverer is Rairii (August 2022); the 38C3 presenter is Thomas Lambertz (Neodyme). Press accounts that refer to &quot;martanne&quot; as a person are confusing the GitHub handle with an author identity.&lt;/p&gt;
&lt;h3&gt;9.2 The KB5025885 / Windows UEFI CA 2023 rotation&lt;/h3&gt;
&lt;p&gt;Microsoft&apos;s structural response is documented in the canonical KB article on Boot Manager revocations [@ms-kb5025885]. The fix is in three stages. Stage 1: enroll the new &lt;em&gt;Windows UEFI CA 2023&lt;/em&gt; certificate in the Secure Boot &lt;code&gt;db&lt;/code&gt; variable. Stage 2: replace existing boot manager binaries with copies signed by the 2023 CA instead of the 2011 CA. Stage 3: revoke the 2011 CA in &lt;code&gt;dbx&lt;/code&gt;. The full rollout is gated on the 2026 natural expiry of the original Microsoft production signing certificate.&lt;/p&gt;
&lt;p&gt;Every one of those three stages changes PCR[7]. &lt;em&gt;Every one&lt;/em&gt;. Stage 1 adds bytes to &lt;code&gt;db&lt;/code&gt;; Stage 3 adds bytes to &lt;code&gt;dbx&lt;/code&gt;; even Stage 2, which doesn&apos;t touch the Secure Boot variables directly, ships a new boot manager binary whose Authenticode digest moves PCR[4]. On TPM-only BitLocker bound to &lt;code&gt;0x880 = PCR[7] + PCR[11]&lt;/code&gt;, the recovery prompt fires twice for every customer.&lt;/p&gt;
&lt;h3&gt;9.3 BlackLotus (CVE-2022-21894 &quot;Baton Drop&quot;)&lt;/h3&gt;
&lt;p&gt;The bitpixie story does not stand alone. On March 1, 2023, ESET researcher Martin Smolár disclosed BlackLotus [@eset-blacklotus] -- in his own words, &lt;em&gt;&quot;the first publicly known UEFI bootkit bypassing the essential platform security feature -- UEFI Secure Boot -- is now a reality.&quot;&lt;/em&gt; BlackLotus exploits CVE-2022-21894 [@nvd-2022-21894] (&quot;Baton Drop&quot;), a Secure Boot bypass in a Microsoft-signed boot manager. From the ESET write-up [@eset-blacklotus]: &lt;em&gt;&quot;Although the vulnerability was fixed in Microsoft&apos;s January 2022 update, its exploitation is still possible as the affected, validly signed binaries have still not been added to the UEFI revocation list. BlackLotus takes advantage of this, bringing its own copies of legitimate -- but vulnerable -- binaries to the system in order to exploit the vulnerability.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The structural fix for BlackLotus is identical to the structural fix for bitpixie: revoke the vulnerable signed binaries in &lt;code&gt;dbx&lt;/code&gt;. Microsoft shipped the BlackLotus &lt;code&gt;dbx&lt;/code&gt; revocations in May 2023; that update is the source of most of the &quot;PCR[7] moved overnight&quot; stories from the second half of 2023. The break-fix-break loop is now a recurring operational reality, not an exception.&lt;/p&gt;

the first publicly known UEFI bootkit bypassing the essential platform security feature -- UEFI Secure Boot -- is now a reality. -- Martin Smolár, ESET Research, March 1, 2023
&lt;h3&gt;9.4 The break-fix-break loop&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; The fix is the breakage. Every dbx update that closes a Secure Boot bypass changes PCR[7]. Every PCR[7] change forces a 48-digit recovery prompt on every TPM-only BitLocker machine on the platform. The patch that closes BlackLotus or bitpixie &lt;em&gt;is&lt;/em&gt; the operational pain. Pre-boot authentication (TPM+PIN) blocks the downgrade attack from releasing the VMK without the user&apos;s PIN, but it does not eliminate PCR[7]-driven recovery: a selected-PCR change still forces suspend/resume or a planned reseal.&lt;/p&gt;
&lt;/blockquote&gt;

flowchart LR
    A[&quot;BlackLotus disclosed&lt;br /&gt;(March 2023)&quot;] --&amp;gt; B[&quot;Microsoft May 2023 dbx update&lt;br /&gt;revokes vulnerable boot managers&quot;]
    B --&amp;gt; C[&quot;PCR[7] changes on every&lt;br /&gt;UEFI Windows machine&quot;]
    C --&amp;gt; D[&quot;TPM-only BitLocker fires&lt;br /&gt;fleet-wide 48-digit prompts&quot;]
    D --&amp;gt; E[&quot;Operators delay patches&lt;br /&gt;or roll back to gain stability&quot;]
    E --&amp;gt; F[&quot;Window of vulnerability&lt;br /&gt;re-opens for class&quot;]
    F --&amp;gt; A
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The only safe pattern when applying UEFI firmware, BIOS, or Secure Boot DB/DBX changes is to suspend BitLocker first. Run &lt;code&gt;Suspend-BitLocker -RebootCount 1&lt;/code&gt; from an elevated PowerShell prompt, apply the patch, and let the suspend auto-resume on the next clean boot. The TPM never sees a PCR mismatch because BitLocker is not asking the TPM for the VMK during the patch reboot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;9.5 Post-quantum agility for the attestation key&lt;/h3&gt;
&lt;p&gt;Looking ahead, the next structural break is cryptographic: the TPM&apos;s signing primitives (RSA-2048, ECC P-256) do not survive Shor&apos;s algorithm on a sufficiently large quantum computer. The TCG&apos;s PC Client Platform Firmware Profile revision 2 work is targeting &lt;a href=&quot;https://paragmali.com/blog/post-quantum-cryptography-on-windows-the-thirty-year-migrati/&quot; rel=&quot;noopener&quot;&gt;post-quantum agility&lt;/a&gt; for attestation keys -- ML-DSA (Dilithium) and ML-KEM (Kyber) variants of the signature and key-encapsulation primitives that &lt;code&gt;TPM2_Quote&lt;/code&gt; and &lt;code&gt;TPM2_ActivateCredential&lt;/code&gt; depend on.&lt;/p&gt;
&lt;p&gt;The constraint that limits the rollout is mechanical. The TPM 2.0 command and response buffer is, by default, 4096 bytes. A Dilithium Level 3 (ML-DSA-65) signature is 3,309 bytes per FIPS 204 [@csrc-nist-gov-204-final]. An RSA-2048 signature is 256 bytes. The buffer survives RSA quotes with vast headroom; it has roughly 800 bytes of headroom for an ML-DSA-65 quote. ML-KEM-768 (NIST Category 3) ciphertexts are 1,088 bytes per FIPS 203 [@csrc-nist-gov-203-final], with public keys at 1,184 bytes -- still tight if you also need an ML-DSA-65 signature on the same response. The PFP r2 work is largely about negotiating buffer growth across the TPM-firmware-OS path so the post-quantum primitives fit. As of 2026 this is &lt;code&gt;UNVERIFIED_FETCH&lt;/code&gt; from the TCG (the TCG specifications site [@tcg-tpm-library] returns HTTP 403 to non-browser User-Agents), but Microsoft has signalled interim TPM 2.0 deployments with enlarged buffers.&lt;/p&gt;
&lt;h3&gt;9.6 DRTM coverage gaps&lt;/h3&gt;
&lt;p&gt;DRTM is a Secured-core feature; not every fleet runs Secured-core hardware. Raw Intel TXT has shipped on vPro platforms since the Q3 2007 introduction of the Intel DQ35J board [@itl-attacking-txt-2009], but the deployable surface for Microsoft Secure Launch is narrower because Secured-Core also requires HVCI, kernel DMA protection, and an SMM Supervisor. In practice Secure Launch is available on Intel Coffee Lake (Core 8th-generation) and later platforms; on AMD with Zen 2 and later (Ryzen 3000+ desktop; EPYC 7002+ server with &lt;code&gt;SKINIT&lt;/code&gt;); and on Qualcomm Snapdragon SD850 and later on the ARM side. Fleets dominated by pre-2018 hardware -- and there are many of them, especially in cost-sensitive deployments -- cannot use Secure Launch as a SRTM allowlist substitute.&lt;/p&gt;
&lt;p&gt;For those fleets, the only deployable mitigation against bitpixie remains pre-boot authentication (TPM+PIN). The cuckoo class remains open against ad-hoc attestation pipelines that do not bind AKs to device serials at provisioning. The OEM allowlist combinatorial explosion remains the unsolved problem that pushed Microsoft to DRTM in the first place.&lt;/p&gt;
&lt;h3&gt;9.7 PFP r2 in flight&lt;/h3&gt;
&lt;p&gt;The PC Client Platform Firmware Profile is in active revision. PFP r2 is expected to formalise SHA-3 support, change the default banks to SHA-384 and SHA-512 (with SHA-256 retained for legacy compatibility), and codify the PCR[14] semantics that have been a Microsoft-vs-Linux ontology disagreement for the past decade. As of 2026 the revision is &lt;code&gt;UNVERIFIED_FETCH&lt;/code&gt; from the TCG canonical URL [@tcg-pfp] (same 403 class); the tpm2_eventlog man page [@gh-tpm2-eventlog-man] tracks the spec by name without a rev number, deliberately so it can absorb r2 without rebuild.&lt;/p&gt;

For practitioners who need a current catalogue of hardware-debugger gaps that PCR[7]&apos;s `EV_EFI_ACTION` event was supposed to close, the Wack0/bitlocker-attacks repository [@gh-wack0-bitlocker] maintains a curated index, including a reference to a DFRWS Europe 2023 paper from the Brazilian Federal Police that catalogued debug-mode firmware shipped to retail. The TCG EFI Platform Specification §6.4 quote reproduced there -- *&quot;If the platform provides a firmware debugger mode... the platform SHALL extend an EV_EFI_ACTION event into PCR[7]&quot;* -- exists precisely because shipped firmware historically did not always do this. The PCR[7] floor is not as solid as the specification suggests.
&lt;p&gt;You have read 8,000 words. You have a recovery prompt to clear on Monday morning. What do you do?&lt;/p&gt;
&lt;h2&gt;10. Practical Guide: A Monday-Morning Checklist&lt;/h2&gt;
&lt;p&gt;Six actions. Each one tied to a verified Microsoft Learn or TCG source. Run them in order; you will know more about your fleet&apos;s measured-boot posture in twenty minutes than most operators learn in a year.&lt;/p&gt;
&lt;h3&gt;10.1 Inspect your log&lt;/h3&gt;
&lt;p&gt;Run &lt;code&gt;tpmtool.exe getdeviceinformation&lt;/code&gt; from an elevated prompt; §6.7 enumerates the cross-platform and Linux equivalents. For a clean machine-readable dump, save the binary log via &lt;code&gt;MeasuredBootTool.exe -log &amp;lt;path&amp;gt;&lt;/code&gt; [@ms-tbs-get-tcg-log] (Windows HLK), then parse it with &lt;code&gt;tpm2_eventlog&lt;/code&gt; [@gh-tpm2-eventlog-man] for a portable text dump. The event stream conforms to the &lt;code&gt;TCG_PCR_EVENT2&lt;/code&gt; struct documented in the &lt;code&gt;Tbsi_Get_TCG_Log&lt;/code&gt; reference [@ms-tbs-get-tcg-log].&lt;/p&gt;
&lt;h3&gt;10.2 Confirm your BitLocker PCR profile&lt;/h3&gt;
&lt;p&gt;Run &lt;code&gt;manage-bde -status C:&lt;/code&gt; from an elevated prompt. Confirm a &lt;code&gt;Numerical Password&lt;/code&gt; protector exists -- without one, you cannot recover from a profile mismatch and you are one PCR drift away from data loss. Then inspect &lt;code&gt;HKLM\SOFTWARE\Policies\Microsoft\FVE\PlatformValidationProfileUEFI&lt;/code&gt;. On a Secure Boot UEFI machine the value should be &lt;code&gt;0x880&lt;/code&gt; (PCR[7] + PCR[11]) per the BitLocker countermeasures documentation [@ms-learn-bitlocker-counter]: &lt;em&gt;&quot;By default, BitLocker provides integrity protection for Secure Boot by using the TPM PCR[7] measurement.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you see &lt;code&gt;0x815&lt;/code&gt; (PCR[0,2,4,11]), you are on the non-PCR[7] legacy validation profile (a CSM/legacy boot, or a UEFI system where Secure Boot PCR[7] binding is unavailable) and every firmware update will trigger a recovery prompt. The fix is to verify Secure Boot is on (&lt;code&gt;Confirm-SecureBootUEFI&lt;/code&gt; from PowerShell), then re-seal by disabling and re-enabling the TPM protector.&lt;/p&gt;
&lt;h3&gt;10.3 Suspend BitLocker before every firmware update&lt;/h3&gt;
&lt;p&gt;The only safe pattern is this:&lt;/p&gt;

```powershell
# Run as administrator.
# Suspend BitLocker for the next 1 reboot. BitLocker auto-resumes after the
# next clean boot completes, regardless of how many additional boots happen.
Suspend-BitLocker -MountPoint &quot;C:&quot; -RebootCount 1Now run the OEM firmware updater or the Windows cumulative update that
touches Secure Boot. The PCRs will move; BitLocker will not see a mismatch
because the seal check is bypassed for this boot.
After the patch reboot, BitLocker automatically re-seals to the new PCR
values. To verify, run:
&lt;p&gt;manage-bde -status C:&lt;/p&gt;
The output should show &quot;Protection On&quot; and the new PCR profile.
&lt;pre&gt;&lt;code&gt;&amp;lt;/Spoiler&amp;gt;

### 10.4 Enable Secure Launch on Secured-Core hardware

If your hardware supports DRTM (Intel TXT-capable Coffee Lake or later, AMD Zen 2 or later with `SKINIT`, ARM SD850 or later), enable Secure Launch. The configuration guide [@ms-learn-sgsl] lists the four paths: MDM via Intune, Group Policy, the Windows Security UI, or the registry directly at `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios`. Once enabled, Secure Launch absorbs OEM firmware diversity into the small DRTM TCB, reducing the verifier&apos;s allowlist burden from O(vendors x firmware versions) to O(vendor).

### 10.5 For high-value devices, switch to TPM+PIN

This is the only deployed mitigation that closes bitpixie pre-attack. From Microsoft&apos;s countermeasures documentation [@ms-learn-bitlocker-counter], four unlock modes exist: TPM-only, TPM+startup-key, TPM+PIN, TPM+startup-key+PIN. Of those, only the modes that require a human secret survive a downgrade attack -- the attacker can recreate the seal-time PCRs by booting an older signed boot manager, but they cannot recreate the PIN.

Enable it with `manage-bde -protectors -add C: -tpmandpin &amp;lt;PIN&amp;gt;`. Users will type the PIN at boot. For Secured-Core fleets where the BIOS exposes USB and TPM+PIN before the OS, this is the best practical security/UX trade. For high-value developer or executive endpoints it is non-negotiable.

&amp;gt; **Note:** bitpixie. Every other recoverable class -- evil-maid via tampered USB, cold-boot RAM extraction at modest cost, supply-chain implants on the firmware -- has either operational mitigations or is out-of-budget for the threat model. bitpixie does not. Pre-boot authentication closes it; nothing else does.

### 10.6 Bind your attestation keys to the device at provisioning

The cuckoo class only closes if the verifier knows the *specific* TPM&apos;s endorsement key before trust is needed. Microsoft Autopilot and Hello for Business do this transparently [@ms-aa-tpm-concepts] during device enrollment, capturing the EK certificate chain and cross-checking it against the OEM root before issuing the device-bound key. Ad-hoc deployments -- &quot;we joined our domain after first boot&quot; -- usually skip this step and leave the cuckoo path open. If you run an attestation pipeline outside Hello for Business or Azure Attestation, audit your AK provisioning: is the EK chain captured at first boot, and is it bound to a unique device record?

The Monday-morning steps are six items long. The structural questions are not. We close with the questions every reader still has.

## 11. Frequently Asked Questions

&amp;lt;FAQ title=&quot;Frequently asked questions about Measured Boot and PCR-bound BitLocker&quot;&amp;gt;

&amp;lt;FAQItem question=&quot;Why am I being prompted for a 48-digit recovery key after a BIOS update?&quot;&amp;gt;
Because PCR[0] or PCR[7] changed. BitLocker&apos;s seal binds the Volume Master Key to a specific subset of PCR values captured at seal time. A UEFI firmware update changes the `EV_S_CRTM_VERSION` and `EV_EFI_PLATFORM_FIRMWARE_BLOB` digests in PCR[0]; a Secure Boot `dbx` update changes PCR[7]. On boot, the TPM runs `TPM2_PolicyPCR` against the current PCRs, fails the match, and refuses to release the VMK. BitLocker falls back to the recovery-key protector. The fix is to suspend BitLocker before the patch with `Suspend-BitLocker -MountPoint &quot;C:&quot; -RebootCount 1`, per Microsoft&apos;s BitLocker countermeasures documentation [@ms-learn-bitlocker-counter].
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;What&apos;s the difference between Secure Boot and Measured Boot?&quot;&amp;gt;
Secure Boot is *enforcement*: it refuses to run code that isn&apos;t signed by a trusted certificate in the `db` variable. Measured Boot is *reporting*: it records what ran -- signed or not -- into PCRs and the TCG event log. They cooperate but don&apos;t substitute. Secure Boot stops a bootkit from running. Measured Boot lets a remote verifier confirm, after the fact, that no bootkit ran. The TPM-based Trusted Boot extension [@ms-learn-boot-process] continues the measurement chain into the Windows kernel, drivers, and ELAM.
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;If Secure Boot is on, do I still need Measured Boot?&quot;&amp;gt;
Yes. The remote-attestation evidence chain is a measured-boot artifact -- Azure Attestation, Intune Device Health Attestation, Hello for Business device-bound key attestation, BitLocker PCR-bound unseal, and System Guard runtime attestation all consult the TCG event log and PCR snapshot. Secure Boot has no remote-reporting story; it cannot, by itself, prove to a verifier in Azure that this laptop in the field booted the firmware Microsoft signed off on. Measured Boot is what makes that proof possible.
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;Why does BitLocker bind to PCR[7] instead of PCR[0,2,4,11]?&quot;&amp;gt;
Because PCR[7] is the *policy* PCR, not the *code* PCR. Firmware updates and option-ROM changes move PCR[0] and PCR[2]; Secure-Boot-policy hashes don&apos;t change unless the actual `PK`/`KEK`/`db`/`dbx` variables change. The result: a fleet on the default UEFI profile (`0x880` = PCR[7] + PCR[11]) survives Dell and HP and Lenovo firmware updates without recovery prompts, because those vendors&apos; firmware updates move PCR[0] and not PCR[7]. The trade-off is that PCR[7] only moves when Secure Boot&apos;s identity moves -- which is exactly when you do want a recovery prompt (a key revocation is a real security event). Microsoft makes the trade-off explicit in the BitLocker countermeasures documentation [@ms-learn-bitlocker-counter].
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;Can attestation prove my OS isn&apos;t compromised right now?&quot;&amp;gt;
No. Attestation proves what *booted*. It captures the boot-time state of the platform up to a `EV_SEPARATOR` event the kernel emits early in OS bootstrap. Anything that happens after the separator -- a malicious kernel driver loaded at runtime, a memory-corruption exploit in a Win32 service, a rootkit that bypasses HVCI -- is invisible to PCR-based attestation. The runtime-attestation problem is what Windows Defender System Guard runtime attestation [@ms-learn-sgsl] and Microsoft&apos;s hypervisor-isolated runtime checks try to address; that is a separate trust system layered on top of measured boot, not part of it.
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;What is PCR[14] for on Windows?&quot;&amp;gt;
Microsoft&apos;s Windows Boot Configuration Log convention uses PCR[14] for boot-loader-authority events -- WBCL records that capture which authorities the boot manager consulted for code-integrity decisions. The Linux shim convention uses PCR[14] for Machine Owner Key (MOK) enrolment events. Same PCR index; different ontology. A verifier reading PCR[14] must know which OS produced the log it is reading; the value is meaningless without that context. This is one of the corner cases PFP r2 is expected to formalise.
&amp;lt;/FAQItem&amp;gt;

&amp;lt;FAQItem question=&quot;Is bitpixie fixed?&quot;&amp;gt;
Not on TPM-only BitLocker, not yet. The structural fix is KB5025885 [@ms-kb5025885] (May 2023) which enrolls the new Windows UEFI CA 2023 certificate and ultimately revokes the 2011 CA in `dbx`. Full revocation is gated on the 2011 CA&apos;s 2026 natural expiry. Until then, an attacker can still downgrade to a 2011-signed boot manager whose PXE-soft-reboot path leaks the VMK. The only pre-attack mitigation that closes the class today is pre-boot authentication: TPM+PIN, or TPM+startup-key, or both. The 38C3 talk demonstrated the attack on fully-patched late-2024 firmware.
&amp;lt;/FAQItem&amp;gt;

&amp;lt;/FAQ&amp;gt;

&amp;lt;StudyGuide slug=&quot;measured-boot-tcg-event-log&quot; keyTerms={[
  { term: &quot;PCR (Platform Configuration Register)&quot;, definition: &quot;Append-only TPM register that extends rather than stores. Modern TPMs have 24 PCRs per hash bank; `PCR[N] := H(PCR[N] || measurement)`.&quot; },
  { term: &quot;CRTM (Core Root of Trust for Measurement)&quot;, definition: &quot;The smallest, lowest, immutable code that runs after platform reset. It measures the next firmware stage into PCR[0] and is an axiomatic root, not a verified one.&quot; },
  { term: &quot;SRTM (Static Root of Trust for Measurement)&quot;, definition: &quot;The measurement chain rooted at the CRTM, covering PCRs 0-7 and 11-14 across firmware, boot manager, OS loader, ELAM, and kernel.&quot; },
  { term: &quot;DRTM (Dynamic Root of Trust for Measurement)&quot;, definition: &quot;Mid-boot CPU primitive (Intel `GETSEC[SENTER]`, AMD `SKINIT`) that resets PCRs 17-22 and atomically launches a vendor-signed Authenticated Code Module plus a Measured Launch Environment.&quot; },
  { term: &quot;TCG Event Log / WBCL&quot;, definition: &quot;Ordered list of `TCG_PCR_EVENT2` records (with Microsoft-specific WBCL extensions in PCRs 11/12/13) that the verifier replays to re-derive PCR values from a `TPM2_Quote`.&quot; },
  { term: &quot;TPM2_PolicyPCR / TPM2_Unseal&quot;, definition: &quot;TPM 2.0 commands that bind a sealed blob&apos;s release to a specific PCR profile. BitLocker uses this pair to release the VMK only when current PCRs match the seal-time digest.&quot; },
  { term: &quot;Authenticode&quot;, definition: &quot;Microsoft PE-image digest format used for code signing. PCR[4] hashes the Authenticode digest of `bootmgfw.efi`, not the raw bytes of the file.&quot; },
  { term: &quot;Cuckoo Attack&quot;, definition: &quot;An attestation-relay attack (Parno 2008) in which a compromised device proxies a verifier&apos;s challenge to a different genuine TPM and returns that TPM&apos;s valid signed quote. Closeable only by pre-binding the AK to the device serial.&quot; },
]} /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>measured-boot</category><category>tcg-event-log</category><category>bitlocker</category><category>tpm</category><category>srtm</category><category>drtm</category><category>secure-launch</category><category>pcr</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>The Day 8.5 Million Devices Couldn&apos;t Boot -- and How Microsoft Rebuilt Recovery as a Security Surface</title><link>https://paragmali.com/blog/the-day-85-million-devices-couldnt-boot----and-how-microsoft/</link><guid isPermaLink="true">https://paragmali.com/blog/the-day-85-million-devices-couldnt-boot----and-how-microsoft/</guid><description>The Windows Recovery Environment worked perfectly on July 19, 2024. That was the problem. How WinRE, Quick Machine Recovery, and the Windows Resiliency Initiative re-priced fleet-scale recovery.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>
**On July 19, 2024, the Windows Recovery Environment worked exactly as designed -- and that was the problem.** WinRE assumed a human operator per machine, and CrowdStrike&apos;s Channel File 291 priced that assumption at 8.5 million endpoints. The Windows Resiliency Initiative -- Quick Machine Recovery, MVI 3.0, the user-mode endpoint security platform, Intune-surfaced WinRE state, Point-in-Time Restore, and Cloud Rebuild -- is Microsoft&apos;s first systemic admission that the recovery path is part of the security architecture. This article maps the architecture, the program, and the trade-off it cannot remove.
&lt;h2&gt;1. A Fleet That Cannot Boot Itself&lt;/h2&gt;
&lt;p&gt;At 04:09 UTC on July 19, 2024, CrowdStrike pushed a new Channel File 291 to its Falcon sensor on Windows. Forty-eight minutes later -- 04:57 UTC, give or take an hour depending on which time zone the failing devices happened to wake into -- the calls began. By the time CrowdStrike reverted the file at 05:27 UTC, roughly 8.5 million Windows endpoints were stuck in a bug-check loop on &lt;code&gt;csagent+0xe14ed&lt;/code&gt;: a read-out-of-bounds page fault inside a kernel-mode driver registered as &lt;code&gt;SERVICE_SYSTEM_START&lt;/code&gt; (&lt;code&gt;Start=1&lt;/code&gt;), so it reloaded on every reboot [@crowdstrike-tech-details, @ms-security-jul27, @ms-crowdstrike-jul20].&lt;/p&gt;
&lt;p&gt;The fix was published almost immediately. &quot;Boot to Safe Mode,&quot; it said. &quot;Delete &lt;code&gt;C-00000291*.sys&lt;/code&gt;. Reboot.&quot; If the volume was &lt;a href=&quot;https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/&quot; rel=&quot;noopener&quot;&gt;BitLocker&lt;/a&gt;-encrypted, find the recovery key first [@ms-kb5042421]. The instruction was technically correct. It was also a procedure for one machine. The Windows Recovery Environment that the procedure depended on -- WinRE -- worked exactly as it was designed to work, on every one of those 8.5 million devices [@ms-crowdstrike-jul20]. That was the problem.&lt;/p&gt;
&lt;p&gt;Think about the engineering. The recovery partition was where it should be. The Boot Configuration Data store pointed at the right &lt;code&gt;winre.wim&lt;/code&gt;. The two-failed-boots trigger fired. The blue Safe Mode tile rendered. The keyboard input handler took keystrokes. The NTFS read-write driver inside WinRE deleted the bad channel file. The reboot succeeded. Every line of code in the recovery path behaved exactly as the engineers in Redmond had specified. The architecture did not break.&lt;/p&gt;
&lt;p&gt;What broke was the architecture&apos;s central assumption: that a person would be sitting in front of the screen.&lt;/p&gt;
&lt;p&gt;The assumption was a security choice as much as a usability choice, and that the cost of that choice was a denial-of-service event measured not in seconds of downtime but in person-days of triage. What follows: the WinRE architecture as it actually exists on every Windows 11 device today, the lineage that produced that architecture, the failure mode that priced the architecture&apos;s blind spot, and the Windows Resiliency Initiative that Microsoft began assembling in the months after the incident.&lt;/p&gt;
&lt;p&gt;A second thesis follows from the first. &lt;em&gt;Recoverability is a security property.&lt;/em&gt; A platform that cannot recover at scale cannot guarantee availability; a platform that cannot guarantee availability cannot keep its confidentiality and integrity promises either, because operations teams in the middle of a fleet-down event will eventually pull every encryption layer and every signing check that gets in their way. The two halves of the CIA triad we usually study -- confidentiality and integrity -- have spent decades crowding out the third. CrowdStrike forced the third one back onto the page.&lt;/p&gt;
&lt;p&gt;If WinRE worked perfectly on July 19, 2024, what does it actually do? And how did a recovery primitive end up being the architecture&apos;s single point of human dependence? Those questions are next.&lt;/p&gt;
&lt;h2&gt;2. The Architecture: WinRE, &lt;code&gt;winre.wim&lt;/code&gt;, &lt;code&gt;boot.sdi&lt;/code&gt;, ReAgentC&lt;/h2&gt;
&lt;p&gt;Before we explain how WinRE failed at scale, we have to be precise about what WinRE &lt;em&gt;is&lt;/em&gt;. Most engineers know it as the screen that appears after two bad boots. That description is correct and unhelpful. WinRE is a Windows Preinstallation Environment image -- &lt;code&gt;winre.wim&lt;/code&gt; -- backed by a system deployment image ramdisk and managed by &lt;code&gt;ReAgentC.exe&lt;/code&gt;, registered with the Windows Boot Manager via an entry in the Boot Configuration Data store [@ms-winre-tech-ref, @ms-reagentc, @ms-bcd]. Each of those four moving pieces does one job; together they make the recovery surface possible.&lt;/p&gt;

A small, self-contained Windows operating system used to install, deploy, and repair Windows desktop editions and Windows Server [@ms-winpe-intro]. WinPE is the substrate of Windows Setup, the install media&apos;s `boot.wim`, and `winre.wim`. The base image requires 512 MB of RAM and automatically reboots after 240 hours of continuous use on Windows 10 1803 and later [@ms-winpe-intro]. Originally released to manufacturing in 2002 by a Microsoft team that included Vijay Jayaseelan, Ryan Burkhardt, and Richard Bond [@wiki-winpe].

A small image-format file that the Windows Boot Manager uses to allocate a RAM disk into which a WIM image can be mounted at boot time. The WinRE BCD entry references `boot.sdi` through a `ramdiskoptions` element; the `osdevice` element then names `winre.wim` as the image to mount inside that RAM disk [@ms-bcd, @ms-winre-tech-ref].

The binary database that replaced `boot.ini` in Windows Vista. The BCD lives on the EFI System Partition on UEFI machines and is the data structure the boot manager reads to decide what to boot. Each entry is a typed collection of *elements* -- `device`, `osdevice`, `path`, `winpe`, `ramdiskoptions`, `recoverysequence`, and others -- manipulated with `bcdedit.exe` [@ms-bcd].

A dedicated GPT partition holding `winre.wim`, identified by partition Type ID `DE94BBA4-06D1-4D40-A16A-BFD50179D6AC` and recommended for placement immediately after the Windows partition. The minimum size is 300 MB, with 250 MB of free space recommended to accommodate future updates [@ms-uefi-gpt]. On Image Configuration Designer media, this partition is the default layout; clean Setup may instead use a `\Recovery\WindowsRE` folder inside the Windows partition [@ms-winre-tech-ref].
&lt;p&gt;Restated in the order a practitioner encounters them on disk, the four pieces are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The recovery partition.&lt;/strong&gt; The default UEFI/GPT layout from the Image Configuration Designer places a Windows RE Tools partition after the Windows partition, sized to hold &lt;code&gt;winre.wim&lt;/code&gt; with headroom for cumulative-update growth [@ms-uefi-gpt]. The GPT Type ID &lt;code&gt;DE94BBA4-06D1-4D40-A16A-BFD50179D6AC&lt;/code&gt; lets &lt;code&gt;bootmgr&lt;/code&gt; find the partition without depending on the Windows volume&apos;s drive letter. A &lt;code&gt;\Recovery\WindowsRE&lt;/code&gt; folder inside the OS volume is an equally valid alternative; some OEMs use one, some the other.The variability is invisible at runtime: &lt;code&gt;bootmgr&lt;/code&gt; follows the BCD, not the disk layout. But it matters at provisioning time. Always check &lt;code&gt;reagentc /info&lt;/code&gt; after deployment to know which arrangement you have, because the &lt;em&gt;Microsoft-recommended fix for &quot;winre.wim is too small after a cumulative update&quot;&lt;/em&gt; (KB5028997) depends on which partition the image lives in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;winre.wim&lt;/code&gt;.&lt;/strong&gt; A customised WinPE image. The lineage goes back to Windows PE 1.0, RTMed in 2002 from Windows XP RTM [@wiki-winpe]. Today&apos;s &lt;code&gt;winre.wim&lt;/code&gt; is built from Windows 10 / 11&apos;s WinPE 10 line and includes the recovery shell, Startup Repair, System Restore (when enabled on the host), command prompt, and a curated list of optional drivers. The base image still inherits the WinPE rules: 512 MB minimum RAM, 240-hour reboot cap on Windows 10 1803+ [@ms-winpe-intro].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;boot.sdi&lt;/code&gt;.&lt;/strong&gt; Sits on the recovery partition (or in &lt;code&gt;\Recovery\WindowsRE\&lt;/code&gt;) and acts as a fixed-size container into which the boot manager creates a RAM disk at boot time [@ms-bcd].The &lt;code&gt;.sdi&lt;/code&gt; extension stands for *System Deployment Image*, the same file format used by older Windows Deployment Services workflows in which a thin ramdisk holds a &lt;code&gt;boot.wim&lt;/code&gt; for PXE installs. The RAM disk is where &lt;code&gt;winre.wim&lt;/code&gt; is mounted. &lt;code&gt;boot.sdi&lt;/code&gt; is small (a few megabytes), unmodifiable in normal operation, and one of the parsers later abused by the BitUnlocker chain [@ms-bitunlocker-blog]; we return to that in Section 9.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;ReAgentC.exe&lt;/code&gt;.&lt;/strong&gt; The in-box management tool. Microsoft Learn documents the supported switches: &lt;code&gt;/info&lt;/code&gt;, &lt;code&gt;/enable&lt;/code&gt;, &lt;code&gt;/disable&lt;/code&gt;, &lt;code&gt;/setreimage /Path &amp;lt;Folder&amp;gt;&lt;/code&gt;, &lt;code&gt;/boottore&lt;/code&gt;, &lt;code&gt;/setbootshelllink&lt;/code&gt;, and the now-deprecated &lt;code&gt;/setosimage&lt;/code&gt; (no longer used on Windows 10 or later) [@ms-reagentc]. The same page notes that for &lt;em&gt;offline&lt;/em&gt; operations on WinPE 2.x/3.x/4.x images, administrators must instead use &lt;code&gt;Winrecfg.exe&lt;/code&gt; from the Windows Assessment and Deployment Kit -- a clue that the &lt;em&gt;online&lt;/em&gt; mode of &lt;code&gt;ReAgentC.exe&lt;/code&gt; predated the offline mode. The tool has shipped since at least Windows 7; the precise RTM month is not surfaced on Microsoft Learn today.The web is full of confident claims that &lt;code&gt;ReAgentC.exe&lt;/code&gt; first shipped in Vista, Windows 7, or Windows 8. The safe attribution is &quot;Windows 7 onwards&quot; because that is the era when the recovery-partition + ReAgentC model became the supported default. Microsoft Learn does not name an exact ship version, and the AI summaries that do are inferring from circumstantial evidence [@ms-reagentc].&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All four pieces have to cooperate at the worst possible moment: when the Windows partition refuses to boot. The question for the next section is the literal handoff. How does the firmware end up running &lt;code&gt;winre.wim&lt;/code&gt;?&lt;/p&gt;
&lt;h2&gt;3. The Mechanism: How a WinRE Boot Actually Happens&lt;/h2&gt;
&lt;p&gt;There is a sentence that appears in dozens of TechNet-era guides and AI summaries: &lt;em&gt;Windows boots WinRE by running &lt;code&gt;winload.exe /recovery&lt;/code&gt;.&lt;/em&gt; That sentence is wrong. There is no &lt;code&gt;/recovery&lt;/code&gt; switch on &lt;code&gt;winload.efi&lt;/code&gt; or &lt;code&gt;winload.exe&lt;/code&gt;. The BCD Boot Options Reference enumerates every legal element on a boot entry, and &lt;code&gt;recoverysequence&lt;/code&gt; is one of them; a command-line switch with that name is not [@ms-bcd]. WinRE is selected through the BCD, not through a flag passed to the loader.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The BCD Boot Options Reference defines every element on a boot entry: &lt;code&gt;device&lt;/code&gt;, &lt;code&gt;osdevice&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;recoverysequence&lt;/code&gt;, &lt;code&gt;winpe&lt;/code&gt;, &lt;code&gt;ramdisksdidevice&lt;/code&gt;, &lt;code&gt;ramdisksdipath&lt;/code&gt;, and a few dozen others [@ms-bcd]. None of them is exposed as a &lt;code&gt;winload.exe /recovery&lt;/code&gt; command-line flag. The recovery handoff happens entirely inside the boot manager, before &lt;code&gt;winload.efi&lt;/code&gt; ever runs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Walk the literal boot sequence on a UEFI machine [@ms-winre-tech-ref, @ms-bcd]:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Firmware passes control to &lt;code&gt;bootmgfw.efi&lt;/code&gt; on the EFI System Partition. (On legacy BIOS, it would be &lt;code&gt;bootmgr&lt;/code&gt; from the active partition.)&lt;/li&gt;
&lt;li&gt;The boot manager reads the BCD store. There is one entry of type &lt;em&gt;Windows Boot Manager&lt;/em&gt; and one or more entries of type &lt;em&gt;Windows Boot Loader&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;The OS loader entry carries an element called &lt;code&gt;recoverysequence&lt;/code&gt;, set to the GUID of a &lt;em&gt;separate&lt;/em&gt; BCD entry. That separate entry is the WinRE configuration.&lt;/li&gt;
&lt;li&gt;On a normal boot, the boot manager loads the OS entry&apos;s &lt;code&gt;path&lt;/code&gt; (&lt;code&gt;\Windows\System32\winload.efi&lt;/code&gt;) against the OS volume named in &lt;code&gt;device&lt;/code&gt;/&lt;code&gt;osdevice&lt;/code&gt;, and &lt;code&gt;winload.efi&lt;/code&gt; brings up the kernel.&lt;/li&gt;
&lt;li&gt;On a recovery trigger -- two failed boots, a corrupted system file, an explicit &lt;code&gt;reagentc /boottore&lt;/code&gt;, or the user choosing &lt;em&gt;Restart&lt;/em&gt; from the Advanced Startup menu -- the boot manager instead follows &lt;code&gt;recoverysequence&lt;/code&gt; to the WinRE entry.&lt;/li&gt;
&lt;li&gt;The WinRE entry&apos;s elements look like this: &lt;code&gt;winpe Yes&lt;/code&gt;, &lt;code&gt;osdevice ramdisk=[recovery]\Recovery\WindowsRE\Winre.wim,{ramdiskoptionsguid}&lt;/code&gt;, &lt;code&gt;device ramdisk=[recovery]\Recovery\WindowsRE\Winre.wim,{ramdiskoptionsguid}&lt;/code&gt;, and &lt;code&gt;path \Windows\System32\Boot\winload.efi&lt;/code&gt;. The &lt;code&gt;ramdiskoptions&lt;/code&gt; element it points to in turn carries &lt;code&gt;ramdisksdidevice&lt;/code&gt; and &lt;code&gt;ramdisksdipath&lt;/code&gt; (&lt;code&gt;\Recovery\WindowsRE\boot.sdi&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The boot manager creates a RAM disk backed by &lt;code&gt;boot.sdi&lt;/code&gt;, mounts &lt;code&gt;winre.wim&lt;/code&gt; inside it, and starts &lt;code&gt;winload.efi&lt;/code&gt; against that ramdisk. From &lt;code&gt;winload.efi&lt;/code&gt;&apos;s point of view, the OS being booted is the one inside &lt;code&gt;winre.wim&lt;/code&gt;. The kernel comes up in the RAM disk and presents the Windows RE entry-point UI.&lt;/li&gt;
&lt;/ol&gt;

flowchart TD
    F[UEFI firmware] --&amp;gt; BM[bootmgfw.efi on ESP]
    BM --&amp;gt; BCD[Read BCD store]
    BCD --&amp;gt; CHK{Trigger fired?}
    CHK -- No --&amp;gt; OS[OS loader entry, winload.efi, Windows partition]
    CHK -- Yes --&amp;gt; RS[Follow recoverysequence GUID]
    RS --&amp;gt; WRE[WinRE BCD entry: winpe Yes, osdevice ramdisk=...winre.wim]
    WRE --&amp;gt; RD[Allocate RAM disk from boot.sdi]
    RD --&amp;gt; MNT[Mount winre.wim into RAM disk]
    MNT --&amp;gt; WL[winload.efi loads WinPE kernel]
    WL --&amp;gt; UX[WinRE entry-point UI]
&lt;p&gt;The five auto-trigger conditions are enumerated verbatim in the Windows RE Technical Reference [@ms-winre-tech-ref]:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Two consecutive failed attempts to start Windows.&lt;/li&gt;
&lt;li&gt;Two consecutive unexpected shutdowns within two minutes of boot completion.&lt;/li&gt;
&lt;li&gt;Two consecutive system reboots within two minutes of boot completion.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://paragmali.com/blog/secure-boot-in-windows-the-chain-from-sector-zero-to-userini/&quot; rel=&quot;noopener&quot;&gt;Secure Boot&lt;/a&gt; error (except for issues related to &lt;code&gt;Bootmgr.efi&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A BitLocker error on touch-only devices.&lt;/li&gt;
&lt;/ol&gt;

flowchart LR
    A[Two failed boots] --&amp;gt; ENT[Enter WinRE]
    B[Two unexpected shutdowns within 2 min of boot] --&amp;gt; ENT
    C[Two reboots within 2 min of boot] --&amp;gt; ENT
    D[Secure Boot error -- not Bootmgr.efi] --&amp;gt; ENT
    E[BitLocker error on touch-only device] --&amp;gt; ENT
&lt;p&gt;Walking the BCD elements themselves makes the absence of any &lt;code&gt;/recovery&lt;/code&gt; switch visible. Here is a minimal model of what the boot manager actually consumes.&lt;/p&gt;
&lt;p&gt;{`
// Paraphrased from the BCD Boot Options Reference. Real bcdedit output is text,
// but the boot manager reads it as a typed key/value store.&lt;/p&gt;
&lt;p&gt;const bcd = {
  bootmgr: {
    type: &apos;Windows Boot Manager&apos;,
    default: &apos;{current}&apos;,
    displayorder: [&apos;{current}&apos;],
  },
  &apos;{current}&apos;: {
    type: &apos;Windows Boot Loader&apos;,
    device: &apos;partition=C:&apos;,
    osdevice: &apos;partition=C:&apos;,
    path: &apos;\\Windows\\system32\\winload.efi&apos;,
    description: &apos;Windows 11&apos;,
    recoverysequence: &apos;{a1b2-...-winre-guid}&apos;,
    recoveryenabled: &apos;Yes&apos;,
  },
  &apos;{a1b2-...-winre-guid}&apos;: {
    type: &apos;Windows Boot Loader&apos;,
    device: &apos;ramdisk=[\\Device\\HarddiskVolume4]\\Recovery\\WindowsRE\\Winre.wim,{ramdiskopts}&apos;,
    osdevice: &apos;ramdisk=[\\Device\\HarddiskVolume4]\\Recovery\\WindowsRE\\Winre.wim,{ramdiskopts}&apos;,
    path: &apos;\\Windows\\system32\\Boot\\winload.efi&apos;,
    description: &apos;Windows Recovery Environment&apos;,
    winpe: &apos;Yes&apos;,
    nx: &apos;OptIn&apos;,
  },
  &apos;{ramdiskopts}&apos;: {
    type: &apos;Device Options&apos;,
    description: &apos;Ramdisk Options&apos;,
    ramdisksdidevice: &apos;partition=\\Device\\HarddiskVolume4&apos;,
    ramdisksdipath: &apos;\\Recovery\\WindowsRE\\boot.sdi&apos;,
  },
};&lt;/p&gt;
&lt;p&gt;// The boot manager picks one of these entries, depending on whether
// recoverysequence has been activated. No command-line flag is involved.&lt;/p&gt;
&lt;p&gt;function bootDecision(failureCount, secureBootError, bitlockerError) {
  if (failureCount &amp;gt;= 2 || secureBootError || bitlockerError) {
    const winreGuid = bcd[&apos;{current}&apos;].recoverysequence;
    return bcd[winreGuid];
  }
  return bcd[&apos;{current}&apos;];
}&lt;/p&gt;
&lt;p&gt;const chosen = bootDecision(2, false, false);
console.log(&apos;Loader path the boot manager invokes:&apos;);
console.log(&apos;  &apos; + chosen.path);
console.log(&apos;Backing device:&apos;);
console.log(&apos;  &apos; + chosen.osdevice);
console.log(&apos;winpe flag (Yes means &quot;boot a WIM into a ramdisk&quot;):&apos;);
console.log(&apos;  &apos; + (chosen.winpe || &apos;(unset, normal OS boot)&apos;));
`}&lt;/p&gt;
&lt;p&gt;That is the entire mechanism. Two failed boots flip an in-BCD counter; the boot manager follows &lt;code&gt;recoverysequence&lt;/code&gt; instead of the default loader path; the WinRE entry mounts &lt;code&gt;winre.wim&lt;/code&gt; in a RAM disk; the kernel inside &lt;code&gt;winre.wim&lt;/code&gt; comes up. No flags, no shells, no scripts.&lt;/p&gt;
&lt;p&gt;Now we know what WinRE is and how it boots. The remaining historical question is how this architecture &lt;em&gt;came to be&lt;/em&gt;, and what about it did not change between 2007 and July 19, 2024.&lt;/p&gt;
&lt;h2&gt;4. Historical Origins: From the Recovery Console to the Recovery Partition (2000-2012)&lt;/h2&gt;
&lt;p&gt;Every architectural choice in WinRE was a response to something that did not work the year before. Walk the four pre-WRI generations of Windows recovery and the story is one long relaxation of the assumption that recovery requires physical media.&lt;/p&gt;
&lt;h3&gt;Generation 1: Emergency Repair Disk (NT 3.x and 4.0, 1993-2000)&lt;/h3&gt;
&lt;p&gt;A floppy disk plus a &lt;code&gt;%SystemRoot%\repair&lt;/code&gt; directory contained snapshotted SYSTEM, SOFTWARE, SAM, and SECURITY registry hives [@wiki-recovery-console]. The administrator booted from the three Windows NT Setup floppies, pressed &lt;code&gt;R&lt;/code&gt; for Repair, fed the floppy when prompted, and Setup wrote the snapshotted hives back over the damaged on-disk copies. ERD repaired the registry, nothing more. If &lt;code&gt;NTOSKRNL.EXE&lt;/code&gt; itself was missing, the operator was reduced to a DOS floppy plus &lt;code&gt;EXPAND&lt;/code&gt; from the install CD. The architecture&apos;s failure mode was the obvious one for a floppy-based snapshot system: the floppy got lost; the snapshot was stale; the scope was too narrow.&lt;/p&gt;

The Windows NT 3.x and 4.0 recovery mechanism: a snapshot of the registry hives written to a floppy by `RDISK.EXE` plus a small `%SystemRoot%\repair` folder. Restored only the registry; required the NT Setup floppies to boot. Wikipedia&apos;s *Recovery Console* article identifies the Recovery Console as ERD&apos;s successor [@wiki-recovery-console].
&lt;h3&gt;Generation 2: Recovery Console (Windows 2000, February 17, 2000)&lt;/h3&gt;
&lt;p&gt;The Recovery Console replaced the binary &quot;restore the snapshot&quot; decision with a programmable shell. Boot from the Windows 2000 or XP install CD; choose Repair; the operator landed in a &lt;code&gt;cmd.exe&lt;/code&gt;-shaped environment with around three dozen internal commands: &lt;code&gt;copy&lt;/code&gt;, &lt;code&gt;del&lt;/code&gt;, &lt;code&gt;attrib&lt;/code&gt;, &lt;code&gt;chkdsk&lt;/code&gt;, &lt;code&gt;fixboot&lt;/code&gt;, &lt;code&gt;fixmbr&lt;/code&gt;, &lt;code&gt;bootcfg&lt;/code&gt;, and the rest [@wiki-recovery-console]. Authentication required the local Administrator password; filesystem access was sharply constrained (read-only by default; on the boot volume only the root and &lt;code&gt;%SystemRoot%&lt;/code&gt; were writable, unless Group Policy relaxed those limits).&lt;/p&gt;

The Windows 2000/XP/Server 2003 command-line repair shell. Initial release February 17, 2000; superseded by the Windows Recovery Environment in Windows Vista. Loadable from the install CD or installable as a startup option via `winnt32 /cmdcons`. Wikipedia lists Windows Recovery Environment as its named successor [@wiki-recovery-console].
&lt;p&gt;The Recovery Console did not fail technically. It failed &lt;em&gt;culturally&lt;/em&gt;. By 2005 the Windows administrator population had shifted decisively to GUI tools. A 2005 user with a corrupt &lt;code&gt;WINLOAD.EXE&lt;/code&gt; and no install CD had no path to repair the box without buying replacement media. There was no automatic-repair logic and no on-disk presence; the install CD was always required, and every fix demanded muscle memory the typical administrator no longer had.&lt;/p&gt;
&lt;h3&gt;Generation 3: WinRE on Installation Media (Windows Vista, January 2007)&lt;/h3&gt;
&lt;p&gt;Vista shipped a full GUI recovery environment built on the brand-new Windows PE 2.0 [@wiki-winpe]. &lt;code&gt;winre.wim&lt;/code&gt; carried Startup Repair (a probe-and-fix playbook for boot failures), System Restore (now backed by the Volume Shadow Copy Service), Complete PC Restore, Windows Memory Diagnostic, and a command prompt for the cases nothing else fit. Vista was also the version that introduced the Boot Configuration Data store and &lt;code&gt;bootmgr&lt;/code&gt;, replacing &lt;code&gt;NTLDR&lt;/code&gt; and the plain-text &lt;code&gt;boot.ini&lt;/code&gt; [@ms-bcd]. The same BCD that today still routes the recovery handoff was written for Vista.The Microsoft Learn &quot;Vista WinRE Overview&quot; page in the previous-versions archive (&lt;code&gt;cc766056&lt;/code&gt;) is now misdirected and renders an unrelated USMT migration topic instead of the original article. The load-bearing claim that WinRE was introduced in Vista is independently supported by the Windows PE Wikipedia article&apos;s version table (WinPE 2.0 built from Vista RTM) and by Microsoft Learn&apos;s &lt;em&gt;Push-button reset overview&lt;/em&gt;, which dates Push-Button Reset to Windows 8 and frames it as built on the existing WinRE architecture [@wiki-winpe, @ms-pbr-overview].&lt;/p&gt;
&lt;p&gt;Vista WinRE had two architectural problems that the next generation fixed. OEMs were free to put &lt;code&gt;winre.wim&lt;/code&gt; wherever they wanted on disk; there was no standard partition. And the install DVD remained the fallback for any user whose OEM had not pre-installed WinRE -- which, by 2010, was most users, none of whom still owned the DVD.&lt;/p&gt;
&lt;p&gt;System Restore is itself a sub-thread worth noting. It first shipped in Windows ME (year 2000), was re-implemented atop VSS in Vista, and remained off by default on Windows 10 and 11 [@wiki-system-restore]. The Vista move made it callable from WinRE even when the host Windows would not boot -- a property that, twenty-five years later, Point-in-Time Restore is re-engineering for the cloud.&lt;/p&gt;
&lt;h3&gt;Generation 4: Recovery Partition + ReAgentC + BCD &lt;code&gt;recoverysequence&lt;/code&gt; (Windows 7, 2009; standardised in Windows 8 and beyond)&lt;/h3&gt;
&lt;p&gt;This is the architecture every Windows 11 device still runs.&lt;/p&gt;
&lt;p&gt;Windows 7 dropped &lt;code&gt;winre.wim&lt;/code&gt; onto a dedicated recovery partition with a GPT Type ID that lets &lt;code&gt;bootmgr&lt;/code&gt; find it without depending on the Windows volume&apos;s drive letter [@ms-uefi-gpt]. &lt;code&gt;ReAgentC.exe&lt;/code&gt; became the in-box management tool [@ms-reagentc]. The BCD &lt;code&gt;recoverysequence&lt;/code&gt; element became the mechanism by which the OS loader entry points at the WinRE entry. The two-failed-boots trigger entered the Windows RE Technical Reference&apos;s enumeration of automatic conditions [@ms-winre-tech-ref].&lt;/p&gt;
&lt;p&gt;Generation 4 &lt;em&gt;did not fail&lt;/em&gt;. The five auto-trigger conditions still fire on Windows 11 24H2. ReAgentC&apos;s switches are still the supported management surface. The recovery-partition GPT Type ID is still &lt;code&gt;DE94BBA4-06D1-4D40-A16A-BFD50179D6AC&lt;/code&gt;. It is the architectural floor every later generation extends, including Quick Machine Recovery.&lt;/p&gt;
&lt;p&gt;What Generation 4 &lt;em&gt;did not solve&lt;/em&gt; was the cost of recovery at fleet scale. WinRE-on-disk handled one machine perfectly; it had nothing to say about ten thousand machines, each still bounded by the time it took to walk to a desk.&lt;/p&gt;

gantt
    dateFormat YYYY
    axisFormat %Y
    section Pre-WinRE
    Emergency Repair Disk (NT 3.x / 4.0)         :1993, 2000
    Recovery Console (Windows 2000 onwards)      :2000, 2008
    section WinRE
    WinRE on installation media (Vista)          :2007, 2009
    Recovery partition + ReAgentC (still current) :2009, 2026
    section Recovery flavours
    Push-Button Reset (Windows 8 onwards)        :2012, 2026
    Autopilot Reset (Win 10 1709)                :2017, 2026
    Quick Machine Recovery (24H2)                :2025, 2026
    Intune Remote Recovery / Cloud Rebuild        :2025, 2026
&lt;p&gt;A few parallel paths deserve naming. Push-Button Reset, introduced in Windows 8 in 2012, gave consumers an in-WinRE &quot;Refresh&quot; or &quot;Reset&quot;; image-less reset in Windows 10 and Cloud Download in Windows 10 version 2004 (May 2020) made the reset progressively less dependent on locally-staged install images [@ms-pbr-overview]. Autopilot Reset, shipped in Windows 10 1709 (October 2017), let Intune issue an MDM-initiated wipe-and-rebuild that preserved the device&apos;s Entra ID join. Microsoft Diagnostics and Recovery Toolset (DaRT) -- the descendant of Winternals ERD Commander acquired in 2006 and shipped under MDOP starting July 2007 (MDOP 2007), with subsequent releases through MDOP 2008 (April 2008) -- gave Software Assurance customers a richer enterprise tool on top of WinPE [@wiki-mdop-dart]. Older recovery mechanisms quietly aged out: Last Known Good Configuration was no longer the default boot-failure response on Windows 8 onward, and the deprecated-features lifecycle framework is the canonical place to track such retirements today [@ms-deprecated].&lt;/p&gt;
&lt;p&gt;By the early 2010s, the architecture that still runs on every Windows 11 device today was largely in place [@ms-winre-tech-ref, @ms-reagentc]. None of these tools gave WinRE permission to call Windows Update from inside the recovery environment. That gap is the next chapter.&lt;/p&gt;
&lt;h2&gt;5. The Forcing Function: July 19, 2024&lt;/h2&gt;
&lt;p&gt;We know what WinRE is. We know how it boots. We can now see the CrowdStrike incident as the architecture&apos;s stress test. The headline numbers are well-rehearsed at this point; what matters here is the technical cause, the kernel-resident dependency it expressed, and the procedure Microsoft published.&lt;/p&gt;
&lt;h3&gt;The fault&lt;/h3&gt;
&lt;p&gt;CrowdStrike&apos;s Falcon sensor for Windows version 7.11, released in February 2024, introduced a new IPC Template Type used by behavioural detection logic [@crowdstrike-rca-pdf]. The Template Type &lt;em&gt;declared&lt;/em&gt; twenty-one input parameter fields. The integration code that invoked the in-driver Content Interpreter to evaluate Template Instances against host activity &lt;em&gt;supplied only twenty inputs&lt;/em&gt; [@crowdstrike-rca-pdf]. For more than four months, Channel File 291 contained no Template Instance whose criterion read the twenty-first field. That made the mismatch latent.&lt;/p&gt;
&lt;p&gt;At 04:09 UTC on July 19, 2024, CrowdStrike pushed a new Channel File 291 containing a Template Instance that referenced the twenty-first field with a non-wildcard matching criterion [@crowdstrike-rca-pdf, @crowdstrike-tech-details]. The Content Interpreter loaded the instance, looked up the twenty-first input pointer in its input-pointer array, and read past the end of that array. Sensors running 7.11 or later that received the update between 04:09 and 05:27 UTC tripped the latent out-of-bounds read [@crowdstrike-tech-details].&lt;/p&gt;
&lt;h3&gt;The crash&lt;/h3&gt;
&lt;p&gt;Microsoft&apos;s Windows Error Reporting analysis, published in the security blog on July 27, 2024, recorded the global crash signature as &lt;code&gt;nt!KeBugCheckEx&lt;/code&gt; followed by &lt;code&gt;nt!KiPageFault&lt;/code&gt; and then &lt;code&gt;csagent+0xe14ed&lt;/code&gt;, with &lt;code&gt;r8=ffff840500000074&lt;/code&gt; as the invalid pointer that the read tried to dereference [@ms-security-jul27]. Microsoft confirmed that the analysis matched CrowdStrike&apos;s own conclusion: a read-out-of-bounds memory safety error in the &lt;code&gt;csagent.sys&lt;/code&gt; driver.&lt;/p&gt;

flowchart TD
    A[Falcon 7.11 ships in Feb 2024 with IPC Template Type declaring 21 fields] --&amp;gt; B[Integration code supplies only 20 inputs]
    B --&amp;gt; C[Latent OOB potential -- no instance references field 21]
    C --&amp;gt; D[July 19 04:09 UTC: new Channel File 291 adds non-wildcard 21st-field criterion]
    D --&amp;gt; E[Content Interpreter reads input-pointer index 20]
    E --&amp;gt; F[Page fault at csagent+0xe14ed]
    F --&amp;gt; G[nt!KiPageFault -&amp;gt; nt!KeBugCheckEx]
    G --&amp;gt; H[Bug check; system reboots]
    H --&amp;gt; I[csagent.sys reloads -- registered SERVICE_SYSTEM_START Start=1 -- bug check again]
    I --&amp;gt; J[Boot loop on 8.5 million endpoints]
&lt;h3&gt;The kernel-resident dependency&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;csagent.sys&lt;/code&gt; loaded early in boot. Microsoft&apos;s WER post-mortem shows the driver registered with &lt;code&gt;REG_DWORD Start 1&lt;/code&gt; -- the &lt;code&gt;SERVICE_SYSTEM_START&lt;/code&gt; class, loaded by the kernel before user-mode comes up [@ms-security-jul27]. That placement is the entire point of a kernel-mode security agent: it has to instrument the kernel boundary at the moment user-mode would otherwise be invisible to it. The cost of that placement is that when an early-boot driver page-faults, the bug check happens &lt;em&gt;before&lt;/em&gt; the operating system is interactive. The remediation -- &lt;em&gt;delete &lt;code&gt;C-00000291*.sys&lt;/code&gt;&lt;/em&gt; -- could not be issued from a running Windows, because there was no running Windows.&lt;/p&gt;

The fault dynamic above is easier to describe than it is to file. CrowdStrike&apos;s own technical-details post is explicit about the file-type distinction: &quot;Although Channel Files end with the SYS extension, they are not kernel drivers&quot; [@crowdstrike-tech-details]. The kernel-mode component is `csagent.sys`. The Channel Files in `C:\Windows\System32\drivers\CrowdStrike\` are *data* that the Content Interpreter inside `csagent.sys` reads. The fault was a bug in `csagent.sys`&apos;s interpretation of a particular Channel File; both ends matter, and the file extension on the data file is incidental.
&lt;h3&gt;The recovery procedure&lt;/h3&gt;
&lt;p&gt;Microsoft published KB5042421 within hours [@ms-kb5042421]. The text reduced to three steps: boot to Safe Mode (which on Windows 11 means letting WinRE select Safe Mode from the &lt;em&gt;Advanced startup options&lt;/em&gt; tree); delete &lt;code&gt;C:\Windows\System32\drivers\CrowdStrike\C-00000291*.sys&lt;/code&gt;; reboot. For BitLocker-encrypted volumes the procedure had a fourth, preliminary step: surface the recovery key. KB5042421 walks the user through the Entra ID self-service flow at &lt;code&gt;aka.ms/aadrecoverykey&lt;/code&gt;: log on from a phone, choose Manage Devices, View BitLocker Keys, Show recovery key [@ms-kb5042421].&lt;/p&gt;
&lt;p&gt;The instruction was correct. It was also unambiguously per-machine.&lt;/p&gt;

We currently estimate that CrowdStrike&apos;s update affected 8.5 million Windows devices, or less than one percent of all Windows machines. -- Microsoft, *Helping our customers through the CrowdStrike outage*, July 20, 2024 [@ms-crowdstrike-jul20].
&lt;h3&gt;The bottleneck&lt;/h3&gt;
&lt;p&gt;Each device&apos;s recovery was a function of &lt;em&gt;time-to-physical-access&lt;/em&gt;, plus &lt;em&gt;time-to-BitLocker-key&lt;/em&gt;, plus &lt;em&gt;time-to-keyboard&lt;/em&gt;. None of those terms scaled. A laptop on a desk that the owner happened to be near recovered in five minutes. A laptop on a desk where the owner was on holiday recovered when someone arrived to swipe their badge. A server in a remote data centre recovered when a hand reached the iLO or KVM. A point-of-sale device in a checked-bag-only baggage hall recovered when someone wheeled a USB keyboard out to it. Multiply by 8.5 million.&lt;/p&gt;
&lt;p&gt;The architecture that delivered Safe Mode to every one of those devices did exactly what its 2009 specification said it would do. The architecture that delivered Safe Mode to every one of those devices left enterprises stranded for days. Both sentences are true. The contradiction is the whole point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; WinRE booted correctly. The Safe Mode tile rendered. The two-failed-boots trigger fired. The recovery partition was where it should be. The BCD &lt;code&gt;recoverysequence&lt;/code&gt; led to the right &lt;code&gt;winre.wim&lt;/code&gt;. The keyboard handler took keystrokes. Every line of code did what it was specified to do. The single unwritten line of the specification -- &lt;em&gt;one operator, please&lt;/em&gt; -- was the line that did not scale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The instruction was correct, the procedure was published within hours, and the floor was on fire for days. The next question -- the one Microsoft was already being asked at WESES, the closed-door September 10, 2024 endpoint-security partner summit [@ms-weses] -- was whether the floor could not be on fire next time.&lt;/p&gt;
&lt;h2&gt;6. The Breakthrough: Quick Machine Recovery&lt;/h2&gt;
&lt;p&gt;Quick Machine Recovery, announced at Microsoft Ignite on November 19, 2024 [@ms-wri-ignite-2024] and generally available on Windows 11 24H2 build 26100.4700+ in August 2025 per the November 18, 2025 update [@ms-wri-ignite-2025], did not add any new &lt;em&gt;technology&lt;/em&gt; to WinRE that had not been in WinPE since 2002. Networking drivers, DHCP clients, HTTPS stacks: all of these were already in &lt;code&gt;winre.wim&lt;/code&gt;&apos;s base image, inherited from the WinPE Optional Components that have shipped with the OS for two decades [@ms-winpe-intro]. What QMR added was an &lt;em&gt;answer to a question WinRE had never been asked&lt;/em&gt;: when you are inside the recovery environment with no operator at the keyboard, who do you call?&lt;/p&gt;

The Windows 11 24H2 feature, available on build 26100.4700 or later, that lets WinRE establish network connectivity from inside the recovery environment, query Windows Update for a remediation matching the current failure signature, download and apply that remediation, and reboot -- all without requiring an operator at the keyboard [@ms-qmr]. Announced at Microsoft Ignite on November 19, 2024 [@ms-wri-ignite-2024]; first shipped in Windows 11 Insider Preview build 26120.3653 on March 28, 2025 [@ms-qmr-insider-mar2025]; generally available in August 2025 [@ms-wri-ignite-2025].
&lt;h3&gt;The five-phase loop&lt;/h3&gt;
&lt;p&gt;Microsoft Learn documents QMR as five phases [@ms-qmr]:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Crash detection.&lt;/strong&gt; The same two-failed-boots trigger already in the Windows RE Technical Reference [@ms-winre-tech-ref] fires the recovery path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boot to recovery.&lt;/strong&gt; The existing BCD &lt;code&gt;recoverysequence&lt;/code&gt; mechanism from Section 3 routes the system into WinRE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network connection.&lt;/strong&gt; WinRE establishes wired Ethernet, or WPA/WPA2 password-based Wi-Fi using a credential pre-staged via &lt;code&gt;reagentc.exe /SetRecoverySettings&lt;/code&gt;. As of the Microsoft Learn page&apos;s current wording, &lt;em&gt;only&lt;/em&gt; wired and WPA/WPA2 password-based wireless are supported [@ms-qmr]; enterprise certificates and WPA3-Enterprise are on the November 18, 2025 roadmap but not yet shipped [@ms-wri-ignite-2025].&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remediation.&lt;/strong&gt; The recovery environment scans Windows Update for a published remediation matching the device&apos;s failure signature, downloads it, and applies it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reboot.&lt;/strong&gt; On success, the device boots normally. On no-match, the device can either present the manual recovery menu (the &lt;em&gt;one-time scan&lt;/em&gt; mode, the default for unmanaged systems) or loop with a configurable interval (the &lt;em&gt;looped&lt;/em&gt; mode) until either a remediation arrives or the operator-set total wait time expires [@ms-qmr].&lt;/li&gt;
&lt;/ol&gt;

sequenceDiagram
    participant D as Device (OS)
    participant W as WinRE
    participant N as Network
    participant WU as Windows Update
    participant O as OS partition
    D-&amp;gt;&amp;gt;W: Two failed boots -&amp;gt; follow recoverysequence
    W-&amp;gt;&amp;gt;N: Acquire Ethernet or WPA2 Wi-Fi
    W-&amp;gt;&amp;gt;WU: Query for remediation matching failure signature
    WU--&amp;gt;&amp;gt;W: Remediation package (or &quot;none found&quot;)
    alt Remediation available
        W-&amp;gt;&amp;gt;O: Apply remediation to OS partition
        W-&amp;gt;&amp;gt;D: Reboot
        D--&amp;gt;&amp;gt;D: Normal boot succeeds
    else None found, one-time mode
        W-&amp;gt;&amp;gt;D: Present manual recovery menu
    else None found, looped mode
        W--&amp;gt;&amp;gt;W: Sleep wait_interval, retry until total_wait_time
    end
&lt;h3&gt;The default-on/off matrix&lt;/h3&gt;
&lt;p&gt;The Microsoft Learn QMR page is explicit on defaults [@ms-qmr]. Cloud remediation is enabled by default, with one-time scan auto-remediation, on systems that are not under enterprise management -- Windows Home and unmanaged Pro. It is disabled by default on enterprise-managed systems -- Windows Enterprise, Education, and managed Pro. The rationale follows from how those populations think: enterprise administrators want to gate cloud remediation behind their own deployment-ring process, and consumers benefit from the default-on behaviour because they do not have a ring process at all. The same Microsoft Learn page documents an Intune Settings Catalog policy under &lt;em&gt;Remote Remediation &amp;gt; Enable Cloud Remediation&lt;/em&gt; for administrators who want to switch the policy on at the tenant level [@ms-qmr].&lt;/p&gt;
&lt;h3&gt;The test-mode flow&lt;/h3&gt;
&lt;p&gt;QMR ships with a dry-run mechanism. &lt;code&gt;reagentc.exe /SetRecoveryTestmode&lt;/code&gt; configures the WinRE entry for a simulated recovery cycle; &lt;code&gt;reagentc.exe /BootToRe&lt;/code&gt; triggers the cycle on the next reboot; the simulated remediation appears in Settings &amp;gt; Windows Update &amp;gt; Update history rather than mutating the production OS [@ms-qmr]. Microsoft suggests using the test mode to validate the per-device QMR configuration before relying on it in production.&lt;/p&gt;
&lt;h3&gt;The pseudocode&lt;/h3&gt;
&lt;p&gt;The five phases collapse into a short loop. The version below is paraphrased from the Microsoft Learn QMR page [@ms-qmr] and shows how the two settings interact.&lt;/p&gt;
&lt;p&gt;{`
// Paraphrased from the Microsoft Learn QMR specification.&lt;/p&gt;
&lt;p&gt;const config = {
  cloud_remediation_enabled: true,    // default on Home/unmanaged Pro
  auto_remediation_mode: &apos;looped&apos;,    // &apos;one_time&apos; | &apos;looped&apos;
  total_wait_time_minutes: 60,
  wait_interval_minutes: 10,
  wifi: { ssid: &apos;corp-recovery&apos;, psk: &apos;***&apos;, encryption: &apos;WPA2&apos; },
};&lt;/p&gt;
&lt;p&gt;function detectFailureSignature() {
  return { driver: &apos;csagent.sys&apos;, offset: &apos;0xe14ed&apos;, signature: &apos;oob-read&apos; };
}&lt;/p&gt;
&lt;p&gt;function scanWindowsUpdate(signature) {
  if (signature.driver === &apos;csagent.sys&apos; &amp;amp;&amp;amp; signature.signature === &apos;oob-read&apos;) {
    return { id: &apos;qmr-csagent-291&apos;, action: &apos;delete&apos;, path:
      &apos;C\\Windows\\System32\\drivers\\CrowdStrike\\C-00000291*.sys&apos; };
  }
  return null;
}&lt;/p&gt;
&lt;p&gt;function qmrEnterRecovery() {
  console.log(&apos;Phase 1: crash detected (two failed boots)&apos;);
  console.log(&apos;Phase 2: booted into WinRE via BCD recoverysequence&apos;);&lt;/p&gt;
&lt;p&gt;  if (!config.cloud_remediation_enabled) {
    console.log(&apos;Cloud remediation disabled; falling back to Startup Repair&apos;);
    return;
  }&lt;/p&gt;
&lt;p&gt;  console.log(&apos;Phase 3: acquiring network (&apos; + config.wifi.encryption + &apos; Wi-Fi)&apos;);
  const sig = detectFailureSignature();
  let elapsed = 0;&lt;/p&gt;
&lt;p&gt;  while (true) {
    console.log(&apos;Phase 4: scanning Windows Update for remediation matching &apos; + sig.driver);
    const remediation = scanWindowsUpdate(sig);
    if (remediation) {
      console.log(&apos;  -&amp;gt; Applying &apos; + remediation.id + &apos; (delete &apos; + remediation.path + &apos;)&apos;);
      console.log(&apos;Phase 5: reboot into repaired Windows&apos;);
      return;
    }
    if (config.auto_remediation_mode === &apos;one_time&apos;) {
      console.log(&apos;No remediation found; presenting manual recovery menu&apos;);
      return;
    }
    elapsed += config.wait_interval_minutes;
    if (elapsed &amp;gt;= config.total_wait_time_minutes) {
      console.log(&apos;Looped mode exhausted; falling back to manual recovery menu&apos;);
      return;
    }
    console.log(&apos;  -&amp;gt; No match; sleeping &apos; + config.wait_interval_minutes + &apos; min&apos;);
  }
}&lt;/p&gt;
&lt;p&gt;qmrEnterRecovery();
`}&lt;/p&gt;
&lt;h3&gt;The counterfactual&lt;/h3&gt;
&lt;p&gt;Had QMR existed on July 19, 2024, the per-device labour would have been zero. Microsoft and CrowdStrike would have published a Windows Update remediation that deletes &lt;code&gt;C-00000291*.sys&lt;/code&gt;; every affected device would have entered WinRE on its second failed boot, picked up the remediation, applied it, and rebooted. The 8.5-million-device fleet cost would have collapsed from operator-days to network-minutes. The CrowdStrike RCA published August 6, 2024 documents that the fault-to-rollback time was 78 minutes [@crowdstrike-tech-details, @crowdstrike-rca-pdf]; QMR would have made &lt;em&gt;time-to-rollback&lt;/em&gt; and &lt;em&gt;time-to-fleet-recovery&lt;/em&gt; the same number, plus the per-device Windows Update transit. That is the empirical case Microsoft is making.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Quick Machine Recovery did not add new technology to WinRE. It added a question. WinRE has always had networking drivers; it had never been told it had permission to phone home. The technical innovation is policy, not code -- the &lt;em&gt;Windows Update endpoint&lt;/em&gt; framing is a commitment that the recovery environment may, in well-defined circumstances, act on behalf of the operator who is not there.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;QMR re-priced the per-device cost of recovery from O(N) to roughly O(1). But QMR alone does not explain why Microsoft is calling this the &lt;em&gt;Windows Resiliency Initiative&lt;/em&gt; rather than the &lt;em&gt;Quick Machine Recovery Release&lt;/em&gt;. The next section unpacks the five layers WRI puts around QMR.&lt;/p&gt;
&lt;h2&gt;7. The Program: The Windows Resiliency Initiative as Five Layers&lt;/h2&gt;
&lt;p&gt;WRI is not one feature. It is a layered program. Each layer is a Microsoft-named deliverable with a Microsoft-cited source. The temptation, on reading any single WRI blog post, is to confuse the layer with the program. The layers are concentric. They are also dated.&lt;/p&gt;
&lt;p&gt;Walk the five layers. Each has a Microsoft term, a primary anchor, and a published status as of November 18, 2025.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Microsoft term&lt;/th&gt;
&lt;th&gt;Anchor&lt;/th&gt;
&lt;th&gt;Status as of Nov 18, 2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Prevent: stop bad updates leaving the partner&lt;/td&gt;
&lt;td&gt;Safe Deployment Practices (SDP), part of &lt;strong&gt;MVI 3.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;[@ms-wri-ignite-2024], [@ms-mvi], [@ms-wri-jun-2025]&lt;/td&gt;
&lt;td&gt;Effective April 1, 2025 [@ms-wri-ignite-2025]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prevent: stop bad code being kernel-resident&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Windows endpoint security platform&lt;/strong&gt; (user-mode antivirus)&lt;/td&gt;
&lt;td&gt;[@ms-wri-ignite-2024], [@ms-wri-jun-2025], [@ms-wri-ignite-2025]&lt;/td&gt;
&lt;td&gt;Private preview July 2025; named partners in [@ms-wri-jun-2025]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manage: see the incident at scale&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Intune surfaces WinRE state&lt;/strong&gt;; Mission Critical Services for Windows&lt;/td&gt;
&lt;td&gt;[@ms-wri-ignite-2025]&lt;/td&gt;
&lt;td&gt;Coming soon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recover: heal the unbootable machine&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quick Machine Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;[@ms-wri-ignite-2024], [@ms-qmr], [@ms-wri-ignite-2025]&lt;/td&gt;
&lt;td&gt;GA August 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recover: rebuild without shipping hardware&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Point-in-Time Restore&lt;/strong&gt;, &lt;strong&gt;Cloud Rebuild&lt;/strong&gt;, &lt;strong&gt;Windows 365 Reserve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;[@ms-wri-ignite-2025]&lt;/td&gt;
&lt;td&gt;PITR Insider preview Nov 2025; W365R GA; Cloud Rebuild coming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

flowchart LR
    subgraph L1[1. Prevent: stop bad updates at the partner -- MVI 3.0 SDP]
      subgraph L2[2. Prevent: stop bad code being kernel-resident -- user-mode AV platform]
        subgraph L3[3. Manage: see the incident at scale -- Intune surfaces WinRE state]
          subgraph L4[4. Recover the unbootable: Quick Machine Recovery]
            subgraph L5[5. Rebuild without shipping hardware: PITR / Cloud Rebuild / W365 Reserve]
              CORE[Windows endpoint -- recoverable at fleet scale]
            end
          end
        end
      end
    end
&lt;h3&gt;Layer 1: Safe Deployment Practices and MVI 3.0&lt;/h3&gt;
&lt;p&gt;Microsoft Virus Initiative 3.0 became effective on April 1, 2025 [@ms-wri-ignite-2025]. Membership now requires partners to commit to four named obligations [@ms-mvi]: a signed nondisclosure agreement; use of Microsoft Trusted Signing (the hosted descendant of &lt;a href=&quot;https://paragmali.com/blog/authenticode-and-catalog-files-the-crypto-foundation-under-w/&quot; rel=&quot;noopener&quot;&gt;Authenticode&lt;/a&gt;) for AV/EDR driver code-signing; documented Safe Deployment Practices for content updates (gradual rollouts with deployment rings and monitoring); and certification within the last 12 months by at least one of AV-Comparatives, AVLab Cybersecurity Foundation, AV-Test, MRG Effitas, SE Labs, SKD Labs, VB 100, or West Coast Labs [@ms-mvi]. The June 26, 2025 WRI update lists eight named partner endorsements -- Bitdefender (Florin Virlan), CrowdStrike (Alex Ionescu), ESET (Juraj Malcho), SentinelOne (Stefan Krantz), Sophos (John Peterson), Trellix (Jim Treinen), Trend Micro (Rachel Jin), and WithSecure (Johannes Rave) -- and the November 18, 2025 update confirms the effective date verbatim: &quot;Effective April 1, 2025, Version 3.0 of the Microsoft Virus Initiative added new requirements for all Windows antivirus (AV) partners to maintain signing rights for Windows AV drivers&quot; [@ms-wri-jun-2025, @ms-wri-ignite-2025].&lt;/p&gt;

Microsoft&apos;s program for third-party antivirus and endpoint detection vendors that ship products on Windows. MVI 3.0, effective April 1, 2025, adds Safe Deployment Practices, mandatory Trusted Signing, NDA, and 12-month independent test-lab certification as preconditions to maintain Windows AV driver signing rights [@ms-mvi, @ms-wri-ignite-2025].
&lt;p&gt;The model is structurally identical to the canary / progressive-rollout pattern formalised in the Google SRE Book chapter on Release Engineering: hermetic builds, multiple deployment rings, gated promotion between rings, &quot;Push on Green&quot;, and the option to cherry-pick at the same revision when a critical change is needed mid-cycle [@sre-release-eng]. MVI 3.0 is not a Microsoft invention; it is a Microsoft &lt;em&gt;mandate&lt;/em&gt; of a model that has been industry practice for two decades. The mandate is what is new.&lt;/p&gt;
&lt;h3&gt;Layer 2: The Windows endpoint security platform&lt;/h3&gt;
&lt;p&gt;The same November 19, 2024 keynote committed to a &lt;em&gt;Windows endpoint security platform&lt;/em&gt; that lets partners ship their detection logic outside kernel mode, with a private preview promised to security-partner programs by July 2025 [@ms-wri-ignite-2024]. The June 26, 2025 update confirmed the date with named partner endorsements [@ms-wri-jun-2025]. The architectural premise is the one BSOD survivors recognise immediately: a faulty user-mode component can be killed by Task Manager; a faulty kernel-mode driver bug-checks the system.&lt;/p&gt;

Graphics drivers, for example, will continue to run in kernel mode for performance reasons. -- Microsoft, *Preparing for what&apos;s next*, November 18, 2025 [@ms-wri-ignite-2025].
&lt;p&gt;Microsoft is careful to frame WRI as a floor-raiser, not a kernel ban. The November 18, 2025 update enumerates the driver-resiliency playbook for the surfaces that &lt;em&gt;will&lt;/em&gt; remain in kernel mode: mandatory compiler safeguards (control-flow integrity, &lt;a href=&quot;https://paragmali.com/blog/process-mitigation-policies-cfg-acg-cig-and-the-layer-betwee/&quot; rel=&quot;noopener&quot;&gt;CFG&lt;/a&gt;, stack canaries), driver isolation, DMA-remapping, a higher signing bar, and expanded in-box Microsoft drivers and APIs that third parties can call rather than reimplementing [@ms-wri-ignite-2025]. The argument is that the kernel surface that &lt;em&gt;must&lt;/em&gt; exist (graphics, storage, some networking) should be smaller, better isolated, and equipped with mitigations that contain a single fault.&lt;/p&gt;
&lt;p&gt;The June 2025 partner roster is the most pointed piece of evidence that the user-mode direction predates and outlasts the July 2024 incident. CrowdStrike itself is named [@ms-wri-jun-2025]. The vendor that started the chain reaction is publicly endorsing the architectural concession the chain reaction priced into existence.&lt;/p&gt;

The Windows Resiliency Initiative is not Microsoft&apos;s only post-2023 security program. The umbrella is the *Secure Future Initiative* (SFI), announced in November 2023 as the company-wide response to identity-based attacks on Microsoft itself. WRI is the workstream inside SFI that owns Windows availability, kernel resilience, and the recovery path; SFI also owns identity hardening, supply-chain controls, and engineering culture changes. Microsoft&apos;s published WRI blogs are explicit that the recoverability program is &quot;the Windows pillar of our Secure Future Initiative&quot; framing, not a stand-alone effort [@ms-wri-ignite-2024, @ms-wri-jun-2025].
&lt;h3&gt;Layer 3: Intune-surfaced WinRE state&lt;/h3&gt;
&lt;p&gt;The November 18, 2025 update names a new Intune signal: &quot;Intune will surface when a Windows device has booted into the Windows Recovery Environment (WinRE)&quot; [@ms-wri-ignite-2025]. The same signal will appear in the Azure Portal for Windows Server VMs that switched into WinRE. The same update introduces a WinRE plug-in model: IT administrators can push custom recovery scripts through Intune, with the model documented as third-party-MDM-adoptable. Both are &quot;coming soon&quot; as of that announcement [@ms-wri-ignite-2025].&lt;/p&gt;
&lt;p&gt;The architectural insight here is that &lt;em&gt;Microsoft-pushed remediations&lt;/em&gt; (QMR) and &lt;em&gt;administrator-pushed remediations&lt;/em&gt; (Intune scripts) must be expressible against the same WinRE surface, with Intune providing the visibility and audit layer.&lt;/p&gt;
&lt;h3&gt;Layer 4: Quick Machine Recovery&lt;/h3&gt;
&lt;p&gt;Already covered in Section 6. Status: GA August 2025 on Windows 11 24H2 build 26100.4700+ [@ms-qmr, @ms-wri-ignite-2025]. Autopatch QMR management is in preview at the November 2025 announcement [@ms-wri-ignite-2025].&lt;/p&gt;
&lt;h3&gt;Layer 5: Rebuild without shipping hardware&lt;/h3&gt;
&lt;p&gt;The November 18, 2025 update introduces three Microsoft-cloud-side recovery actions [@ms-wri-ignite-2025]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Point-in-Time Restore (PITR).&lt;/strong&gt; Cloud-orchestrated rollback to an earlier point-in-time snapshot of the device&apos;s full state. Status: available in the Windows Insider preview build the week of the announcement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud Rebuild.&lt;/strong&gt; Intune-portal-triggered clean OS reimage using Autopilot for zero-touch provisioning, with user data and settings restored from OneDrive and Windows Backup for Organizations. Status: coming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 365 Reserve.&lt;/strong&gt; A temporary Cloud PC for users whose endpoint is unusable. Status: generally available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these targets a scenario QMR cannot fix. PITR addresses regressions that the user-mode WU pipeline cannot patch back -- driver downgrades that need to roll back state, not push a new patch. Cloud Rebuild addresses devices whose local Windows is genuinely beyond surgical repair. Windows 365 Reserve addresses the productivity gap while the local device is being recovered.&lt;/p&gt;
&lt;p&gt;All five layers are anchored on Microsoft blogs and Microsoft Learn pages. None of them is unique to Microsoft. Apple, ChromeOS, and the Linux atomic distributions have each chosen a different layered architecture for the same problem. What does the field actually look like?&lt;/p&gt;
&lt;h2&gt;8. Competing Models: Apple, ChromeOS, and the Linux Atomic Distributions&lt;/h2&gt;
&lt;p&gt;Microsoft is not the first vendor to treat recovery as part of its security architecture. It is, at consumer scale, among the last. Apple, Google, and the Linux atomic-distribution community each picked a different layer to anchor on.&lt;/p&gt;
&lt;h3&gt;Apple macOS: Signed System Volume + paired/fallback recoveryOS + 1TR&lt;/h3&gt;
&lt;p&gt;macOS 10.15 (Catalina, 2019) introduced the read-only system volume. macOS 11 (Big Sur, 2020) added the &lt;em&gt;Signed System Volume&lt;/em&gt; on top of it: a SHA-256 Merkle tree over every block of the system volume, sealed by Apple at install or update time [@apple-ssv]. On Apple Silicon, the bootloader verifies the seal before transferring control to the kernel; on Intel-based Macs with the T2 Security Chip, the bootloader forwards the measurement and signature to the kernel, which verifies the seal directly before mounting the root file system [@apple-ssv]. On verification failure, the Mac drops into recoveryOS automatically and prompts the user to reinstall.&lt;/p&gt;
&lt;p&gt;The recovery side has three flavours [@apple-boot]: a &lt;em&gt;paired recoveryOS&lt;/em&gt; that exactly matches the installed system version; on Apple Silicon, a &lt;em&gt;fallback recoveryOS&lt;/em&gt; (the previous OS version); and a hardware-anchored &lt;em&gt;1TR&lt;/em&gt; (&quot;one true recovery&quot;) environment that survives even when the paired recoveryOS is broken. The 1TR environment is anchored in the Secure Enclave, which is the macOS analogue of Windows&apos;s signed &lt;code&gt;bootmgfw.efi&lt;/code&gt; on the EFI System Partition.&lt;/p&gt;
&lt;p&gt;What Apple excels at is &lt;em&gt;tampered&lt;/em&gt; system files and &lt;em&gt;failed&lt;/em&gt; updates: the first block read fails Merkle verification; the snapshot pointer flips to the prior good snapshot; the user reboots into a working system. What Apple does &lt;em&gt;not&lt;/em&gt; have is an analogue of QMR&apos;s targeted remediation pipeline. The macOS answer to a faulty signed third-party security agent is &quot;reinstall macOS&quot;. That is wipe-and-reload, not surgical repair.&lt;/p&gt;
&lt;h3&gt;ChromeOS: Verified Boot + A/B root partitions + auto-rollback&lt;/h3&gt;
&lt;p&gt;ChromeOS&apos;s verified-boot design has been the same since 2010 [@chromium-verified-boot]. A read-only boot stub, anchored in write-protected EEPROM, computes a cryptographic hash of the read-write firmware (SHA-1 in the original 2010 specification; SHA-256 in current production firmware) and verifies an RSA signature (at least 2048 bits) against a permanently stored public key [@chromium-verified-boot]. The verified read-write firmware then hashes the kernel and verifies its signed hashes. A transparent block device in the kernel verifies each block against a stored hash tree on every read, with the tree&apos;s root signed by the firmware.&lt;/p&gt;
&lt;p&gt;The recovery story is the brilliant part. ChromeOS devices have two root partitions, &lt;em&gt;ROOT-A&lt;/em&gt; and &lt;em&gt;ROOT-B&lt;/em&gt;, plus a separate stateful partition for user data [@chromium-autoupdate]. Each root partition carries a &lt;code&gt;remaining_attempts&lt;/code&gt; counter (default 6) stored in unused GPT bits next to the bootable flag. On N consecutive failed boots, the boot loader falls back to the &lt;em&gt;other&lt;/em&gt; partition. Auto-updates always write to the partition not currently in use, never the booted one. The result is that ChromeOS recovers from a faulty signed system update in &lt;em&gt;one reboot&lt;/em&gt; per device, automatically, without an operator action. This is the empirical upper bound on automation: no fielded platform recovers a signed-but-faulty boot path faster than one reboot.&lt;/p&gt;
&lt;h3&gt;Linux atomic distributions: OSTree, rpm-ostree, bootc&lt;/h3&gt;
&lt;p&gt;OSTree, the upstream of Fedora&apos;s atomic desktops and CoreOS, is &quot;Git for operating system binaries&quot; [@fedora-silverblue]. It stores content-addressed objects under &lt;code&gt;/ostree/repo&lt;/code&gt;, builds atomic &lt;em&gt;deployments&lt;/em&gt; as hardlink farms under &lt;code&gt;/boot/loader/entries/ostree-$stateroot-$checksum.$serial.conf&lt;/code&gt;, performs a three-way merge of &lt;code&gt;/etc&lt;/code&gt; between the booted deployment and the new one, and atomically swaps the boot directory by flipping a symlink between &lt;code&gt;/ostree/boot.0&lt;/code&gt; and &lt;code&gt;/ostree/boot.1&lt;/code&gt; [@ostree-atomic]. The crash-safe guarantee is verbatim: &quot;if the system crashes or you pull the power, you will have either the old system, or the new one&quot; [@ostree-atomic].&lt;/p&gt;
&lt;p&gt;Fedora Silverblue, Fedora CoreOS, Endless OS, and (since 2024) Fedora&apos;s bootc container-based desktops all ship OSTree by default [@fedora-silverblue]. Where OSTree excels is server fleets and developer workstations; where it struggles is layered third-party packages crossing deployments (the rebase/deploy friction) and the absence of a network-reachable in-recovery remediation analogue to QMR.&lt;/p&gt;
&lt;h3&gt;Traditional Linux: dracut + GRUB rescue + initramfs&lt;/h3&gt;
&lt;p&gt;The &quot;manual safe-mode + delete-the-file&quot; model. A skilled operator with shell access plus iLO / iDRAC / IPMI serial-over-LAN can repair a Linux box; everyone else is in trouble. The CrowdStrike-style incident response on traditional Linux would look exactly the same as it did on Windows: per-device, skilled operator, no automation. The Linux distributions that &lt;em&gt;did&lt;/em&gt; avoid this fate are the OSTree-based atomic ones; the conventional ones are at the same operator-bound floor Windows just climbed off.&lt;/p&gt;

flowchart TB
    subgraph WIN[Windows: WinRE + QMR]
      WIN_WIM[winre.wim on recovery partition or in OS-volume folder] --&amp;gt; WIN_WU[Windows Update endpoint]
    end
    subgraph APL[Apple: macOS]
      APL_PR[Paired recoveryOS] --&amp;gt; APL_SNAP[APFS snapshot revert]
      APL_FB[Fallback recoveryOS / 1TR in Secure Enclave] --&amp;gt; APL_SNAP
    end
    subgraph CHR[ChromeOS]
      CHR_BOOTA[ROOT-A] --&amp;gt; CHR_FALLBACK[Boot loader falls back to other root]
      CHR_BOOTB[ROOT-B] --&amp;gt; CHR_FALLBACK
    end
    subgraph OS[Linux atomic / OSTree]
      OS_DEPNEW[New deployment] --&amp;gt; OS_PRIOR[Prior deployment retained for rollback]
    end
&lt;h3&gt;A head-to-head comparison&lt;/h3&gt;
&lt;p&gt;The dimensions that matter are: year shipped, in-recovery network capability, auto-remediation, signed-but-faulty-driver protection, per-device operator cost during a fleet event, trust floor, and encrypted-volume recovery story.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Windows WinRE + QMR&lt;/th&gt;
&lt;th&gt;Apple SSV + recoveryOS&lt;/th&gt;
&lt;th&gt;ChromeOS A/B + verified boot&lt;/th&gt;
&lt;th&gt;Linux atomic (OSTree)&lt;/th&gt;
&lt;th&gt;Conventional Linux&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Year shipped&lt;/td&gt;
&lt;td&gt;WinRE 2007 [@wiki-winre]; QMR 2025 [@ms-qmr]&lt;/td&gt;
&lt;td&gt;SSV 2020; recoveryOS / 1TR 2020 [@apple-ssv, @apple-boot]&lt;/td&gt;
&lt;td&gt;Verified Boot 2010 [@chromium-verified-boot]&lt;/td&gt;
&lt;td&gt;OSTree 2012 (dev started 2011); rpm-ostree later [@ostree-atomic, @fedora-silverblue]&lt;/td&gt;
&lt;td&gt;dracut 2009; GRUB 2 2009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-recovery network capability&lt;/td&gt;
&lt;td&gt;Yes (WPA/WPA2 Wi-Fi or wired) [@ms-qmr]&lt;/td&gt;
&lt;td&gt;Yes for reinstall; no targeted remediation&lt;/td&gt;
&lt;td&gt;Yes for recovery image fetch&lt;/td&gt;
&lt;td&gt;No standard pipeline&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-remediation without operator&lt;/td&gt;
&lt;td&gt;Yes (one-time or looped) [@ms-qmr]&lt;/td&gt;
&lt;td&gt;No (user confirms reinstall)&lt;/td&gt;
&lt;td&gt;Yes (boot loader fallback) [@chromium-autoupdate]&lt;/td&gt;
&lt;td&gt;No (user selects rollback in GRUB)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protection against signed-but-faulty drivers&lt;/td&gt;
&lt;td&gt;Behavioural via MVI 3.0 SDP + user-mode AV [@ms-mvi, @ms-wri-jun-2025]&lt;/td&gt;
&lt;td&gt;DriverKit / System Extensions push third parties out of kernel&lt;/td&gt;
&lt;td&gt;A/B rollback auto-recovers in one boot cycle&lt;/td&gt;
&lt;td&gt;Layered package rolls back with deployment&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-device operator cost in a fleet event&lt;/td&gt;
&lt;td&gt;O(1) -- publish remediation once&lt;/td&gt;
&lt;td&gt;O(N) -- each user reinstalls&lt;/td&gt;
&lt;td&gt;O(0) -- automatic per device&lt;/td&gt;
&lt;td&gt;O(N) -- each user selects rollback&lt;/td&gt;
&lt;td&gt;O(N) -- skilled operator per device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust floor (unrecoverable without external media)&lt;/td&gt;
&lt;td&gt;Corrupted &lt;code&gt;bootmgfw.efi&lt;/code&gt;, missing WinRE, lost BitLocker key&lt;/td&gt;
&lt;td&gt;Failed 1TR (very rare)&lt;/td&gt;
&lt;td&gt;Both root partitions plus EEPROM corrupted&lt;/td&gt;
&lt;td&gt;GRUB unreachable&lt;/td&gt;
&lt;td&gt;GRUB unreachable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypted-volume recovery story&lt;/td&gt;
&lt;td&gt;BitLocker recovery key required [@ms-qmr]&lt;/td&gt;
&lt;td&gt;FileVault key required if at-rest read needed&lt;/td&gt;
&lt;td&gt;Stateful partition holds user data only&lt;/td&gt;
&lt;td&gt;LUKS passphrase required&lt;/td&gt;
&lt;td&gt;LUKS passphrase required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The notable row is the &lt;em&gt;per-device operator cost during a fleet event&lt;/em&gt;. QMR moves Windows from O(N) (pre-WRI) to O(1) (post-WRI). ChromeOS was already at O(0) thanks to the A/B rollback. Apple, conventional Linux, and OSTree-based Linux remain at O(N).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; The per-device operator cost row is the one Microsoft engineered WRI to change. QMR moves Windows from O(N) to O(1). ChromeOS was already at O(0) by virtue of A/B rollback. Apple, conventional Linux, and OSTree-based Linux remain at O(N). This is the empirical justification for the thesis that resilience is a security property: pre-WRI Windows, despite shipping BitLocker, &lt;a href=&quot;https://paragmali.com/blog/wdac--hvci-code-integrity-at-every-layer-in-windows/&quot; rel=&quot;noopener&quot;&gt;HVCI&lt;/a&gt;, and Secure Boot, had a &lt;em&gt;recoverability complexity class&lt;/em&gt; worse than ChromeOS. A faulty signed driver could exploit that gap to deny service at fleet scale.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Three vendors got to fleet-scale recovery earlier. Microsoft&apos;s catch-up move is constrained by what Microsoft does not control: OEM partition layouts, BIOS/UEFI variance, BitLocker key escrow.Apple ships hardware-plus-OS and Google ships ChromeOS against an OEM-certified hardware spec, both of which let those vendors specify partition layout end to end. Microsoft ships the OS and asks OEMs to follow the Image Configuration Designer defaults; some do, some do not. The KB5028997 workaround for &quot;recovery partition too small for new winre.wim&quot; is precisely the artefact of Microsoft &lt;em&gt;not&lt;/em&gt; being able to mandate the layout [@ms-winre-tech-ref, @ms-kb5028997]. Those constraints set hard limits on what WRI can fix, and they are the reason the trust-floor row in the table is longer for Windows than for ChromeOS.&lt;/p&gt;
&lt;h2&gt;9. Theoretical Limits and the BitUnlocker Counter-Current&lt;/h2&gt;
&lt;p&gt;Two well-known results from the systems and security literature say that no fielded recovery primitive can be perfect, and Microsoft&apos;s own offensive-research team demonstrated, at Black Hat USA 2025 in August 2025, exactly which limit WRI runs into [@alon-leviev].&lt;/p&gt;
&lt;h3&gt;The trust-floor lower bound&lt;/h3&gt;
&lt;p&gt;No system can recover from corruption of &lt;em&gt;all&lt;/em&gt; of its boot-path code without external media, because the verification step that detects corruption is itself part of the boot-path code. ChromeOS encodes this with a write-protected EEPROM that an attacker cannot rewrite without a hardware write-protect override [@chromium-verified-boot]; Apple encodes it with the 1TR environment anchored in the Secure Enclave [@apple-boot]; Windows encodes it by requiring the EFI System Partition plus a signed &lt;code&gt;bootmgfw.efi&lt;/code&gt;. Below that floor, QMR, OSTree, and APFS snapshots are all helpless. The recovery surface bounded by what fits in write-protected non-volatile storage is the lower bound on automated recovery.&lt;/p&gt;
&lt;h3&gt;The end-to-end argument applied to recovery&lt;/h3&gt;
&lt;p&gt;Saltzer, Reed, and Clark&apos;s 1984 &lt;em&gt;End-to-End Arguments in System Design&lt;/em&gt; [@saltzer-reed-clark-1984] argued that correctness checks belong at the endpoints of a communication system, not in intermediate nodes. Applied to update pipelines, the argument predicts that &lt;em&gt;bug-free updates cannot be guaranteed by intermediate nodes&lt;/em&gt; (the vendor&apos;s QA fleet, the CDN, the Windows Update service). Correctness can only be observed at the endpoint. The corollary is that the probability of a faulty update reaching production cannot be driven to zero by any amount of pre-release testing; the platform&apos;s design must instead bound &lt;em&gt;blast radius&lt;/em&gt; and &lt;em&gt;time-to-recovery&lt;/em&gt; of the faulty updates that will inevitably ship. MVI 3.0&apos;s SDP bounds the first (deployment rings); QMR bounds the second (network-reachable remediation). The argument is identical to the canary / progressive-rollout pattern in Google&apos;s SRE Book Release Engineering chapter [@sre-release-eng].&lt;/p&gt;
&lt;h3&gt;The attack-surface trade-off&lt;/h3&gt;
&lt;p&gt;An auto-unlocking, network-reachable recovery environment expands the Trusted Computing Base. Every additional capability added to the recovery path is a new code path; a new code path is a new attack vector. The BitUnlocker research, by Netanel Ben Simon and Alon Leviev at Microsoft&apos;s Security Testing and Offensive Research (STORM) team [@alon-leviev, @ms-bitunlocker-blog], is the most pointed evidence we have that the trade-off is real.&lt;/p&gt;

STORM -- Security Testing and Offensive Research at Microsoft -- is the internal red team. Their job is to break Microsoft products before someone else does. BitUnlocker was first presented at Black Hat USA 2025 and DEF CON 33, both in August 2025; the four CVEs were patched in the July 8, 2025 cumulative update, ahead of the disclosure [@alon-leviev, @ms-bitunlocker-blog]. The patches landed one Patch Tuesday cycle before QMR went generally available [@ms-wri-ignite-2025]. In the same summer, the same vendor that made WinRE reachable from Windows Update made WinRE harder to abuse.

The set of hardware, firmware, and software components on which a system&apos;s security policy ultimately depends. A bug in a TCB component can undermine the entire security policy; everything outside the TCB is, by definition, untrusted relative to it. Recovery environments expand the TCB because they need privileged access to encrypted user state.
&lt;p&gt;The four BitUnlocker CVEs are all rated CVSS 6.8:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-48804&lt;/strong&gt; [@ms-bitunlocker-blog] -- BitLocker Security Feature Bypass via &lt;code&gt;boot.sdi&lt;/code&gt; parsing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-48003&lt;/strong&gt; [@ms-bitunlocker-blog] -- BitLocker Security Feature Bypass via &lt;code&gt;SetupPlatform.exe&lt;/code&gt; / Shift+F10 abuse during the WinRE Apps Scheduled Operation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-48800&lt;/strong&gt; [@ms-bitunlocker-blog] -- BitLocker Security Feature Bypass via &lt;code&gt;tttracer.exe&lt;/code&gt; abuse during Offline Scanning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CVE-2025-48818&lt;/strong&gt; [@ms-bitunlocker-blog] -- BitLocker Security Feature Bypass via BCD parsing in the Online PBR exploit chain; the fourth pillar of the chain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The published Microsoft Security blog post on BitUnlocker enumerates the architectural attack surfaces verbatim under three section headings: &lt;em&gt;Attacking Boot.sdi Parsing&lt;/em&gt;, &lt;em&gt;Attacking ReAgent.xml Parsing&lt;/em&gt;, and &lt;em&gt;Attacking Boot Configuration Data (BCD) Parsing&lt;/em&gt; [@ms-bitunlocker-blog]. The premise is the same in every case. WinRE must read the OS volume&apos;s BitLocker recovery material to perform repairs. Therefore WinRE has code paths that, given the right inputs, can obtain the decrypted Full Volume Encryption Key. The four CVEs each find a parser or debugger inside WinRE whose input handling can be steered by an attacker with brief physical access to flip the recovery flow into a state where the decrypted FVEK becomes reachable.&lt;/p&gt;

flowchart TD
    PA[Physical access foothold] --&amp;gt; SDI[Attacking boot.sdi parsing -- CVE-2025-48804]
    PA --&amp;gt; RA[Attacking ReAgent.xml / SetupPlatform.exe -- CVE-2025-48003]
    PA --&amp;gt; BCD[Attacking BCD parsing / Online PBR -- CVE-2025-48818]
    PA --&amp;gt; TT[Abusing tttracer.exe Offline Scanning -- CVE-2025-48800]
    SDI --&amp;gt; FVEK[Reach decrypted FVEK on OS volume]
    RA --&amp;gt; FVEK
    BCD --&amp;gt; FVEK
    TT --&amp;gt; FVEK
    FVEK --&amp;gt; EX[BitLocker bypass; data exfiltration]
&lt;h3&gt;The encrypted-volume impossibility&lt;/h3&gt;
&lt;p&gt;Unattended recovery of an encrypted volume &lt;em&gt;without the key&lt;/em&gt; is impossible. It is a security correctness requirement, not a limitation that engineering can fix. QMR explicitly does not bypass BitLocker [@ms-qmr]. Apple&apos;s FileVault, ChromeOS&apos;s TPM-bound user partition, and Linux LUKS all share this property; none of them gets to be exempt from the requirement that the key be present somewhere before the encrypted volume can be modified offline.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Every additional capability added to the recovery path is an additional attack vector against the encrypted user state that the recovery path is privileged to access. QMR&apos;s network reachability is a feature for the operator and a feature for the attacker. The article&apos;s thesis is not &lt;em&gt;WRI makes Windows safer in absolute terms&lt;/em&gt;; it is &lt;em&gt;WRI moves the trade-off to a different curve&lt;/em&gt;. The same vendor making the recovery surface reachable from Windows Update is the vendor that has to harden it against itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;The upper bound&lt;/h3&gt;
&lt;p&gt;ChromeOS A/B auto-rollback recovers a single device in one reboot cycle without operator action [@chromium-autoupdate]. This is the empirical upper bound on automation. No fielded platform recovers a signed-but-faulty boot path faster than one reboot per device. QMR matches the ChromeOS upper bound in the steady state once a remediation is published; the only thing QMR cannot do that ChromeOS does is recover from the &lt;em&gt;first&lt;/em&gt; signed-but-faulty update before Microsoft has authored the remediation. The lower bound on time-to-fleet-recovery is set by the production lead time of Microsoft&apos;s own QA pipeline plus the time to author and publish the targeted patch.&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s own offensive-research team published the BitUnlocker chain one Patch Tuesday before QMR went generally available. That is not a coincidence; it is the price of moving WinRE up the trust ladder. The next question -- what has not been priced yet? -- belongs in the open-problems list.&lt;/p&gt;
&lt;h2&gt;10. Open Problems: Where Microsoft Has Not Committed&lt;/h2&gt;
&lt;p&gt;WRI is a current commitment with a published roadmap. The roadmap has explicit holes. Each of the six below is documented from a primary Microsoft source -- either by what the source &lt;em&gt;says&lt;/em&gt; or, in the most honest cases, by what it &lt;em&gt;does not say&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network protocol surface in WinRE.&lt;/strong&gt; The Microsoft Learn QMR page is explicit: only wired Ethernet and WPA/WPA2 password-based Wi-Fi are supported as of November 2025 [@ms-qmr]. Enterprise 802.1X and WPA3-Enterprise with device certificates are committed in the November 18, 2025 update as &lt;em&gt;coming soon&lt;/em&gt; under the &lt;em&gt;Wi-Fi 7 for Enterprise&lt;/em&gt; and WinRE-reads-from-Windows lines, but no shipping date is published [@ms-wri-ignite-2025]. For an enterprise on 802.1X, this is the most visible gap: a managed-fleet device on a corporate SSID cannot reach Windows Update from inside WinRE today.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Safe-mode hardening as a discrete deliverable.&lt;/strong&gt; The phrase &quot;safe mode hardening&quot; has no first-party Microsoft anchor as a discrete WRI deliverable. The closest documented item is &lt;a href=&quot;https://paragmali.com/blog/adminless-how-windows-finally-made-elevation-a-security-boun/&quot; rel=&quot;noopener&quot;&gt;&lt;em&gt;Administrator Protection&lt;/em&gt;&lt;/a&gt;, announced in the November 19, 2024 Ignite blog as a constraint on elevated-context behaviour [@ms-wri-ignite-2024]. That is not the same thing. The Safe Mode boot path that the CrowdStrike incident used to delete &lt;code&gt;C-00000291*.sys&lt;/code&gt; was the &lt;em&gt;same&lt;/em&gt; Safe Mode boot path that has existed since Windows NT; nothing in the WRI primary sources commits to changing what Safe Mode does or does not load. Honest reading: WRI re-prices the recovery surface around Safe Mode; it does not (yet) change Safe Mode itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cross-vendor partition layout.&lt;/strong&gt; The Microsoft Learn WinRE Technical Reference [@ms-winre-tech-ref] documents the recommended ICD-media layout but does not enforce it. Clean Windows Setup, OEM-installed Windows, and ICD-media-installed Windows produce different recovery-partition layouts, and the existence of KB5028997 (the well-known workaround for &quot;recovery partition too small for the new &lt;code&gt;winre.wim&lt;/code&gt;&quot;) is a direct consequence. ChromeOS and macOS do not have this problem because Google and Apple control the layout end to end. Microsoft chose, decades ago, not to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third-party MDM support for the WinRE plug-in model.&lt;/strong&gt; The November 18, 2025 update describes the WinRE plug-in model as third-party-MDM-adoptable, but no third-party MDM vendor had shipped a plug-in or a QMR management surface as of that announcement [@ms-wri-ignite-2025]. Customers on JAMF, Workspace ONE, Tanium, or similar do not yet have a documented integration path. If the future of recovery is Intune-coupled, WRI&apos;s reach is bounded by Intune adoption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BitLocker key escrow as a WRI deliverable.&lt;/strong&gt; No WRI primary source ([@ms-wri-ignite-2024, @ms-wri-jun-2025, @ms-wri-ignite-2025]) names &quot;BitLocker recovery key flows&quot; as a discrete WRI deliverable. The adjacent items are: &lt;em&gt;hardware-accelerated BitLocker&lt;/em&gt; on new devices starting spring 2026 [@ms-wri-ignite-2025]; the BitUnlocker CVE patches in July 2025 [@ms-bitunlocker-blog]; and the Entra ID self-service BitLocker recovery flow at &lt;code&gt;aka.ms/aadrecoverykey&lt;/code&gt; [@ms-kb5042421]. The current state is that BitLocker key escrow is an Entra ID and Intune feature, not a WRI feature. QMR&apos;s value is bounded by BitLocker key availability for the encrypted-volume fraction of any fleet; a WRI deliverable that improved key escrow would compound QMR&apos;s benefit. None has been announced.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recovery in air-gapped and sovereign environments.&lt;/strong&gt; QMR routes through Windows Update. Air-gapped fleets, sovereign-cloud customers, and offline manufacturing networks cannot reach Windows Update from WinRE. The November 18, 2025 update mentions Connected Cache, but no QMR-Connected-Cache integration is committed [@ms-wri-ignite-2025]. For the high-assurance customer who today does not let manufacturing endpoints talk to the public Internet at all, QMR is a feature for someone else.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The six items above are gaps in the &lt;em&gt;roadmap&lt;/em&gt;, anchored either by what Microsoft has explicitly named as coming-soon or by the absence of a primary source. They are not features. The article distinguishes Microsoft-committed deliverables (cited to a primary source) from adjacent inferences. Readers reviewing WRI for their own fleets should do the same.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;These six gaps are where the next year of WRI roadmap will be argued. None of them is closed; some are closed-soon. For the practitioner, the immediate question is what to do, today, with what is shipping right now.&lt;/p&gt;
&lt;h2&gt;11. Practitioner&apos;s Guide&lt;/h2&gt;
&lt;p&gt;Everything above is architecture. This section is the checklist.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Verify WinRE is provisioned.&lt;/strong&gt; Run &lt;code&gt;reagentc /info&lt;/code&gt; from an elevated prompt. The output should say &lt;code&gt;Windows RE status: Enabled&lt;/code&gt; and point at a sensible WinRE location -- typically &lt;code&gt;\?\GLOBALROOT\device\harddisk0\partitionN\Recovery\WindowsRE&lt;/code&gt; or &lt;code&gt;C:\Windows\System32\Recovery\WindowsRE&lt;/code&gt;. If the status is &lt;code&gt;Disabled&lt;/code&gt;, run &lt;code&gt;reagentc /enable&lt;/code&gt;. If the recovery partition is too small for a new &lt;code&gt;winre.wim&lt;/code&gt; (a known issue surfacing with cumulative updates that grow the image, surfaced as a System event ID 4502 with &lt;code&gt;ErrorPhase 2&lt;/code&gt;), follow KB5028997 [@ms-kb5028997, @ms-winre-tech-ref].&lt;/p&gt;

The mitigation, in outline: disable WinRE temporarily (`reagentc /disable`); shrink the OS partition via `diskpart` by enough megabytes (250 MB minimum per Microsoft&apos;s published procedure) to host a larger recovery partition; recreate the recovery partition with the GPT Type ID `DE94BBA4-06D1-4D40-A16A-BFD50179D6AC` and the GPT attributes value `0x8000000000000001` that hides it from automounting; re-enable WinRE (`reagentc /enable`) so the new `winre.wim` is copied into the resized partition. The Microsoft Support KB article carries the exact `diskpart` commands [@ms-kb5028997], with the Windows RE Technical Reference as the architectural anchor [@ms-winre-tech-ref]. Test on a representative device first; the resize is not reversible without re-imaging.
&lt;p&gt;&lt;strong&gt;2. Audit your QMR posture before turning it on.&lt;/strong&gt; On Enterprise, Education, and managed Pro, cloud remediation is &lt;em&gt;off&lt;/em&gt; by default [@ms-qmr]. Decide first; ring second; roll out third. The Intune Settings Catalog path is &lt;em&gt;Remote Remediation &amp;gt; Enable Cloud Remediation&lt;/em&gt;. Pre-stage a WPA/WPA2 Wi-Fi credential via &lt;code&gt;reagentc.exe /SetRecoverySettings&lt;/code&gt; if your recovery network is wireless.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Use the test-mode dry run.&lt;/strong&gt; &lt;code&gt;reagentc.exe /SetRecoveryTestmode&lt;/code&gt; followed by &lt;code&gt;reagentc.exe /BootToRe&lt;/code&gt; triggers a &lt;em&gt;simulated&lt;/em&gt; QMR cycle. The simulated remediation appears in Settings &amp;gt; Windows Update &amp;gt; Update history rather than mutating the production OS. Run it on a pilot ring before depending on QMR in a real incident [@ms-qmr].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Plan for BitLocker key availability.&lt;/strong&gt; Ensure recovery keys are escrowed to Entra ID, not just printed on a card in a drawer. Enable the Entra ID self-service flow at &lt;code&gt;aka.ms/aadrecoverykey&lt;/code&gt; so an unattended user can retrieve their own key during an incident [@ms-kb5042421].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Know the difference between Cloud Reset, QMR, and Autopilot Reset.&lt;/strong&gt; Cloud Reset (in-Windows &lt;em&gt;Reset this PC &amp;gt; Cloud download&lt;/em&gt;) reinstalls a running OS [@ms-pbr-overview]. QMR runs in WinRE &lt;em&gt;before&lt;/em&gt; the OS boots, applying targeted patches from Windows Update [@ms-qmr]. Autopilot Reset re-provisions a &lt;em&gt;bootable&lt;/em&gt; device via Intune. Three different tools, three different scenarios; do not confuse them in your runbook.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Watch for the November 2025 Intune signals.&lt;/strong&gt; Once Intune surfaces WinRE state in the admin centre, build the muscle of looking for it. The roll-up that tells you &quot;12 devices are in WinRE right now&quot; is the operational primitive Microsoft did not have through July 2024 [@ms-wri-ignite-2025].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Promote step 3 (the test-mode dry run) into your incident-response runbook now [@ms-qmr]. The time to discover that the recovery Wi-Fi SSID changed last quarter is not in the middle of a fleet-down event.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; QMR cannot decrypt the OS volume. It applies Windows Update patches that take effect on the next boot, but it cannot run against an encrypted volume&apos;s contents without the BitLocker recovery key being available [@ms-qmr]. If a device&apos;s BitLocker key is not escrowed to Entra ID and the user is not available to read it from a printout, QMR cannot help. Key escrow is upstream of recovery; treat it that way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;code&gt;reagentc /info&lt;/code&gt; output is short and uniform enough that a small script can classify the device&apos;s WinRE health. The block below sketches one in JavaScript pseudocode.&lt;/p&gt;
&lt;p&gt;{`
// reagentc /info is a small, deterministic text block. Parse it.&lt;/p&gt;
&lt;p&gt;const sampleOutput = `
Windows Recovery Environment (Windows RE) and system reset configuration
Information:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Windows RE status:         Enabled
Windows RE location:       \\\\?\\\\GLOBALROOT\\\\device\\\\harddisk0\\\\partition4\\\\Recovery\\\\WindowsRE
Boot Configuration Data (BCD) identifier: a1b2c3d4-...-winre-guid
Recovery image location:
Recovery image index:      0
Custom image location:
Custom image index:        0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;REAGENTC.EXE: Operation Successful.
`;&lt;/p&gt;
&lt;p&gt;function classify(output) {
  const status = /Windows RE status:\s+(\w+)/.exec(output)?.[1];
  const location = /Windows RE location:\s+(\S+)/.exec(output)?.[1] || &apos;&apos;;
  const partitionMatch = /partition(\d+)\\Recovery\\WindowsRE/.exec(location);
  const onPartition = !!partitionMatch;
  const onOsVolume = /^[A-Z]:\\Recovery\\WindowsRE/.test(location);&lt;/p&gt;
&lt;p&gt;  if (status !== &apos;Enabled&apos;) {
    return { status, action: &apos;reagentc /enable -- WinRE is not active&apos; };
  }
  if (!onPartition &amp;amp;&amp;amp; !onOsVolume) {
    return { status, action: &apos;Unknown layout; verify with diskpart and reagentc&apos; };
  }
  if (onPartition) {
    return {
      status,
      layout: &apos;recovery-partition&apos;,
      partition: partitionMatch[1],
      note: &apos;If cumulative updates fail with insufficient-space errors, see KB5028997&apos;,
    };
  }
  return { status, layout: &apos;os-volume-recovery-folder&apos;, note: &apos;OEM-style layout; some Intune&apos; +
    &apos; policies assume a separate partition. Confirm before relying on remote remediation.&apos; };
}&lt;/p&gt;
&lt;p&gt;console.log(classify(sampleOutput));
`}&lt;/p&gt;
&lt;p&gt;The practical questions answered, the article closes with a set of FAQs that catch the common misconceptions.&lt;/p&gt;
&lt;h2&gt;12. Frequently Asked Questions and Closing Thoughts&lt;/h2&gt;


No. WRI&apos;s *Windows endpoint security platform* gives MVI partners a user-mode runtime so their detection logic does not have to live in a kernel-mode `.sys` file [@ms-wri-jun-2025, @ms-wri-ignite-2025]. Kernel-mode drivers as a class are not retired: the November 18, 2025 update is explicit that &quot;graphics drivers, for example, will continue to run in kernel mode for performance reasons&quot; [@ms-wri-ignite-2025], and the driver-resiliency playbook (compiler safeguards, driver isolation, DMA-remapping, higher signing bar) is precisely for the kernel-mode surface that will remain.


No. The Microsoft Learn QMR page is explicit that the recovery flow does not decrypt the OS volume [@ms-qmr]. If the BitLocker recovery key is unavailable, QMR cannot help. The recommended escrow path is Entra ID, with the user-facing self-service flow at `aka.ms/aadrecoverykey` [@ms-kb5042421].


No. The BCD Boot Options Reference enumerates every legal element on a boot entry, and there is no `/recovery` flag on `winload.efi` or `winload.exe` [@ms-bcd]. WinRE is selected by following the `recoverysequence` element of the OS-loader entry to a separate BCD entry whose `winpe` is `Yes` and whose `osdevice` mounts `winre.wim` from a `boot.sdi`-backed RAM disk. The entire handoff is inside the boot manager, before `winload.efi` runs.


No. The four CVE-2025-48800/-48003/-48804/-48818 advisories were patched in the July 8, 2025 cumulative update before QMR went generally available in August 2025 [@ms-bitunlocker-blog, @ms-wri-ignite-2025]. The patches addressed parser and debugger code paths inside WinRE; they did not remove WinRE&apos;s ability to read the OS volume&apos;s BitLocker recovery material, which is a feature WinRE needs in order to perform any repair on an encrypted volume.


No. The Secure Future Initiative (SFI), announced in November 2023, is Microsoft&apos;s company-wide security program. WRI is the Windows-specific workstream inside SFI that owns Windows availability, kernel resilience, and the recovery surface; the published WRI blogs frame it as the Windows pillar of SFI rather than a stand-alone effort [@ms-wri-ignite-2024, @ms-wri-jun-2025].


QMR will not connect. The Microsoft Learn page is explicit that only wired Ethernet and WPA/WPA2 password-based Wi-Fi are supported [@ms-qmr]. The November 18, 2025 update commits to WPA3-Enterprise with device certificates as part of the WinRE-reads-from-Windows networking work and the *Wi-Fi 7 for Enterprise* line, but it does not give a shipping date [@ms-wri-ignite-2025]. For now, enterprises whose recovery story depends on QMR over Wi-Fi must either stand up a dedicated WPA2-PSK recovery SSID or rely on wired recovery.


The code is mostly the same. What changed is the *policy* that lets WinRE call Windows Update without an operator at the keyboard. WinPE has shipped networking drivers since 2002 [@ms-winpe-intro], and `winre.wim` has been bootable from a recovery partition since 2009. The breakthrough is the commitment that the recovery environment is allowed to phone home -- and the surrounding program (MVI 3.0, the user-mode AV platform, Intune visibility) that makes it usable as a fleet-scale primitive.

&lt;h3&gt;Closing&lt;/h3&gt;
&lt;p&gt;The Windows Recovery Environment that worked perfectly on July 19, 2024 is the same Windows Recovery Environment that became Microsoft&apos;s most important security surface on August 1, 2025. The architecture did not change in the year between. The question we ask of it did.&lt;/p&gt;
&lt;p&gt;The CrowdStrike incident did not invent the case for resilience as a security property. It priced it. Two months after the bug check signature &lt;code&gt;csagent+0xe14ed&lt;/code&gt; made the rounds, Microsoft and the MVI cohort sat down at WESES to argue out what would become MVI 3.0 [@ms-weses]. Three months after that, the Ignite 2024 keynote committed to Quick Machine Recovery and to a user-mode antimalware platform [@ms-wri-ignite-2024]. Five months after &lt;em&gt;that&lt;/em&gt;, the first QMR code shipped on the Beta Channel [@ms-qmr-insider-mar2025]. Twelve months after the incident, MVI 3.0 was binding [@ms-wri-ignite-2025]. Thirteen months after, QMR went generally available -- and BitUnlocker had been patched a month earlier in the July 2025 cumulative update. Sixteen months after, Microsoft published the rebuild-without-shipping-hardware roadmap [@ms-wri-ignite-2025].&lt;/p&gt;
&lt;p&gt;WRI does not eliminate the trade-off between recoverability and attack surface. It moves the trade-off to a curve where the per-device cost of a fleet-down event is not bounded by human attention, and where the recovery code path is hardened by the same vendor&apos;s offensive-research team. Those are different curves than the ones the platform was on in July 2024. They are not the curves a textbook chapter on Windows internals would have predicted in 2014. They are also still the curves of a single vendor&apos;s program, anchored on a small number of blog posts and Microsoft Learn pages, and the work of validating them belongs in every fleet that depends on Windows for availability.&lt;/p&gt;
&lt;p&gt;If WinRE worked perfectly on July 19, 2024 and that was the problem, the test of WRI is whether the next &lt;em&gt;July 19, 2026&lt;/em&gt; never makes the news.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;windows-recovery-environment-and-the-post-crowdstrike-resilience-initiative&quot; keyTerms={[
  { term: &quot;WinRE&quot;, definition: &quot;Windows Recovery Environment. A Windows Preinstallation Environment image (winre.wim) that the Windows Boot Manager loads on recovery triggers.&quot; },
  { term: &quot;winre.wim&quot;, definition: &quot;The customised WinPE image that contains the recovery shell, Startup Repair, System Restore (when enabled), and the curated WinPE Optional Components.&quot; },
  { term: &quot;boot.sdi&quot;, definition: &quot;A System Deployment Image file used by bootmgr as a container for the RAM disk into which winre.wim is mounted at boot.&quot; },
  { term: &quot;ReAgentC&quot;, definition: &quot;The in-box management tool for WinRE: /info, /enable, /disable, /setreimage, /boottore, /setbootshelllink, and the WinRE-test-mode subcommands.&quot; },
  { term: &quot;BCD recoverysequence&quot;, definition: &quot;The BCD element on a Windows Boot Loader entry that points at a separate BCD entry containing the WinRE configuration; the mechanism by which the boot manager routes a recovery trigger into WinRE.&quot; },
  { term: &quot;Quick Machine Recovery (QMR)&quot;, definition: &quot;The Windows 11 24H2 feature that lets WinRE acquire network connectivity, query Windows Update for a targeted remediation, apply it, and reboot.&quot; },
  { term: &quot;Windows Resiliency Initiative (WRI)&quot;, definition: &quot;Microsoft&apos;s post-CrowdStrike program for treating recovery as part of the security architecture; comprises QMR, MVI 3.0, the user-mode AV platform, Intune WinRE-state surfacing, Point-in-Time Restore, and Cloud Rebuild.&quot; },
  { term: &quot;MVI 3.0&quot;, definition: &quot;Version 3.0 of the Microsoft Virus Initiative, effective April 1, 2025; requires Trusted Signing, Safe Deployment Practices, NDA, and 12-month independent test-lab certification as preconditions for Windows AV driver signing rights.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>windows</category><category>security</category><category>recovery</category><category>winre</category><category>resilience</category><category>crowdstrike</category><category>bitlocker</category><category>system-internals</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>The TPM in Windows: One Primitive, Twenty-Five Years, and the Chip Microsoft Bet On Twice</title><link>https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/</link><guid isPermaLink="true">https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/</guid><description>How a passive 1999 cryptoprocessor became the load-bearing pillar of Windows security, and what twenty-five years of attacks taught us about its limits.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><content:encoded>
The TPM (1.2 since 2007, 2.0 since 2014) is the hardware root of trust under almost every Windows security feature shipped since Vista -- BitLocker, Measured Boot, Credential Guard, Windows Hello, device attestation. Twenty-five years of engineering refined a single primitive (measure, extend, seal, quote) into something one chip could underwrite. Twenty-five years of attacks (Andzakovic 2019, TPM-Fail 2020, faulTPM 2023) have argued empirically about how passive that chip can be. The current state of the art -- Microsoft Pluton on the CPU die, Microsoft-signed Rust firmware (on 2024 AMD and Intel platforms) delivered via Windows Update -- closes the bus and the TEE attack surfaces, but centralizes firmware trust on Microsoft. Post-quantum migration is the next frontier.
&lt;h2&gt;1. The chip nobody asked for&lt;/h2&gt;
&lt;p&gt;On June 24, 2021, Microsoft announced Windows 11 [@ms-windows-experience-blog-2021] -- and told hundreds of millions of working PCs they were no longer eligible to upgrade. Not because they were too slow. Because they did not have a small chip most users had never thought about: a TPM 2.0. The PR backlash was immediate; the technical rationale was almost invisible. &lt;em&gt;Why was Microsoft willing to take that much heat over a piece of silicon?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The next morning, Microsoft&apos;s security team tried to explain [@ms-security-blog-windows11-2021]. The argument was four words long: hardware root of trust.&lt;/p&gt;

All certified Windows 11 systems will come with a TPM 2.0 chip to help ensure customers benefit from security backed by a hardware root-of-trust.
&lt;p&gt;That sentence sat awkwardly against the user experience: a green checkmark in the PC Health Check tool, or a red X telling you to buy a new computer. The deeper claim -- that a passive cryptoprocessor underwrote the security guarantees of half the operating system -- was not something Microsoft had ever asked consumers to think about. For OEMs, the requirement was old news. Since July 28, 2016 [@ms-learn-oem-tpm], every new Windows device model had been contractually required to &quot;implement and enable by default TPM 2.0.&quot; The 2021 mandate did not introduce the chip. It made an existing OEM rule into a visible install gate.&lt;/p&gt;

A small, isolated cryptoprocessor that holds keys, performs cryptographic operations, and records integrity measurements -- usually on a separate package or block of silicon that the host operating system cannot read directly. The TPM is &quot;passive&quot;: it executes commands sent to it but never reaches into the host&apos;s memory.

The PC Health Check tool was pulled and re-released. Reddit and Hacker News spent a weekend arguing about whether Microsoft had effectively bricked older hardware to sell new licenses. Microsoft&apos;s reply -- that TPM-by-default produces measurable population-level security gains even when individual users do not understand it -- was correct, but never quite the rebuttal that a consumer audience could engage with. The politics of &quot;Trusted Computing&quot; had returned, twenty years after the original Stallman objection [@wikipedia-trusted-computing].
&lt;p&gt;This article is about that piece of silicon: what it does, why Windows needs it more than ever, and why twenty-five years of engineering and twenty-five years of attacks have together produced a chip that quietly defines what modern Windows can defend against -- and what it cannot.&lt;/p&gt;
&lt;p&gt;The central claim, which the rest of this piece will earn: a passive cryptoprocessor designed in 1999 became the load-bearing pillar of half of Windows security, and the history of attacks against it has been a sustained empirical argument about exactly how passive that pillar is allowed to be.&lt;/p&gt;
&lt;h2&gt;2. The problem the TPM was built to solve&lt;/h2&gt;
&lt;p&gt;Picture an engineer at IBM in early 2000. The Windows kernel has just been rooted again. The newly shipped DPAPI master keys -- introduced with Windows 2000&apos;s general availability on February 17, 2000 [@wikipedia-windows-2000] -- are recoverable in seconds once SYSTEM falls. Stolen ThinkPads come back with their fresh EFS volumes already decrypted. Where do you put a secret that the OS cannot read?&lt;/p&gt;
&lt;p&gt;Software-only key storage was Generation 0. Windows had DPAPI, EFS, and LSA secrets [@ms-learn-cryptography-portal], all deriving their wrapping keys from the user&apos;s logon credential or from system-level material. Every derivation had the same structural problem: the unwrapping key, sooner or later, lived in the kernel&apos;s address space. An attacker who reached SYSTEM (or who carried the disk away to a separate machine) could replay it. A volume encrypted &quot;at rest&quot; was decryptable as soon as the disk was readable -- and a disk you can read is a disk you can read offline. Microsoft now states the constraint plainly: a TPM-resident key, by contrast, &quot;truly can&apos;t leave the TPM&quot; [@ms-learn-how-windows-uses-tpm]. That property cannot be retrofitted onto software-only storage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Software-only key storage cannot defend against an attacker who reaches SYSTEM, and cannot defend against an attacker who carries the disk away. To survive both, the secret must live in silicon that the OS itself cannot read.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In October 1999 [@wikipedia-tcg], five PC-industry incumbents took that observation and turned it into an industrial coalition: Compaq, Hewlett-Packard, IBM, Intel, and Microsoft incorporated the Trusted Computing Platform Alliance.The Wikipedia Trusted Computing Group article gives the day-precision date as October 11, 1999. The original TCPA press release URL has not survived; the founder list and date are consistent across secondary sources. TCPA&apos;s charter was narrow: define a chip that could hold keys an x86 OS could not export, record boot-time integrity measurements, and sign attestations about that boot. The first chip to ship against the resulting TPM Main Specification 1.1b [@tcg-tpm-main-spec] appeared in 2003 [@wikipedia-tpm]. Atmel, Infineon, and STMicroelectronics built it [@wikipedia-tpm].&lt;/p&gt;
&lt;p&gt;In parallel, Microsoft Research ran its own bet. Paul England, Butler Lampson, John Manferdelli, Marcus Peinado, and Bryan Willman [@england-2003-trusted-open-platform] published &quot;A Trusted Open Platform&quot; in &lt;em&gt;IEEE Computer&lt;/em&gt;, July 2003. The codename inside Microsoft was Palladium; the public name was the Next-Generation Secure Computing Base, NGSCB. It described a Windows where high-assurance code could run isolated from a possibly-compromised OS kernel, anchored in a hardware secure coprocessor that looked very much like a TPM. The motivating sentence read like a thesis: NGSCB extends personal computers &quot;to offer mechanisms that let high-assurance software protect itself from the operating systems, device drivers, BIOS, and other software running on the same machine.&quot;&lt;/p&gt;
&lt;p&gt;NGSCB never shipped as advertised. By 2005, reports indicated [@wikipedia-ngscb] that Microsoft would ship &quot;only part of the architecture, BitLocker, which can optionally use the Trusted Platform Module to validate the integrity of boot and system files prior to operating system startup.&quot; The &quot;Nexus&quot; hypervisor, the user-mode high-assurance &quot;agents,&quot; the protected paths for keyboard and display -- all dropped against the Vista deadline.The deadline pressure on Vista is legendary. The architecture team chose to ship the smallest piece of NGSCB the existing chip could underwrite -- BitLocker -- and shelved the rest. That shelved piece eventually returned, fifteen years later, as Virtualization-Based Security and Credential Guard.&lt;/p&gt;
&lt;p&gt;The shelved primitives, however, did not die. &lt;em&gt;Measured boot&lt;/em&gt; -- the firmware measures the boot loader, the boot loader measures the kernel, each measurement extended into a register that cannot be rewound -- migrated into Vista &lt;a href=&quot;https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/&quot; rel=&quot;noopener&quot;&gt;BitLocker&lt;/a&gt; and, later, into Windows 8 Measured Boot. &lt;em&gt;Sealed storage&lt;/em&gt; -- a key tied to a measured boot state, unreleasable unless the boot state matches -- became the defining property of every TPM-bound BitLocker volume. &lt;em&gt;Remote attestation&lt;/em&gt; -- a device signing a quote of its own measurements for a remote verifier -- became Device Health Attestation. NGSCB shipped, just not as itself.&lt;/p&gt;

In the early 2000s, Richard Stallman and the Free Software Foundation framed Trusted Computing as &quot;treacherous computing&quot; [@wikipedia-trusted-computing]: hardware secured &quot;for its owner, but also against its owner.&quot; That objection has aged unevenly. The DRM concerns the FSF predicted did not dominate -- Hollywood never got the protected video paths it wanted on PCs. The trust-centralization concern has aged well: the modern Pluton debate raises a structurally similar question about who holds the signing key on the world&apos;s PC fleet, and the answer is now political rather than technical.
&lt;p&gt;TCPA had built a chip that could hold a key the OS couldn&apos;t read. Which keys, under whose authority, against which threats? The first answer was almost good enough -- and it lasted about a decade.&lt;/p&gt;
&lt;h2&gt;3. Generation 1 and Generation 2: TPM 1.1b -&amp;gt; 1.2, and why they failed&lt;/h2&gt;
&lt;p&gt;If you opened a 2007 ThinkPad and looked at the LPC bus next to the Super-IO chip, you would see a small Infineon SLB chip [@andzakovic-2019-tpm-sniffing]. That was your TPM 1.2. It did exactly one job, and Vista&apos;s BitLocker was the first feature to depend on it.&lt;/p&gt;
&lt;p&gt;The architectural skeleton of TPM 1.x [@wikipedia-tpm] was simple. At least sixteen Platform Configuration Registers, with the PC Client TPM Interface Specification mandating 24 per active bank. Hash algorithm: SHA-1. Asymmetric algorithm: RSA-2048. A single root of storage, the Storage Root Key, whose private half never left the chip. An Endorsement Key burned in at manufacture as the chip&apos;s permanent identity. An HMAC-SHA1 authorization model over command parameters. A &quot;Take Ownership&quot; ceremony where the platform owner created the SRK and bound it to an owner secret.&lt;/p&gt;

A TPM-internal register modified only by a one-way &quot;extend&quot; operation: $\text{PCR}_{\text{new}} = H(\text{PCR}_{\text{old}} \,\|\, \text{measurement})$. Static PCRs (0-15) cannot be rolled back without a full platform reset. TPM 2.0 also defines *dynamic* PCRs (16, 17-22, and 23 in the PC Client profile) that can be reset at specific localities via `TPM2_PCR_Reset`. DRTM uses PCRs 17-22 at locality 4 to re-launch a known measurement chain mid-run; PCRs 16 and 23 are resettable at lower localities for debug and application use. Either way, PCRs are the data structure that compresses a chain of measurements into a single attestable digest.

The TPM&apos;s permanent identity key, generated at manufacture and accompanied by an EK certificate from the chip vendor&apos;s CA. The EK is non-migratable and is used during attestation to prove that a given key was generated inside a genuine TPM. It is also the privacy-sensitive part of TPM identity: the EK is unique to one chip, so unrestricted use of the EK in attestation reveals which physical machine you are.

The root of the TPM&apos;s key hierarchy. In TPM 1.x there was exactly one SRK per chip, created during the &quot;Take Ownership&quot; ceremony. Every protected key in the hierarchy was a child of the SRK -- if you cleared the SRK, every key tied to it was lost.

A restricted signing key the TPM uses to sign quotes of PCR values for a remote verifier. Naming changed with the spec: in TPM 1.x it was the Attestation Identity Key (AIK), a separate RSA key whose binding to a real TPM was asserted by a Privacy CA&apos;s certificate over the EK. In TPM 2.0 it is the Attestation Key (AK), a primary key in the Endorsement Hierarchy *derived from the same Endorsement Primary Seed as the EK* -- the AK is a sibling of the EK, not a copy, and it is certified by the EK rather than being an alias of it. Either way, the AIK/AK signs the quote; the EK never directly signs anything.
&lt;p&gt;TPM 1.2 [@wikipedia-tpm], shipped in late 2003 and standardized as ISO/IEC 11889:2009, layered on the practical machinery: locality (a way for code at different privilege levels to extend different PCRs), monotonic counters, NV indices, transport sessions, and the eight-PCR split between firmware (PCR[0..7]) and OS (PCR[8..15]). It was the chip that mass-deployed in essentially every business PC from 2006 to 2014. When Windows Vista [@wikipedia-ngscb] reached volume-license RTM in late 2006 and broad availability in early 2007, BitLocker [@ms-learn-bitlocker] (Enterprise and Ultimate editions only) became the first mainstream Windows feature whose security depended on the chip: BitLocker sealed the Volume Master Key to PCR values describing the boot-loader chain, so that a stolen disk could not be decrypted offline. Secure Boot binding (PCR[7]) would not arrive until UEFI Secure Boot [@ms-learn-oem-secure-boot] shipped with Windows 8 in 2012.&lt;/p&gt;

flowchart TD
    EK[&quot;Endorsement Key (EK)&lt;br /&gt;RSA-2048, burned at manufacture&quot;]
    Owner[&quot;Owner secret&lt;br /&gt;(Take Ownership)&quot;]
    SRK[&quot;Storage Root Key (SRK)&lt;br /&gt;RSA-2048, single per chip&quot;]
    K1[&quot;Storage key&lt;br /&gt;(child)&quot;]
    K2[&quot;Binding key&lt;br /&gt;(child)&quot;]
    K3[&quot;Signing key&lt;br /&gt;(child)&quot;]
    AIK[&quot;Attestation Identity Key&lt;br /&gt;(independent RSA key)&quot;]
    PCA[&quot;Privacy CA&quot;]&lt;pre&gt;&lt;code&gt;Owner --&amp;gt; SRK
SRK --&amp;gt; K1
SRK --&amp;gt; K2
SRK --&amp;gt; K3
AIK --&amp;gt; PCA
EK -. cert .-&amp;gt; PCA
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The problem with all of this was not that anyone broke it. The problem was that the architecture hard-coded its cryptographic primitives into its data structures. SHA-1 was not a configurable algorithm; it was the literal width of the PCR register and of every hash field in the spec. RSA-2048 was not a configurable algorithm; it was the literal layout of the EK, the SRK, and every protected key blob. If the world deprecated SHA-1, you did not patch the firmware. You replaced the chip.&lt;/p&gt;
&lt;p&gt;NIST SP 800-131A deprecated SHA-1 [@nist-sp-800-131a-r2] digital signatures starting in 2011. The 2017 SHAttered collision [@google-2017-shattered] drove the point home.The 2017 SHAttered SHA-1 collision does not retroactively break Vista BitLocker in practice -- to do that, an attacker would have to choose firmware blobs whose hashes collide, not merely demonstrate a collision exists. But it ended any defense of &quot;SHA-1 in PCRs is fine because nobody can collide it.&quot; Algorithm flexibility cannot be retrofitted onto silicon whose data structures hard-code SHA-1. There were other limitations: a single SRK hierarchy meant clearing the chip&apos;s storage hierarchy also reset chip identity; the Privacy CA model for attestation never deployed at scale; ECC was missing; and the HMAC-based authorization model made every command exchange a piece of bespoke crypto plumbing.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Hash&lt;/th&gt;
&lt;th&gt;Asym&lt;/th&gt;
&lt;th&gt;Hierarchies&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Software-only (LSA / PStore)&lt;/td&gt;
&lt;td&gt;1996+ [@wikipedia-windows-nt-4]&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;NT 4.0 baseline; disk-readable wrapping keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software-only (DPAPI / EFS)&lt;/td&gt;
&lt;td&gt;2000+&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;RSA-1024 (EFS)&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Defeated by offline disk theft and by SYSTEM compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPM 1.1b&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;SHA-1&lt;/td&gt;
&lt;td&gt;RSA-2048&lt;/td&gt;
&lt;td&gt;1 (SRK)&lt;/td&gt;
&lt;td&gt;First mass deployment; superseded by 1.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPM 1.2&lt;/td&gt;
&lt;td&gt;2003-2014&lt;/td&gt;
&lt;td&gt;SHA-1&lt;/td&gt;
&lt;td&gt;RSA-2048&lt;/td&gt;
&lt;td&gt;1 (SRK)&lt;/td&gt;
&lt;td&gt;Vista/7/8 BitLocker baseline; algorithm-rigid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPM 2.0&lt;/td&gt;
&lt;td&gt;2014+&lt;/td&gt;
&lt;td&gt;SHA-1 + SHA-256 (+ SHA-3, future PQC)&lt;/td&gt;
&lt;td&gt;RSA, ECC&lt;/td&gt;
&lt;td&gt;4 (Platform / Endorsement / Storage / Null)&lt;/td&gt;
&lt;td&gt;Current; ISO/IEC 11889:2015&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;TCG accepted the constraint in 2014 and started over. The 2.0 design did not add features to 1.2. It answered a different question: how do you let one TPM survive twenty years of cryptographic transitions?&lt;/p&gt;
&lt;h2&gt;4. Generation 3: TPM 2.0 -- one primitive, many algorithms&lt;/h2&gt;
&lt;p&gt;On April 9, 2014 [@wikipedia-tpm], the Trusted Computing Group [@tcg-tpm2-library-spec] did something rare in standards bodies: they threw away a working specification and started from a different question. The result was the TPM 2.0 Library Specification, Family 2.0, Level 00, Revision 116. A year later it became ISO/IEC 11889-1:2015 Edition 2 [@iso-iec-11889-1-2015], which removed the &quot;industry consortium&quot; objection from procurement teams in regulated environments. By July 28, 2016 [@ms-learn-oem-tpm], Microsoft had quietly made TPM 2.0 a contractual must-have for every new Windows OEM SKU.&lt;/p&gt;
&lt;p&gt;Four conceptual changes carry the architecture.&lt;/p&gt;
&lt;h3&gt;4.1 Algorithm agility&lt;/h3&gt;
&lt;p&gt;Every cryptographic algorithm in TPM 2.0 carries an integer identifier. PCRs no longer have a single hash; they have &lt;em&gt;banks&lt;/em&gt;, one per supported algorithm, all extended in parallel by a single command. Microsoft&apos;s own documentation [@ms-learn-how-windows-uses-tpm] describes the contract: when firmware extends PCR[0] with the IBV&apos;s CRTM measurement, the TPM extends both the SHA-1 bank and the SHA-256 bank, and on newer parts the SHA-384 bank as well.The PC Client Platform TPM Profile mandates SHA-1 + SHA-256 minimum, not SHA-256-only. Backwards compatibility had a cost. Future-proofing against SHA-3 and post-quantum algorithms is now a matter of registering a new ID, not replacing silicon.&lt;/p&gt;

A property of a cryptographic protocol or device whereby the choice of hash, signature, or encryption algorithm is decoupled from the protocol&apos;s data structures. Algorithm-agile systems carry algorithm identifiers alongside their cryptographic blobs, so a new algorithm can be added by registering an ID rather than by re-laying out the wire format. TPM 2.0 is algorithm-agile; TPM 1.x was not.
&lt;h3&gt;4.2 Four hierarchies, four primary seeds&lt;/h3&gt;
&lt;p&gt;Where TPM 1.x had a single SRK, TPM 2.0 has four hierarchies -- Platform, Endorsement, Storage, Null -- each rooted in a per-hierarchy &lt;em&gt;primary seed&lt;/em&gt;. Primary keys are derived deterministically: call &lt;code&gt;TPM2_CreatePrimary&lt;/code&gt; with the same template against the same seed, and you get the same key back, byte-for-byte. The Apress textbook by Arthur, Challener, and Goldman [@arthur-challener-goldman-2015] -- the de-facto developer reference for the spec -- describes this as the architectural fix to a real operational problem: the platform owner can clear the storage hierarchy without losing the device&apos;s endorsement identity.&lt;/p&gt;

flowchart TD
    subgraph Platform[&quot;Platform Hierarchy&lt;br /&gt;(firmware-only)&quot;]
      PSeed[&quot;Platform Primary Seed&quot;]
      PSRK[&quot;Platform SRK&quot;]
      PSeed --&amp;gt; PSRK
    end
    subgraph Endorsement[&quot;Endorsement Hierarchy&lt;br /&gt;(privacy-sensitive)&quot;]
      ESeed[&quot;Endorsement Primary Seed&quot;]
      EK[&quot;EK&quot;]
      AK[&quot;AK&lt;br /&gt;(restricted signing)&quot;]
      ESeed --&amp;gt; EK
      ESeed --&amp;gt; AK
      EK -. cert .-&amp;gt; AK
    end
    subgraph Storage[&quot;Storage Hierarchy&lt;br /&gt;(owner-cleared)&quot;]
      SSeed[&quot;Storage Primary Seed&quot;]
      SRK[&quot;SRK&quot;]
      Sealed[&quot;Sealed VMK&lt;br /&gt;(BitLocker)&quot;]
      Bound[&quot;Hello key&lt;br /&gt;(per-user)&quot;]
      SSeed --&amp;gt; SRK
      SRK --&amp;gt; Sealed
      SRK --&amp;gt; Bound
    end
    subgraph Null[&quot;Null Hierarchy&lt;br /&gt;(reset on every reboot)&quot;]
      NSeed[&quot;Null Primary Seed&lt;br /&gt;(per-boot random)&quot;]
    end
&lt;h3&gt;4.3 Enhanced Authorization&lt;/h3&gt;
&lt;p&gt;The most interesting change is how TPM 2.0 talks about access control. Every protected object has a &lt;code&gt;policyDigest&lt;/code&gt;, an algorithm-agile hash of an arbitrarily complex set of conditions. To use the object, the caller starts a policy session (&lt;code&gt;TPM2_StartAuthSession&lt;/code&gt; with &lt;code&gt;TPM_SE_POLICY&lt;/code&gt;) and walks predicates -- &lt;code&gt;TPM2_PolicyPCR&lt;/code&gt;, &lt;code&gt;TPM2_PolicyAuthorize&lt;/code&gt;, &lt;code&gt;TPM2_PolicySigned&lt;/code&gt;, &lt;code&gt;TPM2_PolicyCommandCode&lt;/code&gt;, &lt;code&gt;TPM2_PolicyAuthValue&lt;/code&gt; -- each extending the running session digest. At the end, the TPM checks that the session digest matches the object&apos;s &lt;code&gt;policyDigest&lt;/code&gt;, and only then authorizes the operation. BitLocker, in its current Microsoft Learn description [@ms-learn-bitlocker], uses this to seal the Volume Master Key to PCR[7] (Secure Boot policy) and PCR[11] (BitLocker control flags). Any tampering with Secure Boot configuration -- or any non-BitLocker boot path -- causes unseal to fail.&lt;/p&gt;

TPM 2.0&apos;s flexible authorization mechanism. Each protected object carries a hash (policyDigest) of the predicates required to use it. A caller builds an equivalent digest by walking a sequence of TPM2_Policy* commands inside a policy session; the TPM only authorizes the operation if the two digests match. This is the mechanism that lets BitLocker bind the VMK to specific PCR values, lets Hello bind a key to a PIN gesture with anti-hammering, and lets attestation servers compose policies they did not design into the chip.
&lt;h3&gt;4.4 The unifying primitive: measure, extend, seal, quote&lt;/h3&gt;
&lt;p&gt;The reason any of this matters for Windows is that the entire feature surface compresses down to four operations on the same set of registers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Measure.&lt;/strong&gt; A piece of code computes the hash of the next piece of code (or configuration) about to run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extend.&lt;/strong&gt; That hash is folded into a PCR via &lt;code&gt;PCR_new = H(PCR_old || hash)&lt;/code&gt;. The operation is one-way: PCRs cannot be rewound.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seal.&lt;/strong&gt; A symmetric key (or arbitrary blob) is encrypted under the TPM&apos;s Storage hierarchy with a &lt;code&gt;policyDigest&lt;/code&gt; that names a specific set of PCR values. &lt;code&gt;TPM2_Unseal&lt;/code&gt; releases the blob if and only if the live PCR state matches.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quote.&lt;/strong&gt; The TPM signs a snapshot of selected PCRs with an Attestation Key. A remote verifier can check the signature against a known AKpub and an EK certificate chain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The boot of a measured Windows machine is exactly this loop. The Core Root of Trust for Measurement -- a small piece of immutable firmware -- measures the next stage and extends PCR[0]. Each stage measures the next: PCR[2] for option ROMs, PCR[4] for the Windows Boot Manager, PCR[7] for the Secure Boot policy, PCR[11] for BitLocker volume control flags, and on through ELAM and the kernel. Microsoft&apos;s Trusted Boot description [@ms-learn-secure-boot-process] walks the chain.&lt;/p&gt;

sequenceDiagram
    participant FW as Firmware (CRTM)
    participant BM as Bootmgr
    participant Win as Windows kernel
    participant TPM as TPM
    FW-&amp;gt;&amp;gt;TPM: PCR_Extend(PCR[0], H(firmware))
    FW-&amp;gt;&amp;gt;BM: Hand off
    BM-&amp;gt;&amp;gt;TPM: PCR_Extend(PCR[4], H(bootmgr))
    BM-&amp;gt;&amp;gt;TPM: PCR_Extend(PCR[7], H(SecureBoot policy))
    BM-&amp;gt;&amp;gt;Win: Hand off
    Win-&amp;gt;&amp;gt;TPM: PCR_Extend(PCR[11], H(BitLocker control))
    Win-&amp;gt;&amp;gt;TPM: TPM2_Unseal(VMK, policyDigest = PCR[7],PCR[11])
    TPM--&amp;gt;&amp;gt;Win: VMK if PCRs match policy, else error
&lt;p&gt;Now compress the Windows feature catalogue against those four operations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BitLocker [@ms-learn-bitlocker] seals the VMK to a PCR policy.&lt;/li&gt;
&lt;li&gt;Measured Boot and Device Health Attestation [@ms-learn-azure-measured-boot] quote PCRs to a remote verifier.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://paragmali.com/blog/the-windows-secure-kernel/&quot; rel=&quot;noopener&quot;&gt;Credential Guard&lt;/a&gt; [@ms-learn-credential-guard] seals the VBS-isolated NTLM/Kerberos secrets with a policy that includes the VBS measurement.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://paragmali.com/blog/your-face-is-not-your-password-inside-windows-hellos-hardwar/&quot; rel=&quot;noopener&quot;&gt;Windows Hello for Business&lt;/a&gt; [@ms-learn-hello-for-business] creates a per-user RSA-2048 or P-256 key whose authorization policy requires the PIN gesture and is bounded by the TPM&apos;s anti-hammering counter.&lt;/li&gt;
&lt;li&gt;Virtual smart cards, DPAPI-NG, and TPM key attestation [@ms-learn-tpm-key-attestation] for ADCS-issued certificates all sit on the same primitives.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; BitLocker, Measured Boot, Credential Guard, Windows Hello, virtual smart cards, DPAPI-NG, and TPM key attestation are not seven independent uses of a chip. They are seven &lt;em&gt;policy expressions&lt;/em&gt; over the same four operations -- measure, extend, seal, quote -- on the same PCR set. The TPM is not a checkbox shared by features. It is one primitive that &lt;em&gt;defines&lt;/em&gt; what hardware-rooted security can do in Windows.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; One primitive -- measure, extend, seal, quote -- underwrites every Windows hardware-rooted security feature shipped since Vista. The TPM&apos;s value to Windows is not a list of cryptographic operations. It is a single, composable contract: &quot;this key only releases when the boot looks like &lt;em&gt;this&lt;/em&gt;.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By July 28, 2016, TPM 2.0 was a hidden contractual requirement under the entire Windows OEM channel. By June 24, 2021, Microsoft made the same chip the visible install gate for Windows 11. The architecture had won the building. Then attackers started taking it apart.&lt;/p&gt;
&lt;h2&gt;5. The threat model collapses inward (2019-2024)&lt;/h2&gt;
&lt;p&gt;On March 13, 2019, a New Zealand security researcher named Denis Andzakovic posted a blog entry [@andzakovic-2019-tpm-sniffing] that, in retrospect, started the modern era of TPM offense. He demonstrated two LPC-bus sniffing attacks on two different machines. On an HP business laptop running TPM 1.2, he used a DSLogic Plus logic analyzer connected via the laptop&apos;s debug header (7 wires: LCLK, LFRAME, LAD[0:3], and ground) to lift the BitLocker Volume Master Key off the LPC bus. On a Surface Pro 3 running TPM 2.0, he spent $40 NZD on a Lattice iCE40 ICEStick FPGA (8 connections: GND, LCLK, LFRAME#, LRESET#, LAD[0:3]) and replicated the attack. With the disk in hand and the motherboard accessible, a thief could decrypt a TPM-only BitLocker volume in the time it took to boot it once. Andzakovic open-sourced the FPGA gateware [@andzakovic-lpc-sniffer-code] the same day.Andzakovic credits Hector Martin (&lt;code&gt;@marcan&lt;/code&gt;) for prototyping LPC sniffing earlier; the 2019 write-up was the first end-to-end public demonstration with reproducible code.&lt;/p&gt;
&lt;p&gt;The structural insight, which has not been backed away from, is that Windows does not enable TPM 2.0 &lt;em&gt;parameter encryption&lt;/em&gt; on the BitLocker boot path. The VMK travels in plaintext at the LPC bus&apos;s 33 MHz clock across a few millimetres of PCB.Why doesn&apos;t Windows turn on parameter encryption for BitLocker? The boot-time pressure is real -- pre-OS code lives in a tight memory budget and parameter encryption requires HMAC-signed sessions. The pragmatic mitigation Microsoft documents is preboot authentication (PIN or startup key), which makes the bus-sniffed VMK insufficient on its own.&lt;/p&gt;
&lt;p&gt;The attack would not stay a one-laptop curio. In late 2020, F-Secure&apos;s (later WithSecure) Henri Nurmi released an SPI variant [@withsecure-2020-spi-sniffing] and a public BitLocker-key extraction tool. A year later, Thomas Dewaele and Julien Oberson at SCRT reproduced the LPC attack [@scrt-2021-tpm-sniffing] on a Lenovo ThinkPad L440 with a chip (labeled P24JPVSP, identified by SCRT as probably equivalent to the ST33TPM12LPC) and published a tutorial. By October 2024, SCRT had industrialized the attack [@scrt-2024-bitlocker-pin] across &quot;the three major enterprise-grade laptop manufacturers (i.e. Lenovo, HP, and Dell)&quot; in &quot;a few minutes.&quot;&lt;/p&gt;
&lt;p&gt;The first reassurance the industry reached for was: ship the TPM inside the chipset. No bus, no sniff. Both Intel (Platform Trust Technology, fTPM-in-CSME [@wikipedia-intel-me]) and AMD (fTPM-in-PSP) had already done this for cost reasons. The second reassurance lasted eight months.&lt;/p&gt;
&lt;p&gt;In November 2019, Daniel Moghimi, Berk Sunar, Thomas Eisenbarth, and Nadia Heninger -- soon to be USENIX Security 2020 -- released TPM-Fail [@tpmfail-microsite]. Their finding: Intel PTT and a STMicro ST33 dTPM both leaked ECDSA private keys through ordinary timing side channels in their scalar multiplication. The numbers were brutal:&lt;/p&gt;

A local adversary can recover the ECDSA key from Intel fTPM in 4-20 minutes depending on the access level. We even show that these attacks can be performed remotely on fast networks, by recovering the authentication key of a virtual private network (VPN) server in 5 hours. -- TPM-Fail, tpm.fail [@tpmfail-microsite], 2019
&lt;p&gt;NVD assigned CVE-2019-11090 [@cve-2019-11090] to Intel PTT and CVE-2019-16863 [@cve-2019-16863] to STMicroelectronics&apos; ST33TPHF2ESPI. The latter entry is blunt: &quot;STMicroelectronics ST33TPHF2ESPI TPM devices before 2019-09-12 allow attackers to extract the ECDSA private key via a side-channel timing attack because ECDSA scalar multiplication is mishandled, aka TPM-FAIL.&quot; Both chips were certified at the moment of disclosure -- the STMicro chip held both Common Criteria EAL4+ and FIPS 140-2 Level 2, while the Intel chip held FIPS 140-2 [@tpmfail-microsite]. Certification did not catch the bug. The presentation is preserved in the USENIX Security 2020 proceedings [@moghimi-2020-usenix-tpmfail].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Removing the bus did not remove the attack surface. It relocated it from the PCB to the trusted execution environment that hosted the firmware TPM. The fTPM closes one channel and opens another -- and the certification regime that was supposed to catch both missed the timing leak in chips that had passed their respective certification programmes (STMicro: Common Criteria EAL4+ and FIPS 140-2 Level 2; Intel: FIPS 140-2). The &quot;fTPM has no bus to sniff&quot; reassurance was a category error.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The final beat came four years later. In April 2023, Hans Niklas Jacob, Christian Werling, Robert Buhren, and Jean-Pierre Seifert posted faulTPM (arXiv:2304.14717) [@jacob-2023-faultpm], with reproducible code at github.com/PSPReverse/ftpm_attack [@pspreverse-ftpm-attack]. The attack: voltage-glitch the AMD Platform Security Processor and walk out with the entire internal TPM state. The paper&apos;s own claim is the sentence that, more than any other, framed the modern TPM threat model.&lt;/p&gt;

this vulnerability exposes the complete internal TPM state of the fTPM. It allows us to extract any cryptographic material stored or sealed by the fTPM regardless of authentication mechanisms such as Platform Configuration Register validation or passphrases with anti-hammering protection. -- Jacob, Werling, Buhren, Seifert, faulTPM (2023) [@jacob-2023-faultpm]
&lt;p&gt;Two to three hours of physical access. Anti-hammering bypassed because anti-hammering is enforced by the TPM, and once the TPM&apos;s internal state is on your bench you set the counter to zero. PCR-policy bypassed because the sealed blob&apos;s wrapping key is in the extracted state. The structural punch is that this makes BitLocker TPM+PIN on AMD fTPM with a low-entropy PIN &lt;em&gt;less&lt;/em&gt; secure than a TPM-less passphrase (a corollary the faulTPM paper makes explicit [@jacob-2023-faultpm]): the TPM concentrates all your trust into a chip whose internal state can be exfiltrated.&lt;/p&gt;

timeline
    title Three generations of TPM attack
    section Bus sniffing
      2019 March : Andzakovic - \$40 FPGA, BitLocker VMK off LPC bus
      2020 December : WithSecure - SPI variant and key-extraction tool
      2021 November : SCRT reproduces on Lenovo ThinkPad L440
      2024 October : SCRT - few-minute attack on Lenovo, HP, Dell
    section Side channel in fTPM
      2019 November : TPM-Fail (Moghimi, Sunar, Eisenbarth, Heninger)
      2019 November : CVE-2019-11090 (Intel PTT), CVE-2019-16863 (STMicro)
    section Fault injection in fTPM
      2023 April : faulTPM - full AMD fTPM state extracted in 2-3 h
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attack class&lt;/th&gt;
&lt;th&gt;TPM form&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;LPC bus sniffing (BitLocker VMK)&lt;/td&gt;
&lt;td&gt;Discrete TPM 1.2 / 2.0&lt;/td&gt;
&lt;td&gt;$0 (logic analyzer) -- ~$40 NZD (iCE40 FPGA, Surface Pro 3)&lt;/td&gt;
&lt;td&gt;Minutes once wired&lt;/td&gt;
&lt;td&gt;Andzakovic 2019; SCRT 2021/2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPI bus sniffing&lt;/td&gt;
&lt;td&gt;Discrete TPM 2.0&lt;/td&gt;
&lt;td&gt;~$50 (logic analyzer)&lt;/td&gt;
&lt;td&gt;Minutes once wired&lt;/td&gt;
&lt;td&gt;WithSecure 2020-2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timing side channel on ECDSA&lt;/td&gt;
&lt;td&gt;Intel PTT, STMicro ST33&lt;/td&gt;
&lt;td&gt;Software-only&lt;/td&gt;
&lt;td&gt;4-20 min local; 5 h remote VPN&lt;/td&gt;
&lt;td&gt;TPM-Fail 2019/2020&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voltage glitch on PSP&lt;/td&gt;
&lt;td&gt;AMD fTPM&lt;/td&gt;
&lt;td&gt;~$200 (glitching rig)&lt;/td&gt;
&lt;td&gt;2-3 h physical&lt;/td&gt;
&lt;td&gt;faulTPM 2023&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If a $40 FPGA defeats discrete TPM, a network packet defeats Intel PTT, and a few hours of physical access defeats AMD fTPM completely -- where does the next generation of TPM live? Microsoft&apos;s answer was on the CPU die itself.&lt;/p&gt;
&lt;h2&gt;6. State of the art: five realizations of one specification&lt;/h2&gt;
&lt;p&gt;All five chips in this section pass the same TCG conformance suite. They expose the same &lt;code&gt;TPM2_*&lt;/code&gt; command surface to Windows. They fail to completely different attackers. The architecture is identical; the &lt;em&gt;attack surface&lt;/em&gt; is everything.&lt;/p&gt;

A *discrete* TPM is a separate chip on the motherboard, talking to the host over LPC, SPI, or I2C. A *firmware* TPM is a TPM 2.0 implementation running inside an existing trusted execution environment on the host -- Intel CSME (Platform Trust Technology), AMD PSP (fTPM), or a dedicated Microsoft IP block (Pluton). Both pass the same TCG specification; they differ in physical location, attack surface, and update channel.

A zero-knowledge protocol that lets a TPM prove &quot;I am a real TPM certified by vendor X&quot; without revealing which chip is talking. Replaces the TPM 1.2 Privacy CA model, which required a third-party CA to mediate every attestation. ECDAA is the elliptic-curve variant standardized in TPM 2.0.
&lt;h3&gt;6.1 Discrete TPM&lt;/h3&gt;
&lt;p&gt;The classical chip. Infineon, STMicroelectronics, Nuvoton. Hangs off the motherboard&apos;s LPC, SPI, or I2C bus. Best certifications (Common Criteria EAL4+, FIPS 140-2/3). One bug class: bus sniffing in minutes for $40 against the BitLocker boot path that Windows leaves in plaintext.&lt;/p&gt;
&lt;h3&gt;6.2 Intel PTT&lt;/h3&gt;
&lt;p&gt;TPM 2.0 inside the Converged Security and Management Engine -- historically on the Platform Controller Hub die, and increasingly on the SoC die in integrated-platform Intel processors since Tiger Lake. Either way, no physical bus to sniff. Defeated by TPM-Fail [@tpmfail-microsite] timing side channel; firmware-patched, but inherits CSME&apos;s broader attack surface and CSME&apos;s update story (UEFI capsule via OEM, lifecycle entirely under the OEM&apos;s control).&lt;/p&gt;
&lt;h3&gt;6.3 AMD fTPM (PSP)&lt;/h3&gt;
&lt;p&gt;TPM 2.0 inside the AMD Platform Security Processor [@wikipedia-amd-psp] (an ARM TrustZone Cortex-A5 core integrated into every modern Ryzen SoC). Ships in essentially all Ryzen-class client SoCs since 2017. No physical bus to sniff. Defeated end-to-end by the faulTPM [@jacob-2023-faultpm] voltage-glitch attack against the PSP. The structural problem is shared TEE: the same coprocessor is responsible for memory encryption setup, secure-boot enforcement, and TPM service, and a single fault-injection path drops all of those.&lt;/p&gt;
&lt;h3&gt;6.4 Microsoft Pluton&lt;/h3&gt;
&lt;p&gt;A Microsoft IP block on the CPU SoC die, with Microsoft-authored Rust firmware (on 2024 AMD and Intel platforms) [@ms-learn-pluton] delivered through Windows Update. According to Microsoft&apos;s hardware list, Pluton &quot;is currently available on devices with the following chipsets running on Windows 11: AMD: Ryzen 6000, 7000, 8000, 9000 and Ryzen AI Series ... Intel: Core Series Processors -- Ultra 200V Series, Ultra Series 3 and Series 3 ... Qualcomm: Snapdragon 8cx Gen 3 and Snapdragon X Series.&quot; The same page notes that &quot;Pluton platforms in 2024 AMD and Intel systems will start to use a Rust-based firmware foundation given the importance of memory safety.&quot;&lt;/p&gt;
&lt;p&gt;The thesis is laid out in Microsoft&apos;s November 17, 2020 announcement post [@ms-pluton-blog-2020], which links explicitly to Andzakovic. The architectural framing is unusually direct.&lt;/p&gt;

The Pluton design removes the potential for that communication channel to be attacked by building security directly into the CPU. -- Microsoft Security Blog, November 17, 2020 [@ms-pluton-blog-2020]
&lt;p&gt;Three things change at once. The bus is gone -- Pluton is on-die, so dTPM bus-sniffing has no surface to attack. The TEE host is dedicated -- Pluton is not the same coprocessor that runs SEV memory encryption or ME runtime services. And the firmware ships through Windows Update -- so when a Pluton firmware vulnerability is found (and one will be found), the patch reaches the deployed fleet through Windows Update rather than through OEM UEFI capsule rollouts.The Pluton-as-TPM page makes the trade-off explicit: &quot;Microsoft Pluton can be used as a TPM, or with a TPM. Although Pluton builds security directly into the CPU, device manufacturers might choose to use discrete TPM as the default TPM.&quot; [@ms-learn-pluton-as-tpm] Several enterprise security teams have publicly cited the Pluton update model as a reason to keep dTPM as their default for high-assurance fleets even where Pluton silicon is available.&lt;/p&gt;
&lt;h3&gt;6.5 vTPM&lt;/h3&gt;
&lt;p&gt;A software TPM emulation, typically inside a hypervisor. Azure Trusted Launch [@ms-learn-azure-trusted-launch] is Microsoft&apos;s flagship implementation: &quot;Trusted Launch is the default state for newly created Azure Gen2 VM and scale sets.&quot; The vTPM lives in a host-protected memory region and inherits the trust of the host. For cloud workloads where the threat model already includes &quot;the hypervisor host is honest,&quot; this is the right shape; for adversarial physical access, it is not.&lt;/p&gt;
&lt;h3&gt;6.6 Head-to-head&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;dTPM&lt;/th&gt;
&lt;th&gt;Intel PTT&lt;/th&gt;
&lt;th&gt;AMD fTPM&lt;/th&gt;
&lt;th&gt;Pluton&lt;/th&gt;
&lt;th&gt;vTPM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Physical location&lt;/td&gt;
&lt;td&gt;Separate chip&lt;/td&gt;
&lt;td&gt;CSME (PCH die)&lt;/td&gt;
&lt;td&gt;PSP (CPU die)&lt;/td&gt;
&lt;td&gt;Dedicated IP block on CPU die&lt;/td&gt;
&lt;td&gt;Hypervisor memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bus to host&lt;/td&gt;
&lt;td&gt;LPC / SPI / I2C&lt;/td&gt;
&lt;td&gt;None (on-die)&lt;/td&gt;
&lt;td&gt;None (on-die)&lt;/td&gt;
&lt;td&gt;None (on-die)&lt;/td&gt;
&lt;td&gt;None (virtual)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TEE shared with&lt;/td&gt;
&lt;td&gt;none (own die)&lt;/td&gt;
&lt;td&gt;CSME&lt;/td&gt;
&lt;td&gt;PSP (large)&lt;/td&gt;
&lt;td&gt;none (Pluton-only)&lt;/td&gt;
&lt;td&gt;host kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Side-channel exposure&lt;/td&gt;
&lt;td&gt;Implementation-dependent&lt;/td&gt;
&lt;td&gt;TPM-Fail patched&lt;/td&gt;
&lt;td&gt;faulTPM unaddressed structurally&lt;/td&gt;
&lt;td&gt;Limited public research&lt;/td&gt;
&lt;td&gt;host-dependent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update channel&lt;/td&gt;
&lt;td&gt;UEFI capsule&lt;/td&gt;
&lt;td&gt;UEFI capsule (CSME)&lt;/td&gt;
&lt;td&gt;UEFI capsule (PSP)&lt;/td&gt;
&lt;td&gt;Windows Update&lt;/td&gt;
&lt;td&gt;hypervisor patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Certifications&lt;/td&gt;
&lt;td&gt;EAL4+, FIPS 140-2/3&lt;/td&gt;
&lt;td&gt;EAL4+&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OEM cost&lt;/td&gt;
&lt;td&gt;per-chip BOM&lt;/td&gt;
&lt;td&gt;bundled&lt;/td&gt;
&lt;td&gt;bundled&lt;/td&gt;
&lt;td&gt;bundled&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best-known attack&lt;/td&gt;
&lt;td&gt;LPC/SPI sniffing in minutes&lt;/td&gt;
&lt;td&gt;TPM-Fail timing&lt;/td&gt;
&lt;td&gt;faulTPM full state&lt;/td&gt;
&lt;td&gt;None public at faulTPM depth&lt;/td&gt;
&lt;td&gt;host compromise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Algorithm agility&lt;/td&gt;
&lt;td&gt;spec-required&lt;/td&gt;
&lt;td&gt;spec-required&lt;/td&gt;
&lt;td&gt;spec-required&lt;/td&gt;
&lt;td&gt;spec-required + Rust firmware updates&lt;/td&gt;
&lt;td&gt;spec-required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Compliance-driven, high-assurance fleets&lt;/td&gt;
&lt;td&gt;Existing Intel platforms&lt;/td&gt;
&lt;td&gt;Existing AMD platforms&lt;/td&gt;
&lt;td&gt;Default for Windows 11 client&lt;/td&gt;
&lt;td&gt;Cloud workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

flowchart LR
    subgraph TPMs[&quot;Five realizations&quot;]
      dTPM[&quot;Discrete TPM&lt;br /&gt;(LPC/SPI/I2C)&quot;]
      PTT[&quot;Intel PTT&lt;br /&gt;(CSME)&quot;]
      AMD[&quot;AMD fTPM&lt;br /&gt;(PSP)&quot;]
      Pluton[&quot;Microsoft Pluton&lt;br /&gt;(on-die, Rust, WU)&quot;]
      vTPM[&quot;vTPM&lt;br /&gt;(Hyper-V / Azure)&quot;]
    end
    subgraph Surface[&quot;TCG2 command surface&quot;]
      TCG[&quot;TPM2_* commands&quot;]
    end
    dTPM --&amp;gt; TCG
    PTT --&amp;gt; TCG
    AMD --&amp;gt; TCG
    Pluton --&amp;gt; TCG
    vTPM --&amp;gt; TCG
    TCG --&amp;gt; BL[&quot;BitLocker VMK seal&quot;]
    TCG --&amp;gt; MB[&quot;Measured Boot / DHA&quot;]
    TCG --&amp;gt; CG[&quot;Credential Guard&quot;]
    TCG --&amp;gt; WH[&quot;Windows Hello&quot;]
    TCG --&amp;gt; VSC[&quot;Virtual smart cards&quot;]
    TCG --&amp;gt; DPAPI[&quot;DPAPI-NG&quot;]
    TCG --&amp;gt; KA[&quot;TPM key attestation (ADCS)&quot;]
&lt;p&gt;The deep claim of the Pluton design is not that it is a better cryptoprocessor. It is that the previous decade&apos;s lesson -- TEE memory-safety bugs are systemic, certification did not catch them, and OEM UEFI capsule patching is too slow -- argues for moving the firmware signer to Microsoft and the firmware language to Rust. That is a political choice, not just a technical one. The October 2019 Secured-core PCs initiative [@ms-secured-core-blog-2019] was the first public step; Pluton is its descendant.&lt;/p&gt;
&lt;p&gt;If you can sniff a dTPM, time-attack an Intel PTT, glitch an AMD fTPM, and trust Microsoft to sign your Pluton firmware -- which threat are you actually defending against?&lt;/p&gt;
&lt;h2&gt;7. Theoretical limits: what a passive cryptoprocessor cannot do&lt;/h2&gt;
&lt;p&gt;A famous joke in the trusted-computing community: the TPM cannot make a compromised OS uncompromised. It can only make sure that nothing else helped.&lt;/p&gt;
&lt;p&gt;Three impossibility-style results follow from the architecture itself, regardless of which of the five realizations you pick.&lt;/p&gt;
&lt;h3&gt;7.1 The TPM is a Root of Trust for Storage and Reporting, not Execution&lt;/h3&gt;
&lt;p&gt;The Core Root of Trust for Measurement -- the immutable code that bootstraps the measurement chain -- lives in firmware, not in the TPM. The TPM cannot detect that the wrong code measured itself; it can only refuse to release sealed material when the PCRs do not match the stored policy. If the CRTM is compromised (or a downstream measurement is forged before extension), the TPM has no way to know.&lt;/p&gt;
&lt;p&gt;Stronger guarantees require an &lt;em&gt;active&lt;/em&gt; root of trust: a Dynamic Root of Trust for Measurement, where the CPU enters a known good state late in the boot and re-measures from there. Intel TXT, AMD SVM-SKINIT, and Microsoft&apos;s System Guard Secure Launch [@ms-learn-system-guard] on Secured-core PCs all implement this. The TPM is a participant in DRTM; on its own, it is not sufficient.&lt;/p&gt;
&lt;h3&gt;7.2 TPM-only BitLocker has a structural lower bound&lt;/h3&gt;
&lt;p&gt;The VMK must enter RAM during Trusted Boot before the user authenticates. This is not a bug; it is the threat-model definition of &quot;TPM-only.&quot; Therefore &lt;em&gt;any&lt;/em&gt; attacker who intercepts the VMK at the moment of release defeats TPM-only BitLocker, regardless of TPM strength. This is what every dTPM bus-sniffing attack actually exploits -- not a weakness of the TPM, but the structural condition that the key must traverse the boot path.&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s countermeasures documentation [@ms-learn-bitlocker-countermeasures] names the mitigation in plain terms: preboot authentication. Adding TPM+PIN raises the bound to &quot;guess the PIN against intact anti-hammering&quot; -- but only as long as the TPM&apos;s anti-hammering counter cannot be exfiltrated. faulTPM violates that condition for AMD fTPM. On a Pluton or hardened dTPM, anti-hammering still holds, and a sufficiently random PIN closes the bound.&lt;/p&gt;
&lt;p&gt;The complexity of guessing an $n$-digit PIN against intact anti-hammering [@ms-learn-bitlocker-countermeasures] with a per-failure delay $\Delta t$ is approximately $\frac{1}{2} \cdot 10^n \cdot \Delta t$ in the average case. For $n = 8$ and $\Delta t \geq 1\text{s}$ this is roughly $5 \times 10^7$ seconds, or about 1.6 years. For $n = 4$, it is hours.&lt;/p&gt;

CVE-2023-21563 [@cve-2023-21563] -- the BitLocker Security Feature Bypass that the offensive-security community calls &quot;Bitpixie&quot; -- is a useful reminder that breaking BitLocker does not require breaking the TPM. The NVD entry reads simply &quot;BitLocker Security Feature Bypass Vulnerability,&quot; and the bypass operates against the boot path that consumes the unsealed VMK, not against the chip that sealed it. (NVD does not use the &quot;Bitpixie&quot; name; it is community-known-as.)
&lt;h3&gt;7.3 Once a key is unsealed, it lives in the OS&apos;s address space&lt;/h3&gt;
&lt;p&gt;A runtime-compromised OS reads any key the TPM has unsealed for it. The TPM defends against the &lt;em&gt;offline&lt;/em&gt; attacker (disk theft, post-shutdown tamper) and the &lt;em&gt;pre-OS&lt;/em&gt; attacker (boot-time integrity violation that fails the unseal). It does not defend against a privileged runtime attacker. This is a general impossibility, not a TPM weakness; no passive cryptoprocessor can decide whether the OS asking to unseal a key is itself trustworthy at the moment it asks.&lt;/p&gt;
&lt;p&gt;This is why VBS, Credential Guard, and DRTM exist as separate disciplines: they answer &quot;what protects the unsealed key once it is in RAM?&quot; by isolating the key inside a VTL1 enclave or by re-measuring the OS after launch. The TPM is a participant; it is not the answer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; The TPM defends against the offline attacker and the pre-OS attacker. It does not defend against a runtime-compromised OS. This is by design, and is the most a passive cryptoprocessor can do. Stronger guarantees require an active component (DRTM, VBS, hypervisor isolation) -- and none of those are the TPM.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What would an &lt;em&gt;ideal&lt;/em&gt; TPM look like? On-die (no bus), in an isolated TEE shared with nothing else, with the host-firmware-update path replaced by an OS-channel update path, with high-assurance certification depth, with an authenticated wire protocol always on, and with native support for post-quantum primitives. &lt;em&gt;No shipping TPM today satisfies all six properties.&lt;/em&gt; Pluton plus future PQC firmware updates is the closest existing trajectory; it is on-die, isolated, OS-channel-updated, and Rust-implemented, but it does not yet expose PQC primitives and its certification depth is still evolving.&lt;/p&gt;
&lt;p&gt;If the TPM cannot defeat a runtime-compromised OS by design, and the best fTPM can be extracted in three hours, where is the security frontier actually moving?&lt;/p&gt;
&lt;h2&gt;8. Open problems: PQC, supply chain, and trust centralization&lt;/h2&gt;
&lt;p&gt;On August 13, 2024, NIST finalized FIPS 203 (ML-KEM) [@nist-fips-203-mlkem], FIPS 204 (ML-DSA) [@nist-fips-204-mldsa], and FIPS 205 (SLH-DSA) [@nist-fips-205-slhdsa] -- the first federal post-quantum cryptography standards. ML-DSA-87&apos;s public keys are 2,592 bytes. A typical TPM has 6 to 32 KiB of NV memory total. The math gets uncomfortable quickly.&lt;/p&gt;
&lt;h3&gt;8.1 Post-quantum migration&lt;/h3&gt;
&lt;p&gt;The NIST Post-Quantum Cryptography project page [@nist-pqc-project] describes the timeline: &quot;In August 2024, NIST released its principal PQC standards ... Under the transition timeline in NIST IR 8547, NIST will deprecate and ultimately remove quantum-vulnerable algorithms from its standards by 2035, with high-risk systems transitioning much earlier.&quot; That is the deadline driving every TPM roadmap, and the August 14, 2024 Federal Register notice [@federal-register-2024-fips-pqc] made it formal U.S. policy.&lt;/p&gt;
&lt;p&gt;Three concrete obstacles. &lt;strong&gt;First&lt;/strong&gt;, the TCG algorithm registry has not yet normatively added ML-KEM, ML-DSA, or SLH-DSA; a TCG PQC working group exists, but its output is in flight. The Microsoft TPM 2.0 reference code [@ms-tpm-20-ref-releases] tracks TCG: the V1.83 release notes describe it as &quot;the first revision in sync with Trusted Computing Group 1.83,&quot; and that revision still does not expose PQC algorithm IDs. The Fraunhofer SIT Post-Quantum Cryptography for TPM [@fraunhofer-pqc-tpm] programme has prototyped PQC primitives inside reference TPM stacks, but those changes are research artefacts, not normative TCG output.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, the constrained NV-memory budget on a typical TPM cannot hold many simultaneous PQC keys at the larger parameter sets. Quick arithmetic against ML-DSA-87 (FIPS 204): 2,592-byte public key plus 4,896-byte private key plus protocol overhead pushes a single persistent key blob past 7.5 KiB. A 16-KiB-NV TPM can hold at most two persistent ML-DSA-87 slots before exhausting NV. The larger SLH-DSA-256s signatures (29,792 bytes per FIPS 205 Table 2) [@nist-fips-205-slhdsa] routinely exceed the typical 1-4 KiB response-buffer cap (&lt;code&gt;TPM_PT_MAX_RESPONSE_SIZE&lt;/code&gt; in the PC Client Platform TPM Profile [@tcg-pc-client-ptp-spec]); the related &lt;code&gt;TPM_PT_NV_BUFFER_MAX&lt;/code&gt; (the maximum NV read/write chunk) is in the same order of magnitude and complicates persistent-storage cases as well. The chip cannot return such a signature in a single command without fragmentation extensions. PQC support on commodity TPMs is not just a software upgrade; it is an NV-budget renegotiation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, hybrid signing schemes (composite RSA + ML-DSA, or ECDSA + ML-DSA) are well-defined for transitional certificates. The IETF LAMPS WG draft on composite ML-DSA signatures [@ietf-lamps-pq-composite-sigs] specifies &quot;combinations of US NIST Module-Lattice-Based Digital Signature Algorithm (ML-DSA) in hybrid with traditional algorithms RSASSA-PKCS1-v1.5, RSASSA-PSS, ECDSA, Ed25519, and Ed448&quot; for X.509 PKIX. The TLS hybrid key-exchange draft [@ietf-tls-hybrid-design] does the same for TLS 1.3 handshakes. Neither defines a hybrid &lt;code&gt;TPM2_Sign&lt;/code&gt; profile, and no shipping Windows TPM exposes one.&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s Quantum Safe Security blog (August 2025) [@ms-quantum-safe-2025] describes the broader effort -- &quot;Our PQC effort began in 2014 when we published research on post-quantum algorithms ... We participated in four submissions to the original 2017 NIST PQC call and one submission to the current call&quot; -- but is silent on Pluton-firmware PQC support specifically.&lt;/p&gt;
&lt;p&gt;The architectural punchline: Pluton&apos;s Windows-Update firmware delivery channel is the only realization that can plausibly add a PQC primitive across the deployed fleet without a hardware refresh. Every other realization will need new silicon to ship native PQC.&lt;/p&gt;
&lt;h3&gt;8.2 The supply-chain trust of EK certificates&lt;/h3&gt;
&lt;p&gt;The Microsoft TPM key attestation documentation [@ms-learn-tpm-key-attestation] describes the trust-chain assumption plainly: the requestor proves &quot;to a CA that the RSA key in the certificate request is protected by either &apos;a&apos; or &apos;the&apos; TPM that the CA trusts.&quot; That trust is anchored on the EK certificate the chip&apos;s vendor issued at manufacture. A vendor-CA compromise therefore equals collapse of TPM-bound device identity for an entire OEM cohort.&lt;/p&gt;
&lt;p&gt;The 2017 ROCA incident is the canonical event for why this matters. In February 2017, Matúš Nemec, Marek Sýs, Petr Švenda, Dušan Klinec, and Vashek Matyáš at Masaryk University [@crocs-muni-roca] disclosed to Infineon a flaw in its RSA key-generation library that drastically reduced the entropy of generated keys and made factoring tractable. The NVD entry for CVE-2017-15361 [@cve-2017-15361] is precise about scope: &quot;The Infineon RSA library 1.02.013 in Infineon Trusted Platform Module (TPM) firmware ... mishandles RSA key generation, which makes it easier for attackers to defeat various cryptographic protection mechanisms via targeted attacks, aka ROCA. Examples of affected technologies include BitLocker with TPM 1.2, YubiKey 4 (before 4.3.5) PGP key generation, and the Cached User Data encryption feature in Chrome OS.&quot; The Wikipedia summary [@wikipedia-roca] reports the team&apos;s own estimate that the bug &quot;affected around one-quarter of all current TPM devices globally.&quot;&lt;/p&gt;
&lt;p&gt;The Estonian e-ID program -- about 750,000 cards issued since 2014 [@arstechnica-2017-roca-estonia], all using the affected Infineon chip -- had to be re-enrolled. Microsoft published advisory ADV170012 [@msrc-adv170012] on the same coordinated disclosure date. There is still no scalable revocation mechanism for individual EK certificates: vendor-level revocation breaks every device whose EKpub was issued by that vendor&apos;s CA, and ADCS-template OEM-pinning limits scope but does not solve in-scope CA compromise. Pluton centralizes one part of trust (Microsoft as firmware signer); EK certificate issuance for the silicon is unchanged, and supply-chain integrity remains a per-vendor question.&lt;/p&gt;
&lt;h3&gt;8.3 Attestation freshness in zero-trust networks&lt;/h3&gt;
&lt;p&gt;A TPM Quote proves &quot;this device booted clean,&quot; not &quot;this device is currently clean.&quot; Microsoft Intune&apos;s default device-compliance check-in is on the order of hours; Microsoft Entra&apos;s Continuous Access Evaluation documentation [@ms-learn-cae] specifies the upper-bound numerics: &quot;By default, access tokens are valid for one hour ... The goal for critical event evaluation is for response to be near real time, but latency of up to 15 minutes might be observed because of event propagation time.&quot;&lt;/p&gt;
&lt;p&gt;A 15-minute revocation window for critical events is good. But it propagates &lt;em&gt;signed&lt;/em&gt; policy decisions, not fresh TPM measurements. A device that was clean at boot, was compromised five minutes ago, and just made a request now will pass CAE if its existing access token is valid. Closing that window requires either much shorter token lifetimes, runtime attestation (TCG DICE, Project Cerberus), or a hypervisor-mediated re-measurement -- and none of them are the TPM.&lt;/p&gt;
&lt;p&gt;DPAPI-NG, the CNG-layer successor to classic DPAPI that Windows uses to encrypt secrets to a set of authorization principals, is a useful test case. The DPAPI-NG documentation [@ms-learn-cng-dpapi] describes the API as &quot;secure[ly] shar[ing] secrets (keys, passwords, key material) and messages by protecting them to a set of principals.&quot; The protection-descriptor grammar [@ms-learn-protection-descriptors] permits five descriptor keywords -- &lt;code&gt;SID&lt;/code&gt;, &lt;code&gt;SDDL&lt;/code&gt;, &lt;code&gt;LOCAL&lt;/code&gt;, &lt;code&gt;WEBCREDENTIALS&lt;/code&gt;, &lt;code&gt;CERTIFICATE&lt;/code&gt; -- across three logical authorization classes (AD-forest groups, web credentials, certificate-store entries). Notably absent: any literal &lt;code&gt;TPM=true&lt;/code&gt; clause. DPAPI-NG can be backed by a TPM-bound CNG key, but the &lt;em&gt;authorization&lt;/em&gt; is expressed in principal terms, not in TPM terms. The TPM is a key-residence property, not a policy primitive at this layer -- the right architectural choice, but it means TPM-bound DPAPI-NG inherits the freshness limits of whatever principal authorization decides who is currently authorized.&lt;/p&gt;
&lt;h3&gt;8.4 The Pluton political question&lt;/h3&gt;
&lt;p&gt;Centralizing firmware on a single Microsoft signing key is a deliberate trade-off, not an oversight. The benefit is the patch path: a Pluton firmware vulnerability becomes a Windows Update release rather than a multi-quarter OEM capsule rollout. The cost is that the chip&apos;s trust anchor is now a Microsoft signing key, in a way that even the most conservative dTPM is not. The market response in 2022 was openly mixed.&lt;/p&gt;
&lt;p&gt;In March 2022, The Register obtained vendor statements [@register-2022-pluton] from Dell, Lenovo, and HP. Dell&apos;s reply was unusually direct: &quot;Pluton does not align with Dell&apos;s approach to hardware security and our most secure commercial PC requirements.&quot; Lenovo deployed the chip but disabled it: &quot;[ThinkPads] will not support Microsoft Pluton at launch ... But ThinkPads introduced in January with AMD Ryzen 6000 processors will include Pluton as it&apos;s present in those AMD chips, though the feature will be disabled by default. AMD has provided an option for users to turn the feature on and off.&quot; PCWorld followed up [@pcworld-2022-pluton] with Lenovo&apos;s articulated reasoning: &quot;Pluton is disabled by default on 2022 Lenovo ThinkPad laptops using AMD Ryzen PRO 6000 Series processors because that&apos;s what Lenovo customers have asked for, the choice to enable or not.&quot;&lt;/p&gt;
&lt;p&gt;Matthew Garrett -- who later contributed the upstream Linux kernel support for the Pluton TPM CRB interface in Linux 6.3 (merged February 2023, released April 2023) [@phoronix-2023-pluton-linux63] -- published the closest thing to a public engineering analysis of Pluton&apos;s controllability. His April 2022 reverse-engineering write-up [@garrett-2022-pluton-rev] of the ASUS ROG Zephyrus G14 BIOS documents two firmware-level disable mechanisms on AMD Ryzen 6000 platforms: an x86-firmware &quot;do not communicate&quot; toggle, and a PSP directory entry 0xB BIT36 soft-fuse that &quot;will NOT put HSP hardware in disable state, to disable HSP hardware, you need setup PSP directory entry 0xB, BIT36 to 1.&quot; Garrett&apos;s caveat is honest: &quot;My interpretation of this is that it doesn&apos;t directly influence Pluton, but disables all mechanisms that would allow the OS to communicate with it.&quot; It is not a multi-signer proposal. There is no public peer-reviewed proposal for multi-signer or open-source Pluton firmware.&lt;/p&gt;
&lt;p&gt;The unresolved engineering question: whether a multi-signer model is feasible without losing the timely-update property that motivated Pluton in the first place. The answer is genuinely unknown. The political question -- whether one signing key on the world&apos;s PC fleet is the right cost for the Windows-Update patch latency it enables -- is no longer a technical argument. It is a procurement-policy and procurement-jurisdiction argument, and high-assurance fleets are deciding both ways.&lt;/p&gt;
&lt;p&gt;The TPM was supposed to be the part of the system you didn&apos;t have to trust anyone for. Twenty-five years later, the trust question is back -- and the answer is now political.&lt;/p&gt;
&lt;h2&gt;9. A Windows practitioner&apos;s TPM reference&lt;/h2&gt;
&lt;p&gt;What does this mean for the engineer running &lt;code&gt;Get-Tpm&lt;/code&gt; on Monday morning? Three concrete things: discovery, choosing a form factor, and avoiding the pitfalls.&lt;/p&gt;
&lt;h3&gt;9.1 Discovery&lt;/h3&gt;
&lt;p&gt;Three commands establish ground truth on any Windows 11 device. &lt;code&gt;Get-Tpm&lt;/code&gt; returns presence, ownership, and command-availability state. &lt;code&gt;Get-TpmEndorsementKeyInfo&lt;/code&gt; returns the EK public and certificate. &lt;code&gt;tpm.msc&lt;/code&gt; opens the Microsoft Management Console snap-in. The TCG event log lives at &lt;code&gt;C:\Windows\Logs\MeasuredBoot\*.log&lt;/code&gt; and contains the per-PCR measurement history for every boot. Microsoft&apos;s BitLocker page [@ms-learn-bitlocker] documents the protector model that pairs with the TPM state.&lt;/p&gt;
&lt;p&gt;{`
// Demonstrates the logic of:
//   Get-Tpm
//   (Get-BitLockerVolume -MountPoint &apos;C:&apos;).KeyProtector
//
// Mirrors the PowerShell decision tree without requiring a real TPM.&lt;/p&gt;
&lt;p&gt;const tpm = {
  TpmPresent: true,
  TpmReady: true,
  ManufacturerVersion: &apos;7.2.0.1&apos;,
  PhysicalPresenceVersionInfo: &apos;1.3&apos;,
};&lt;/p&gt;
&lt;p&gt;// Sample KeyProtector list as PowerShell would return it.
const protectors = [
  { KeyProtectorType: &apos;Tpm&apos; },
  { KeyProtectorType: &apos;RecoveryPassword&apos; },
  // Uncomment to model TPM+PIN:
  // { KeyProtectorType: &apos;TpmPin&apos; },
];&lt;/p&gt;
&lt;p&gt;function classify(tpm, protectors) {
  if (!tpm.TpmPresent) return &apos;no-tpm&apos;;
  if (!tpm.TpmReady) return &apos;tpm-not-ready&apos;;&lt;/p&gt;
&lt;p&gt;  const types = protectors.map(p =&amp;gt; p.KeyProtectorType);
  const hasPin = types.includes(&apos;TpmPin&apos;) || types.includes(&apos;TpmPinStartupKey&apos;);
  const hasStartupKey = types.includes(&apos;TpmStartupKey&apos;);
  const hasRecovery = types.includes(&apos;RecoveryPassword&apos;);&lt;/p&gt;
&lt;p&gt;  if (hasPin) return &apos;tpm-plus-pin&apos;;
  if (hasStartupKey) return &apos;tpm-plus-startup-key&apos;;
  if (types.includes(&apos;Tpm&apos;)) return &apos;tpm-only&apos;;
  return &apos;no-tpm-protector&apos;;
}&lt;/p&gt;
&lt;p&gt;const verdict = classify(tpm, protectors);
console.log(&apos;TPM present:&apos;, tpm.TpmPresent);
console.log(&apos;TPM ready  :&apos;, tpm.TpmReady);
console.log(&apos;Configuration:&apos;, verdict);
if (verdict === &apos;tpm-only&apos;) {
  console.log(&apos;WARN: TPM-only is vulnerable to bus-sniffing on dTPM.&apos;);
  console.log(&apos;Mitigation: enable TPM+PIN with PIN length &amp;gt;= 8.&apos;);
}
console.log(&apos;Recovery key escrowed:&apos;, protectors.some(p =&amp;gt; p.KeyProtectorType === &apos;RecoveryPassword&apos;));
`}&lt;/p&gt;
&lt;h3&gt;9.2 Choosing a TPM form when the OEM gives you a choice&lt;/h3&gt;
&lt;p&gt;A short decision tree, distilled from the SOTA analysis above:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opportunistic theft, low-skill attacker.&lt;/strong&gt; Default TPM-only is acceptable but not ideal. TPM+PIN with at least 8 random digits closes the bus-sniffing window on dTPM and the low-PIN-entropy window on AMD fTPM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Determined targeted adversary.&lt;/strong&gt; TPM+PIN is necessary but not sufficient. Add a startup-key factor or Network Unlock where appropriate (BitLocker&apos;s native OS-volume preboot authentication is TPM, TPM+PIN, and startup key, not FIDO2 or smart card), and prefer Pluton or hardened dTPM over commodity AMD fTPM for the device class.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compliance-driven.&lt;/strong&gt; Discrete TPM with EAL4+ / FIPS 140-2 certification is still the easiest procurement story. Verify the OEM has not enabled &lt;code&gt;Pluton-as-TPM&lt;/code&gt; if the auditor&apos;s checklist requires a discrete chip.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud workload.&lt;/strong&gt; Azure Trusted Launch with vTPM [@ms-learn-azure-trusted-launch] is the default for Gen2 VMs and underwrites Confidential VM offerings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface Copilot+, AMD Ryzen 6000+, Intel Core Ultra 200V, Snapdragon X.&lt;/strong&gt; Pluton-as-TPM [@ms-learn-pluton] is the OEM default in many SKUs; verify the Pluton firmware is current via Windows Update.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;9.3 Five common pitfalls&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Clearing the TPM invalidates every TPM-bound protector, so the next boot falls back to the BitLocker recovery key. Always verify recovery key escrow first -- in Microsoft Entra ID for Azure-AD-joined devices, in Active Directory for AD-joined devices, or in a printed/saved location for personal devices. If the recovery key is unescrowed and the TPM is cleared, the volume is unrecoverable.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The other four pitfalls in brief: firmware updates change PCR[0] and PCR[7], so suspend BitLocker before applying them; dual-boot Linux extends PCRs differently than Windows, so PCR-only sealing breaks under it -- escape with TPM+PIN; Windows does not enable parameter encryption on the BitLocker boot path, so the actual mitigation against dTPM bus sniffing is preboot authentication, not &quot;TPM hardening&quot;; and Windows Hello silently falls back to no-TPM credential storage if the TPM is unhealthy, so periodically check &lt;code&gt;Get-Tpm&lt;/code&gt; on enrolled devices.&quot;Anti-hammering&quot; is the persistent rate-limit counter the TPM enforces against authValue and policy-PIN failures. It survives reboots and only resets after a long lockout period.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The Group Policy setting &quot;Require additional authentication at startup&quot; with a minimum PIN length of 8 buys you the most security against published attacks for the least operational cost. It defeats Andzakovic-style bus sniffing (the VMK is no longer the only secret on the bus) and forces an attacker on AMD fTPM to either compromise the TPM state out-of-band or guess the PIN against anti-hammering. The exception is a fully-extracted AMD fTPM where faulTPM has already obtained the unsealed material -- in that case the PIN is bypassed.&lt;/p&gt;
&lt;/blockquote&gt;

From an elevated PowerShell prompt:&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;Suspend-BitLocker -MountPoint &quot;C:&quot; -RebootCount 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;RebootCount 1&lt;/code&gt; argument auto-resumes after the next reboot, which is what you want when the firmware update reboots the device. After the update completes, run &lt;code&gt;Get-BitLockerVolume -MountPoint C:&lt;/code&gt; and confirm &lt;code&gt;ProtectionStatus&lt;/code&gt; is &lt;code&gt;On&lt;/code&gt; again. If you forget, the next boot will land on the BitLocker recovery prompt because PCR[0] no longer matches the sealed policy.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The TPM does exactly what it was designed to do, no more. Which is exactly enough -- if you understand what &quot;exactly&quot; means.&lt;/p&gt;
&lt;h2&gt;10. FAQ and closing&lt;/h2&gt;
&lt;p&gt;A handful of questions get asked again and again about the TPM. The answers do not always match the marketing.&lt;/p&gt;

No. TPM keys are non-exportable and held inside the chip; the Microsoft documentation [@ms-learn-how-windows-uses-tpm] is explicit that &quot;if a key stored in a TPM has properties that disallow exporting the key, that key truly can&apos;t leave the TPM.&quot; The Endorsement Key is a privacy concern (it uniquely identifies the chip) but it is not a Microsoft backdoor. Pluton centralizes firmware *signing*, not key access -- Microsoft signs the firmware that runs on Pluton, but the keys Pluton creates and seals stay inside Pluton.

Depends on threat model. Against software attackers, fTPM is sufficient -- the no-bus property defeats the cheap LPC/SPI sniffing class. Against well-funded physical attackers, fTPM is weaker than dTPM: TPM-Fail [@tpmfail-microsite] showed timing-side-channel ECDSA key recovery on Intel PTT, and faulTPM [@jacob-2023-faultpm] showed 2-3 hour state extraction on AMD PSP. Pluton sits between the two with a smaller TEE surface but less public scrutiny.

Yes -- Microsoft mandates it. The OEM mandate has been in force since July 28, 2016 [@ms-learn-oem-tpm]; the consumer mandate became visible on June 24, 2021 with the Windows 11 announcement. The defensive primitives the TPM underwrites -- BitLocker, Credential Guard, Windows Hello, Device Health Attestation [@ms-learn-azure-measured-boot] -- are real, measurable, and not realistically replaceable by software-only equivalents.

Practically no for dTPM and Pluton; the EK private key never leaves the chip, and replicating it would require silicon-level extraction that no public attack has achieved. faulTPM [@jacob-2023-faultpm] proved that AMD fTPM internal state can be *extracted* in 2-3 hours of physical access; that is closer to &quot;extracted&quot; than &quot;cloned&quot; but the practical effect is the same for keys the chip held.

Because ransomware operates after the OS has loaded -- by definition outside the TPM&apos;s threat model. The TPM secures keys at rest and attests boot integrity. It does not run anti-malware, sign user files, or detect runtime compromise. Microsoft&apos;s BitLocker countermeasures page [@ms-learn-bitlocker-countermeasures] is explicit that BitLocker is a data-protection feature, not an anti-malware feature; the same logic applies to the TPM that underwrites it.

Pluton implements TPM 2.0 plus Microsoft-specific extensions. From Windows&apos;s perspective it *is* a TPM with a different update story (Windows Update instead of UEFI capsule) and a different trust anchor (Microsoft as firmware signer). Whether the OEM exposes Pluton &quot;as the TPM&quot; or alongside a discrete TPM is an OEM choice [@ms-learn-pluton-as-tpm].
&lt;p&gt;Return to June 24, 2021. The PR backlash about a Trusted Platform Module made the chip visible for the first time to a consumer audience that had owned one for a decade. The technical rationale Microsoft gave was four words long; the actual rationale is the rest of this article.&lt;/p&gt;
&lt;p&gt;A passive cryptoprocessor designed in 1999 quietly became the load-bearing pillar of half of Windows security. Twenty-five years of engineering refined a single primitive -- measure, extend, seal, quote -- into something one chip could underwrite. Twenty-five years of attacks, from a $40 FPGA on an LPC bus to a voltage glitch against the AMD PSP, argued empirically about how passive that chip can be allowed to be. The current state of the art is on the CPU die, in Rust, signed by Microsoft, patched through Windows Update -- and post-quantum migration is the next argument.&lt;/p&gt;
&lt;p&gt;The TPM is not a checkbox. It is the point at which Windows decided integrity must be measurable. It is not a panacea -- the runtime-compromised OS still wins once the key is unsealed -- but it is a primitive, with a clean boundary. Now you know what it can prove, and what it cannot. The chip is the cheapest part of the system. The cost was twenty-five years of getting it right.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;tpm-in-windows&quot; keyTerms={[
  { term: &quot;TPM (Trusted Platform Module)&quot;, definition: &quot;A passive cryptoprocessor on a separate chip or block of silicon that holds keys and records integrity measurements.&quot; },
  { term: &quot;PCR (Platform Configuration Register)&quot;, definition: &quot;A TPM register modified only by one-way extend operations, which fold a measurement into the running hash.&quot; },
  { term: &quot;Sealing&quot;, definition: &quot;Encrypting a blob under the TPM with a policy that names a specific PCR state; unseal succeeds only when the live PCRs match.&quot; },
  { term: &quot;Quote&quot;, definition: &quot;A TPM-signed snapshot of selected PCRs, used by remote verifiers in attestation.&quot; },
  { term: &quot;Endorsement Key (EK)&quot;, definition: &quot;The TPM&apos;s permanent identity key, generated at manufacture and certified by the chip vendor&apos;s CA.&quot; },
  { term: &quot;Enhanced Authorization&quot;, definition: &quot;TPM 2.0&apos;s policy-session mechanism, which lets a callable&apos;s authorization rule be an arbitrary composition of PCR, signed, and command-code predicates.&quot; },
  { term: &quot;Algorithm agility&quot;, definition: &quot;The architectural property of TPM 2.0 that decouples cryptographic algorithms from data-structure layout, allowing new algorithms to be added by registering an identifier rather than re-laying out the spec.&quot; },
  { term: &quot;fTPM (firmware TPM)&quot;, definition: &quot;A TPM 2.0 implementation running inside an existing TEE: Intel CSME (PTT), AMD PSP, or Microsoft Pluton.&quot; },
  { term: &quot;DRTM (Dynamic Root of Trust for Measurement)&quot;, definition: &quot;A late-launch boot mechanism (Intel TXT, AMD SVM-SKINIT, System Guard Secure Launch) that re-establishes a known good measurement chain after the OS has started, complementing the TPM&apos;s static RTM.&quot; },
  { term: &quot;Anti-hammering&quot;, definition: &quot;A persistent TPM-enforced rate-limit counter against repeated authValue or PIN failures; survives reboots and forces lockout after a configurable threshold.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>tpm</category><category>windows-security</category><category>bitlocker</category><category>pluton</category><category>hardware-security</category><category>measured-boot</category><category>post-quantum-cryptography</category><author>noreply@paragmali.com (Parag Mali)</author></item><item><title>BitLocker on Windows: Architecture, Attacks, and the Limits of Full-Disk Encryption</title><link>https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/</link><guid isPermaLink="true">https://paragmali.com/blog/bitlocker-on-windows-architecture-attacks-and-the-limits-of-/</guid><description>How BitLocker evolved from an optional enterprise feature to encryption-by-default, its cryptographic architecture, every known attack, and what FDE still cannot protect against.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate><content:encoded>
**Windows 11 now encrypts your drive with BitLocker by default -- no action required.** The encryption itself (XTS-AES) is solid, but the default TPM-only configuration is vulnerable to physical attacks costing as little as \$5 in hardware. For real security, add a pre-boot PIN, verify software encryption is enforced, and know where your recovery key is stored. This article traces BitLocker&apos;s 20-year evolution from an optional enterprise feature to encryption-by-default, explains its cryptographic architecture, catalogs every known attack, and compares it to VeraCrypt, LUKS, and FileVault.
&lt;h2&gt;Your Laptop Is Already Encrypted&lt;/h2&gt;
&lt;p&gt;Your Windows laptop is almost certainly encrypting every sector of its drive right now -- and you probably never turned that on. Since late 2024, every clean install of Windows 11 activates BitLocker by default, silently encrypting the entire volume and uploading a recovery key to Microsoft&apos;s cloud [@computerworld-24h2]. This is the culmination of a 20-year engineering effort that began with a stolen laptop containing 26.5 million veterans&apos; medical records.&lt;/p&gt;
&lt;p&gt;In May 2006, an employee of the U.S. Department of Veterans Affairs took home a laptop and an external hard drive containing the personal data of 26.5 million veterans and active-duty military personnel. Both were stolen from his home. The data was not encrypted. The breach later resulted in a $20 million class-action settlement and became the defining example of why laptops need full-disk encryption [@ms-bitlocker].&lt;/p&gt;
&lt;p&gt;That event accelerated a shift already underway inside Microsoft: from &quot;encryption is something you turn on&quot; to &quot;encryption is something that&apos;s always there.&quot; Today, the 24H2 update means every new Windows 11 installation has BitLocker active with no user action [@computerworld-24h2]. On Windows Home editions, this takes the form of Device Encryption -- a streamlined subset of BitLocker without Group Policy control or configurable pre-boot PIN.&lt;/p&gt;
&lt;p&gt;But here is the tension at the heart of this story. BitLocker encrypts everything by default, yet security researchers keep finding ways past it -- with a $5 chip, a network cable, or a can of compressed air. If your drive is encrypted, why should you care?&lt;/p&gt;
&lt;p&gt;The answer lies in how the keys are managed. And that story starts 25 years ago.&lt;/p&gt;
&lt;h2&gt;Before BitLocker: File-Level Encryption and Its Fatal Flaw&lt;/h2&gt;
&lt;p&gt;Before BitLocker, Windows had encryption. The Encrypting File System (EFS) shipped with Windows 2000 in 1999, and it encrypted individual files beautifully [@ms-efs]. So why wasn&apos;t that enough?&lt;/p&gt;

A file-level encryption feature built into NTFS since Windows 2000. EFS encrypts individual files using a randomly generated File Encryption Key (FEK), which is then wrapped with the user&apos;s RSA public key certificate. Decryption is transparent while the user is logged in.
&lt;p&gt;EFS worked at the NTFS layer. Each file got its own symmetric key (DESX by default in Windows 2000; AES became the default EFS cipher in Windows XP SP1 and Windows Server 2003), wrapped with the user&apos;s public key and stored in a special NTFS attribute. When you were logged in, decryption happened transparently [@ms-efs].&lt;/p&gt;
&lt;p&gt;The problem was where it didn&apos;t go. EFS encrypts files and folders -- not volumes. The operating system itself, the page file, the hibernation file, the temp directory -- all of that remained in plaintext. An attacker who booted from a USB stick could read the Windows directory, extract cached credentials from the SAM and SECURITY registry hives, and access fragments of &quot;encrypted&quot; files that the OS had swapped to disk [@ms-bitlocker].&lt;/p&gt;
&lt;p&gt;The failure mode was concrete: steal a laptop, mount the drive on another machine, and everything the OS touched is readable. EFS protected the documents you remembered to encrypt. It did nothing for the thousands of files the OS created on your behalf.
Microsoft also explored a far more ambitious approach. The &quot;Next-Generation Secure Computing Base&quot; (NGSCB), originally codenamed Palladium, proposed a hardware-rooted secure computing environment -- a tamper-resistant &quot;nexus&quot; running alongside Windows. Announced in 2002 under Peter Biddle&apos;s leadership, the full vision was scaled back around 2004-2005 under a wave of industry resistance and public backlash over DRM fears. But its core idea -- a Trusted Platform Module providing hardware-rooted key storage -- survived and became BitLocker&apos;s anchor [@ngscb-wiki].&lt;/p&gt;

A dedicated hardware chip (or firmware module) that provides cryptographic key storage, platform integrity measurement, and sealed storage. The TPM can &quot;seal&quot; a secret to specific Platform Configuration Register (PCR) values, releasing it only when the boot chain matches the expected measurements. Standardized by the Trusted Computing Group (TCG), first as TPM 1.2 and later TPM 2.0.
&lt;p&gt;Microsoft needed something that encrypted &lt;em&gt;everything&lt;/em&gt; on the disk -- the OS, the swap file, the hibernation file, the temp files, all of it. But who would design the cipher, and how would the keys be protected without making the user type a 48-character password at every boot?&lt;/p&gt;
&lt;h2&gt;The Architecture: How BitLocker Actually Works&lt;/h2&gt;
&lt;p&gt;In 2006, a Dutch cryptographer named Niels Ferguson published a paper describing a new disk encryption scheme [@ferguson-2006]. Two decades later, the core architecture he designed is still running on hundreds of millions of machines -- structurally unchanged.&lt;/p&gt;
&lt;h3&gt;The Three-Layer Key Hierarchy&lt;/h3&gt;
&lt;p&gt;BitLocker&apos;s design centers on a three-layer key hierarchy that solves an otherwise painful problem: how do you let a user change their password without re-encrypting an entire 2 TB drive?&lt;/p&gt;

The symmetric key that directly encrypts and decrypts disk sectors. In XTS-AES-256 mode, this is effectively two 256-bit AES keys -- one for block encryption, one for the XTS &quot;tweak&quot; computation that ensures identical plaintext at different sector locations produces different ciphertext.

A key-encrypting key that wraps the FVEK. The VMK itself is encrypted by one or more key protectors. This indirection allows changing authentication methods (adding a PIN, rotating a recovery key) without re-encrypting the entire volume -- only the VMK wrapping changes.

An authentication mechanism that independently encrypts the VMK. Common protectors include TPM-only (VMK sealed to Platform Configuration Registers), TPM+PIN (adds a user-supplied PIN), and Recovery Password (a 48-digit numerical backup code). Multiple protectors can coexist on the same volume.
&lt;p&gt;The indirection is the key insight. Your data is encrypted with the FVEK. The FVEK is wrapped by the VMK. The VMK is wrapped by one or more key protectors -- your TPM, your PIN, your recovery password. When you change your PIN, only the VMK wrapper changes. The FVEK stays the same. The entire volume never needs re-encryption [@ms-bitlocker].&lt;/p&gt;

flowchart TD
    A[&quot;Disk Sectors&lt;br /&gt;(encrypted data)&quot;] --&amp;gt;|&quot;decrypted by&quot;| B[&quot;FVEK&lt;br /&gt;(Full Volume Encryption Key)&quot;]
    B --&amp;gt;|&quot;wrapped by&quot;| C[&quot;VMK&lt;br /&gt;(Volume Master Key)&quot;]
    C --&amp;gt;|&quot;protected by&quot;| D[&quot;TPM-Only&lt;br /&gt;Protector&quot;]
    C --&amp;gt;|&quot;protected by&quot;| E[&quot;TPM+PIN&lt;br /&gt;Protector&quot;]
    C --&amp;gt;|&quot;protected by&quot;| F[&quot;Recovery Password&lt;br /&gt;(48-digit)&quot;]
    C --&amp;gt;|&quot;protected by&quot;| G[&quot;Recovery Key&lt;br /&gt;(file/cloud escrow)&quot;]
&lt;h3&gt;TPM Sealing: The Hardware Root of Trust&lt;/h3&gt;
&lt;p&gt;At boot time, the TPM measures each component of the boot chain -- firmware, bootloader, boot configuration -- and records hashes in its Platform Configuration Registers (PCRs). During BitLocker setup, the TPM seals the VMK to the current PCR values. On every subsequent boot, the TPM re-measures the chain. If the measurements match, the TPM releases the VMK. If anything has changed -- a modified bootloader, a BIOS update, a different boot device -- the TPM refuses, and the user must provide a recovery key [@ms-bitlocker].&lt;/p&gt;

A register inside the TPM that stores a hash representing the state of a specific component of the boot chain (firmware, bootloader, OS kernel, etc.). PCR values are &quot;extended&quot; at each boot step -- the new measurement is hashed together with the previous value, creating a tamper-evident chain. BitLocker seals the VMK to specific PCR values so that any modification to the boot process blocks key release.

sequenceDiagram
    participant UEFI as UEFI Firmware
    participant TPM as TPM Chip
    participant BL as Windows Boot Manager
    participant OS as Windows OS
    UEFI-&amp;gt;&amp;gt;TPM: Extend PCR 0-7 (firmware measurements)
    BL-&amp;gt;&amp;gt;TPM: Extend PCR 8-11 (bootloader measurements)
    BL-&amp;gt;&amp;gt;TPM: Request VMK unseal
    alt PCR values match sealed state
        TPM-&amp;gt;&amp;gt;BL: Release VMK (cleartext)
        BL-&amp;gt;&amp;gt;OS: Decrypt FVEK, mount volume
    else PCR mismatch (tampered boot chain)
        TPM-&amp;gt;&amp;gt;BL: Refuse unseal
        BL-&amp;gt;&amp;gt;OS: Prompt for recovery key
    end
&lt;p&gt;Ferguson&apos;s Elephant diffuser served BitLocker well from Vista through Windows 7, but it was a custom, non-standard construction. Government compliance frameworks (FIPS 140-2) and the emerging IEEE 1619 standard required a published, peer-reviewed cipher mode [@nist-800-38e].
Ferguson&apos;s original 2006 design used AES-128 in CBC mode with a custom &quot;Elephant&quot; diffuser -- a two-pass diffusion algorithm (one pass forward, one pass backward) applied to each 512-byte sector. The Elephant diffuser ensured that flipping one bit of ciphertext would scramble the entire sector of plaintext, raising the bar for sector manipulation attacks. The name was reportedly a nod to the animal&apos;s famously long memory -- a reference to diffusion spreading changes across the entire sector.&lt;/p&gt;

The removal of the Elephant diffuser in Windows 8 was controversial. Microsoft cited FIPS 140-2 certification requirements and alignment with standardized disk-encryption modes as the primary motivations. Windows 8 kept AES-CBC but removed the proprietary whole-sector diffuser; Windows 10 version 1511 later moved new volumes to XTS-AES. Critics pointed out that both post-Elephant designs lost the diffuser&apos;s whole-sector avalanche behavior. Microsoft chose standards compliance over a proprietary advantage -- a pragmatic decision that made BitLocker deployable in regulated environments worldwide [@ms-bitlocker].
&lt;p&gt;Windows 10 version 1511 (November 2015) completed the transition by making XTS-AES-128 the default for new volumes, with XTS-AES-256 available via Group Policy [@ms-bitlocker]. XTS stands for XEX-based Tweaked-codebook mode with ciphertext Stealing, built on Rogaway&apos;s XEX (XOR-Encrypt-XOR) construction [@rogaway-2004]. The core XEX pattern works like this: each sector gets a unique &quot;tweak&quot; derived from its sector number, and each 16-byte block within that sector is XORed with the tweak, AES-encrypted, then XORed with the tweak again. XTS extends XEX by adding ciphertext stealing to handle sectors that are not an exact multiple of 16 bytes. The result: identical plaintext at different disk locations produces different ciphertext, and there is no IV management problem like CBC had [@nist-800-38e].&lt;/p&gt;

flowchart LR
    SN[&quot;Sector Number&quot;] --&amp;gt; TW[&quot;Tweak Generation&lt;br /&gt;(AES encrypt sector #&lt;br /&gt;with tweak key)&quot;]
    TW --&amp;gt; X1a[&quot;XOR with&lt;br /&gt;Tweak&quot;]
    TW --&amp;gt; X2a[&quot;XOR with&lt;br /&gt;Tweak&quot;]
    TW --&amp;gt; XNa[&quot;XOR with&lt;br /&gt;Tweak&quot;]
    P1[&quot;Plaintext&lt;br /&gt;Block 1&quot;] --&amp;gt; X1a --&amp;gt; AES1[&quot;AES Encrypt&quot;] --&amp;gt; X1b[&quot;XOR with&lt;br /&gt;Tweak&quot;] --&amp;gt; C1[&quot;Ciphertext&lt;br /&gt;Block 1&quot;]
    P2[&quot;Plaintext&lt;br /&gt;Block 2&quot;] --&amp;gt; X2a --&amp;gt; AES2[&quot;AES Encrypt&quot;] --&amp;gt; X2b[&quot;XOR with&lt;br /&gt;Tweak&quot;] --&amp;gt; C2[&quot;Ciphertext&lt;br /&gt;Block 2&quot;]
    PN[&quot;Plaintext&lt;br /&gt;Block N&quot;] --&amp;gt; XNa --&amp;gt; AESN[&quot;AES Encrypt&quot;] --&amp;gt; XNb[&quot;XOR with&lt;br /&gt;Tweak&quot;] --&amp;gt; CN[&quot;Ciphertext&lt;br /&gt;Block N&quot;]
&lt;p&gt;This architecture is elegant. The TPM releases the key automatically at boot if nothing has changed. The key hierarchy means operational changes (new PIN, new recovery key) never touch the encrypted data. The cipher mode is standardized, hardware-accelerated via AES-NI on virtually all modern CPUs [@intel-aesni], and FIPS-validated.&lt;/p&gt;
&lt;p&gt;But what happens if an attacker gets to the hardware? Princeton researchers were about to find out.&lt;/p&gt;
&lt;h2&gt;The Cold Wake-Up Call: Attacks That Changed Everything&lt;/h2&gt;
&lt;p&gt;In 2008, a team at Princeton did something unsettling. They sprayed a laptop&apos;s RAM with compressed air, yanked the power cord, and recovered the BitLocker encryption key from the memory that should have been erased. It wasn&apos;t [@halderman-2008].&lt;/p&gt;

A physical attack exploiting the fact that DRAM retains its contents for seconds to minutes after power loss (a property called &quot;data remanence&quot;). By cooling RAM to extend retention time and quickly rebooting into an attacker-controlled OS, encryption keys can be extracted from residual memory contents. First demonstrated against BitLocker, FileVault, and dm-crypt by Halderman et al. at Princeton in 2008.
&lt;p&gt;J. Alex Halderman and his team demonstrated that DRAM does not instantly lose its contents when power is removed. At room temperature, data decays over seconds. Cooled with compressed air (around -50C), retention extends to minutes. That is enough time to reboot into a USB-based attack environment, scan memory for AES key schedules, and extract the FVEK [@halderman-2008].&lt;/p&gt;

DRAM retains its contents for seconds to minutes after power loss... enough time to extract full encryption keys. -- Halderman et al., 2008, adapted from the paper&apos;s findings.
&lt;p&gt;The cold boot attack revealed a fundamental truth about every full-disk encryption system: the keys must live in RAM while the OS is running. There is no way around this. Encrypt the keys in memory and you need a key to decrypt &lt;em&gt;those&lt;/em&gt; keys -- turtles all the way down. The cold boot paper did not just break BitLocker; it defined the boundary of what FDE can and cannot do.&lt;/p&gt;
&lt;h3&gt;The $5 Chip That Reads Your Encryption Key&lt;/h3&gt;
&lt;p&gt;In 2019, Denis Andzakovic at Pulse Security demonstrated something even more unsettling: in BitLocker&apos;s default TPM-only configuration, the VMK travels in cleartext on the communication bus (SPI or LPC, depending on hardware) between the discrete TPM chip and the CPU [@andzakovic-2019]. A $40 NZD FPGA, clipped to the right pins, captured the VMK during boot. The drive was decrypted offline in under five minutes.&lt;/p&gt;

sequenceDiagram
    participant CPU as CPU
    participant SPI as SPI / LPC Bus
    participant TPM as Discrete TPM
    participant ATK as Attacker (logic analyzer)
    Note over CPU,TPM: Normal boot sequence
    CPU-&amp;gt;&amp;gt;SPI: Request VMK unseal
    SPI-&amp;gt;&amp;gt;TPM: Forward request
    TPM-&amp;gt;&amp;gt;SPI: Return VMK (cleartext!)
    ATK-&amp;gt;&amp;gt;SPI: Sniff VMK from bus traffic
    SPI-&amp;gt;&amp;gt;CPU: Deliver VMK
    Note over ATK: Attacker now has VMK -- Drive can be decrypted offline
&lt;p&gt;The SCRT security team independently reproduced this attack in 2021 [@scrt-tpm-2021], and by 2024, the community had replaced the FPGA with a $5 Raspberry Pi Pico [@tpm-sniffing-repo]. Compass Security documented successful attacks on Lenovo ThinkPad, HP EliteBook, and Microsoft Surface models -- the most common enterprise laptops [@compass-bypasses].
The $40 FPGA that Andzakovic used in 2019 has since been replaced by a $5 Raspberry Pi Pico in community tooling. The TPM-Sniffing repository on GitHub maintains a list of tested laptop models and TPM chips, with specific pinout diagrams for each.&lt;/p&gt;
&lt;p&gt;Even adding a TPM+PIN does not fully close this gap. In October 2024, SCRT Security demonstrated that if an attacker knows (or coerces) the PIN, the VMK can still be extracted via SPI bus sniffing [@scrt-tpm-pin-2024]. The real mitigation is a firmware TPM (fTPM, integrated into the CPU) -- when the TPM is on the same die as the processor, there is no external bus to sniff.&lt;/p&gt;
&lt;h3&gt;The SSD Betrayal&lt;/h3&gt;
&lt;p&gt;In 2019, Carlo Meijer and Bernard van Gastel at Radboud University published findings that shocked the storage industry. Multiple popular SSDs from Samsung and Critical had critically flawed hardware encryption. In some cases, the data encryption key was stored in plaintext on the drive. In others, the user&apos;s password was never actually used for key derivation [@meijer-2019].&lt;/p&gt;

Multiple popular SSDs had critically flawed hardware encryption -- in some cases, the data encryption key was stored in plaintext or could be recovered by manipulating firmware. -- Meijer and van Gastel, 2019, summarizing their IEEE S&amp;amp;P findings.

This was not a theoretical weakness. BitLocker&apos;s &quot;eDrive&quot; mode trusted SSD firmware to perform encryption. On a Samsung 850 EVO or Critical MX300 with eDrive enabled, BitLocker reported the drive as &quot;encrypted&quot; -- but an attacker with physical access could use JTAG debugging or firmware manipulation to read all data in plaintext. The data was never actually encrypted by the hardware [@meijer-2019]. Microsoft issued Security Advisory ADV180028 in November 2018, recommending administrators enforce software encryption, and later changed the default so BitLocker no longer trusts hardware encryption [@adv180028].
&lt;h3&gt;DMA and Bitpixie: The Attacks Keep Coming&lt;/h3&gt;
&lt;p&gt;Ulf Frisk&apos;s PCILeech tool (2016) turned DMA attacks into a scriptable operation. Any system with unprotected Thunderbolt, ExpressCard, or PCIe slots was vulnerable to direct memory reads while powered on or in sleep mode [@pcileech]. Björn Ruytenberg&apos;s Thunderspy research (2020) found seven vulnerabilities in Intel&apos;s Thunderbolt protocol that enabled evil-maid DMA attacks bypassing disk encryption and screen locks. Microsoft introduced Kernel DMA Protection in Windows 10 version 1803, using IOMMU to block unauthorized DMA from external Thunderbolt and PCIe devices -- closing this vector on supported hardware [@ms-kernel-dma].&lt;/p&gt;
&lt;p&gt;And in 2023, the &quot;bitpixie&quot; vulnerability (CVE-2023-21563) introduced a purely software-based bypass. An attacker with physical access triggers a PXE network boot, which performs a soft reboot -- leaving the VMK in RAM. The attacker boots into a Linux environment (or, in newer variants using the WinPE approach, a custom Windows PE image that avoids Secure Boot restrictions on third-party Linux loaders), scans memory, and extracts the VMK. The entire attack takes about five minutes and requires no hardware modifications [@cve-2023-21563].&lt;/p&gt;
&lt;p&gt;Each attack reinforced the same lesson: full-disk encryption only protects data at rest. The default TPM-only configuration was never designed to resist a determined attacker with physical access. So how did Microsoft respond?&lt;/p&gt;
&lt;h2&gt;The Evolution: Generation by Generation&lt;/h2&gt;
&lt;p&gt;What makes BitLocker&apos;s history unusual is that each generation was a direct response to a specific failure. The evolution was not planned from the start -- it was forced by attackers.&lt;/p&gt;

flowchart TD
    G0[&quot;Gen 0: EFS (2000)&lt;br /&gt;File-level encryption&quot;] --&amp;gt;|&quot;OS/swap/temp left exposed&quot;| G1[&quot;Gen 1: Vista BitLocker (2006)&lt;br /&gt;AES-CBC + Elephant diffuser&quot;]
    G1 --&amp;gt;|&quot;OS drive only; non-standard cipher&quot;| G2[&quot;Gen 2: Win 7 (2009)&lt;br /&gt;+ BitLocker To Go&quot;]
    G2 --&amp;gt;|&quot;Elephant blocks FIPS/IEEE compliance&quot;| G3[&quot;Gen 3: Win 8/8.1 (2012-2013)&lt;br /&gt;No Elephant + eDrive + Device Encryption&quot;]
    G3 --&amp;gt;|&quot;SSD hardware encryption broken (2018)&quot;| G4[&quot;Gen 4: Win 10 (2015-2021)&lt;br /&gt;Software-first + cloud management&quot;]
    G4 --&amp;gt;|&quot;Still not default for consumers&quot;| G5[&quot;Gen 5: Win 11 24H2 (2024)&lt;br /&gt;Encryption by default&quot;]
&lt;p&gt;&lt;strong&gt;Generation 0 -- EFS (2000):&lt;/strong&gt; File-level encryption on NTFS. Left the OS, swap, and temp files exposed. Superseded because volume-level encryption was needed [@ms-efs].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 1 -- Vista (2006):&lt;/strong&gt; Ferguson&apos;s AES-CBC + Elephant diffuser. First volume-level encryption in Windows. OS drive only. The cold boot attack (2008) revealed that FDE keys in RAM are vulnerable [@ferguson-2006, @halderman-2008].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 2 -- Windows 7 (2009):&lt;/strong&gt; Added BitLocker To Go for USB drives and data volumes. The 2006 VA breach had involved a stolen external hard drive, making removable media encryption urgent. The Elephant diffuser persisted, blocking compliance certification [@ms-bitlocker].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 3 -- Windows 8/8.1 (2012-2013):&lt;/strong&gt; Removed the Elephant diffuser while retaining AES-CBC, introduced eDrive hardware offload in Windows 8, and added consumer Device Encryption in Windows 8.1. The SSD betrayal (2018) destroyed the eDrive trust model [@ms-bitlocker, @meijer-2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 4 -- Windows 10 (2015):&lt;/strong&gt; XTS-AES-128 became the default for new volumes in version 1511. Software encryption was enforced after the Radboud findings. Cloud-based key escrow via Azure AD. TPM sniffing attacks (2019) showed the default TPM-only configuration was vulnerable [@adv180028, @andzakovic-2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Generation 5 -- Windows 11 24H2 (2024):&lt;/strong&gt; Encryption by default on clean installs. Relaxed hardware requirements (no Modern Standby/HSTI needed). &lt;a href=&quot;https://paragmali.com/blog/the-tpm-in-windows-one-primitive-twenty-five-years-and-the-c/&quot; rel=&quot;noopener&quot;&gt;TPM 2.0&lt;/a&gt; mandatory. Recovery keys escrowed to Microsoft Account or Azure AD. Hardware-accelerated encryption available in 25H2 [@techpowerup-hwaccel].&lt;/p&gt;

gantt
    title BitLocker Evolution and Attack Timeline
    dateFormat YYYY
    axisFormat %Y
    section Generations
        EFS (file-level)           :g0, 2000, 2006
        Vista: AES-CBC+Elephant    :g1, 2006, 2009
        Win 7: +BitLocker To Go   :g2, 2009, 2012
        Win 8/8.1: no Elephant+eDrive :g3, 2012, 2015
        Win 10: Software-first    :g4, 2015, 2024
        Win 11 24H2: Default      :g5, 2024, 2026
    section Attacks
        Cold boot (Princeton)     :milestone, 2008, 0d
        DMA/PCILeech              :milestone, 2016, 0d
        SSD bypass (Radboud)      :milestone, 2018, 0d
        TPM sniffing              :milestone, 2019, 0d
        Thunderspy                :milestone, 2020, 0d
        Bitpixie (CVE-2023-21563) :milestone, 2023, 0d
&lt;p&gt;By 2024, BitLocker had evolved from an enterprise opt-in feature to encryption that activates without asking. But how does it compare to what Linux and macOS users have?&lt;/p&gt;
&lt;h2&gt;BitLocker vs. the Competition&lt;/h2&gt;
&lt;p&gt;BitLocker is not the only option. Every major OS now ships with full-disk encryption, and the open-source world offers capabilities that BitLocker cannot match.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;BitLocker (Win 11)&lt;/th&gt;
&lt;th&gt;VeraCrypt&lt;/th&gt;
&lt;th&gt;LUKS2 (dm-crypt)&lt;/th&gt;
&lt;th&gt;FileVault 2&lt;/th&gt;
&lt;th&gt;SEDs (TCG Opal)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;td&gt;Windows, macOS, Linux&lt;/td&gt;
&lt;td&gt;Linux&lt;/td&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;Any (firmware)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cipher&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XTS-AES-128/256&lt;/td&gt;
&lt;td&gt;XTS-AES, Serpent, Twofish, cascades&lt;/td&gt;
&lt;td&gt;XTS-AES (default)&lt;/td&gt;
&lt;td&gt;XTS-AES-256 (APFS)&lt;/td&gt;
&lt;td&gt;AES-256 (vendor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key derivation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TPM sealing + optional PIN&lt;/td&gt;
&lt;td&gt;PBKDF2 + PIM&lt;/td&gt;
&lt;td&gt;Argon2id (memory-hard)&lt;/td&gt;
&lt;td&gt;Secure Enclave&lt;/td&gt;
&lt;td&gt;Firmware-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open source&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Audited&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FIPS 140-2 certified&lt;/td&gt;
&lt;td&gt;Quarkslab 2016; Fraunhofer/BSI 2020&lt;/td&gt;
&lt;td&gt;Community-audited&lt;/td&gt;
&lt;td&gt;Apple docs published&lt;/td&gt;
&lt;td&gt;Radboud found flaws&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise mgmt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intune, GPO, SCCM&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Scriptable&lt;/td&gt;
&lt;td&gt;MDM (Jamf)&lt;/td&gt;
&lt;td&gt;Vendor-specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plausible deniability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (hidden volumes)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimal (sequential); up to 50% random IOPS loss&lt;/td&gt;
&lt;td&gt;Similar&lt;/td&gt;
&lt;td&gt;Similar&lt;/td&gt;
&lt;td&gt;Near-zero (hardware)&lt;/td&gt;
&lt;td&gt;Near-zero (hardware)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;VeraCrypt&lt;/strong&gt; (2013) is the open-source TrueCrypt fork, maintained by Mounir Idrassi [@veracrypt-docs]. It offers cascaded ciphers (AES-Twofish-Serpent), hidden volumes for plausible deniability, and cross-platform support. Its hidden volume feature is particularly notable: a single encrypted container holds two volumes with different passwords, and the outer volume&apos;s free space is cryptographically indistinguishable from the hidden volume&apos;s ciphertext. An adversary who compels you to reveal a password gets the decoy; the hidden volume remains undetectable. VeraCrypt was audited by Quarkslab in 2016, which found 8 critical and 3 medium-severity vulnerabilities; v1.19 fixed many high-priority issues, while OSTIF noted that some complex findings were handled with documented workarounds rather than complete fixes. It was audited by Fraunhofer SIT, commissioned by the German BSI, in 2020 [@ostif-veracrypt]. What it lacks is enterprise management -- no centralized key escrow, no MDM integration, no Group Policy. For individual privacy, it is unmatched. For a fleet of 10,000 laptops, it is impractical.
VeraCrypt&apos;s hidden volumes provide plausible deniability -- you can be compelled to reveal a password, and it unlocks a decoy volume while the real data remains hidden in space that is statistically indistinguishable from random data. No other mainstream FDE tool offers this capability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LUKS2 with dm-crypt&lt;/strong&gt; is Linux-native full-disk encryption, maintained as part of the cryptsetup project [@cryptsetup-faq]. Its standout feature is the Argon2id key derivation function -- a memory-hard, GPU/ASIC-resistant password hash that provides superior brute-force resistance compared to BitLocker&apos;s TPM-based approach or VeraCrypt&apos;s PBKDF2 [@argon2-spec]. Why does memory-hardness matter? GPUs and ASICs can test billions of PBKDF2 hashes per second because each attempt needs little memory. Argon2id forces each attempt to allocate a configurable amount of RAM; LUKS2 calibrates the parameters to a target unlock time on the host system rather than using a fixed 1 GB default. That makes parallel brute-force attacks on GPUs prohibitively expensive. LUKS2 supports up to 32 keyslots, allowing multiple users or recovery methods per volume [@cryptsetup-faq]. It integrates with systemd-cryptenroll for TPM2 and &lt;a href=&quot;https://paragmali.com/blog/your-face-is-not-your-password-inside-windows-hellos-hardwar/&quot; rel=&quot;noopener&quot;&gt;FIDO2&lt;/a&gt; token support. But it is Linux-only, and setup requires comfort with the command line.&lt;/p&gt;

A memory-hard key derivation function (KDF) that won the Password Hashing Competition in 2015. Argon2id combines the data-dependent memory access pattern of Argon2d with the data-independent access pattern of Argon2i, providing resistance to both GPU-based brute-force attacks and side-channel attacks. Used by LUKS2 as its default KDF, replacing the older PBKDF2.
&lt;p&gt;&lt;strong&gt;FileVault 2&lt;/strong&gt; is macOS-native full-disk encryption, deeply integrated with Apple&apos;s hardware. On APFS volumes (macOS High Sierra and later), FileVault uses XTS-AES-256. On T2-equipped Intel Macs and all Apple Silicon machines, the Secure Enclave -- a dedicated security coprocessor physically isolated from the main CPU -- manages encryption keys in hardware. Unlike a discrete TPM where keys transit an external bus (the vulnerability that enables TPM sniffing), Secure Enclave keys never leave the chip. The SSD controller handles encryption in real-time using dedicated AES hardware. The result is near-zero measurable performance impact. FileVault is what happens when one company controls both the hardware and software.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Self-Encrypting Drives (SEDs)&lt;/strong&gt; conforming to TCG Opal perform encryption in the drive&apos;s firmware with zero CPU overhead. But after the Radboud findings, trusting opaque SSD firmware for security is a gamble. The Meijer and van Gastel research affected drives from Samsung and Critical that, according to the researchers, represented roughly 60% of the consumer SSD market at the time [@meijer-2019].&lt;/p&gt;
&lt;p&gt;Each approach makes different trade-offs between transparency, performance, enterprise management, and trust. But they all share one theoretical limitation.&lt;/p&gt;
&lt;h2&gt;The Limits: What No Full-Disk Encryption Can Do&lt;/h2&gt;
&lt;p&gt;Here is the uncomfortable truth that no vendor will put on the box: full-disk encryption cannot protect your data while your computer is running. That is not a bug. It is a fundamental impossibility.&lt;/p&gt;

Any full-disk encryption system must hold decryption keys in volatile memory while the OS is running. Full protection is available only when the device is powered off.
&lt;p&gt;Any FDE system -- BitLocker, VeraCrypt, LUKS, FileVault -- must load the decryption key into RAM to service I/O requests. While the key is in RAM, it is vulnerable to cold boot attacks, DMA attacks, and any malware running with kernel privileges. This is not a design flaw. It is an impossibility result. You cannot encrypt and decrypt data simultaneously without holding a key somewhere accessible [@halderman-2008].&lt;/p&gt;
&lt;h3&gt;The XTS Semantic Security Gap&lt;/h3&gt;
&lt;p&gt;XTS mode has a narrower theoretical limitation. It uses a sector-derived tweak, so identical plaintext at the same block offset in different sectors does &lt;strong&gt;not&lt;/strong&gt; produce identical ciphertext. The limitation is narrower diffusion: each 16-byte block is protected independently within the sector, so a targeted ciphertext modification corrupts the corresponding 16-byte plaintext block rather than avalanching across the entire sector. Phillip Rogaway&apos;s tweakable-block-cipher work explains why narrow-block disk modes have this shape [@rogaway-2004].&lt;/p&gt;
&lt;p&gt;Wide-block modes like EME and CMC, proposed by Shai Halevi and Rogaway, encrypt an entire sector as a single block -- changing one bit of plaintext changes &lt;em&gt;every&lt;/em&gt; bit of ciphertext across the sector [@halevi-rogaway-eme]. These modes provide stronger semantic security but at higher computational cost, and no major FDE system has adopted them.&lt;/p&gt;

NIST SP 800-111 recommends pre-boot authentication for full-disk encryption in government systems [@nist-sp800-111]. Organizations subject to NIST guidelines may find TPM-only mode insufficient for compliance -- both because of the bus sniffing vulnerability and because of the XTS narrow-block limitation. The practical recommendation is TPM+PIN with XTS-AES-256, which satisfies most regulatory frameworks even if it does not close the theoretical semantic security gap.
&lt;h3&gt;The Performance Reality&lt;/h3&gt;
&lt;p&gt;Software-based BitLocker on fast NVMe SSDs carries a real cost. TechPowerUp measured a 375% increase in CPU cycles per I/O when software BitLocker is active, with random 4K IOPS dropping by up to 50% [@techpowerup-hwaccel]. Sequential throughput impact is typically under 5% thanks to AES-NI acceleration, but the random I/O penalty matters for database workloads and developer builds.&lt;/p&gt;
&lt;p&gt;Microsoft&apos;s hardware-accelerated BitLocker, available in Windows 11 25H2, uses CPU crypto instructions and NVMe controller integration to close this gap. Early benchmarks show random 4K IOPS doubling compared to software mode, with CPU usage dropping by over 70% -- approaching unencrypted performance [@techpowerup-hwaccel].&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;No BitLocker&lt;/th&gt;
&lt;th&gt;Software BitLocker&lt;/th&gt;
&lt;th&gt;HW-Accelerated BitLocker (25H2)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Sequential read/write&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;~5% overhead&lt;/td&gt;
&lt;td&gt;~0% overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random 4K IOPS&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;Up to 50% loss&lt;/td&gt;
&lt;td&gt;~10% loss&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU cycles per I/O&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;+375%&lt;/td&gt;
&lt;td&gt;~+30%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If the fundamental limits are known, what problems remain unsolved?&lt;/p&gt;
&lt;h2&gt;Open Problems: What Keeps Researchers Awake&lt;/h2&gt;
&lt;p&gt;BitLocker is mature, battle-tested, and now ubiquitous. Yet at least five significant problems remain open -- and some of them could invalidate the entire trust model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Post-quantum readiness.&lt;/strong&gt; AES-256 survives Grover&apos;s algorithm with an effective 128-bit security level -- still intractable for foreseeable quantum computers [@nist-800-38e]. But the key &lt;em&gt;management&lt;/em&gt; layer is not quantum-safe. TPM 2.0 attestation and Azure AD key escrow use RSA-2048 or ECC P-256, both vulnerable to Shor&apos;s algorithm. NIST finalized post-quantum key encapsulation (ML-KEM) and digital signature (ML-DSA) standards in 2024 [@nist-pqc], but no shipping FDE system integrates post-quantum cryptography into its key management chain yet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSD firmware auditability.&lt;/strong&gt; There is no standard mechanism to verify that a self-encrypting drive&apos;s firmware actually implements encryption correctly. The Radboud findings proved this is not hypothetical. Microsoft&apos;s policy of defaulting to software encryption works around the problem but does not solve it for hardware-only use cases [@meijer-2019].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Secure Boot trust chain revocation.&lt;/strong&gt; The bitpixie attack persists because older, vulnerable bootloaders remain trusted by Secure Boot. Revoking old certificates via DBX updates is slow and risks bricking devices on heterogeneous hardware fleets. Microsoft&apos;s KB5025885 provides a phased revocation approach, but the transition from the 2011 Microsoft UEFI CA to the 2023 CA is incomplete [@cve-2023-21563].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Recovery key awareness.&lt;/strong&gt; Encryption-by-default means millions of non-technical users have BitLocker active without understanding recovery key management. If a TPM is replaced, a BIOS update changes PCR values, or the motherboard is swapped, users who do not know they have a recovery key -- or where it is stored -- may permanently lose access to all their data [@elcomsoft-forensics].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Forensic and legal implications.&lt;/strong&gt; As every Windows device becomes encrypted by default, law enforcement and digital forensics face increasing difficulty accessing data on seized devices. Courts are grappling with compelled decryption and Fifth Amendment implications. Forensic vendors maintain tools that exploit known weaknesses (like bitpixie), but these become less effective as mitigations are deployed [@elcomsoft-forensics].
Twenty years after BitLocker first shipped, the symmetric encryption itself (AES-256) is solved. The unsolved problems are all about trust -- in hardware, in firmware, in cloud key escrow, and in users&apos; ability to manage their own recovery keys.&lt;/p&gt;
&lt;h2&gt;Practical Guide: Deploying BitLocker Correctly&lt;/h2&gt;
&lt;p&gt;Theory is useful. Configuration is what actually protects your data. Here is how to deploy BitLocker in a way that addresses the known attack surface.&lt;/p&gt;
&lt;h3&gt;Recommended Configuration&lt;/h3&gt;
&lt;p&gt;For sensitive systems, the recommended configuration is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TPM+PIN&lt;/strong&gt; -- Closes the TPM bus sniffing gap. The PIN adds a knowledge factor that the TPM requires before releasing the VMK. Even on discrete TPM chips, the attacker cannot extract the VMK without the PIN (though the PIN itself must be strong enough to resist brute-force) [@andzakovic-2019, @scrt-tpm-pin-2024].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;XTS-AES-256&lt;/strong&gt; -- The maximum key length available. Configure via Group Policy: &lt;code&gt;Computer Configuration &amp;gt; Administrative Templates &amp;gt; Windows Components &amp;gt; BitLocker Drive Encryption &amp;gt; Operating System Drives &amp;gt; Choose drive encryption method and cipher strength&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Software encryption mode&lt;/strong&gt; -- Do not trust SSD hardware encryption. Force software mode via Group Policy: &lt;code&gt;Configure use of hardware-based encryption for operating system drives: Disabled&lt;/code&gt; [@adv180028].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify recovery key location&lt;/strong&gt; -- Check that your recovery key is stored somewhere you can access. For consumers: &lt;code&gt;https://account.microsoft.com/devices/recoverykey&lt;/code&gt;. For enterprises: verify Azure AD / Entra ID escrow.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Verification Commands&lt;/h3&gt;
&lt;p&gt;{`
// Simulates the logic of manage-bde -status and Get-BitLockerVolume
// In production, run these PowerShell commands:
// manage-bde -status C:
// Get-BitLockerVolume -MountPoint C: | Select-Object *&lt;/p&gt;
&lt;p&gt;const config = {
  volume: &quot;C:&quot;,
  encryptionMethod: &quot;XTS-AES-256&quot;,
  protectors: [&quot;Tpm&quot;, &quot;RecoveryPassword&quot;],
  encryptionPercentage: 100,
  lockStatus: &quot;Unlocked&quot;,
  hardwareEncryption: false
};&lt;/p&gt;
&lt;p&gt;// Check 1: Is a PIN configured?
const hasPIN = config.protectors.some(p =&amp;gt; 
  p === &quot;TpmPin&quot; || p === &quot;TpmPinStartupKey&quot;
);
console.log(hasPIN 
  ? &quot;OK: Pre-boot PIN is configured&quot; 
  : &quot;WARNING: No pre-boot PIN -- vulnerable to TPM bus sniffing&quot;
);&lt;/p&gt;
&lt;p&gt;// Check 2: Is encryption AES-256?
const is256 = config.encryptionMethod.includes(&quot;256&quot;);
console.log(is256 
  ? &quot;OK: Using AES-256&quot; 
  : &quot;INFO: Using AES-128 (consider upgrading to 256)&quot;
);&lt;/p&gt;
&lt;p&gt;// Check 3: Software encryption?
console.log(!config.hardwareEncryption
  ? &quot;OK: Software encryption (not trusting SSD firmware)&quot;
  : &quot;WARNING: Hardware encryption in use -- verify SSD firmware integrity&quot;
);&lt;/p&gt;
&lt;p&gt;// Check 4: Recovery password exists?
const hasRecovery = config.protectors.includes(&quot;RecoveryPassword&quot;);
console.log(hasRecovery
  ? &quot;OK: Recovery password protector exists&quot;
  : &quot;WARNING: No recovery password -- data may be irrecoverable&quot;
);&lt;/p&gt;
&lt;p&gt;// Check 5: Fully encrypted?
console.log(config.encryptionPercentage === 100
  ? &quot;OK: Volume is fully encrypted&quot;
  : &quot;WARNING: Encryption is &quot; + config.encryptionPercentage + &quot;% complete&quot;
);&lt;/p&gt;
&lt;p&gt;console.log(&quot;\n--- Recommendation ---&quot;);
if (!hasPIN) {
  console.log(&quot;Run: manage-bde -protectors -add C: -TPMAndPIN&quot;);
  console.log(&quot;This adds a pre-boot PIN to mitigate bus sniffing attacks.&quot;);
}
`}&lt;/p&gt;
&lt;h3&gt;Common Pitfalls&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Firmware updates triggering recovery mode:&lt;/strong&gt; BIOS/UEFI updates change PCR values, causing the TPM to refuse VMK release. Always suspend BitLocker before firmware updates: &lt;code&gt;manage-bde -protectors -disable C:&lt;/code&gt; [@ms-bitlocker-ps].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dual-boot scenarios:&lt;/strong&gt; BitLocker encrypts the Windows volume; Linux cannot natively read BitLocker partitions (though the &lt;code&gt;dislocker&lt;/code&gt; tool provides limited read support [@dislocker-github]). Plan partition layouts carefully.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hardware swaps:&lt;/strong&gt; Replacing the motherboard or TPM chip triggers recovery mode. Ensure the recovery key is accessible &lt;em&gt;before&lt;/em&gt; hardware changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Recovery key in deleted Microsoft Account:&lt;/strong&gt; If the Microsoft Account used during setup is later deleted, the escrowed recovery key is lost. Verify the key is backed up to multiple locations.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

No. Full-disk encryption protects data at rest -- meaning when the device is powered off. While the OS is running, the decryption key is in RAM and vulnerable to DMA attacks, cold boot attacks, and malware with kernel access. While in sleep mode, the key is still in RAM. The protection window is narrower than most people assume: it really only covers a powered-off device stolen by someone without your recovery key.

BitLocker&apos;s source code is not publicly available, so independent code audits are not possible. However, the cryptographic design is published (Ferguson&apos;s 2006 paper), the implementation is FIPS 140-2 certified by an independent lab, and the XTS-AES cipher mode is standardized by IEEE and NIST. The recovery key escrow to Microsoft&apos;s cloud is not a &quot;backdoor&quot; -- it is a documented feature. If you do not want Microsoft to hold your recovery key, you can store it locally or in on-premises Active Directory instead.

No -- not without independent verification. The Radboud University research (Meijer and van Gastel, 2019) proved that Samsung and Critical SSDs had critically broken hardware encryption, affecting drives that the researchers said represented roughly 60% of the consumer SSD market. Microsoft now defaults to software encryption and recommends against relying on SSD hardware encryption unless independently validated. Force software mode via Group Policy.

Yes. Your Windows login password protects against *online* attacks -- someone trying to log in while the OS is running. It does nothing against *offline* attacks. An attacker who removes your drive and connects it to another machine bypasses the login screen entirely. Without encryption, your data is readable. A strong login password and full-disk encryption solve different problems.

It depends on the workload. Sequential read/write performance drops by about 5% with software BitLocker, barely noticeable in daily use thanks to AES-NI hardware acceleration. Random 4K IOPS -- important for databases and development builds -- can drop by up to 50%, with CPU cycles per I/O increasing by 375%. Microsoft&apos;s hardware-accelerated BitLocker in Windows 11 25H2 closes most of this gap, bringing random IOPS to within 10% of unencrypted performance.

Your data is permanently inaccessible. There is no master key, no backdoor, and no way to brute-force AES-256. Check these locations for your recovery key: (1) Microsoft Account at account.microsoft.com/devices/recoverykey, (2) Azure AD / Entra ID if your device is enterprise-managed, (3) a printed copy if you saved one during setup. If none of these have the key, the data is gone.

Yes, especially on laptops with discrete TPM chips. Without a PIN, the TPM releases the encryption key automatically at every boot with no human input. An attacker with brief physical access can sniff the key from the TPM&apos;s SPI bus using a \$5 Raspberry Pi Pico. A pre-boot PIN adds a knowledge factor that the TPM requires before release. Run: `manage-bde -protectors -add C: -TPMAndPIN` to enable it.
&lt;h2&gt;What Comes Next&lt;/h2&gt;
&lt;p&gt;Twenty years of BitLocker history tell a consistent story: the encryption itself was never the weak link. AES has held. XTS mode is mathematically sound. Ferguson&apos;s key hierarchy design from 2006 still works.&lt;/p&gt;
&lt;p&gt;Every real-world failure -- every headline, every conference demo, every CVE -- targeted the trust boundary around the encryption. The trust that RAM clears instantly (it does not). The trust that SSD firmware encrypts honestly (it did not). The trust that the TPM bus is not observable (it is). The trust that users understand their recovery keys (they do not).&lt;/p&gt;
&lt;p&gt;The next chapter of this story will be written by quantum computers and post-quantum cryptography. AES-256 will survive Grover&apos;s algorithm. But the RSA and ECC that protect key exchange, TPM attestation, and cloud escrow will not survive Shor&apos;s. No shipping FDE system has integrated post-quantum key management yet [@nist-pqc]. The clock is ticking -- and the question is whether the industry will act before the deadline, or after the first quantum key recovery makes the news.&lt;/p&gt;
&lt;p&gt;For now, the practical advice is simple: enable TPM+PIN, enforce software encryption, know where your recovery key is, and remember that BitLocker protects your data only when your machine is off.&lt;/p&gt;
</content:encoded><category>bitlocker</category><category>full-disk-encryption</category><category>windows-security</category><category>tpm</category><category>cryptography</category><category>xts-aes</category><category>disk-encryption</category><author>noreply@paragmali.com (Parag Mali)</author></item></channel></rss>