The Depths of Windows Virtualization (Part 2) — Memory Even the Kernel Cannot See: How VBS, HVCI, and Credential Guard Work
· Go Komura · Windows, Virtualization, Security, VBS, HVCI, Credential Guard
There was a time when administrator privileges were the “goal” for an attacker on Windows. Load a kernel driver as administrator, dump the memory of the LSASS process, and you have password hashes and Kerberos tickets. From there it is just a matter of walking to another machine with the stolen hashes.
On current Windows 11 with Credential Guard running — the default state from 22H2 onward on devices that meet the license requirements such as Enterprise and Education, plus the hardware requirements — that playbook does not work. An attacker who has fully taken the kernel can search memory all they like, and the actual hashes of the protected domain credentials are not found “inside that OS”. If it is not running, the old danger remains, so read this together with the confirmation methods later in the article.
So where are they? The answer is “another world, created inside the same PC”. As we saw in Part 1, the host Windows runs in the root partition on top of the hypervisor (“Where Is Your Windows Actually Running?”). This article continues from there and follows one more boundary line the hypervisor draws inside the same partition.
The question Part 2 answers is just one.
Where does Windows put secrets that neither an administrator nor the kernel can read?
Intended readers are developers and operators who have seen words such as Core isolation, Memory integrity, and Credential Guard on a settings screen or in a troubleshooting case, and want to understand the real thing from the mechanism up. Prerequisites are x64 Windows 10/11 or current Windows Server (as in Part 1, the discussion of rings and SLAT assumes x64; Arm64 uses a different mechanism such as exception levels). Required background is the concepts of partitions and SLAT covered in Part 1. The difficulty is intermediate. The aim is an explanation of the structure, not a how-to for configuring the security features.
1. The Bottom Line First
Windows added an axis of privilege called VTL (Virtual Trust Level) and put the secrets in VTL1. Memory in VTL1 cannot be read from the ordinary kernel that runs in VTL0. What guards the boundary is not the kernel itself, but the hypervisor that holds the SLAT translation tables.
That is the skeleton of virtualization-based security (VBS). VBS uses the hypervisor to create an isolated environment and houses security features there. It is designed on the assumption that the isolated environment remains protected even if the kernel is compromised.1
flowchart TB
accTitle: The two worlds VBS creates
accDescr: VTL0 and VTL1 sit inside the same partition; VTL0 holds the ordinary kernel and apps, VTL1 holds the Secure Kernel and isolated security features, and the hypervisor guards the boundary
subgraph vtl0 ["VTL0 (the ordinary world)"]
apps["Apps (ring 3)"]
ntk["NT kernel and drivers (ring 0)"]
end
subgraph vtl1 ["VTL1 (the isolated world)"]
ium["Isolated security features"]
sk["Secure Kernel"]
end
hv["Hypervisor (enforces the boundary via SLAT)"] --- vtl0
hv --- vtl1
ntk -.->|Cannot read| ium
Figure 1: There are two worlds inside one Windows, and the VTL0 kernel cannot access VTL1 memory.
The important point is that this is not “standing up another VM”. VTL0 and VTL1 are inside the same partition, inside the same Windows. We will look in turn at how this split is realized.
2. The Limits of the Ring Model — The Guardian and the Guarded Sit at the Same Height
Traditional Windows security was built on the ladder of rings (privilege levels). User mode (ring 3) is guarded by kernel mode (ring 0). So who guards ring 0 — no one can. Ring 0 is the highest privilege.
This structure has two structural weaknesses.
- The kernel is not a monolith. At ring 0, not only Windows itself but a large number of third-party drivers run. If any one of them has a vulnerability, an attacker obtains code execution at ring 0.
- From ring 0, everything is visible. However much a user-mode process such as LSASS defends itself, its memory is free to read for an attacker who has taken the kernel. Protection attributes and page tables alike are managed by the kernel itself.
flowchart TB
accTitle: The credential-theft path in the traditional ring model
accDescr: An attacker who takes ring 0 through a vulnerable driver can read LSASS process memory with the kernel's full authority and obtain password hashes
mal["Attacker code"] -->|Exploits a vulnerable driver| r0["Takes control of ring 0"]
r0 --> readall["Can read all physical memory"]
readall --> lsass["Obtains hashes from LSASS memory"]
lsass --> lateral["Abused for lateral movement to other machines"]
Figure 2: Because the guardian (the kernel) and the guarded (the secrets) sit at the same height, the fundamental weakness is that if ring 0 falls, everything falls.
What is needed, then, is “a place higher than ring 0”. That place already appeared in Part 1. The hypervisor runs at a privilege higher than the kernel and monopolizes control of the CPU’s memory-access permissions (SLAT) early. An isolated region the hypervisor guards is protected even against access from ring-0 (supervisor-mode) OS software.2
3. VSM and VTLs — Adding One More Axis of Privilege
3.1. Virtual Trust Levels (VTLs)
The family of hypervisor features that provide this isolation is called VSM (Virtual Secure Mode). VSM is the foundation for Device Guard, Credential Guard, a virtual TPM, and the like.2
The central concept of VSM is the VTL (Virtual Trust Level). The key points are as follows.2
- VTLs are hierarchical, and the higher the number, the higher the privilege. VTL0 is the lowest; VTL1 is more privileged than VTL0.
- Architecturally up to 16 levels are defined, but what is currently implemented is two: VTL0 and VTL1.
- Each VTL has independent memory access protections. These protections are managed by the hypervisor against the partition’s physical address space, so system software inside the partition cannot change them.
- A virtual processor has a separate register state and interrupt machinery per VTL, and a lower VTL cannot peek at a higher VTL’s state.
flowchart TB
accTitle: Three independences that make up VTL isolation
accDescr: Memory access protections, virtual-processor register state, and interrupt machinery are independent per VTL, and a lower VTL cannot touch any of them in a higher VTL
vtl["What is independent per VTL"] --> m1["Memory access protections"]
vtl --> m2["Virtual processor register state"]
vtl --> m3["Interrupt machinery"]
m1 -.-> rule["A lower VTL cannot touch a higher VTL"]
m2 -.-> rule
m3 -.-> rule
Figure 3: Making not only memory but also CPU state and interrupts a separate world is the three-piece set that leaves no peephole.
If rings (0 and 3) are the axis that separates “OS and apps”, VTLs are a second axis that separates “the ordinary world and the isolated world”. The two axes are orthogonal, and inside VTL1 there is kernel mode and user mode as well.
flowchart TB
accTitle: Four regions created by the two axes of rings and VTLs
accDescr: The ring axis separates kernel mode and user mode, the VTL axis separates the ordinary world and the isolated world, and the combination produces four regions: ordinary apps, the NT kernel, IUM trustlets, and the Secure Kernel
subgraph ax0 ["VTL0 (ordinary world)"]
a0["Ring 3: ordinary apps"]
k0["Ring 0: NT kernel and drivers"]
end
subgraph ax1 ["VTL1 (isolated world)"]
a1["Ring 3: IUM (trustlets)"]
k1["Ring 0: Secure Kernel"]
end
a0 --- k0
a1 --- k1
k0 ~~~ a1
Figure 4: There are now two axes of privilege, and “is it the kernel?” and “is it the isolated world?” became separate questions.
3.2. The Substance of the Boundary Is SLAT
In Part 1 we said that the second-level translation tables that map a guest physical address (GPA) onto actual RAM (SPA) — SLAT — are held by the hypervisor. VSM uses exactly this property. VTL isolation is created using the Hyper-V hypervisor and SLAT.3
When VTL1 declares “this memory is not to be shown to VTL0”, the hypervisor drops access permission to that page from VTL0’s translation tables. From then on, even if the VTL0 kernel tries to touch that address, it is denied at the CPU’s address-translation stage. It is useless for the kernel to rewrite its own page tables however it likes. The page tables (GVA→GPA) may belong to the kernel, but the translation beyond that (GPA→SPA) and the final access permission belong to the hypervisor.
flowchart TB
accTitle: The flow by which access from VTL0 to VTL1 memory is denied
accDescr: When the VTL0 kernel tries to read VTL1 memory, it can pass its own page table but is denied by SLAT access protection, and control transfers to the hypervisor
try["VTL0 kernel tries to read a VTL1 page"] --> pt["Passes the kernel's own page table"]
pt --> slat{"Does SLAT access protection allow it?"}
slat -->|Not allowed| deny["Hypervisor intervenes and denies access"]
slat -->|Allowed| ok["Ordinary memory access"]
deny -.-> point["Protected at a layer the kernel cannot change"]
Figure 5: The barrier sits outside the kernel, and SLAT protections cannot be changed by software inside the partition.
In Part 1 of the memory series we wrote that “VADs, PTEs, and protection attributes decide whether access is allowed”. In a VBS environment you can organize it as: after all of those have been passed, a SLAT checkpoint is still waiting.
3.3. The Secure Kernel and IUM
What runs inside VTL1 is not the ordinary NT kernel but a small kernel called the Secure Kernel. User mode in VTL1 is called IUM (Isolated User Mode), and the programs that run there are called trustlets (trusted processes).3
A trustlet cannot do everything the way an ordinary process can. Most system calls are marshalled to the NT kernel on the VTL0 side and the work is requested there.3 VTL1 is not an “upper world that can do anything”; it is built intentionally small, as a vault that holds secrets. The less code you can bring into the vault, the smaller the attack surface.
flowchart TB
accTitle: The flow of a trustlet's system calls
accDescr: A trustlet in VTL1 does not handle most system calls itself; it marshals them to the VTL0 NT kernel and receives only the result, which keeps VTL1 small
tl["Trustlet (IUM in VTL1)"] --> sc{"A system call is needed"}
sc -->|In most cases| mar["Request is marshalled to the VTL0 NT kernel"]
mar --> res["Only the result comes back"]
res -.-> small["VTL1 stays small, shrinking the attack surface"]
Figure 6: The vault has no facilities of its own; it farms out the chores and keeps guarding only the secrets.
4. HVCI — Verifying Kernel Code Integrity in the Vault
4.1. What Is Being Verified
The first representative feature that sits on VBS is Memory integrity — HVCI (hypervisor-protected code integrity). Windows has a code-integrity mechanism that inspects kernel-mode drivers and binaries before they start and does not load unsigned or untrusted ones. HVCI runs this verification inside VBS’s isolated environment.1
The reason for moving the verification logic itself into VTL1 is exactly the weakness in Section 2. If the verification code sits inside the VTL0 kernel, an attacker who has taken the kernel can swap the verification out. If it is in VTL1, the swapping hand cannot reach it.
flowchart TB
accTitle: The difference made by where the verification code lives
accDescr: If the verification code sits inside the VTL0 kernel it can be disabled by taking the kernel, but if it is in VTL1 even an attacker who has taken the kernel cannot reach it and verification is protected
atk["Attacker who has taken the kernel"] --> q{"Where does code-integrity verification live?"}
q -->|"Inside the VTL0 kernel (classic)"| bad["The verification logic can be swapped out"]
q -->|"Isolated environment in VTL1 (HVCI)"| good["The swap is out of reach"]
bad --> res1["Unsigned code can run in the kernel"]
good --> res2["Verification keeps working after the kernel is compromised"]
Figure 7: Do not put the checkpoint inside the side that might be breached — that relocation of the verification logic is the essence of HVCI.
4.2. The Rules for Executable Pages
HVCI’s effect is not limited to “inspection at startup”. It also constrains kernel-memory allocation.4
- A kernel page becomes executable only after it has passed code-integrity verification.
- An executable page does not become writable (so-called W^X).
When these two are in place, even if a vulnerability such as a buffer overflow lets you rewrite kernel memory, you cannot put the rewritten contents into execution. An executable page cannot be rewritten, and a page that can be rewritten cannot be executed.4 The final backing of execute permission is the execute right on the SLAT side, which the VTL0 kernel cannot manipulate.
flowchart TB
accTitle: Until a kernel page becomes executable in an HVCI environment
accDescr: A driver-load request receives code-integrity verification in VBS's isolated environment; if it passes it is allowed as an executable, non-writable page, and if it fails it is blocked and recorded in the CodeIntegrity log
load["Request to load and execute kernel code"] --> verify{"Code-integrity verification in the isolated environment"}
verify -->|Pass| exec["Allowed as an executable page (writes forbidden)"]
verify -->|Fail| block["Load is blocked"]
block --> log["Recorded in the CodeIntegrity Operational log (event ID 3087)"]
exec -.-> wx["Writable pages remain non-executable"]
Figure 8: Verification of the rule that does not let execute and write coexist is done on the VTL1 side, and the VTL0 kernel cannot overturn it.
Tracing this from an attacker’s point of view makes it clear how the rule takes effect.
flowchart TB
accTitle: The flow by which code injection fails in an HVCI environment
accDescr: Even if a vulnerability lets you rewrite kernel memory, a page you could write is not executable, and an executable page cannot be rewritten in the first place, so the injected code cannot be put into execution
inj["Try to tamper with kernel memory via a vulnerability"] --> which{"Which page is the target?"}
which -->|A writable page| wok["The write succeeds"]
which -->|An executable page| xfail["The write itself is impossible"]
wok --> nx["But that page is not executable"]
nx --> dead["The injected code cannot be executed"]
xfail --> dead
Figure 9: The meaning of not crossing writable pages with runnable pages is that whichever entrance you take, you hit a dead end.
4.3. The Price in Driver Compatibility
This rule collides with older-design drivers. Ones that rewrite their own code at run time, have no signature, or demand memory that is both executable and writable — such drivers cannot be loaded in an HVCI environment. The fact of the block can be confirmed in Event Viewer under Applications and Services Logs\Microsoft\Windows\CodeIntegrity\Operational (event ID 3087 is representative).5
“After I enabled Memory integrity, a peripheral stopped working” — in many cases, that is the real identity of the trouble. The proper response is to update to an HVCI-compatible driver; disabling Memory integrity should be thought of as a last resort that gives up the protection wholesale. If you are involved in this verification from a driver-development standpoint, see also the filter-driver article (“Windows Minifilter Drivers”).
flowchart TB
accTitle: Isolating the case where a peripheral stops working under Memory integrity
accDescr: Identify the blocked driver in the CodeIntegrity Operational log; the proper response is to update to an HVCI-compatible version, ask the vendor if none exists, and treat disabling as a last resort you do not make permanent
sym["A device stops working after Memory integrity is enabled"] --> log2["Identify the blocked driver in the CodeIntegrity log"]
log2 --> upd{"Is there an HVCI-compatible driver?"}
upd -->|Yes| fix2["Update and resolve it while leaving HVCI on"]
upd -->|No| ask2["Ask the vendor for a compatible version"]
ask2 -.-> temp["Disabling is a last resort, not a permanent setting"]
Figure 10: The first thing to look at is not the settings screen but the log, and event ID 3087 knows who blocked the load.
5. Credential Guard — The Hashes Are Inside LSAIso
5.1. LSASS and LSAIso
The second representative feature that sits on VBS is the answer to the opening mystery: Credential Guard.
Traditional Windows kept NTLM hashes and Kerberos tickets in the memory of the LSA process (lsass.exe). When Credential Guard is enabled, storage of the protected secrets among these — the NTLM hashes of domain credentials and Kerberos TGTs (Ticket Granting Tickets) — moves to LSAIso.exe, a trustlet that runs in IUM in VTL1.6
- lsass.exe (VTL0) continues to run as the front desk for authentication processing, as before.
- The actual secrets are held by LSAIso.exe (VTL1) and cannot be accessed from VTL0.
- The two communicate via RPC (Remote Procedure Call).
- LSAIso hosts no device drivers at all, and houses only the minimum of signed binaries. The signatures are verified with a certificate that VBS trusts.6
flowchart TB
accTitle: Where credentials sit when Credential Guard is enabled
accDescr: lsass in VTL0 communicates with LSAIso in VTL1 via RPC as the authentication front desk; the actual hashes and TGTs of protected domain credentials are held by LSAIso, so an attacker who obtains administrator privileges in VTL0 and dumps lsass still does not get the protected substance
subgraph v0 ["VTL0"]
lsassP["lsass.exe (authentication front desk)"]
att["Attacker (administrator privileges)"]
end
subgraph v1 ["VTL1"]
iso["LSAIso.exe (vault for secrets)"]
end
lsassP <-->|RPC| iso
att -->|Memory dump| lsassP
att -.->|Cannot reach| iso
Figure 11: Because the front desk and the vault were separated, dumping lsass no longer yields the actual hashes of the protected domain credentials.
From Windows 11 version 22H2 onward, on devices that meet the license requirements (Enterprise E3/E5, Education A3/A5) and the hardware requirements, VBS and Credential Guard are enabled by default. On editions such as Pro, Credential Guard is not enabled automatically (there are exceptions, such as when a machine that was enabled under a qualifying license is later downgraded).7 “The playbook no longer works” at the opening is not a story about a special add-on product; it is the standard state of current Windows on the target editions.
flowchart TB
accTitle: The flow of credentials from sign-in to authentication
accDescr: After sign-in the actual secrets are stored in LSAIso in VTL1; each time authentication is needed, lsass in VTL0 requests computation via RPC, and only the result of the authentication processing comes back to VTL0 without the protected long-term secrets themselves being returned
signin["User signs in"] --> front["lsass handles it as the front desk"]
front --> store["The actual secrets are stored in LSAIso"]
auth["Subsequent authentication requests"] --> front
front -->|"Request computation via RPC"| store
store -->|"Returns the result (does not return the secret)"| front
Figure 12: The protected long-term secrets themselves never leave the vault; what returns to VTL0 is the result of authentication processing, such as a ticket.
5.2. Know Precisely What Is Not Protected
Credential Guard is not an all-purpose shield. What is protected is NTLM hashes of domain credentials, Kerberos TGTs (Ticket Granting Tickets), and things stored as domain credentials. The following are out of scope.8
- Kerberos service tickets (TGTs are protected)
- Credentials of local accounts and Microsoft accounts
- Theft of input by a keylogger, and physical attacks
- Credentials on paths that use NTLMv1, MS-CHAPv2, Digest, or CredSSP
- The internals of third-party software that manages credentials on its own
Also, when Credential Guard is enabled, NTLMv1, unconstrained Kerberos delegation, and the like become unusable, so business systems that depend on legacy authentication need a compatibility check.8 Not “enable it and you are done”, but grasp what is inside and outside the defensive range and fill the rest with other controls — that is the correct way to use it in practice.
flowchart TB
accTitle: Credential Guard's defensive range
accDescr: Domain NTLM hashes and TGTs, and stored domain credentials, are protected, while service tickets, local accounts, keyloggers, physical attacks, and credentials stored privately by an app are out of scope
scope{"Which side of the protection boundary is this secret on?"} --> inA["Domain NTLM hashes and TGTs"]
scope --> outA["Service tickets and local accounts"]
inA --> prot["Protected in LSAIso"]
outA --> unprot["Not protected (other controls are needed)"]
unprot -.-> outB["Keystrokes, physical attacks, and app-private stores are also out of scope"]
Figure 13: The defensive range is drawn with a clear line, and the outside of the line is filled with multi-factor authentication and app-side design.
6. See It for Yourself
You can confirm the running state of VBS and each feature on your own machine.
Get-CimInstance -Namespace root/Microsoft/Windows/DeviceGuard `
-ClassName Win32_DeviceGuard |
Select-Object VirtualizationBasedSecurityStatus,
SecurityServicesConfigured,
SecurityServicesRunning
How to read it is as follows.9
- If
VirtualizationBasedSecurityStatusis 2, VBS is enabled and running. - If
SecurityServicesRunningcontains 1, Credential Guard is running; if it contains 2, Memory integrity (HVCI) is running.
To confirm the running state in the GUI, look at the “Virtualization-based security” field in msinfo32 (services that are running are listed, such as “Hypervisor enforced Code Integrity”). The “Memory integrity” toggle under “Device security > Core isolation” in the Windows Security app is a screen that reflects settings; it can look on even while HVCI is not actually running — waiting for a reboot right after enablement, or a compatibility problem at startup — so judge whether it is running from msinfo32 or from Win32_DeviceGuard’s SecurityServicesRunning.5
There is also a trace on Task Manager’s Details tab. On a machine where VBS is running you will see a process called “Secure System”. LsaIso.exe is the process that appears when the Isolated LSA service is hosted in VTL1, and it does not normally appear in a configuration where only HVCI is enabled. The presence or absence of a process is only a trace, though, so judge whether Credential Guard is running from SecurityServicesRunning (whether it contains 1), as above. Both are windows visible from VTL0 that correspond to the VTL1-side world.
flowchart TB
accTitle: How to check that VBS-related features are running
accDescr: Confirm that VBS is running by querying Win32_DeviceGuard, judge Credential Guard and HVCI from the SecurityServicesRunning values, and look at the CodeIntegrity log for driver problems
q0["Win32_DeviceGuard"] --> q1{"VBS Status 2?"}
q1 -->|No| off["VBS is not running"]
q1 -->|Yes| q2{"Contains 1 or 2?"}
q2 -->|1| cg["Credential Guard on"]
q2 -->|2| hvciR["HVCI on"]
hvciR -.-> ev["CodeIntegrity 3087"]
Figure 14: State confirmation proceeds in three stages: VBS itself, each service on top of it, and the log when a problem occurs.
7. Three Misreadings to Avoid in Practice
7.1. “Protecting administrator privileges is enough. VBS is a server-side story”
What Credential Guard prevents is damage spreading after administrator privileges have been taken (hash exfiltration and lateral movement). In other words VBS is one layer of defense-in-depth that assumes compromise, and it is on client PCs that it is effective. On Windows 11 that meets the requirements, enabled-by-default is the standard, so the right posture is not “this has nothing to do with us” but “manage compatibility on the assumption that it is already running”.
flowchart TB
accTitle: Stages of compromise and where VBS takes effect
accDescr: Initial access is covered by other controls such as multi-factor authentication and training; HVCI blocks code injection into the kernel after privilege escalation; Credential Guard blocks theft of protected domain secrets and lateral movement, but does not reach secrets outside its scope
s1["Initial access (phishing and the like)"] --> s2["Privilege escalation"]
s2 --> s3["Code injection into the kernel"]
s3 --> s4["Theft of protected domain secrets and lateral movement"]
s1 -.-> d1["MFA, training, and EDR cover this"]
s3 -.-> d2["HVCI blocks this step"]
s4 -.-> d3["Credential Guard blocks this (protected secrets only)"]
Figure 15: VBS is not a “don’t let them in” technology; it is a “don’t let them win after they are in” technology, and the stage it guards is different.
7.2. “If Memory integrity causes a problem, just turn it off”
Turning it off will make things work for the moment, but it takes down the barrier against code injection into the kernel wholesale. The proper response is first to identify the blocked driver in the CodeIntegrity log and apply the vendor’s updated version. Even if you disable it temporarily for validation, we recommend an operation that does not make that a permanent setting.
7.3. “With Credential Guard, passwords cannot be stolen”
That is overconfidence from mixing up the defensive range. Service tickets, local accounts, keystrokes themselves, and credentials stored privately by an app are out of scope.8 Phishing and keyloggers need other controls (multi-factor authentication, Windows Hello, and a review of credential management on the app side).
8. Summary
- VBS uses the hypervisor to create an isolated environment and protects security features on the assumption that the kernel can be compromised.1
- The unit of isolation is the VTL; currently two levels are implemented, VTL0 (the ordinary world) and VTL1 (the Secure Kernel and IUM).2
- The substance of the boundary is SLAT memory access protection, which software inside the partition — including the kernel — cannot change.2
- HVCI runs code-integrity verification in the isolated environment and enforces “not executable until verification passes” and “an executable page is not writable”.4 The price is that you have to manage driver compatibility.5
- Credential Guard isolates NTLM hashes of domain credentials and TGTs into LSAIso in VTL1. From Windows 11 22H2 onward it is enabled by default on devices that meet the license requirements (Enterprise, Education) and the hardware requirements (use this together with a check of the running state).67
- You can confirm the running state from
Win32_DeviceGuard’s SecurityServicesRunning (1 = Credential Guard, 2 = HVCI).9
Continued in Part 3, “Virtual Machines That Boot in Seconds — WSL2, Windows Sandbox, and Containers”.
So far we have looked at virtualization from the “strength of isolation” side. The final instalment looks from the opposite, “lightness” side, and follows where the lightweight VMs that discarded the weight of a full VM are cutting corners.
Related Articles
- The Depths of Windows Virtualization (Part 1) — Where Is Your Windows Actually Running? The Hypervisor and Partitions
- The Depths of Windows Memory (Part 1) — The Moment a Virtual Address Becomes Physical RAM: A Page Fault from Start to Finish
- The Depths of Windows I/O (Part 6, Final) — Filter Drivers and Minifilters: Why Procmon and Antivirus Scanners Can Intercept I/O
- Decoding Windows Error Codes — The Three-Layer Structure of Win32 Errors, HRESULT, and NTSTATUS
Related Consulting Areas
KomuraSoft LLC handles compatibility investigations between Windows applications and security features, analysis of driver-caused failures, and technical validation of in-house PC environments.
- Windows Application Development
- Bug Investigation & Root-Cause Analysis
- Legacy Asset Migration
- Contact Us
References
-
Microsoft Learn, Virtualization-based Security (VBS). On VBS using hardware virtualization and the Windows hypervisor to create an isolated environment and treating that as the OS’s root of trust on the assumption that the kernel can be compromised; Memory integrity running kernel-mode code-integrity verification inside that isolated environment; and SLAT being a hard requirement for VBS. ↩ ↩2 ↩3
-
Microsoft Learn, Virtual Secure Mode. On VSM being the foundation for Device Guard, Credential Guard, a virtual TPM, and the like; access to isolated regions being controlled only through the hypervisor and protected even from ring-0 OS software; VTLs being hierarchical with 2 of a maximum of 16 levels implemented; and per-VTL memory access protections being unchangeable by system software inside the partition. ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Isolated User Mode (IUM) Processes. On VSM creating VTLs using the Hyper-V hypervisor and SLAT; the Secure Kernel and IUM running in VTL1; trustlets marshalling system calls to the VTL0 kernel; and LSAIso running in VTL1 and communicating with lsass via RPC. ↩ ↩2 ↩3
-
Microsoft Learn, Memory integrity and virtualization-based security. On Memory integrity (HVCI) running code-integrity verification in an isolated environment, and on kernel memory pages becoming executable only after passing verification and executable pages not becoming writable. ↩ ↩2 ↩3
-
Microsoft Learn, Memory integrity and VBS enablement. On Memory integrity being enabled by default on a clean install of Windows 11 if the hardware is compatible; confirming state in msinfo32 and the Windows Security app; and confirming a blocked driver via event ID 3087 in the CodeIntegrity Operational log. ↩ ↩2 ↩3
-
Microsoft Learn, How Credential Guard works. On the LSA communicating with an Isolated LSA process (LSAIso.exe) to store secrets when Credential Guard is enabled; the stored data being protected by VBS and inaccessible from the rest of the OS; and the Isolated LSA process hosting no device drivers and housing only a minimum of signature-verified binaries. ↩ ↩2 ↩3
-
Microsoft Learn, Credential Guard overview. On Credential Guard being enabled by default from Windows 11 version 22H2 onward on devices that meet the license, hardware, and software requirements and have not been explicitly disabled; the qualifying editions/licenses being Enterprise (E3/E5) and Education (A3/A5), with Pro out of scope; and a Pro machine that was previously enabled under a qualifying license remaining a default-enabled target after a downgrade. ↩ ↩2
-
Microsoft Learn, Credential Guard protection limits. On service tickets, local accounts, keyloggers, physical attacks, and the like being out of Credential Guard’s protection scope; TGTs being protected while service tickets are not; and NTLMv1 and unconstrained delegation becoming unusable when it is enabled. ↩ ↩2 ↩3
-
Microsoft Learn, Enable virtualization-based protection of code integrity. On how to confirm the state of VBS and Memory integrity via the Win32_DeviceGuard class, and on the meaning of SecurityServicesRunning values (1 is Credential Guard, 2 is Memory integrity). ↩ ↩2
Related Articles
Recent articles sharing the same tags. Deepen your understanding with closely related topics.
The Depths of Windows Virtualization (Part 3) — Virtual Machines That Boot in Seconds: Why WSL2, Windows Sandbox, and Containers Are So Light
Why do WSL2 and Windows Sandbox start in seconds and feel so light? This article explains the mechanisms, from dynamic base images and di...
The Depths of Windows Virtualization (Part 1) — Where Is Your Windows Actually Running? The Hypervisor and Partitions
When you enable Hyper-V, the host Windows itself runs on top of the hypervisor as the root partition. This article explains the foundatio...
Named Pipes in Practice — Windows' Standard IPC from Design to Security
A practical guide to named pipes, Windows' standard inter-process communication. This article organises, from primary sources, the choice...
Choosing a Windows Service Account — LocalSystem, Virtual Accounts, and gMSA
Are you still running a Windows service as LocalSystem? This article compares the privileges and network identity of LocalService, Networ...
Windows Security Audit Policy and Event Log Investigation in Practice — Becoming an IT Team That Can Read Event 4625
A practical guide for answering "please look into the failed sign-in logs." It covers the relationship between basic and advanced audit p...
Related Topics
These topic pages place the article in a broader service and decision context.
Windows Technical Topics
Topic hub for KomuraSoft LLC's Windows development, investigation, and legacy-asset articles.
Where This Topic Connects
This article connects naturally to the following service pages.
Windows App Development
We support Windows desktop applications that involve resident processing, device integration, operational logging, and maintainable structure.
Frequently Asked Questions
Common questions about the topic of this article.
- Are VBS (virtualization-based security) and Core isolation the same thing?
- Strictly speaking, they are different. VBS is the foundational technology that creates an isolated environment with the hypervisor, and "Core isolation" in the Windows Security app is the name of a screen that groups several protections built on VBS. The representative one is "Memory integrity", which refers to HVCI (hypervisor-protected code integrity). Confirm the running state of each service by querying Win32_DeviceGuard, not from the screen display.
- Can VTL1 memory really not be read, even with administrator privileges or from a kernel driver?
- It cannot. Per-VTL memory access protections are managed by the hypervisor against the partition's physical address space, and software running inside the partition cannot change them. Even code that runs in the kernel (ring 0) is not permitted to access VTL1 memory from VTL0.
- Why can enabling Memory integrity (HVCI) stop a driver from working?
- In an HVCI environment, a kernel page becomes executable only after it has passed integrity verification, and writes to executable pages are not permitted. An unsigned driver, or an older-design driver that rewrites executable memory, cannot satisfy this constraint and its load is blocked. You can confirm the block in the CodeIntegrity Operational log (event ID 3087 and the like).
- What does Credential Guard protect, and what does it not protect?
- It protects NTLM password hashes of domain credentials, Kerberos TGTs, and things an app stored as domain credentials, in an isolated environment. Kerberos service tickets, credentials of local accounts and Microsoft accounts, theft of input by a keylogger, and physical attacks are out of scope.
- Where can I check whether VBS is running?
- Look at the "Virtualization-based security" field in msinfo32, or query the Win32_DeviceGuard class in the root/Microsoft/Windows/DeviceGuard namespace from PowerShell. If SecurityServicesRunning contains 1, Credential Guard is running; if it contains 2, Memory integrity (HVCI) is running.