<?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: measured-boot</title><description>Posts tagged measured-boot.</description><link>https://paragmali.com/</link><language>en-US</language><lastBuildDate>Sun, 07 Jun 2026 04:13:14 GMT</lastBuildDate><atom:link href="https://paragmali.com/tags/measured-boot/rss.xml" rel="self" type="application/rss+xml"/><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. Twenty-four 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&lt;/code&gt; exposes the log to firmware drivers and applications. After &lt;code&gt;ExitBootServices&lt;/code&gt;, UEFI publishes the final log via the &lt;code&gt;EFI_TCG2_FINAL_EVENTS_TABLE&lt;/code&gt; configuration table. Windows reads that table 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 event in the log on that machine 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;BIOS-setup change (boot order, virtualization toggle)&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 a vendor-signed Authenticated Code Module (Intel) or a self-signed Secure Loader Block (AMD), verify its 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 attack and the IOMMU precondition&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 voltage glitch on the SPI bus, 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. The only deployment path that breaks this loop is pre-boot authentication, because TPM+PIN does not depend on PCR[7] alone.&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 running the legacy CSM profile 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>Secure Boot in Windows: The Chain From Sector Zero to Userinit, and Every Place It Has Broken</title><link>https://paragmali.com/blog/secure-boot-in-windows-the-chain-from-sector-zero-to-userini/</link><guid isPermaLink="true">https://paragmali.com/blog/secure-boot-in-windows-the-chain-from-sector-zero-to-userini/</guid><description>How Windows verifies and measures itself from CPU reset to logon, every rung of the boot chain, every public break, and what Pluton is being built to fix.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>
Windows boots through a chain of verifications and measurements that runs from CPU reset to your desktop. UEFI Secure Boot signs the boot manager; Trusted Boot extends the signature check to every kernel-mode component; Measured Boot extends a parallel hash of every step into the TPM&apos;s PCR 0-7 and PCR 11, with DRTM later seeding PCR 17-22 from a CPU-vendor-signed late-launch anchor. After fifteen years of BIOS rootkits, MBR bootkits, and ESP-resident bootkits, that chain holds -- but every public Secure Boot break since 2022 (BlackLotus, Bitpixie, Bootkitty, LogoFAIL) has exploited the same gap: between patching a vulnerable Microsoft-signed binary and revoking it in dbx. Pluton-rooted firmware on Microsoft&apos;s update cadence is the planned escape.
&lt;h2&gt;1. Eight seconds in 2010, and everything that could already be wrong&lt;/h2&gt;
&lt;p&gt;Picture a small business owner in December 2010. She unplugs her three-year-old Dell, drives it home, and powers it on. The fan spins. The BIOS chimes. The Windows 7 logo appears. By the time she types her password and the desktop loads, eight seconds have passed.&lt;/p&gt;
&lt;p&gt;In those eight seconds, a TDL-4 bootkit that has been on disk for two weeks has already done its work. The infected master boot record patched the operating system loader in memory before the kernel finished initialising. Driver Signature Enforcement, the policy that was supposed to keep unsigned kernel drivers out, was disabled before the kernel checked for it. A ring-0 rootkit is now staged inside &lt;code&gt;ntoskrnl.exe&lt;/code&gt;. Kaspersky&apos;s June 2011 analysis counted 4,524,488 infected machines in the first three months of 2011 alone [@kaspersky-tdl4]. The owner notices nothing. By the time she authenticates, the operating system that authenticates her is loading code the operating system never agreed to load.&lt;/p&gt;
&lt;p&gt;The structural question raised by that scene is the question this article exists to answer: &lt;em&gt;what would it take for Windows to know, by the time the user types a password, that the machine has not been tampered with since power-on?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The answer Microsoft began designing in 2011-2012 is a chain. UEFI Platform Initialization brings up the firmware. UEFI Secure Boot verifies the boot manager. Trusted Boot extends the signature check through &lt;code&gt;winload.efi&lt;/code&gt;, the kernel, and every boot-start driver. Early Launch Anti-Malware classifies subsequent drivers. The Secure Kernel comes up in a hardware-isolated execution mode. Through every one of those rungs, a parallel rail -- Measured Boot -- writes a tamper-evident hash log into the TPM&apos;s Platform Configuration Registers, so that what was loaded can be proven later, even if the verifier itself was bypassed.&lt;/p&gt;
&lt;p&gt;That chain is the spine of this article. We will walk it rung by rung. We will see where it has been broken in the wild. And we will see why every successful break since 2022 has exploited the same operational invariant -- the gap between &lt;em&gt;patched&lt;/em&gt; and &lt;em&gt;revoked&lt;/em&gt; -- rather than any flaw in the cryptography.&lt;/p&gt;

flowchart TD
    SEC[&quot;SEC -- CPU reset, immutable ROM&quot;] --&amp;gt; PEI[&quot;PEI -- platform init&quot;]
    PEI --&amp;gt; DXE[&quot;DXE -- Secure Boot verifier lives here&quot;]
    DXE --&amp;gt; BDS[&quot;BDS -- pick boot variable&quot;]
    BDS --&amp;gt; BMGR[&quot;bootmgfw.efi (Microsoft-signed)&quot;]
    BMGR --&amp;gt; WLOAD[&quot;winload.efi (Microsoft-signed)&quot;]
    WLOAD --&amp;gt; NT[&quot;ntoskrnl.exe + boot-start drivers&quot;]
    NT --&amp;gt; ELAM[&quot;ELAM (Defender, signed AM)&quot;]
    NT --&amp;gt; SK[&quot;securekernel.exe (VTL1) + Trustlets&quot;]
    ELAM --&amp;gt; SMSS[&quot;smss.exe -&amp;gt; wininit -&amp;gt; winlogon&quot;]
    SK --&amp;gt; SMSS
    SMSS --&amp;gt; USR[&quot;userinit.exe -&amp;gt; explorer.exe&quot;]
    TPM[(&quot;TPM PCR 0-7, PCR 11&quot;)]
    DXE -. extend .-&amp;gt; TPM
    BMGR -. extend .-&amp;gt; TPM
    WLOAD -. extend .-&amp;gt; TPM
    NT -. extend .-&amp;gt; TPM
    ELAM -. extend .-&amp;gt; TPM
&lt;p&gt;Before there was a chain to walk, there was no chain at all.&lt;/p&gt;
&lt;h2&gt;2. Before Secure Boot: sector zero and the fiction of OS-level security&lt;/h2&gt;
&lt;p&gt;Ask what was actually verified during a 2011 PC boot, and the answer is: one byte pair. The &lt;code&gt;0x55AA&lt;/code&gt; magic at the end of the 512-byte master boot record. That is a format check, not an authenticity check. The 16-bit BIOS power-on self test loaded sector zero of the boot device into memory at &lt;code&gt;0000:7C00&lt;/code&gt; and jumped [@wp-mbr]. No signature. No measurement. Whatever was at sector zero, ran.&lt;/p&gt;
&lt;p&gt;That architectural fact had been the structural lesson of computer-security history for a quarter century. Stoned, the boot sector virus written by an unknown student in Wellington, New Zealand in 1987, demonstrated it without malicious intent: the virus was a prank that displayed &quot;Your PC is now Stoned!&quot; and propagated by writing itself to the boot sector of every disk a victim machine touched [@wp-stoned]. Brain (Pakistan, 1986) [@wp-brain] and Michelangelo (1991) [@wp-michelangelo] were the same lesson at scale. The lesson was not that those particular authors were dangerous. It was that any code reaching sector zero ran with implicit privilege.&lt;/p&gt;

A class of malware that survives operating-system reinstallation and antivirus scanning by infecting code that runs *before* the operating system loads -- traditionally the master boot record or the partition&apos;s volume boot record, more recently the EFI System Partition or the firmware itself. A bootkit&apos;s defining property is that the operating system it boots is one the bootkit itself chooses to load.
&lt;p&gt;The modern bootkit family arrived in 2005 and ran undefended for the next seven years. Derek Soeder and Ryan Permeh of eEye published &lt;em&gt;BootRoot&lt;/em&gt; at Black Hat USA 2005 [@bhusa05-bootroot], a proof of concept that hooked the BIOS interrupt 13h disk-read service before any operating system loaded and intercepted Windows kernel images on the way to memory. Vbootkit (Vipin and Nitin Kumar) followed in 2007, demonstrating the same primitive on Vista [@vbootkit-archive]. Mebroot (the malware family Sinowal/Torpig used) compiled in November 2007 according to early infection telemetry, weaponised the technique against actual victim populations [@wp-mebroot]. By 2011, TDL-3 and TDL-4 had pushed the lineage into the millions of infected hosts [@kaspersky-tdl4].&lt;/p&gt;
&lt;p&gt;The category took its final structural step on 13 September 2011, when Marco Giuliani at Webroot&apos;s threat lab disclosed &lt;em&gt;Mebromi&lt;/em&gt;, the first BIOS rootkit found in the wild. Mebromi targeted Award BIOS firmware. It used the legitimate Phoenix &lt;code&gt;CBROM.EXE&lt;/code&gt; utility -- a tool the BIOS vendor itself shipped for assembling firmware images -- to splice malicious code into the firmware ROM image, then flashed the modified ROM through System Management Mode. On every subsequent boot, the firmware itself reinstalled the rootkit&apos;s MBR before any operating system existed to scan for it.The Mebromi reuse of the legitimate &lt;code&gt;CBROM.EXE&lt;/code&gt; firmware-assembly utility is the canonical illustration of the architectural problem. The defender&apos;s tools and the attacker&apos;s tools were the same tools. The firmware-update path had no signature, no measurement, and no policy gate; CBROM was just an executable that knew the Award ROM image format. The fix was not better antivirus. The fix was a hardware root that the OS itself could not rewrite.&lt;/p&gt;
&lt;p&gt;The structural argument that Mebromi made unanswerable: there was no measurement endpoint and no signature verifier &lt;em&gt;anywhere below&lt;/em&gt; the operating system. Every operating-system-level defence was rhetorical against this layer. Kernel-Mode Code Signing, the policy Windows Vista x64 had introduced in 2006 [@app-identity-sibling], was enforced by code that the bootkit could rewrite before the kernel started checking. Driver Signature Enforcement was a setting the operating system wrote into a memory location the operating system could not yet defend.&lt;/p&gt;
&lt;p&gt;Trust must be rooted in something the operating system cannot rewrite. That means the chain has to start before the operating system exists. The next rung is firmware itself.&lt;/p&gt;
&lt;h2&gt;3. UEFI Platform Initialization: SEC, PEI, DXE, BDS, and where Secure Boot actually lives&lt;/h2&gt;
&lt;p&gt;If Secure Boot starts at the operating-system loader, which exact piece of firmware decides whether the operating-system loader is allowed to run, and what verifies &lt;em&gt;that&lt;/em&gt; piece? The answer is a four-phase pipeline that almost no Windows engineer ever writes about. It is also where every modern firmware attack lands.&lt;/p&gt;

The Unified Extensible Firmware Interface Platform Initialization specification defines the internal architecture firmware uses to bring a system up. It splits boot into four phases: Security (SEC), Pre-EFI Initialization (PEI), Driver Execution Environment (DXE), and Boot Device Selection (BDS). Standard Windows usage of &quot;UEFI&quot; almost always means the externally-visible behaviour exposed by BDS and the EFI runtime services, not the multi-phase internal pipeline the firmware uses to get there.
&lt;p&gt;The four phases, per the TianoCore reference flow [@tianocore-pi-flow]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SEC.&lt;/strong&gt; The Security phase begins at processor reset. Code runs from immutable on-die ROM or a locked region of SPI flash before main memory is even initialised. SEC&apos;s job is to establish the root of trust in the firmware -- before any flexible code path can be taken, the firmware has committed to an instruction stream the operating system cannot influence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PEI.&lt;/strong&gt; Pre-EFI Initialization brings up DRAM, configures the memory controller, populates Hand-Off Blocks (HOBs) the later phases consume, and dispatches the small drivers needed to reach a state where general firmware code can run. SEC and PEI together are the part of firmware that fits in the few hundred kilobytes of cache-as-RAM the CPU offers before main memory is up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DXE.&lt;/strong&gt; The Driver Execution Environment hosts most of what we think of as firmware: the disk drivers, the network stack, the human-interface drivers, the USB stack, and Secure Boot&apos;s image verifier. &lt;em&gt;This is where &lt;code&gt;LoadImage()&lt;/code&gt; runs db/dbx checks against incoming PE/COFF binaries.&lt;/em&gt; DXE phase code is several megabytes on a modern x86 platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BDS.&lt;/strong&gt; Boot Device Selection reads the &lt;code&gt;BootOrder&lt;/code&gt; UEFI variable, picks a boot entry, hands the platform off to the operating system loader, and -- in normal operation -- never runs again until the next reboot.&lt;/li&gt;
&lt;/ul&gt;

flowchart LR
    BG[&quot;Boot Guard / AMD PSB&lt;br /&gt;(microcode, OTP fuses)&quot;] --&amp;gt; SEC[&quot;SEC&lt;br /&gt;immutable ROM&quot;]
    SEC --&amp;gt; PEI[&quot;PEI&lt;br /&gt;DRAM init&quot;]
    PEI --&amp;gt; DXE[&quot;DXE&lt;br /&gt;Secure Boot LoadImage()&quot;]
    DXE --&amp;gt; BDS[&quot;BDS&lt;br /&gt;read BootOrder&quot;]
    BDS --&amp;gt; OS[&quot;bootmgfw.efi&quot;]
&lt;p&gt;There is one rung &lt;em&gt;below&lt;/em&gt; SEC. Intel Boot Guard verifies the firmware via a CPU-microcode-loaded Authenticated Code Module signed by Intel [@wp-txt]; AMD Platform Secure Boot performs the same role from the AMD Platform Security Processor (PSP), an ARM-based co-processor embedded on the SoC [@ioactive-psb, @wp-amd-psp]. Both run before SEC can begin. Intel introduced Boot Guard on platforms based on the Haswell processor family (4th-generation Core, Lynx Point PCH) in 2013 [@eset-lojax, @wp-txt]; the actual root-of-trust fuses live in the PCH (on Haswell through Skylake-era platforms; from Ice Lake (2019+) onward, Intel placed the fuses on the CPU die itself) [@eset-lojax], and the OEM commits the verification key at provisioning, so Boot Guard support is a chipset-and-OEM property rather than a bare CPU-model property [@eset-lojax, @ioactive-psb]. AMD&apos;s PSB followed on EPYC server parts and was rolled out to Ryzen Pro platforms over the next several years; the PSP itself has been present on AMD client and server parts since around 2013 [@wp-amd-psp], but PSB is a distinct firmware-signing flow that uses it [@ioactive-psb].The Windows Hardware Compatibility Program codified UEFI 2.3.1 as the firmware floor for Windows 10 security features [@ms-oem-uefi]. Anything below 2.3.1 cannot host a Secure Boot configuration that Microsoft will certify. The keys that anchor those verifications are burned into one-time-programmable fuses inside the package, so the OEM commits to a public key when the part ships and cannot rotate it later [@eset-lojax, @ioactive-psb]. ESET&apos;s 2018 LoJax disclosure recommended Boot Guard explicitly: &quot;if possible, have a processor with a hardware root of trust as is the case with Intel processors supporting Intel Boot Guard (from the Haswell family of Intel processors onwards)&quot; [@eset-lojax].Boot Guard&apos;s OTP fuses are the canonical example of why hardware-rooted verification cannot have a software-only escape hatch [@eset-lojax, @ioactive-psb]. If the OEM&apos;s signing key leaks, the fuses cannot be reprogrammed in the field; an attacker with the leaked key can produce firmware that the silicon will accept. This is the structural argument behind moving the root one more rung down -- into Pluton, where Microsoft, not the OEM, owns the update cadence.&lt;/p&gt;
&lt;p&gt;The conclusion is the part most engineers skip. By the time &lt;code&gt;bootmgfw.efi&lt;/code&gt; is verified, several megabytes of DXE-phase code have already executed. Anything that compromises the DXE compromises Secure Boot from below: the verifier itself is now the attacker&apos;s code. That is the precondition that LogoFAIL exploits, and it is the reason &quot;Secure Boot starts at the OS loader&quot; is the wrong mental model.&lt;/p&gt;
&lt;p&gt;NIST recognised the structural problem early. NIST Special Publication 800-147 &lt;em&gt;BIOS Protection Guidelines&lt;/em&gt; (April 2011) [@nist-sp-800-147] articulated the BIOS-update-signing baseline two years before Boot Guard shipped a hardware-rooted answer. SP 800-147 said only that firmware updates must be signed; it did not say &lt;em&gt;who&lt;/em&gt; must verify the signing key. Boot Guard and PSB were the hardware-rooted answer to that gap, with the OEM holding the verification key in OTP fuses.&lt;/p&gt;
&lt;p&gt;Now we have a place to put a verifier. The next question is &lt;em&gt;what&lt;/em&gt; it verifies, and &lt;em&gt;who&lt;/em&gt; signed the allowlist.&lt;/p&gt;
&lt;h2&gt;4. Secure Boot itself: PK, KEK, db, dbx, and the Microsoft monoculture&lt;/h2&gt;
&lt;p&gt;Secure Boot is four UEFI variables, one Authenticode hash per binary, and one centralised root of trust. The technical content of this section is not the hard part. The social and operational content -- &lt;em&gt;who&lt;/em&gt; holds which key, and &lt;em&gt;what happens when a signed binary becomes vulnerable&lt;/em&gt; -- is the rest of the article.&lt;/p&gt;
&lt;p&gt;The four authenticated UEFI variables, defined in UEFI 2.3.1 (April 2011) and refined through the current 2.11 specification (December 16, 2024) [@oem-secure-boot]:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PK&lt;/strong&gt; -- the Platform Key. The OEM holds the private half. Whoever holds PK can rewrite KEK, db, and dbx; whoever holds PK can &lt;em&gt;turn Secure Boot off&lt;/em&gt; by replacing PK with a key it does not actually own.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KEK&lt;/strong&gt; -- the Key Exchange Key. Both the OEM and Microsoft hold KEKs. KEK is the trust anchor for db and dbx updates. A KEK-signed update can add or remove entries in db and dbx without touching PK.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;db&lt;/strong&gt; -- the signature database. This is the allowlist: hashes the firmware will accept, plus certificates whose signers it will accept. db typically contains a small handful of entries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dbx&lt;/strong&gt; -- the forbidden signatures database. The denylist: hashes and certs the firmware must refuse, even if they would otherwise pass db.&lt;/li&gt;
&lt;/ul&gt;

Four EFI variables defined by the UEFI specification that together form Secure Boot&apos;s trust hierarchy. Each variable is *authenticated*: any update must be signed by a key one rung up the hierarchy. PK signs updates to KEK, db, and dbx; KEK signs updates to db and dbx. Microsoft requires the Microsoft Corporation KEK CA to be present in KEK on every Windows-certified PC, so that Microsoft can push db and dbx updates without OEM cooperation per device.
&lt;p&gt;The verification algorithm runs every time UEFI calls &lt;code&gt;LoadImage()&lt;/code&gt; on a PE/COFF binary, in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hash the PE/COFF image. The Authenticode digest excludes the signature directory and the checksum field, so the hash is computed over the parts of the image that should not change between signing and loading [@ms-pe-format].&lt;/li&gt;
&lt;li&gt;If the hash matches a hash in dbx, reject.&lt;/li&gt;
&lt;li&gt;Else if the signer&apos;s certificate chains to a certificate in dbx, reject.&lt;/li&gt;
&lt;li&gt;Else if the hash matches an entry in db, accept. Else if the signer chains to a certificate in db, accept.&lt;/li&gt;
&lt;li&gt;Else, reject.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Microsoft&apos;s WHCP requires firmware components to be signed with at least RSA-2048 and SHA-256 [@oem-secure-boot]. That floor is generous by 2026 standards but has held without serious controversy since the original UEFI 2.3.1 release.&lt;/p&gt;

flowchart TD
    L[&quot;LoadImage(image)&quot;] --&amp;gt; H[&quot;Compute Authenticode hash&quot;]
    H --&amp;gt; D1{&quot;Hash in dbx?&quot;}
    D1 -- yes --&amp;gt; R[&quot;REJECT&quot;]
    D1 -- no --&amp;gt; D2{&quot;Signer chains to dbx cert?&quot;}
    D2 -- yes --&amp;gt; R
    D2 -- no --&amp;gt; D3{&quot;Hash in db, OR signer chains to db cert?&quot;}
    D3 -- yes --&amp;gt; A[&quot;ACCEPT (load image)&quot;]
    D3 -- no --&amp;gt; R
&lt;p&gt;The de facto roots for x86 PCs are &lt;em&gt;two&lt;/em&gt; Microsoft-rooted certificate authorities, both pre-trusted in db on essentially every certified Windows-class system: the &lt;strong&gt;Microsoft Windows Production PCA 2011&lt;/strong&gt;, which signs Microsoft&apos;s own Windows boot binaries (&lt;code&gt;bootmgfw.efi&lt;/code&gt;, &lt;code&gt;bootmgr.efi&lt;/code&gt;, &lt;code&gt;winload.efi&lt;/code&gt;), and the &lt;strong&gt;Microsoft Corporation UEFI CA 2011&lt;/strong&gt;, which signs third-party UEFI binaries -- Linux&apos;s &lt;code&gt;shim&lt;/code&gt;, option ROMs, and third-party firmware drivers [@sbat-shim, @oem-secure-boot]. The rhboot/shim project documents the arrangement: every certified PC is &quot;typically configured to trust 2 authorities for signing UEFI boot code, the Microsoft UEFI Certificate Authority (CA) and Windows CA&quot; [@sbat-shim]. The fact that &lt;em&gt;both&lt;/em&gt; are Microsoft-rooted is the reason Secure Boot, as deployed, and &quot;Microsoft is the gatekeeper of which operating systems may boot&quot; are operationally the same thing. The UEFI Forum&apos;s specification did not require that monoculture. The economics did. There are exactly two certificate authorities every OEM is willing to trust by default, and both belong to the operating-system vendor whose installer media every OEM ships.&lt;/p&gt;

The X.509 certificate authorities Microsoft uses for Secure Boot. Two CAs from the 2011 family ship pre-installed in db on essentially every Windows-certified PC: the **Microsoft Windows Production PCA 2011** signs Microsoft&apos;s own Windows boot binaries, and the **Microsoft Corporation UEFI CA 2011** signs third-party UEFI binaries (Linux&apos;s `shim`, option ROMs, third-party firmware drivers). Both 2011 certificates begin expiring in late June 2026. The **Windows UEFI CA 2023** is their successor; its industry-wide enrolment began in May 2023 with the KB5025885 program responding to CVE-2023-24932 and is still rolling out under phased automatic enrolment via monthly Windows Updates as of 2026.

Linux&apos;s path through Secure Boot runs through `shim.efi`, a small bootloader Matthew Garrett released on November 30, 2012 -- his last day at Red Hat. The trick is structural: Microsoft signs `shim` itself; `shim` is shipped on the install media of every major Linux distribution; once running, `shim` validates a distribution-signed `grubx64.efi` (or kernel) using a key the distribution embeds, *or* a Machine Owner Key (MOK) the user has enrolled at install time. Garrett credits the MOK design to engineers at SUSE. The arrangement is the open-source community&apos;s pressure valve against the Microsoft monoculture: Linux still boots on Secure Boot hardware because Microsoft signs one bootloader that delegates trust to a community-managed key store. It also explains why Linux dual-boot installs began breaking after May 2023 -- the certificates that signed older copies of `shim` are being rotated out.
&lt;p&gt;The dbx variable carries the operational weight of the system. If a signed bootloader is found to be vulnerable, the only blocking remedy is to add its hash to dbx. dbx lives in NV-RAM; on commodity Windows PCs the storage budget is roughly 32 KB total [@sbat-shim].The 32 KB figure comes from the rhboot/shim project&apos;s SBAT documentation, which notes that the BootHole disclosure of July 2020 -- a single GRUB vulnerability requiring revocation of three certificates and roughly 150 image hashes -- consumed approximately 10 KB of dbx in one event. That is one third of the available capacity, used up by one CVE. Linux distributions and Windows share the same dbx region. A botched update can refuse to validate a bootloader that the platform actually needs, and there is no remote rollback for a brick-on-write to dbx. Section 9 will show what happens when dbx revocation lags behind a CVE.&lt;/p&gt;
&lt;p&gt;The CA-2023 transition is therefore not a routine certificate rotation. The original 2011 certificates begin expiring in late June 2026. Microsoft&apos;s industry-wide Windows UEFI CA 2023 rollout started May 2023 with KB5025885, the patch advisory that paired with CVE-2023-24932, and is on track to be, in Microsoft&apos;s own framing, one of the largest coordinated security maintenance efforts the Windows install base has ever seen [@kb5025885]. The phasing, as published: enrol the new CA in db; sign new bootloaders with it; enrol new dbx entries to revoke older signed-but-vulnerable binaries; finally, revoke the 2011 CA. The published cautionary text is unambiguous: once the irreversible mitigation step is enabled on a device, &quot;it cannot be reverted if you continue to use Secure Boot on that device. Even reformatting of the disk will not remove the revocations if they have already been applied&quot; [@kb5025885].&lt;/p&gt;
&lt;p&gt;{`
// Sketch of what UEFI does for every PE/COFF binary it loads.
function loadImage(image, db, dbx) {
  const hash = authenticodeHash(image);
  const signerCert = parseSignerCert(image);&lt;/p&gt;
&lt;p&gt;  if (dbx.hashes.includes(hash)) return { ok: false, reason: &quot;dbx hash&quot; };
  if (signerCert &amp;amp;&amp;amp; chainsTo(signerCert, dbx.certs)) {
    return { ok: false, reason: &quot;dbx cert&quot; };
  }
  if (db.hashes.includes(hash)) return { ok: true, reason: &quot;db hash&quot; };
  if (signerCert &amp;amp;&amp;amp; chainsTo(signerCert, db.certs)) {
    return { ok: true, reason: &quot;db cert&quot; };
  }
  return { ok: false, reason: &quot;not in db&quot; };
}&lt;/p&gt;
&lt;p&gt;const decision = loadImage(
  { hash: &quot;abc&quot;, signer: &quot;Microsoft Windows Production PCA 2011&quot; },
  { hashes: [], certs: [&quot;Microsoft Windows Production PCA 2011&quot;, &quot;Microsoft Corporation UEFI CA 2011&quot;] },
  { hashes: [], certs: [] }
);
console.log(decision);
`}&lt;/p&gt;
&lt;p&gt;Verification is a one-shot signature check at firmware boundaries. The chain still has to extend all the way to userland. Microsoft&apos;s name for what comes next is &lt;em&gt;Trusted Boot&lt;/em&gt;. And here is the thing the patch-cadence narrative fails to convey: &lt;em&gt;patched is not revoked&lt;/em&gt;. Microsoft can ship a fixed &lt;code&gt;bootmgfw.efi&lt;/code&gt; next month. It cannot delete the old, vulnerable, validly-signed copy from every machine in the world. As long as the old binary&apos;s hash is not in dbx, Secure Boot will load it.&lt;/p&gt;
&lt;h2&gt;5. Trusted Boot: bootmgfw.efi, winload.efi, and the Windows-specific chain&lt;/h2&gt;
&lt;p&gt;Secure Boot can answer &quot;is this &lt;code&gt;.efi&lt;/code&gt; file in our allowlist?&quot; It cannot answer &quot;is every kernel-mode driver loaded after this &lt;code&gt;.efi&lt;/code&gt; file in our allowlist?&quot; That second question is what Trusted Boot exists to answer.&lt;/p&gt;

Microsoft&apos;s term for the post-firmware portion of the verified boot chain. UEFI Secure Boot validates `bootmgfw.efi`. `bootmgfw.efi` validates `winload.efi`. `winload.efi` validates `ntoskrnl.exe`, the Hardware Abstraction Layer, every boot-start driver, and the ELAM driver. `ntoskrnl.exe` validates every driver loaded thereafter against the active code-integrity policy. Trusted Boot is therefore the Microsoft policy enforcement chain layered *on top of* Secure Boot&apos;s firmware-side verifier; it is what extends the signature check past the operating-system loader into kernel mode.
&lt;p&gt;The mechanics, after the firmware hands control to &lt;code&gt;bootmgfw.efi&lt;/code&gt;: the boot manager reads the Boot Configuration Data store, locates &lt;code&gt;winload.efi&lt;/code&gt; (or &lt;code&gt;winresume.efi&lt;/code&gt; for resuming from hibernation), and enforces the boot-time integrity policy on every component it loads [@ms-trusted-boot]. The verifier handoff, however, is more interesting than the Microsoft Learn paragraph suggests. It runs in three stages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage A: &lt;code&gt;winload&lt;/code&gt;&apos;s in-image &lt;code&gt;bootlib&lt;/code&gt; verifier.&lt;/strong&gt; &lt;code&gt;winload.efi&lt;/code&gt; does not call kernel-mode &lt;code&gt;ci.dll&lt;/code&gt; to validate boot images. It carries its own boot-time code-integrity verifier inside the &lt;code&gt;bootlib&lt;/code&gt; boot library shared with &lt;code&gt;bootmgr&lt;/code&gt;. Reverse-engineering work on the Elysium bootkit research framework reconstructed the call chain inside &lt;code&gt;winload.efi&lt;/code&gt;: &lt;code&gt;OslLoadDrivers&lt;/code&gt; -&amp;gt; &lt;code&gt;OslLoadImage&lt;/code&gt; -&amp;gt; &lt;code&gt;LdrpLoadImage&lt;/code&gt; -&amp;gt; &lt;code&gt;BlImgLoadPEImageEx&lt;/code&gt; -&amp;gt; &lt;code&gt;ImgpLoadPEImage&lt;/code&gt;, with &lt;code&gt;ImgpValidateImageHash&lt;/code&gt; performing the Authenticode digest check against the trusted boot policy embedded in &lt;code&gt;winload&lt;/code&gt; itself [@elysium-bootkit]. Boot-start drivers, &lt;code&gt;ntoskrnl.exe&lt;/code&gt;, the Hardware Abstraction Layer, and the ELAM driver all flow through this chain before kernel mode is alive to do anything about it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage B: handoff via &lt;code&gt;LOADER_PARAMETER_EXTENSION&lt;/code&gt;.&lt;/strong&gt; When &lt;code&gt;winload.efi&lt;/code&gt; is done validating, it has to hand the validated state across the loader-kernel boundary. The mechanism is &lt;code&gt;LOADER_PARAMETER_EXTENSION&lt;/code&gt; (LPE), the under-documented structure that hangs off the &lt;code&gt;LOADER_PARAMETER_BLOCK&lt;/code&gt; whose address the loader passes to the kernel.The LPE structure has been Microsoft-internal in every shipping Windows release; the public reference Geoff Chappell maintains is the canonical third-party reverse-engineering of its layout across Windows builds. New fields are added at the tail of the structure when shipping features need to communicate state across the loader/kernel boundary. The fact that Smart App Control&apos;s CI state needed two new LPE fields is a small but telling indicator of how much policy state Trusted Boot now carries. Geoff Chappell&apos;s reference describes the LPE as &quot;part of the mechanism through which the kernel and HAL learn the initialisation data that was gathered by the loader&quot; [@geoffchappell-lpe]. The structure has grown across Windows builds; with Smart App Control on Windows 11 22H2, two new fields -- &lt;code&gt;CodeIntegrityData&lt;/code&gt; and &lt;code&gt;CodeIntegrityDataSize&lt;/code&gt; -- were added so that the loader-validated CI state, including the active SiPolicy and the pre-validated boot-start driver list, would survive the handoff intact [@n4r1b-sac].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stage C: kernel-mode &lt;code&gt;ci.dll&lt;/code&gt; continuation.&lt;/strong&gt; Only after &lt;code&gt;ntoskrnl.exe&lt;/code&gt; is itself running does the kernel-mode &lt;code&gt;ci.dll&lt;/code&gt; come into play. It picks up the SiPolicy state from the LPE and continues the same code-integrity policy enforcement on every kernel-mode image loaded after the loader&apos;s window closes -- principally via the &lt;code&gt;Se&lt;/code&gt;-prefixed validation routines that the kernel&apos;s image-load notification routines call into. From that point, every subsequent driver load goes through the same code-integrity gate. The &lt;code&gt;bootlib&lt;/code&gt; -&amp;gt; LPE -&amp;gt; kernel-mode &lt;code&gt;ci.dll&lt;/code&gt; decomposition is the underlying mechanism Microsoft&apos;s high-level documentation collapses into a single sentence:&lt;/p&gt;

The Windows bootloader verifies the digital signature of the Windows kernel before loading it. The Windows kernel, in turn, verifies every other component of the Windows startup process, including boot drivers, startup files, and your anti-malware product&apos;s early-launch anti-malware (ELAM) driver. -- Microsoft Learn [@ms-trusted-boot]
&lt;p&gt;Trusted Boot is therefore the &lt;em&gt;Windows-specific&lt;/em&gt; extension of the verifier into kernel mode. UEFI Secure Boot is platform-agnostic; it ships in db on every certified PC. Trusted Boot is the policy engine that reuses the firmware-side trust anchor and walks it forward into &lt;code&gt;ntoskrnl.exe&lt;/code&gt;. The mechanism for &lt;em&gt;how&lt;/em&gt; SiPolicy is parsed, how publisher rules are evaluated, and how the kernel&apos;s code-integrity state machine handles attempts to load binaries outside policy, lives in this article&apos;s App Identity sibling and is not redefined here [@app-identity-sibling].&lt;/p&gt;
&lt;p&gt;There is a failure mode you can see coming. If the trusted boot manager itself is signed but vulnerable, the chain still validates, the policy still enforces, and the entire defence is bypassed. The signature is correct; the code path is what is wrong. Section 9 will show what happens when an older &lt;code&gt;bootmgfw.efi&lt;/code&gt; revision contains a memory-map manipulation flaw that lets attacker-controlled data flow before the SiPolicy enforcement engine is up. That is the BlackLotus failure. For now, hold the framing: Trusted Boot&apos;s guarantee is &quot;every kernel-mode component has a valid Microsoft signature.&quot; It is not &quot;every Microsoft signature in this chain corresponds to a binary that is itself secure.&quot;&lt;/p&gt;
&lt;p&gt;Verification can stop loading bad code. It cannot prove that good code was loaded. For that we need a parallel rail.&lt;/p&gt;
&lt;h2&gt;6. Measured Boot: SRTM, the TPM event log, and PCR 0-7+11 in order&lt;/h2&gt;
&lt;p&gt;Verification stops bad code from running. &lt;em&gt;Measurement&lt;/em&gt; makes sure you can prove, after the fact, what code did run. The two rails do not protect against the same thing. This is the article&apos;s mechanism-densest section, and the place a few key terms have to be exactly right.&lt;/p&gt;

A boot-time chain of cryptographic measurements anchored in a Core Root of Trust for Measurement (CRTM): a code segment in the platform&apos;s flash that is implicitly trusted because it is immutable and is *measured by construction* into the TPM before any flexible code runs. SRTM extends one PCR per component as the chain unfolds, producing a tamper-evident log of exactly which firmware, boot manager, and kernel the platform launched. The measurement does not stop bad code; it records what code ran so a verifier can decide later.
&lt;p&gt;The TPM extend primitive is the cryptographic core. The TPM never overwrites a PCR. When the platform asks the TPM to extend PCR &lt;code&gt;N&lt;/code&gt; with a measurement &lt;code&gt;m&lt;/code&gt;, the TPM does:&lt;/p&gt;
&lt;p&gt;$$\mathrm{PCR}[N] := H\bigl(\mathrm{PCR}[N] ,\Vert, m\bigr)$$&lt;/p&gt;
&lt;p&gt;where &lt;code&gt;H&lt;/code&gt; is the bank&apos;s hash algorithm (SHA-1 on TPM 1.2; SHA-1 and SHA-256 banks both required by the TCG PC Client Platform Firmware Profile on TPM 2.0; SHA-384 and SHA3 banks optional and present on some newer parts) and &lt;code&gt;||&lt;/code&gt; is byte concatenation [@syss-bitpixie]. The TPM 2.0 specification was finalised by the Trusted Computing Group on 9 April 2014 [@wp-tpm]. The mechanism guarantees that any later PCR value is a function of every prior measurement in the order it was extended -- you cannot rewind, and you cannot reorder. The TPM 2.0 PC Client profile specifies at least 24 PCRs, the first 16 of which are append-only and non-resettable until the platform itself is reset [@syss-bitpixie]. The full TPM &lt;code&gt;extend&lt;/code&gt; mechanics are covered in this article&apos;s TPM sibling; we do not redefine them here [@tpm-sibling].&lt;/p&gt;
&lt;p&gt;The PCR allocation, per the TCG PC Client Platform Firmware Profile, corroborated against the SySS Bitpixie writeup [@syss-bitpixie] and Microsoft Learn [@ms-secure-boot-process]:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCR&lt;/th&gt;
&lt;th&gt;Extended by&lt;/th&gt;
&lt;th&gt;What it measures&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;CRTM, SEC, PEI&lt;/td&gt;
&lt;td&gt;SRTM core firmware code (BIOS/UEFI)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;PEI / DXE&lt;/td&gt;
&lt;td&gt;Host platform configuration (CPU microcode, NVRAM settings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;DXE&lt;/td&gt;
&lt;td&gt;UEFI driver and application code (option ROMs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;DXE&lt;/td&gt;
&lt;td&gt;UEFI driver and application configuration / data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;DXE / BDS&lt;/td&gt;
&lt;td&gt;Hashes of all boot managers in the boot path; &lt;code&gt;bootmgfw.efi&lt;/code&gt; lands here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;BDS&lt;/td&gt;
&lt;td&gt;Boot manager code config and data; GPT; boot attempts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;DXE / OEM&lt;/td&gt;
&lt;td&gt;Host platform manufacturer specific&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;DXE&lt;/td&gt;
&lt;td&gt;State of Secure Boot: PK, KEK, db, dbx hashes; the &lt;code&gt;SecureBoot&lt;/code&gt; variable; signing certificate of every loaded image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bootmgfw.efi&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BitLocker access control: locked after VMK is obtained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

sequenceDiagram
    participant CRTM
    participant SEC
    participant DXE
    participant BMGR as bootmgfw.efi
    participant TPM as TPM PCRs
    CRTM-&amp;gt;&amp;gt;TPM: extend PCR[0] with SRTM hash
    SEC-&amp;gt;&amp;gt;TPM: extend PCR[1] with platform config
    DXE-&amp;gt;&amp;gt;TPM: extend PCR[2] with option-ROM code
    DXE-&amp;gt;&amp;gt;TPM: extend PCR[7] with Secure Boot state
    DXE-&amp;gt;&amp;gt;TPM: extend PCR[4] with bootmgfw.efi hash
    BMGR-&amp;gt;&amp;gt;TPM: extend PCR[4] with winload.efi hash
    BMGR-&amp;gt;&amp;gt;TPM: extend PCR[7] with signer cert of winload
    BMGR-&amp;gt;&amp;gt;TPM: extend PCR[11] with BitLocker access flag
&lt;p&gt;PCR[7] deserves a section of its own. On modern Windows, &lt;em&gt;PCR[7] is the canonical seal target&lt;/em&gt; for BitLocker. A protector sealed to PCR[7] unwraps cleanly across firmware updates, microcode revisions, and option-ROM changes, because PCR[7] reflects only the Secure Boot state -- the keys in PK, KEK, db, dbx, the &lt;code&gt;SecureBoot&lt;/code&gt; variable, and the signing certificates of loaded images. PCR[0..4] are too volatile for sealing on a real fleet because every BIOS update changes them. PCR[7] changes only when Secure Boot policy itself changes [@syss-bitpixie, @ms-system-guard]. The full BitLocker key hierarchy is covered in this article&apos;s BitLocker sibling [@bitlocker-sibling]; here we are placing PCR[7] in the chain.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Verification stops bad code. Measurement records what code ran. Neither rail is sufficient alone. Modern Windows boot integrity needs both rails reaching the same place -- the kernel and the Secure Kernel -- before user-mode runtime defences take over.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The TCG event log makes the measurement chain useful for more than sealing. Every &lt;code&gt;extend&lt;/code&gt; is logged through the TCG2 EFI Protocol with the hash, the algorithm, and a description of what was measured. A verifier (BitLocker locally; an attestation service remotely) can replay the log to recover &lt;em&gt;which binary hashed to which PCR value&lt;/em&gt;, and -- if the replay does not match the live PCRs -- detect tampering. Microsoft Learn describes exactly that path: &quot;the PC&apos;s firmware logs the boot process, and Windows can send it to a trusted server that can objectively assess the PC&apos;s health&quot; [@ms-secure-boot-process].&lt;/p&gt;
&lt;p&gt;There is a second root of measurement that sidesteps the firmware-trust regress entirely. DRTM -- Dynamic Root of Trust for Measurement -- is late-launched after firmware boot, via Intel TXT&apos;s &lt;code&gt;GETSEC[SENTER]&lt;/code&gt; instruction or AMD&apos;s &lt;code&gt;SKINIT&lt;/code&gt;. It resets PCR[17..22] at locality 4 and re-anchors a measurement chain in a vendor-controlled allowlistable module that does not depend on the DXE phase having been clean [@wp-txt, @ms-system-guard]. Microsoft documents the motivation in plain language:&lt;/p&gt;

There are thousands of PC vendors that produce many models with different UEFI BIOS versions. This creates an incredibly large number of SRTM measurements upon bootup. [@ms-system-guard]
&lt;p&gt;The argument: SRTM measurements are platform-specific. An attestation service that wants to know whether a given device booted clean must hold an allowlist of SRTM measurements covering N OEMs * M models * K firmware revisions. The allowlist explodes; the blocklist is asymmetric in the attacker&apos;s favour. DRTM collapses the allowlist by defining one small, well-known late-launched measurement chain that the attestation service can recognise across every Secured-core PC.&lt;/p&gt;

A late-launched measurement chain that re-anchors trust *after* firmware boot, by using a CPU instruction (`GETSEC[SENTER]` on Intel, `SKINIT` on AMD) to reset a designated set of PCRs and execute a small, vendor-controlled measured launch module. DRTM is Microsoft&apos;s answer to the SRTM allowlist explosion. It powers System Guard Secure Launch, which Windows 10 1809 introduced; on supported hardware, the late-launched module brings up the hypervisor and Secure Kernel from a trust anchor that the firmware cannot influence.
&lt;p&gt;The DRTM PCR allocation is parallel to SRTM but lives in a separate range, PCR[17..22], reset only by the late-launch event. Per the TCG PC Client Platform Firmware Profile (corroborated against the Wikipedia Trusted Execution Technology mirror, since TCG returns HTTP 403 to non-browser fetches) and Microsoft&apos;s System Guard documentation [@wp-txt, @ms-system-guard]:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PCR&lt;/th&gt;
&lt;th&gt;Reset by&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GETSEC[SENTER]&lt;/code&gt; / &lt;code&gt;SKINIT&lt;/code&gt; at locality 4&lt;/td&gt;
&lt;td&gt;DRTM-event measurement and Launch Control Policy hash extended by the SINIT ACM (Intel TXT) or the Secure Loader block hash (&lt;code&gt;SKINIT&lt;/code&gt; on AMD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;locality 4&lt;/td&gt;
&lt;td&gt;Trusted-OS start-up code (the Measured Launch Environment itself)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;locality 4&lt;/td&gt;
&lt;td&gt;Trusted-OS measurement, e.g., OS configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;locality 4&lt;/td&gt;
&lt;td&gt;Trusted-OS measurement, e.g., OS kernel and other code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;locality 4&lt;/td&gt;
&lt;td&gt;Reserved for and defined by the Trusted OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;locality 4&lt;/td&gt;
&lt;td&gt;Reserved for and defined by the Trusted OS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The reset semantics are the load-bearing detail. PCR[0..16] are append-only after platform reset; they cannot be cleared without rebooting the box. PCR[17..22] are different: they can be reset &lt;em&gt;during runtime&lt;/em&gt;, but only by an atomic late-launch event. That asymmetry is what makes DRTM&apos;s anchor verifiable [@wp-txt, @syss-bitpixie].&lt;/p&gt;
&lt;p&gt;The mechanism that enforces it is &lt;em&gt;TPM locality&lt;/em&gt;. Locality is a side-channel attribute on every TPM command identifying which entity issued the request. Locality 0 is general OS and application traffic. &lt;strong&gt;Locality 4 is assertable only by the CPU itself&lt;/strong&gt;, during the atomic &lt;code&gt;GETSEC[SENTER]&lt;/code&gt; (Intel TXT) or &lt;code&gt;SKINIT&lt;/code&gt; (AMD) sequence. The TPM accepts a &lt;code&gt;Reset&lt;/code&gt; of PCR[17..22] only when the request arrives tagged with locality 4. No software running outside the late-launch instruction can forge that tag. That is the structural reason DRTM&apos;s late-launch is verifiable rather than forgeable [@wp-txt].&lt;/p&gt;
&lt;p&gt;The asymmetry pays off for an attestation service. If a remote verifier reads PCR[17] and finds it equal to zero, DRTM did not happen on this boot. If it reads PCR[17] and finds it equal to the iterated extend $\mathrm{PCR}[17] := H\bigl(0 ,\Vert, H(\text{SINIT_ACM_hash} ,\Vert, \text{LCP_hash})\bigr)$ (or, more accurately, the chain of extends the SINIT ACM logged), a CPU-vendor-signed SINIT Authenticated Code Module seeded the chain, and the value is recomputable by the verifier from the published, signed SINIT ACM and the platform&apos;s Launch Control Policy [@wp-txt, @ms-system-guard]. The verifier&apos;s allowlist for DRTM measurements is bounded by the small set of CPU-vendor-signed measured-launch modules in circulation (SINIT ACMs on Intel TXT; the Secure Loader block measured directly by &lt;code&gt;SKINIT&lt;/code&gt; on AMD) -- not by the cross-product of OEMs, models, and firmware revisions.&lt;/p&gt;
&lt;p&gt;{`
// Demonstrates the PCR extend formula:
//   PCR[N] := H( PCR[N] || measurement )
// Run it to see how PCR[4] would evolve as bootmgfw, winload, and ntoskrnl
// hashes are extended one after another.&lt;/p&gt;
&lt;p&gt;const sha256 = (buf) =&amp;gt; createHash(&apos;sha256&apos;).update(buf).digest();&lt;/p&gt;
&lt;p&gt;function extend(pcrHex, measurementHex) {
  const pcr = Buffer.from(pcrHex, &apos;hex&apos;);
  const m = Buffer.from(measurementHex, &apos;hex&apos;);
  return sha256(Buffer.concat([pcr, m])).toString(&apos;hex&apos;);
}&lt;/p&gt;
&lt;p&gt;// Real PCRs start as 32 bytes of zero on a TPM 2.0 reset.
let pcr4 = &apos;00&apos;.repeat(32);&lt;/p&gt;
&lt;p&gt;const measurements = [
  { name: &apos;bootmgfw.efi&apos;, hash: &apos;aa&apos;.repeat(32) },
  { name: &apos;winload.efi&apos;,  hash: &apos;bb&apos;.repeat(32) },
  { name: &apos;ntoskrnl.exe&apos;, hash: &apos;cc&apos;.repeat(32) },
];&lt;/p&gt;
&lt;p&gt;for (const m of measurements) {
  pcr4 = extend(pcr4, m.hash);
  console.log(`after ${m.name}: PCR[4] = ${pcr4.slice(0, 16)}...`);
}
`}&lt;/p&gt;
&lt;p&gt;We now have two rails of trust ready to converge in the kernel. The next thing the kernel has to do is hand control to defenders that can keep the chain alive into runtime.&lt;/p&gt;
&lt;h2&gt;7. ELAM, the kernel, and the Secure Kernel bring-up: where the chain ends&lt;/h2&gt;
&lt;p&gt;Trusted Boot has signed every kernel-mode binary along the path. Then what? The chain still has to outlive the boot.&lt;/p&gt;

A specially-signed driver class introduced in Windows 8 (2012) that loads as the *first* boot-start driver -- ahead of every other boot-start driver -- and classifies each subsequent boot-start driver as *Good*, *Bad*, *Unknown*, or *BadButCritical* before the operating-system loader allows it to load [@ms-elam, @ms-elam-driver-requirements]. ELAM&apos;s classification influences whether Windows loads the driver. The ELAM driver itself is a Microsoft-signed binary in the `Early-Launch` service-start group and is itself measured into the SRTM chain; the user-mode anti-malware service that consumes its classification events runs as a Protected Process Light (PPL).
&lt;p&gt;ELAM exists for a specific reason. The boot-start group includes anti-malware, device, and disk drivers that have to load before the rest of the operating system. Before Windows 8, those drivers all loaded in an undefined order, with no anti-malware product running yet. A bootkit that survived the kernel&apos;s signature check (or a driver that was signed but malicious) had a window in which nothing was watching. ELAM closed that window by ordering one driver -- a Microsoft-signed AM driver -- as the first boot-start driver, and giving it the right to classify those drivers as they loaded [@ms-elam]. ELAM is itself a boot-start driver; the Microsoft documentation specifies the INF requirement plainly: &quot;An ELAM Driver advertises its group as &apos;Early-Launch&apos;&quot; [@ms-elam-driver-requirements]. The associated user-mode anti-malware service runs as a Protected Process Light (PPL), so even SYSTEM-privileged user-mode code cannot inject into it [@ms-elam, @app-identity-sibling].The classification surface ELAM exposes is the four-element set Good / Bad / Unknown / BadButCritical, enumerated in Microsoft&apos;s &lt;code&gt;BDCB_CLASSIFICATION&lt;/code&gt; reference (ntddk.h) as &lt;code&gt;BdCbClassificationKnownGoodImage&lt;/code&gt;, &lt;code&gt;BdCbClassificationKnownBadImage&lt;/code&gt;, &lt;code&gt;BdCbClassificationUnknownImage&lt;/code&gt;, and &lt;code&gt;BdCbClassificationKnownBadImageBootCritical&lt;/code&gt; (the ELAM driver requirements page itself only enumerates three classes in prose; the fourth lives in the enum reference) [@ms-elam-driver-requirements]. The fourth category exists because some drivers are required for the system to boot; the AM driver&apos;s verdict on those is advisory rather than blocking. Defender ships the ELAM driver in Windows; Microsoft&apos;s interface allows third-party AM products to ship their own [@ms-elam].&lt;/p&gt;
&lt;p&gt;The kernel itself does the next set of jobs. &lt;code&gt;ntoskrnl.exe&lt;/code&gt; initialises memory protections and DMA defences. Kernel DMA Protection enables the IOMMU (Intel VT-d or AMD-Vi) so that PCIe peripherals either DMA only to memory their compatible driver has assigned (DMA-Remapping-compatible drivers, enumerated and started normally) or are blocked from starting and performing DMA entirely until an authorised user signs in or unlocks the screen (DMA-Remapping-incompatible drivers, the user-presence-gated default); both regimes block the drive-by-DMA pattern that targets arbitrary kernel memory and defend against malicious Thunderbolt peripherals [@ms-kernel-dma-protection]. The Driver Block List, enforced at code-integrity load time, refuses to load a recognised set of vulnerable signed drivers (the canonical example is &lt;em&gt;gdrv2.sys&lt;/em&gt;); details in this article&apos;s App Identity sibling [@app-identity-sibling]. HVCI (Hypervisor-Enforced Code Integrity, also called Memory Integrity) is loaded inside the Secure Kernel and enforces W^X on all kernel-mode memory; details in the Secure Kernel sibling [@secure-kernel-sibling].&lt;/p&gt;
&lt;p&gt;Then the Secure Kernel comes up. &lt;code&gt;securekernel.exe&lt;/code&gt; and &lt;code&gt;skci.dll&lt;/code&gt; initialise in Virtual Trust Level 1 -- a Hyper-V-managed isolation domain that the normal Windows kernel in VTL0 cannot read or write. The first Trustlet is LSAIso, the isolated process Credential Guard uses to hold NTLM hashes and Kerberos tickets out of reach of any kernel-mode attacker [@secure-kernel-sibling]. Control returns to the normal kernel; the user-mode tail begins.&lt;/p&gt;

flowchart TD
    WL[&quot;winload.efi&quot;] --&amp;gt; NT[&quot;ntoskrnl.exe (VTL0)&quot;]
    NT --&amp;gt; SK[&quot;securekernel.exe (VTL1)&quot;]
    SK --&amp;gt; LSA[&quot;LSAIso (Credential Guard Trustlet)&quot;]
    NT --&amp;gt; ELAM[&quot;ELAM driver&quot;]
    ELAM --&amp;gt; BS[&quot;boot-start drivers (classified by ELAM)&quot;]
    BS --&amp;gt; SMSS[&quot;smss.exe&quot;]
    SMSS --&amp;gt; WI[&quot;wininit.exe&quot;]
    WI --&amp;gt; WL2[&quot;winlogon.exe&quot;]
    WL2 --&amp;gt; UI[&quot;userinit.exe -&amp;gt; explorer.exe&quot;]
&lt;p&gt;The user-mode tail is not security-cryptographic per se. SMSS (the Session Manager) loads system DLLs and starts the first Win32 subsystem session. &lt;code&gt;wininit.exe&lt;/code&gt; initialises the LSA, the Service Control Manager, and the Local Session Manager. &lt;code&gt;winlogon.exe&lt;/code&gt; paints the credential UI, calls into Windows Hello [@no-secrets-to-steal-sibling] if applicable, and authenticates the user. &lt;code&gt;userinit.exe&lt;/code&gt; runs the logon scripts and launches &lt;code&gt;explorer.exe&lt;/code&gt; [@ms-trusted-boot]. From the boot-integrity perspective, &lt;code&gt;userinit&lt;/code&gt; is the moment the static-time guarantees of Trusted Boot end and the runtime defences -- Defender, EDR, attestation -- take over.&lt;/p&gt;
&lt;p&gt;We have walked the chain end to end. The next question is: when did this chain &lt;em&gt;actually start working&lt;/em&gt;?&lt;/p&gt;
&lt;h2&gt;8. The breakthroughs that made the chain land (2014-2024)&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Secure Boot existed&lt;/em&gt; in 2012. &lt;em&gt;Secure Boot worked&lt;/em&gt; (in the sense of defending most of what it claims to defend) only after roughly a decade of operational fixes that almost nobody outside Microsoft and a handful of OEMs ever wrote about. Four breakthroughs deserve naming. The matrix below collates them by &lt;em&gt;layer fixed&lt;/em&gt; and &lt;em&gt;fix-delivery vehicle&lt;/em&gt; before the prose treatments that follow.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Breakthrough&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Layer it fixed&lt;/th&gt;
&lt;th&gt;Fix-delivery vehicle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;B1&lt;/td&gt;
&lt;td&gt;PCR[7] becomes the canonical BitLocker seal target&lt;/td&gt;
&lt;td&gt;~2014-2016&lt;/td&gt;
&lt;td&gt;Sealing brittleness; PCR[0..4] churn vs. firmware-revision cadence&lt;/td&gt;
&lt;td&gt;Windows servicing + BitLocker policy default change [@syss-bitpixie, @ms-system-guard]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2&lt;/td&gt;
&lt;td&gt;Forced retirement of the Microsoft UEFI CA 2011&lt;/td&gt;
&lt;td&gt;May 2023 - June 2026&lt;/td&gt;
&lt;td&gt;Revocation gap (BlackLotus / Baton Drop)&lt;/td&gt;
&lt;td&gt;KB5025885 / CVE-2023-24932 multi-year, opt-in dbx push and CA-2023 enrolment [@kb5025885]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3&lt;/td&gt;
&lt;td&gt;Secure Kernel becomes the launch destination&lt;/td&gt;
&lt;td&gt;Win10 2015 - Win11 2021&lt;/td&gt;
&lt;td&gt;&quot;Kernel signed&quot; is insufficient (TDL-4 lesson)&lt;/td&gt;
&lt;td&gt;OS feature ship and WHCP requirement; HVCI / Driver Block List default-on by 2024 [@ms-trusted-boot, @secure-kernel-sibling]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B4&lt;/td&gt;
&lt;td&gt;Pluton arrives as a Microsoft-firmware-authored RoT&lt;/td&gt;
&lt;td&gt;Nov 2020 announcement; Q1 2022 first silicon&lt;/td&gt;
&lt;td&gt;LPC/SPI bus-sniffing class against discrete TPMs; OEM patch-cadence latency for fTPM/PTT firmware&lt;/td&gt;
&lt;td&gt;Windows-Update-delivered Pluton firmware (alongside UEFI capsule), Rust-based on 2024+ AMD/Intel parts [@ms-pluton]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The first row is operational, not architectural: PCR[7] becoming the canonical BitLocker seal target, somewhere between Windows 8.1 and Windows 10 1607 [@syss-bitpixie, @ms-system-guard]. Before PCR[7], BitLocker sealed against PCR[0..4]: firmware code, platform configuration, option ROMs, option-ROM configuration, and boot-manager hashes. Every UEFI update -- and on real fleets they happen monthly -- changed PCR[0..4] and forced BitLocker into recovery, which forced an IT staffer to find the recovery key, which was annoying enough to make people turn BitLocker off. PCR[7] sealing decoupled the BitLocker protector from the firmware-revision churn and made Measured Boot durable in practice. This is the operational fix that made Measured Boot actually worth running on a fleet of thousands of laptops with monthly UEFI capsule updates.&lt;/p&gt;
&lt;p&gt;The second row is the forced retirement of the Microsoft UEFI CA 2011, which began in May 2023 with KB5025885 and CVE-2023-24932 and is on track to complete in late 2026 [@kb5025885]. This was the first serious dbx housekeeping in a decade. The relevant point: the fix had to be a &lt;em&gt;programme&lt;/em&gt;, not a hotfix, because dbx is too small to handle a one-shot revocation of a CA-rooted set without bricking either some Linux dual-boots or some Windows machines. The CA-2023 rollout phases the work across four years.&lt;/p&gt;
&lt;p&gt;The third was VBS and the Secure Kernel becoming the launch target the boot chain was actually defending. Without the Secure Kernel as a destination, Trusted Boot&apos;s guarantee ended at &quot;the kernel is signed&quot;, which TDL-4 had already shown was insufficient -- a signed kernel is of limited use if the SYSTEM-privileged user-mode code that follows can rewrite kernel memory through a vulnerable signed driver. The Secure Kernel arrived in Windows 10 1507 (2015) and matured into its enforced-by-default form in Windows 11 (2021), at which point the chain had a hardware-isolated destination that even a SYSTEM-level attacker could not reach without a hypervisor exploit [@secure-kernel-sibling].&lt;/p&gt;
&lt;p&gt;The fourth is still landing. Pluton, the cryptoprocessor whose firmware Microsoft (not the OEM) ships and updates, was announced in November 2020 and reached its first silicon -- AMD Ryzen 6000 -- in Q1 2022 [@ms-pluton]. Pluton is not yet ubiquitous, and its Secure Boot story is pending: as of 2026, Pluton ships as a TPM 2.0 implementation [@ms-pluton-as-tpm], not as a replacement verifier. Section 10 unpacks why the Microsoft-firmware-on-silicon-Microsoft-doesnt-own model matters more than the part numbers do.&lt;/p&gt;
&lt;p&gt;These were the operational fixes. The architectural breaks they were responding to are the next section.&lt;/p&gt;
&lt;h2&gt;9. The boot-chain attacks that actually worked&lt;/h2&gt;
&lt;p&gt;There has never been a public Secure Boot attack that broke the cryptographic primitive. Every successful attack has exploited the same gap: between fixing a vulnerability and revoking the signed binaries that carried it. The CVE numbers change. The structure does not.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Scope note: LoJax (ESET, September 2018) was the first real-world UEFI rootkit deployed in the wild, but it operates at the SPI flash layer -- below Secure Boot&apos;s signature verification chain -- and is therefore outside the scope of this table. The table focuses on attacks on the Secure Boot signature-enforcement chain itself.&lt;/em&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attack&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Rung broken&lt;/th&gt;
&lt;th&gt;Prerequisite&lt;/th&gt;
&lt;th&gt;dbx state at disclosure&lt;/th&gt;
&lt;th&gt;Fix path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;ESPecter&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;ESP-resident bootmgr replacement&lt;/td&gt;
&lt;td&gt;Secure Boot disabled&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Enable Secure Boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FinSpy UEFI&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;bootmgfw.efi replaced on ESP&lt;/td&gt;
&lt;td&gt;Secure Boot disabled&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Enable Secure Boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlackLotus / CVE-2022-21894 (Baton Drop)&lt;/td&gt;
&lt;td&gt;2022-23&lt;/td&gt;
&lt;td&gt;Signed-but-vulnerable older bootmgfw&lt;/td&gt;
&lt;td&gt;Patched but unrevoked old binaries&lt;/td&gt;
&lt;td&gt;Old binaries not revoked&lt;/td&gt;
&lt;td&gt;dbx update via KB5025885&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitpixie / CVE-2023-21563&lt;/td&gt;
&lt;td&gt;2022-24&lt;/td&gt;
&lt;td&gt;PXE soft-reboot leaks BitLocker VMK&lt;/td&gt;
&lt;td&gt;TPM-only BitLocker; LAN + keyboard&lt;/td&gt;
&lt;td&gt;n/a (no signature break)&lt;/td&gt;
&lt;td&gt;Pre-boot PIN; KB5025885&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LogoFAIL / CVE-2023-39539 et al.&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;DXE-phase image-parser RCE&lt;/td&gt;
&lt;td&gt;UEFI logo customisation accepting attacker BMP&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;OEM UEFI updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bootkitty&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Self-signed PoC; Secure Boot disabled or LogoFAIL&lt;/td&gt;
&lt;td&gt;Linux target&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Enable Secure Boot; patch LogoFAIL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinRE / CVE-2024-20666 family&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Recovery Environment downgrade&lt;/td&gt;
&lt;td&gt;TPM-only BitLocker; reachable WinRE&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;Servicing stack updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ESPecter (ESET, October 2021) [@eset-especter] is the simplest case. It is an ESP-resident bootkit that bypasses Driver Signature Enforcement to load its own unsigned kernel driver -- but only on systems with Secure Boot disabled. ESPecter is in the table to make the category visible: the ESP is a writable FAT partition with no signature on the contents, and any malware that can write to the ESP and persuade the firmware to boot from a different &lt;code&gt;bootmgfw&lt;/code&gt; path can win on a non-Secure-Boot system. The fix is to turn Secure Boot on.&lt;/p&gt;
&lt;p&gt;FinSpy (Kaspersky, September 2021) [@kaspersky-finspy] is the same attack family carrying an actual nation-state-grade payload. Kaspersky&apos;s GReAT analysis names the mechanism plainly: &quot;All machines infected with the UEFI bootkit had the Windows Boot Manager (&lt;code&gt;bootmgfw.efi&lt;/code&gt;) replaced with a malicious one.&quot; The malicious &lt;code&gt;bootmgfw&lt;/code&gt; injected code into &lt;code&gt;winlogon.exe&lt;/code&gt; for persistence. Again, Secure Boot disabled was the precondition. FinSpy was the proof that the ESP-resident category had real-world tradecraft attached, not just academic interest.&lt;/p&gt;
&lt;p&gt;BlackLotus (advertised on hacking forums from at least October 2022 [@eset-blacklotus]; ESET writeup 1 March 2023) is the case that defines the modern era [@eset-blacklotus, @wack0-batondrop]. BlackLotus does not disable Secure Boot. It chain-loads a legitimately-signed but vulnerable older &lt;code&gt;bootmgfw.efi&lt;/code&gt; revision. The vulnerability is CVE-2022-21894, nicknamed &lt;em&gt;Baton Drop&lt;/em&gt;: an older boot manager honoured a &lt;code&gt;truncatememory&lt;/code&gt; setting that removed blocks of memory containing serialised data structures from the memory map. The Wack0 PoC repository describes the primitive: &quot;Windows Boot Applications allow the truncatememory setting to remove blocks of memory containing &apos;persistent&apos; ranges of serialised data from the memory map, leading to Secure Boot bypass&quot; [@wack0-batondrop]. The chain: boot the legitimately-signed older bootmgfw; trigger Baton Drop; install a malicious SiPolicy that disables further checks; load an unsigned kernel driver; persistently disable HVCI, BitLocker, and Defender from below the trusted-boot horizon. Microsoft&apos;s incident-response guide for BlackLotus enumerates six classes of detection artefact: recently-written ESP files, staging directories, registry entries, event-log evidence of policy changes, network indicators, and BCD-log modifications [@ms-blacklotus-guidance]. The NSA and CISA published a joint mitigation guide on 22 June 2023 [@nsa-blacklotus]. ESET&apos;s epitaph is the article&apos;s recurring quote:&lt;/p&gt;

Exploitation is still possible as the affected, validly signed binaries have still not been added to the [UEFI revocation list]. -- Martin Smolar, ESET, March 2023 [@eset-blacklotus]

sequenceDiagram
    participant Attacker
    participant ESP as EFI System Partition
    participant FW as UEFI firmware
    participant BMGR as bootmgfw (older signed)
    participant OS as Windows kernel
    Attacker-&amp;gt;&amp;gt;ESP: drop legit but old signed bootmgfw
    FW-&amp;gt;&amp;gt;BMGR: LoadImage() -- signature OK, hash NOT in dbx
    Attacker-&amp;gt;&amp;gt;BMGR: trigger CVE-2022-21894 (truncatememory)
    BMGR-&amp;gt;&amp;gt;BMGR: install malicious SiPolicy
    BMGR-&amp;gt;&amp;gt;OS: load unsigned driver
    OS-&amp;gt;&amp;gt;OS: disable HVCI, BitLocker, Defender
&lt;p&gt;The &quot;disables HVCI / BitLocker / Defender from below the trusted-boot horizon&quot; framing in the caption is verbatim from the ESET disclosure and is reinforced by Microsoft&apos;s own incident-response guide [@eset-blacklotus, @ms-blacklotus-guidance].&lt;/p&gt;
&lt;p&gt;Bitpixie / CVE-2023-21563 [@neodyme-bitpixie, @syss-bitpixie] is BlackLotus&apos; twin in BitLocker space. The vulnerability was discovered by &lt;code&gt;Rairii&lt;/code&gt; in August 2022; Thomas Lambertz of Neodyme published a public PoC at 38C3 in December 2024. The mechanism is a downgrade. The attacker boots the target machine into Windows&apos; PXE network-recovery soft-reboot path, which loads a Microsoft-signed but older &lt;code&gt;bootmgfw.efi&lt;/code&gt; revision. That older revision does not erase the BitLocker VMK from physical memory before the PXE soft-reboot hands off, leaving the VMK in RAM where the chained payload (a signed Linux PE or downgraded WinPE) can dump it. The combination of TPM-only BitLocker (no pre-boot PIN), a Microsoft-Account-defaulted Windows 11 install (which biases toward TPM-only encryption), and physical access to a network port and keyboard, decrypts the disk in minutes. Lambertz&apos; framing: &quot;All an attacker needs is the ability to plug in a LAN cable and keyboard to decrypt the disk&quot; [@neodyme-bitpixie]. Bitpixie does not break Secure Boot. It exploits the same operational invariant -- old-but-signed binaries still validate -- in a different protection domain.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; TPM-only BitLocker is no longer a defensible default on Windows 11 once Bitpixie&apos;s PoC is public; the attack reduces to a LAN cable and a keyboard. See Section 11&apos;s &lt;code&gt;Replace TPM-only BitLocker&lt;/code&gt; bullet for the pre-boot-factor fix list [@neodyme-bitpixie, @kb5025885].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bootkitty (ESET, 27 November 2024) [@eset-bootkitty] closes a symmetry. Twelve years after Andrea Allievi&apos;s September 2012 PoC -- the first UEFI bootkit designed for Windows 8 [@theregister-allievi] -- Bootkitty is the first UEFI bootkit aimed at Linux. Bootkitty was uploaded as a self-signed PoC, so on systems with Secure Boot enabled, it does not load unless the attacker&apos;s certificate has been enrolled in the Machine Owner Key (MOK) list -- either by a user via &lt;code&gt;mokutil&lt;/code&gt; (the ordinary Linux path), by a prior compromise enrolling the cert, or by chaining LogoFAIL (CVE-2023-40238) to inject a rogue MOK certificate from a malicious BMP, as Binarly demonstrated [@binarly-logofail-bootkitty]. Bootkitty patches kernel-image-integrity functions and pre-loads ELF binaries via &lt;code&gt;init&lt;/code&gt;. ESET later updated the attribution: an analysis posted in early December 2024 traced the build to a Korean Best of the Best (BoB) student project. The structural lesson is platform-orthogonal -- Secure Boot&apos;s gaps live in the firmware and revocation surfaces, not in any one operating system.&lt;/p&gt;

The Allievi 2012 ITSEC PoC was *the first UEFI bootkit*, full stop -- a research artefact that demonstrated, on Windows 8, the same trick BootRoot had demonstrated on the Windows NT/2000/XP MBR seven years earlier. Twelve years later, Bootkitty is the first UEFI bootkit *for Linux*, also a research artefact. The arc closes a symmetry: UEFI&apos;s verifier is platform-agnostic, so its weaknesses are too. A LogoFAIL-style image-parser bug in DXE compromises Secure Boot whether the operating system above it is Windows or Ubuntu. The attacker community needed twelve years to apply the technique to the second platform, but only because the second platform&apos;s market share for boot-chain attacks was smaller, not because the verifier was structurally any safer.
&lt;p&gt;LogoFAIL (Binarly REsearch, Black Hat EU 2023; CVE-2023-39539, CVE-2023-40238, CVE-2023-5058; advisory BRLY-2023-006) is the most architectural of the breaks because it compromises the verifier itself. The DXE phase parses a customisable boot logo image -- the OEM splash screen displayed on power-on -- and the parser is a piece of firmware code accepting an attacker-controlled input. Binarly demonstrated parser bugs in the BMP, GIF, JPEG, PCX, and TGA decoders shipped in reference code by all three major Independent BIOS Vendors -- AMI, Insyde, and Phoenix -- across roughly six hundred enterprise device models. A successful exploit gives the attacker code execution at the DXE phase, which is &lt;em&gt;below&lt;/em&gt; Secure Boot&apos;s &lt;code&gt;LoadImage()&lt;/code&gt; verifier. From DXE, the attacker can do whatever they want before the operating-system loader runs. Bootkitty later carried a LogoFAIL exploit (CVE-2023-40238) to inject a rogue MOK certificate from a malicious BMP, demonstrating the chain end to end [@binarly-logofail-bootkitty].&lt;/p&gt;
&lt;p&gt;Finally, the WinRE / &lt;code&gt;ReAgent.xml&lt;/code&gt; downgrade family (CVE-2024-20666 and successors) is the smaller cousin of the bigger story [@nvd-cve-2024-20666]. The Recovery Environment is a Windows partition with its own boot path; older WinRE images that contain unrevoked vulnerable &lt;code&gt;bootmgr.efi&lt;/code&gt; revisions can be persuaded to mount the encrypted volume under attacker control. The attack does not break the Secure Boot chain; it routes around it. The point of including it in this catalogue: it is another instance of the dbx-revocation-by-hash limit. As long as an older signed binary exists and is reachable, Secure Boot&apos;s verifier will validate it.&lt;/p&gt;
&lt;p&gt;Every attack here exploits the same operational invariant: the gap between &lt;em&gt;patched&lt;/em&gt; and &lt;em&gt;revoked&lt;/em&gt; is wide, and dbx is too small to close it. The next section examines whether anything can.&lt;/p&gt;
&lt;h2&gt;10. Theoretical limits, open problems, and the Pluton pivot&lt;/h2&gt;
&lt;p&gt;If every break has been operational, why has nobody fixed the operations? Because the operational bounds are themselves theoretical.&lt;/p&gt;
&lt;p&gt;Six structural limits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The verifier-of-verifiers regress.&lt;/strong&gt; Secure Boot&apos;s verifier is firmware code that itself must be trusted. Boot Guard and AMD PSB push that root one rung deeper, into silicon ROM and OTP fuses [@ioactive-psb, @wp-txt]. Pluton arguably pushes it one rung deeper still, into silicon Microsoft directly updates. There is no software-only bottom turtle. Every architecture in the field has &lt;em&gt;some&lt;/em&gt; layer that is trusted because there is no further layer to which trust can be deferred. The engineering question is &lt;em&gt;which party&lt;/em&gt; owns that layer -- OEM, Intel, AMD, or Microsoft via Pluton -- and &lt;em&gt;on whose update cadence&lt;/em&gt; the layer can be patched. IOActive&apos;s 2024 review of AMD PSB found that &quot;various major vendors fail to&quot; configure PSB correctly [@ioactive-psb], which is the kind of operational failure mode no cryptographic primitive can fix.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why dbx revocation is hard.&lt;/strong&gt; dbx is small, shared with Linux, vendor-implemented, and a brick-risk if mismanaged. The list stayed nearly empty for a decade until BlackLotus forced KB5025885&apos;s multi-year program [@nvd-cve-2023-24932]. SBAT (Secure Boot Advanced Targeting), the partial answer in the rhboot/shim project [@sbat-shim], revokes by &lt;em&gt;generation number&lt;/em&gt; rather than by image hash. SBAT works by embedding a CSV-formatted vendor-and-component-version table in every shim-signed binary; when the firmware-side SBAT policy variable says &quot;minimum acceptable shim generation is 4&quot;, every older shim hashes correctly but is refused for being too old. SBAT collapses tens of revocation events that would each consume hundreds of bytes of dbx into a single small metadata bump. The UEFI Forum has, since 2024, deferred to the canonical Microsoft-managed &lt;code&gt;secureboot_objects&lt;/code&gt; GitHub repository [@ms-secureboot-objects] as the source of truth for KEK, db, and dbx contents.&lt;/p&gt;

A revocation scheme designed by the rhboot/shim project to address dbx capacity exhaustion. Instead of revoking each vulnerable signed binary by Authenticode hash (which consumes ~32 bytes of dbx per binary), SBAT revokes by *generation number*: each signed component carries a CSV-formatted version table; a small SBAT policy variable in firmware specifies the minimum generation accepted; older builds are refused without consuming dbx capacity. SBAT is the project&apos;s structural answer to the cohort-revocation problem the §4 Sidenote quantifies.
&lt;p&gt;The SBAT generation-number scheme is also the model the Microsoft UEFI CA 2023 rollout extends across the wider Windows install base. KB5025885&apos;s mitigation strategy combines a small set of dbx hash revocations with a CA rotation, because no single mechanism by itself can revoke a decade&apos;s worth of signed bootloaders within the dbx storage budget [@kb5025885, @sbat-shim].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The signed-but-vulnerable problem.&lt;/strong&gt; As long as Microsoft-signed bootloaders with known flaws exist on the install media of any production Windows installation, Secure Boot must revoke by hash, by SVN, by SiPolicy, or by certificate -- each with collateral damage. Hash revocation does not cover binaries the attacker has not yet seen. SVN revocation forces a rebuild of every signed binary across the install base. SiPolicy revocation depends on the SiPolicy update reaching every machine. CA rotation breaks PXE recovery, recovery USBs, dual-boot Linux, and custom WinPE images.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supply chain at the firmware level.&lt;/strong&gt; LogoFAIL, BMC-resident attacks against rack servers, Boot Guard key leaks (which OTP fuses cannot recover from), and OEM ME/PSP fuse misconfiguration are the categories Secure Boot cannot, by construction, defend against. The verifier sits above these layers; if these layers are compromised, the verifier is running on a base it cannot trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SRTM allowlist explosion.&lt;/strong&gt; N OEMs, M models, K firmware revisions; the allowlist of &quot;good SRTM measurements&quot; explodes; the blocklist is asymmetric in the attacker&apos;s favour. DRTM late-launch is the only known way to collapse the allowlist. As Microsoft puts it, &quot;DRTM lets the system freely boot into untrusted code initially, but shortly after launches the system into a trusted state&quot; [@ms-system-guard].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bus interception of discrete TPMs.&lt;/strong&gt; A discrete TPM on the LPC or SPI bus can be sniffed by a physical attacker. This is what motivates the move to Pluton: the TPM moves on-die, the bus disappears, and the BitLocker VMK no longer crosses a sniffable wire [@tpm-sibling].&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key idea:&lt;/strong&gt; Every public Secure Boot break has exploited the gap between &lt;em&gt;patched&lt;/em&gt; and &lt;em&gt;revoked&lt;/em&gt;, not the cryptographic primitive. The dbx revocation half-life is the article&apos;s invariant. Pluton closes the cadence gap on the verifier-update side. It does not close the gap between patched and revoked.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Pluton pivot.&lt;/strong&gt; Pluton&apos;s pitch, for the boot chain, is to re-anchor both the verification root (long term) and the measurement endpoint (today) in silicon Microsoft can patch [@ms-pluton, @ms-pluton-as-tpm]. Pluton implements TPM 2.0 on the CPU die, so the existing measurement chain plugs in unchanged. What changes is the &lt;em&gt;firmware update cadence&lt;/em&gt; -- Pluton firmware ships through Windows Update as an additional channel alongside existing UEFI capsule updates; the key difference is that Microsoft authors and controls the firmware, and the Windows Update path enables Microsoft to deliver fixes independent of OEM release scheduling. The bus disappears: Pluton&apos;s interface is on-die--there is no external LPC or SPI bus crossing a package boundary that can be physically tapped, eliminating bus-sniffing as an attack class. And on 2024+ AMD and Intel parts, the Pluton firmware itself is written in Rust, addressing the memory-safety class of bugs that has historically dominated firmware CVEs [@ms-pluton].&lt;/p&gt;

flowchart LR
    subgraph Discrete[&quot;Discrete TPM&quot;]
        CPU1[&quot;CPU&quot;] -- LPC/SPI bus&lt;br /&gt;(sniffable) --&amp;gt; dTPM[&quot;dTPM (Infineon, STM)&quot;]
    end
    subgraph PlutonTopo[&quot;Pluton&quot;]
        CPU2[&quot;CPU&quot;] -- on-die mailbox --&amp;gt; PL[&quot;Pluton&quot;]
    end

The first reaction to &quot;dbx is too small&quot; is always: make it bigger. Three constraints stop that. First, dbx is implemented by hundreds of OEM firmware vendors against a UEFI specification floor; raising the floor would invalidate every shipped UEFI implementation. Second, dbx is shared between Windows, Linux, ESXi, and other operating systems, so growing it requires coordination across vendors with different incentives. Third -- and the real blocker -- the variable lives in NV-RAM with limited write cycles; a runaway revocation update can brick a board if the write fails partway through. The realistic fix is SBAT for image-version bumps and CA rotation for cohort-scale revocation. Both are partial.

Pluton&apos;s design only makes sense against the contrast with the two endpoints of the design space.&lt;p&gt;At one endpoint sits Apple. Apple authors the silicon, the Boot ROM, the iBoot bootloader, the kernel, and the Secure Enclave Processor&apos;s sepOS firmware. The Apple Boot ROM holds the Apple Root certificate authority public key directly; it verifies iBoot before iBoot loads anything else; on older A-series parts an additional Low-Level Bootloader stage is verified by the Boot ROM and in turn loads and verifies iBoot [@apple-boot]. The Secure Enclave Processor is &quot;a dedicated secure subsystem integrated into Apple SoC&quot;, isolated from the main processor and reachable only over a mailbox interface; sepOS is an L4 microkernel Apple ships and updates [@apple-sep]. Every stage of secure boot is signed by the same vendor that ships the operating system, and &quot;secure boot begins in silicon and builds a chain of trust through software&quot; [@apple-system]. The cadence is the iOS / iPadOS / macOS update cadence -- Apple-cadence -- because the same release pipeline ships everything from the Boot ROM update vehicle to the user-facing apps.&lt;/p&gt;
&lt;p&gt;At the other endpoint sits Trusted Firmware-A on Armv7-A and Armv8-A platforms. TF-A is the reference secure-world software stack with a Secure Monitor at Exception Level 3 [@tfa-home]. The Trusted Board Boot feature implements Arm&apos;s TBBR-CLIENT specification (DEN0006D): &quot;The Trusted Board Boot (TBB) feature prevents malicious firmware from running on the platform by authenticating all firmware images up to and including the normal world bootloader&quot; [@tfa-tbb]. The chain runs BL1 -&amp;gt; BL2 -&amp;gt; BL31 / BL32 -&amp;gt; BL33, anchored on a ROTPK (Root of Trust Public Key) fused per silicon family. Because TBBR is a specification rather than a single shipping product, the actual signing keys and update cadence are the OEM&apos;s choice. The silicon vendor sets the fuse policy; the platform vendor signs the boot images; the operating-system vendor sees a verified BL33 handoff and trusts whatever ROTPK the silicon was fused with. There is no monoculture, and there is no single update cadence -- which is exactly what makes the security guarantees uneven across Arm devices in practice.&lt;/p&gt;
&lt;p&gt;Pluton sits between Apple and TF-A. Microsoft authors the firmware (vendor-monopoly trust anchor) on silicon Microsoft does not own (AMD, Intel, Qualcomm fabricate it) [@ms-pluton]. The contrast is sharpest at the firmware-update cadence. Apple-cadence ships everything as one. OEM-UEFI-capsule-cadence is what discrete TPMs and PCH-isolated fTPM/PTT firmware are stuck with -- which is why a known-bad fTPM firmware can take months to land on every customer device after Microsoft posts a fix. Windows-Update-cadence is what Pluton offers: a Microsoft-authored firmware update riding the same channel that ships kernel patches. The same axis -- &lt;em&gt;who&lt;/em&gt; owns the trust anchor and &lt;em&gt;on whose schedule&lt;/em&gt; it ships -- is the axis on which the article&apos;s main Pluton argument turns.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;There are honest residual limits. Pluton is a TPM, not a verification chain; the rest of Secure Boot still runs in DXE-phase firmware that LogoFAIL can compromise. Adoption is non-universal -- as of 2026, Pluton ships on Microsoft Surface, AMD Ryzen 6000-9000/AI series, a subset of Intel Core Ultra (200V / Series 3) parts, and Qualcomm Snapdragon 8cx Gen 3 / X parts powering Copilot+ PCs, with many enterprise PCs still on discrete TPMs [@ms-pluton]. The OEM still owns PK and the firmware update path &lt;em&gt;outside&lt;/em&gt; Pluton, so the dbx-revocation problem and the OEM-key-leak problem are unaddressed by Pluton alone. Attestation infrastructure -- Device Health Attestation, Intune device-health Conditional Access -- is still maturing, and the policies that consume attestation outcomes are still hand-rolled per organisation.&lt;/p&gt;
&lt;p&gt;Pluton closes the cadence gap. It does not close the gap between &lt;em&gt;patched&lt;/em&gt; and &lt;em&gt;revoked&lt;/em&gt; -- nothing yet does, and that is the next decade&apos;s problem.&lt;/p&gt;
&lt;h2&gt;11. Practical guide, FAQ, and where the chain goes next&lt;/h2&gt;
&lt;p&gt;This is the part you do today, on whatever Windows machine is in front of you, before this article ages another year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verify Secure Boot state.&lt;/strong&gt; Open an elevated PowerShell prompt and run &lt;code&gt;Confirm-SecureBootUEFI&lt;/code&gt;. The cmdlet returns &lt;code&gt;True&lt;/code&gt; only if Secure Boot is currently enforcing. &lt;code&gt;msinfo32&lt;/code&gt; shows BIOS Mode (UEFI vs Legacy) and Secure Boot State on its System Summary page. &lt;code&gt;Get-SecureBootPolicy&lt;/code&gt; reveals which Secure Boot policy GUID is in force; the default Microsoft policy on a healthy modern install is &lt;code&gt;{77fa9abd-0359-4d32-bd60-28f4e78f784b}&lt;/code&gt; (the Microsoft owner GUID for the canonical KEK/db/dbx variables) [@ms-secureboot-objects]. &lt;code&gt;Get-Tpm&lt;/code&gt; and &lt;code&gt;tpmtool getdeviceinformation&lt;/code&gt; confirm that the TPM is present, owned, and ready [@ms-trusted-boot, @ms-secure-boot-process].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Read the TPM event log.&lt;/strong&gt; &lt;code&gt;tpmtool gatherlogs&lt;/code&gt; collects the WBCL files into a working folder you can inspect; &lt;code&gt;Get-WinEvent -LogName Microsoft-Windows-TPM-WMI&lt;/code&gt; exposes the boot and provisioning events. On a healthy boot, the WBCL and the live PCR state replay to the same digest; mismatch is the attestation signal a remote verifier looks for.&lt;/p&gt;

The following one-liner gathers the basic state in elevated PowerShell:&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;&quot;&quot; |
  Select-Object @{n=&apos;SecureBoot&apos;; e={ Confirm-SecureBootUEFI }},
                @{n=&apos;SBPolicy&apos;;  e={ (Get-SecureBootPolicy).Publisher }},
                @{n=&apos;TPMReady&apos;;  e={ (Get-Tpm).TpmReady }},
                @{n=&apos;UEFI/BIOS&apos;; e={ (Get-CimInstance Win32_BIOS).SMBIOSBIOSVersion }} |
  Format-List
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;SecureBoot&lt;/code&gt; is &lt;code&gt;False&lt;/code&gt;, your boot chain has no firmware-side allowlist. If &lt;code&gt;TPMReady&lt;/code&gt; is &lt;code&gt;False&lt;/code&gt;, BitLocker is sealing to nothing -- recovery-key escrow is your only protector.
&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verify your Windows UEFI CA 2023 enrolment.&lt;/strong&gt; KB5025885 is a phased deployment; the relevant deployment phase is recorded in the registry under &lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Control\Secureboot\AvailableUpdates&lt;/code&gt; (or the equivalent CSV in the support article) [@kb5025885]. The current UEFI db can be inspected with &lt;code&gt;Get-SecureBootUEFI db&lt;/code&gt; and &lt;code&gt;Format-SecureBootUEFI&lt;/code&gt;. The 2023 CA&apos;s certificate has subject CN &lt;code&gt;Windows UEFI CA 2023&lt;/code&gt;. If you do not see it in db and you are running a Windows install that has been online during 2025-2026, the deployment programme has not reached your device; consult the KB article for the next steps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The 2011 CA expires in late June 2026. After that, signed-but-old bootloaders that depend on the 2011 CA will not validate without explicit dbx housekeeping. If your install media is older than May 2023 and you have not run a full set of cumulative updates, you may end up with a machine that boots today but cannot boot a future Windows recovery image. The fix is to apply the KB5025885 updates and verify the 2023 CA is enrolled before that deadline [@kb5025885].&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Enable DRTM / System Guard Secure Launch where the silicon supports it.&lt;/strong&gt; The control surfaces are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MDM CSP: &lt;code&gt;DeviceGuard/ConfigureSystemGuardLaunch&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Group Policy: &lt;em&gt;Computer Configuration &amp;gt; Administrative Templates &amp;gt; System &amp;gt; Device Guard &amp;gt; Turn On Virtualization Based Security &amp;gt; Secure Launch Configuration&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Registry: &lt;code&gt;HKLM\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\SystemGuard\Enabled = 1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Verify via &lt;code&gt;msinfo32&lt;/code&gt;: under &lt;em&gt;System Summary&lt;/em&gt; the &lt;em&gt;Virtualization-based Security Services Configured / Running&lt;/em&gt; line should include &lt;em&gt;Secure Launch&lt;/em&gt; [@ms-system-guard].&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Replace TPM-only BitLocker.&lt;/strong&gt; After Bitpixie, TPM-only BitLocker is no longer a defensible default. Add a pre-boot PIN (&lt;code&gt;manage-bde -protectors -add C: -tpmAndPin&lt;/code&gt;), a USB key, or use device encryption with pre-boot authentication [@neodyme-bitpixie, @syss-bitpixie].&lt;/p&gt;
&lt;p&gt;{`
// JavaScript analogue of the PowerShell one-liner above. The real cmdlets
// query NV variables and the TPM driver directly; this just shows the shape
// of what a remote attestation collector would assemble.&lt;/p&gt;
&lt;p&gt;function healthCheck(state) {
  return {
    secureBoot:  state.secureBoot === true,
    sbPolicyGuid: state.policyGuid ?? &apos;unknown&apos;,
    tpmReady:    state.tpmReady === true,
    pcr7:        state.pcr7,
    caEnrolled:  state.dbCerts.includes(&apos;Windows UEFI CA 2023&apos;),
    notes:       []
  };
}&lt;/p&gt;
&lt;p&gt;const live = healthCheck({
  secureBoot:  true,
  policyGuid:  &apos;{77fa9abd-0359-4d32-bd60-28f4e78f784b}&apos;,
  tpmReady:    true,
  pcr7:        &apos;0xab4c...&apos;,
  dbCerts:     [&apos;Microsoft Windows Production PCA 2011&apos;, &apos;Microsoft Corporation UEFI CA 2011&apos;, &apos;Windows UEFI CA 2023&apos;]
});&lt;/p&gt;
&lt;p&gt;console.log(live);
`}&lt;/p&gt;

No. Secure Boot defends the boot chain. Ransomware targets user data after the operating system is up and the user is logged in, so it sees a signed Windows kernel exactly as it should. The defences against ransomware are runtime: Defender, EDR, Controlled Folder Access, and offline backups. Secure Boot is a precondition for trusting the operating system that hosts those runtime defences, but it is not a runtime defence itself.

Yes, via the Microsoft-signed `shim`. The maintenance burden: keep `shim` current under the Windows UEFI CA 2023 rollout (`shim-signed`, `shim-x64`, `mokutil` packages on most distributions) or your Linux install will lose its boot path when older `shim` builds are revoked. See `The shim escape hatch` Aside in §4 for the underlying mechanism [@sbat-shim].

Yes. Pluton replaces the TPM, not the signature-verification chain. Pluton is a cryptoprocessor: it implements TPM 2.0 on the CPU die, holds keys, performs `extend` operations, and signs attestations [@ms-pluton-as-tpm]. Secure Boot is the firmware-side `LoadImage()` allowlist check. The two rails are complementary, not substitutes -- Pluton makes Measured Boot&apos;s endpoint better; it does not replace Secure Boot&apos;s verifier.

The 2011 CA is being revoked. You need a `shim` signed by the 2023 CA. Update from your distribution&apos;s secure-boot package (the canonical names are `shim-signed`, `shim-x64`, or `mokutil`). If your installation media is older than May 2023 and you have not run distribution updates, expect breakage somewhere between your next dbx update and the June 2026 expiry [@kb5025885, @sbat-shim].

Not as a default. After Bitpixie / CVE-2023-21563, TPM-only BitLocker can be defeated with a LAN cable and a keyboard on a Windows 11 install with Microsoft Account defaults. See `Replace TPM-only BitLocker` in Section 11 for the fix list [@neodyme-bitpixie].

Trusted Boot is *signature-policy enforcement*: `bootmgfw.efi` and `winload.efi` refuse to load any kernel-mode binary whose Authenticode hash or signer is not in the trusted-boot policy, and the kernel-mode `ci.dll` continues that enforcement after handoff. Measured Boot is *hash-into-PCR recording*: every binary that loads is also extended into a TPM PCR so a verifier (BitLocker locally, an attestation service remotely) can later prove what code ran. Trusted Boot stops bad code; Measured Boot records what code ran. They run in parallel, not in sequence [@ms-trusted-boot, @ms-secure-boot-process].
&lt;p&gt;The chain is longer than it has ever been. It is not yet long enough.&lt;/p&gt;
&lt;p&gt;The next article in this series picks up where &lt;code&gt;userinit&lt;/code&gt; ends. Once Windows is running, the question shifts from &lt;em&gt;which code loaded?&lt;/em&gt; to &lt;em&gt;what does this device look like to a remote verifier right now?&lt;/em&gt; Device Health Attestation, runtime measurement of the running kernel and Secure Kernel, and Conditional Access decisions tied to attestation outcomes are the runtime continuation of everything we walked through here. Pluton on the boot chain feeds Pluton-rooted attestation at runtime. Secure Boot ends at the desktop. The runtime chain begins there.&lt;/p&gt;
&lt;p&gt;&amp;lt;StudyGuide slug=&quot;secure-boot-in-windows&quot; keyTerms={[
  { term: &quot;Bootkit&quot;, definition: &quot;Malware that survives operating-system reinstallation by infecting code that runs before the operating system loads -- MBR, ESP, firmware, or below.&quot; },
  { term: &quot;UEFI Platform Initialization (PI)&quot;, definition: &quot;Four-phase firmware pipeline (SEC, PEI, DXE, BDS); Secure Boot&apos;s verifier lives in DXE.&quot; },
  { term: &quot;PK / KEK / db / dbx&quot;, definition: &quot;Authenticated UEFI variables: Platform Key, Key Exchange Key, allowlist, denylist.&quot; },
  { term: &quot;Trusted Boot&quot;, definition: &quot;Microsoft&apos;s policy enforcement chain from bootmgfw.efi through winload.efi, ntoskrnl.exe, ELAM, and every boot-start driver.&quot; },
  { term: &quot;SRTM&quot;, definition: &quot;Static Root of Trust for Measurement: the boot-time chain of TPM extends anchored in the immutable CRTM.&quot; },
  { term: &quot;DRTM&quot;, definition: &quot;Dynamic Root of Trust for Measurement: late-launched via GETSEC[SENTER] or SKINIT to re-anchor measurement after firmware boot.&quot; },
  { term: &quot;ELAM&quot;, definition: &quot;Early Launch Anti-Malware: a specially-signed driver class that loads as the first boot-start driver, ahead of every other boot-start driver, and classifies them Good/Bad/Unknown/BadButCritical.&quot; },
  { term: &quot;PCR[7]&quot;, definition: &quot;Platform Configuration Register holding the state of Secure Boot; the canonical BitLocker seal target on modern Windows.&quot; },
  { term: &quot;Baton Drop&quot;, definition: &quot;CVE-2022-21894: a memory-map manipulation primitive in older signed bootmgfw.efi revisions that BlackLotus used to bypass Secure Boot.&quot; },
  { term: &quot;Bitpixie&quot;, definition: &quot;CVE-2023-21563: older signed bootmgfw.efi revisions do not erase the BitLocker VMK from physical memory before the PXE soft-reboot handoff, leaving the VMK in RAM where a downgraded payload chain-loaded over PXE can dump it.&quot; },
  { term: &quot;SBAT&quot;, definition: &quot;Secure Boot Advanced Targeting: rhboot/shim&apos;s generation-number revocation scheme, the partial answer to dbx capacity exhaustion.&quot; },
  { term: &quot;Pluton&quot;, definition: &quot;Microsoft&apos;s cryptoprocessor on the CPU die, implementing TPM 2.0, with firmware delivered by Microsoft via Windows Update.&quot; }
]} /&amp;gt;&lt;/p&gt;
</content:encoded><category>secure-boot</category><category>windows-security</category><category>uefi</category><category>measured-boot</category><category>tpm</category><category>pluton</category><category>bootkit</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;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, WithSecure&apos;s 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 FIDO2 or smart-card preboot authentication where supported, 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 BitLocker recovery on every TPM-bound protector. 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></channel></rss>