• Link zu X
  • Link zu Xing
  • Link zu LinkedIn
  • Link zu Instagram
  • Link zu Youtube
Webcasts | Beratungstermin buchen | Newsletter abonnieren
  • Microsoft 365
    • Workshops
    • Microsoft Teams
    • Telefonie
      • Microsoft Teams Telefonie
      • Contact Center
      • Managed SBC
    • Microsoft Exchange
    • Microsoft SharePoint
    • M365 Migration
    • Security
      • Microsoft 365 Security
      • SOC
      • E-Mail Security
    • Microsoft Power Platform
    • Microsoft Copilot
    • Informationsmanagement
    • Wissensmanagement
  • Business Apps
    • Microsoft Development
    • Individuelle Softwareentwicklung
  • Intranet
  • Managed Services
  • Change Management
  • Unternehmen
    • Kontakt
    • Über uns
    • Referenzen
    • Karriere
      • Fach- und Führungskräfte
      • Junge Talente
    • Webcasts
  • Blog
    • Blog
    • Newsletter-Abo
  • Termin buchen
  • Click to open the search input field Click to open the search input field Suche
  • Menü Menü
  • Neue BitLocker-Schwachstelle „YellowKey“ – notwendige Gegenmaßnahmen und Handlungsempfehlungen

Neue BitLocker-Schwachstelle „YellowKey“ – notwendige Gegenmaßnahmen und Handlungsempfehlungen

Nick LewelingConsultant Microsoft Securityhttps://linkedin.com/in/nick-leweling-75371826b–Auf LinkedIn vernetzen

BitLocker gilt in vielen Unternehmen als letzte Verteidigungslinie, um vertrauliche Daten auf verlorenen oder gestohlenen Geräten zu schützen. Genau dieses „Lost-/Stolen-Device“-Versprechen steht bei der neu veröffentlichten Schwachstelle CVE-2026-45585, die öffentlich als „YellowKey“ bezeichnet wird, im Mittelpunkt. Microsoft beschreibt die Lücke als „Security Feature Bypass“ und stellt bereits Maßnahmen bereit, bis ein reguläres Sicherheitsupdate verfügbar ist. Dies ist besonders relevant, da bereits ein öffentlicher Proof of Concept (PoC) existiert.

Was steckt hinter der BitLocker-Schwachstelle „YellowKey“?

Bei „YellowKey“ handelt es sich nicht um einen direkten Angriff auf die BitLocker-Verschlüsselung selbst. Stattdessen wird ein Ablauf innerhalb der Windows Recovery Environment (WinRE) ausgenutzt – also genau in dem Rettungssystem, das Windows startet, wenn Reparatur- oder Wiederherstellungsfunktionen benötigt werden. Microsoft ordnet dies als “Security Feature Bypass” ein. Das bedeutet, dass ein Sicherheitsmechanismus unter bestimmten Bedingungen umgangen werden kann, ohne die Verschlüsselung an sich zu verändern.

Wie funktioniert der Angriff?

Der Angriff setzt physischen Zugriff voraus. In der Praxis bedeutet das: Eine Person muss das Gerät in der Hand haben, neu starten und in die Wiederherstellungsumgebung booten können. Anschließend reicht bereits ein präparierter Datenträger (z.B. USB-Stick) aus, um das Verhalten von WinRE so zu beeinflussen, dass statt der üblichen Wiederherstellungsoberfläche eine Shell bzw. ein Command Prompt erscheint. Abhängig von der eingesetzten BitLocker-Konfiguration kann dadurch Zugriff auf Inhalte der eigentlich geschützten Systempartition möglich werden, ohne dass der legitime Nutzer aktiv beteiligt ist.

Technisch nutzt die Schwachstelle Transactional NTFS (TxF) aus, eine NTFS-Erweiterung, mit der Dateioperationen ausgeführt werden können, um eine wichtige Steuerdatei (winpeshi.ini) zu löschen. Ohne diese Steuerdatei fällt die WinRE auf die Standard-Konsolenanwendung zurück und öffnet eine Shell bzw. einen Command Prompt. Der Schwachpunkt sitzt hier also nicht im laufenden Windows, sondern im Pre-Boot-/Recovery-Bereich, der bei Datenträgerverlust besonders kritisch ist.

Wie kritisch ist der Angriff?

„Physisch“ klingt zunächst nach einem geringen Risiko, im Enterprise-Umfeld ist es das aber oft nicht. BitLocker wird typischerweise genau für Situationen eingesetzt, in denen Geräte außerhalb der kontrollierten Umgebung sind:

  • Homeoffice
  • Außendienst
  • Geschäftsreisen
  • Leihgeräte
  • kurzfristig unbeaufsichtigte Geräte

Genau deshalb betont Microsoft in den begleitenden FAQ, dass die temporären Maßnahmen zur Risikominderung insbesondere dann in Betracht gezogen werden sollten, wenn Geräte und Daten realistisch dem Risiko „verloren/gestohlen“ ausgesetzt sind. Dass bereits ein PoC öffentlich ist, macht Angriffe zusätzlich wahrscheinlicher, weil weniger Aufwand nötig ist, um das Vorgehen zu reproduzieren. 

Welche Systeme sind betroffen?

Der Angriff setzt voraus, dass BitLocker ohne Pre-Boot-Authentifizierung / PIN verwendet wird. Betroffen sind darüber hinaus sämtliche Windows-11-Versionen sowie Windows Server 2025.

Welche Schutzmaßnahmen empfiehlt Microsoft?

Aktuell stellt Microsoft noch keinen Sicherheits-Patch zur vollständigen Behebung der Schwachstelle bereit. Um das Ausnutzen des Angriffs dennoch zu reduzieren, stellt Microsoft ein Skript für notwendige Anpassungen bereit. Dieses Skript zielt darauf ab, in WinRE das automatische Starten einer Komponente (autofstx.exe) zu verhindern. Praktisch geschieht dies durch eine Änderung der Registry-Einstellung „BootExecute“ innerhalb des WinRE-Images. Damit wird genau der Teil deaktiviert, der als Hebel zum Umgehen der BitLocker-Verschlüsselung beschrieben wird.

Für Unternehmen ist besonders wichtig, was Microsoft dazu in ihren FAQs sagt:

Die Mitigation soll keine Auswirkungen auf die Verfügbarkeit oder das Management der Systeme haben, und muss später nicht zurückgerollt werden. Ein späteres Sicherheitsupdate soll dieses Verhalten beibehalten.

Schutzmaßnahmen zentral über Microsoft Intune steuern

Das von Microsoft bereitgestellte Skript lässt sich zentral über Microsoft Intune auf betroffene Geräte verteilen.

  • Plattform-Skript
  • Remediation-Skript

In der Praxis bieten Remediation-Skripte deutliche Vorteile, da sich der Umsetzungsstatus besser überwachen und auswerten lässt. Durch die Kombination aus Erkennungs- und Reparaturlogik können IT-Abteilungen transparent nachvollziehen,

  • auf welchen Geräten die Anpassung bereits umgesetzt wurde.
  • wo weiterhin Handlungsbedarf besteht.

Da das von Microsoft bereitgestellte Skript eher als Plattform-Skript ausgelegt ist, sind dafür jedoch kleinere Änderungen notwendig. Für größere Umgebungen empfiehlt sich daher der Einsatz von Remediation-Skripte, um den Rollout sauber zu überwachen und langfristig abzusichern.

Code ausklappen

Erkennungsskript:

Weiterlesen

<# .SYNOPSIS Checks for the presence of autofstx.exe in the WinRE BootExecute registry value. .DESCRIPTION This detection script checks for the presence of "autofstx.exe" in the BootExecute REG_MULTI_SZ value inside the Windows Recovery Environment (WinRE) offline SYSTEM registry hive. This is a security concern if the entry is present. The script performs the following steps: 1. Verify administrator privileges 2. Verify WinRE is enabled 3. Mount the WinRE image via reagentc 4. Load the offline SYSTEM registry hive 5. Read BootExecute and check for autofstx.exe Exit 0 = Success (entry not present) Exit 1 = Failure (error during detection or entry found) .PARAMETER MountPath Directory to use as the WinRE mount point. Created if it does not exist. Default: C:\Mount .EXAMPLE # Standard run .\Check-AutoFsTxInWinRE.ps1 .NOTES Requirements: Windows with WinRE and reagentc support, Administrator privileges. The WinRE disable/enable cycle at the end is required to re-seal the BitLocker measurement chain after modifying the WinRE image. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #>

$MountPath = “C:\Mount”

# Target entry to check for in BootExecute
$EntryToRemove = “autofstx.exe”

# Internal constant for the offline hive key name
$HiveName = “WinREHive”

# State tracking for cleanup
$hiveLoaded = $false
$imageMounted = $false
$mountCreated = $false

Write-Host “Check autofstx.exe ”

# 1. Verify Administrator Privileges
# PS Version: All | Admin: Yes | System Requirements: None
try {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal]$identity
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if (-not $isAdmin) {
Write-Host “[1/5] Administrator check: FAILED – This script must be run as Administrator. ”
exit 1
}

Write-Host “[1/5] Administrator check: Passed”
} catch {
Write-Host “Error checking administrator privileges: $_”
exit 1
}

# 2. Check WinRE Status
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe
try {
$winreOutput = & reagentc /info 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[2/5] WinRE status check: FAILED – reagentc /info returned exit code $LASTEXITCODE”
exit 1
}
$winreOutputStr = $winreOutput -join “`n”

# Make this check language agnostic
if ($winreOutputStr -match “[::]\s*Enabled\b”) {
Write-Host “[2/5] WinRE status: Enabled”
} else {
Write-Host “[2/5] WinRE status: NOT ENABLED. Exiting.”
exit 0
}
} catch {
Write-Host “Error checking WinRE status: $_”
exit 1
}

# 3. Mount WinRE Image
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe
try {
if (-not (Test-Path $MountPath)) {
New-Item -ItemType Directory -Path $MountPath -Force | Out-Null
$mountCreated = $true
Write-Host “[3/5] Created mount directory: $MountPath”
} else {
$existing = Get-ChildItem -Path $MountPath -Force -ErrorAction SilentlyContinue
if ($existing) {
Write-Host “[3/5] Mount WinRE image: FAILED – Mount directory $MountPath is not empty. Clean it or specify a different -MountPath.”
exit 1
}
}

$mountOutput = & reagentc /mountre /path $MountPath 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[3/5] Mount WinRE image: FAILED – reagentc /mountre output: $mountOutput”
exit 1
}

$imageMounted = $true
Write-Host “[3/5] WinRE image mounted: $MountPath”
} catch {
Write-Host “Error mounting WinRE image: $_”
exit 1
}

# 4. Load Offline SYSTEM Registry Hive
# PS Version: All | Admin: Yes | System Requirements: reg.exe
try {
# Locate the SYSTEM hive in the mounted WinRE image
$hivePath = $null
$hiveCandidates = @(
“$MountPath\Windows\System32\config\SYSTEM”,
“$MountPath\windows\system32\config\SYSTEM”
)

foreach ($candidate in $hiveCandidates) {
if (Test-Path $candidate) {
$hivePath = $candidate
break
}
}

if (-not $hivePath) {
# Broader search as fallback
$found = Get-ChildItem -Path $MountPath -Recurse -Filter “SYSTEM” -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match “config\\SYSTEM$” } |
Select-Object -First 1

if ($found) {
$hivePath = $found.FullName
}
}

if (-not $hivePath) {
Write-Host “[4/5] Load offline hive: FAILED -Cannot locate SYSTEM hive in mounted WinRE image.”

# Cleanup: unmount with discard
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}

Write-Host “[4/5] Found SYSTEM hive: $hivePath”

$loadOutput = & reg load “HKLM\$HiveName” $hivePath 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[4/5] Load offline hive: FAILED – reg load output: $loadOutput”

# Cleanup: unmount with discard
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}

$hiveLoaded = $true
Write-Host “[4/5] Hive loaded as HKLM\$HiveName”
} catch {
Write-Host “Error loading offline hive: $_”

if ($imageMounted) {
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
}
exit 1
}

# 5. Read BootExecute and Remove autofstx.exe
# PS Version: All | Admin: Yes | System Requirements: None
try {
# Determine active ControlSets from Select key
$selectPath = “Registry::HKEY_LOCAL_MACHINE\$HiveName\Select”
$selectProps = Get-ItemProperty -Path $selectPath -ErrorAction SilentlyContinue

if ($selectProps -and $selectProps.Current) {
$csNumbers = @($selectProps.Current)
if ($selectProps.Default -and $selectProps.Default -ne $selectProps.Current) {
$csNumbers += $selectProps.Default
}
$controlSets = $csNumbers | ForEach-Object { “ControlSet{0:D3}” -f [int]$_ }
Write-Host “[5/5] Active ControlSets (from Select key): $($controlSets -join ‘, ‘)”
} else {
$controlSets = @(“ControlSet001”)
Write-Host “[5/5] Select key not readable, falling back to ControlSet001”
}

# Remediate all relevant ControlSets
$foundEntry = $false

foreach ($cs in $controlSets) {
$regPath = “Registry::HKEY_LOCAL_MACHINE\$HiveName\$cs\Control\Session Manager”
$testResult = Get-ItemProperty -Path $regPath -Name “BootExecute” -ErrorAction SilentlyContinue

if (-not $testResult) {
Write-Host ” $cs\Session Manager\BootExecute: not found, skipping”
continue
}

$currentValue = $testResult.BootExecute

if (-not $currentValue) {
Write-Host ” $cs BootExecute: (empty)”
continue
}

# Remove matching entry (case-insensitive)
$updatedValue = @($currentValue | Where-Object {
$_ -and
($_ -ne $EntryToRemove) -and
($_ -notmatch “^\s*$([regex]::Escape($EntryToRemove))\s*$”)
})

if ($updatedValue.Count -eq @($currentValue).Count) {
Write-Host ” $cs BootExecute: ‘$EntryToRemove’ not present”
continue
}else {
Write-Host ” $cs BootExecute: ‘$EntryToRemove’ found”
$foundEntry = $true
}
}

if (-not $foundEntry) {
Write-Host “‘$EntryToRemove’ not found in any active ControlSet. No changes needed.”

# Cleanup: unload hive, unmount with discard
[gc]::Collect()
Start-Sleep -Seconds 1
$null = & reg unload “HKLM\$HiveName” 2>&1
$hiveLoaded = $false
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
if ($mountCreated) { Remove-Item -Path $MountPath -Recurse -Force -ErrorAction SilentlyContinue }
exit 0
}else {
Write-Host “‘$EntryToRemove’ found in active ControlSet. Changes needed.”
# Cleanup: unload hive, unmount with discard
[gc]::Collect()
Start-Sleep -Seconds 1
$null = & reg unload “HKLM\$HiveName” 2>&1
$hiveLoaded = $false
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
if ($mountCreated) { Remove-Item -Path $MountPath -Recurse -Force -ErrorAction SilentlyContinue }
exit 1
}

} catch {
Write-Host “Error modifying BootExecute: $_”

# Cleanup: unload hive, unmount with discard
[gc]::Collect()
Start-Sleep -Seconds 2
if ($hiveLoaded) {
$null = & reg unload “HKLM\$HiveName” 2>&1
$hiveLoaded = $false
}
if ($imageMounted) {
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
}
exit 1
}

Code ausklappen

Korrekturskript:

Weiterlesen

<# .SYNOPSIS Removes autofstx.exe from the WinRE BootExecute registry value. .DESCRIPTION This remediation script removes the "autofstx.exe" entry from the BootExecute REG_MULTI_SZ value inside the Windows Recovery Environment (WinRE) offline SYSTEM registry hive. This is a security fix to prevent autofstx.exe from executing during WinRE boot. The script performs the following steps: 1. Verify administrator privileges 2. Verify WinRE is enabled 3. Mount the WinRE image via reagentc 4. Load the offline SYSTEM registry hive 5. Read BootExecute and remove autofstx.exe if present 6. Unload the offline hive 7. Unmount the WinRE image with commit 8. Disable and re-enable WinRE to re-seal BitLocker trust chain Exit 0 = Success (entry removed or not present) Exit 1 = Failure (error during remediation) .PARAMETER MountPath Directory to use as the WinRE mount point. Created if it does not exist. Default: C:\Mount .EXAMPLE # Standard run .\Remove-AutoFsTxFromWinRE.ps1 .EXAMPLE # Custom mount path .\Remove-AutoFsTxFromWinRE.ps1 -MountPath D:\mount .NOTES Requirements: Windows with WinRE and reagentc support, Administrator privileges. The WinRE disable/enable cycle at the end is required to re-seal the BitLocker measurement chain after modifying the WinRE image. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #>
param(
[Parameter(Mandatory = $false)]
[string]$MountPath = “C:\Mount”
)

# Target entry to remove from BootExecute
$EntryToRemove = “autofstx.exe”

# Internal constant for the offline hive key name
$HiveName = “WinREHive”

# State tracking for cleanup
$hiveLoaded = $false
$imageMounted = $false
$mountCreated = $false
$changesMade = $false

Write-Host “Remove autofstx.exe from WinRE BootExecute”

# 1. Verify Administrator Privileges
# PS Version: All | Admin: Yes | System Requirements: None
try {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal]$identity
$isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if (-not $isAdmin) {
Write-Host “[1/8] Administrator check: FAILED” -ForegroundColor Red
Write-Host ” This script must be run as Administrator.”
Write-Host ” Right-click PowerShell and select ‘Run as administrator’.”
exit 1
}

Write-Host “[1/8] Administrator check: Passed” -ForegroundColor Green
} catch {
Write-Warning “Error checking administrator privileges: $_”
exit 1
}

# 2. Check WinRE Status
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe
try {
$winreOutput = & reagentc /info 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[2/8] WinRE status check: FAILED” -ForegroundColor Red
Write-Warning “reagentc /info returned exit code $LASTEXITCODE”
exit 1
}
$winreOutputStr = $winreOutput -join “`n”

# Make this check language agnostic
if ($winreOutputStr -match “[::]\s*Enabled\b”) {
Write-Host “[2/8] WinRE status: Enabled” -ForegroundColor Green
} else {
Write-Host “[2/8] WinRE status: NOT ENABLED. Exiting.” -ForegroundColor Green
exit 0
}
} catch {
Write-Warning “Error checking WinRE status: $_”
exit 1
}

# 3. Mount WinRE Image
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe
try {
if (-not (Test-Path $MountPath)) {
New-Item -ItemType Directory -Path $MountPath -Force | Out-Null
$mountCreated = $true
Write-Host “[3/8] Created mount directory: $MountPath”
} else {
$existing = Get-ChildItem -Path $MountPath -Force -ErrorAction SilentlyContinue
if ($existing) {
Write-Host “[3/8] Mount WinRE image: FAILED” -ForegroundColor Red
Write-Host ” Mount directory $MountPath is not empty.”
Write-Host ” Clean it or specify a different -MountPath.”
exit 1
}
}

$mountOutput = & reagentc /mountre /path $MountPath 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[3/8] Mount WinRE image: FAILED” -ForegroundColor Red
Write-Warning “reagentc /mountre output: $mountOutput”
exit 1
}

$imageMounted = $true
Write-Host “[3/8] WinRE image mounted: $MountPath” -ForegroundColor Green
} catch {
Write-Warning “Error mounting WinRE image: $_”
exit 1
}

# 4. Load Offline SYSTEM Registry Hive
# PS Version: All | Admin: Yes | System Requirements: reg.exe
try {
# Locate the SYSTEM hive in the mounted WinRE image
$hivePath = $null
$hiveCandidates = @(
“$MountPath\Windows\System32\config\SYSTEM”,
“$MountPath\windows\system32\config\SYSTEM”
)

foreach ($candidate in $hiveCandidates) {
if (Test-Path $candidate) {
$hivePath = $candidate
break
}
}

if (-not $hivePath) {
# Broader search as fallback
$found = Get-ChildItem -Path $MountPath -Recurse -Filter “SYSTEM” -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -match “config\\SYSTEM$” } |
Select-Object -First 1

if ($found) {
$hivePath = $found.FullName
}
}

if (-not $hivePath) {
Write-Host “[4/8] Load offline hive: FAILED” -ForegroundColor Red
Write-Warning “Cannot locate SYSTEM hive in mounted WinRE image.”

# Cleanup: unmount with discard
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}

Write-Host “[4/8] Found SYSTEM hive: $hivePath”

$loadOutput = & reg load “HKLM\$HiveName” $hivePath 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[4/8] Load offline hive: FAILED” -ForegroundColor Red
Write-Warning “reg load output: $loadOutput”

# Cleanup: unmount with discard
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}

$hiveLoaded = $true
Write-Host “[4/8] Hive loaded as HKLM\$HiveName” -ForegroundColor Green
} catch {
Write-Warning “Error loading offline hive: $_”

if ($imageMounted) {
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
}
exit 1
}

# 5. Read BootExecute and Remove autofstx.exe
# PS Version: All | Admin: Yes | System Requirements: None
try {
# Determine active ControlSets from Select key
$selectPath = “Registry::HKEY_LOCAL_MACHINE\$HiveName\Select”
$selectProps = Get-ItemProperty -Path $selectPath -ErrorAction SilentlyContinue

if ($selectProps -and $selectProps.Current) {
$csNumbers = @($selectProps.Current)
if ($selectProps.Default -and $selectProps.Default -ne $selectProps.Current) {
$csNumbers += $selectProps.Default
}
$controlSets = $csNumbers | ForEach-Object { “ControlSet{0:D3}” -f [int]$_ }
Write-Host “[5/8] Active ControlSets (from Select key): $($controlSets -join ‘, ‘)”
} else {
$controlSets = @(“ControlSet001”)
Write-Host “[5/8] Select key not readable, falling back to ControlSet001”
}

# Remediate all relevant ControlSets
$foundEntry = $false

foreach ($cs in $controlSets) {
$regPath = “Registry::HKEY_LOCAL_MACHINE\$HiveName\$cs\Control\Session Manager”
$testResult = Get-ItemProperty -Path $regPath -Name “BootExecute” -ErrorAction SilentlyContinue

if (-not $testResult) {
Write-Host ” $cs\Session Manager\BootExecute: not found, skipping”
continue
}

$currentValue = $testResult.BootExecute

if (-not $currentValue) {
Write-Host ” $cs BootExecute: (empty)”
continue
}

# Remove matching entry (case-insensitive)
$updatedValue = @($currentValue | Where-Object {
$_ -and
($_ -ne $EntryToRemove) -and
($_ -notmatch “^\s*$([regex]::Escape($EntryToRemove))\s*$”)
})

if ($updatedValue.Count -eq @($currentValue).Count) {
Write-Host ” $cs BootExecute: ‘$EntryToRemove’ not present”
continue
}

# Write updated REG_MULTI_SZ back
Set-ItemProperty -Path $regPath -Name “BootExecute” -Value $updatedValue
$foundEntry = $true

Write-Host ” $cs BootExecute: removed ‘$EntryToRemove'” -ForegroundColor Green

# Verify the write
$verifyValue = (Get-ItemProperty -Path $regPath -Name “BootExecute” -ErrorAction Stop).BootExecute
Write-Host ” $cs verification: $($verifyValue -join ‘; ‘)”
}

if (-not $foundEntry) {
Write-Host “[5/8] ‘$EntryToRemove’ not found in any active ControlSet. No changes needed.” -ForegroundColor Green

# Cleanup: unload hive, unmount with discard
[gc]::Collect()
Start-Sleep -Seconds 1
$null = & reg unload “HKLM\$HiveName” 2>&1
$hiveLoaded = $false
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
if ($mountCreated) { Remove-Item -Path $MountPath -Recurse -Force -ErrorAction SilentlyContinue }
exit 0
}

$changesMade = $true
Write-Host “[5/8] Removed ‘$EntryToRemove’ from BootExecute” -ForegroundColor Green
} catch {
Write-Warning “Error modifying BootExecute: $_”

# Cleanup: unload hive, unmount with discard
[gc]::Collect()
Start-Sleep -Seconds 2
if ($hiveLoaded) {
$null = & reg unload “HKLM\$HiveName” 2>&1
$hiveLoaded = $false
}
if ($imageMounted) {
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
}
exit 1
}

# 6. Unload Offline Registry Hive
# PS Version: All | Admin: Yes | System Requirements: reg.exe
try {
[gc]::Collect()
Start-Sleep -Seconds 2

$unloadOutput = & reg unload “HKLM\$HiveName” 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Warning “First unload attempt failed, retrying…”
[gc]::Collect()
Start-Sleep -Seconds 3
$unloadOutput = & reg unload “HKLM\$HiveName” 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[6/8] Unload hive: FAILED” -ForegroundColor Red
Write-Warning “reg unload output: $unloadOutput”
Write-Host ” Close any Registry Editor windows and retry.”

# Try to unmount with discard to avoid leaving image mounted
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}
}

$hiveLoaded = $false
Write-Host “[6/8] Offline hive unloaded” -ForegroundColor Green
} catch {
Write-Warning “Error unloading hive: $_”

$null = & reagentc /unmountre /path $MountPath /discard 2>&1
$imageMounted = $false
exit 1
}

# 7. Unmount WinRE Image with Commit
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe
try {
if ($changesMade) {
$unmountOutput = & reagentc /unmountre /path $MountPath /commit 2>&1
} else {
$unmountOutput = & reagentc /unmountre /path $MountPath /discard 2>&1
}

if ($LASTEXITCODE -ne 0) {
Write-Host “[7/8] Unmount WinRE: FAILED” -ForegroundColor Red
Write-Warning “reagentc /unmountre output: $unmountOutput”

# Attempt discard as fallback
if ($changesMade) {
Write-Host ” Attempting discard to avoid leaving image in broken state…”
$null = & reagentc /unmountre /path $MountPath /discard 2>&1
}
$imageMounted = $false
exit 1
}

$imageMounted = $false

if ($changesMade) {
Write-Host “[7/8] WinRE image unmounted and committed” -ForegroundColor Green
} else {
Write-Host “[7/8] WinRE image unmounted (no changes)” -ForegroundColor Green
}
} catch {
Write-Warning “Error unmounting WinRE image: $_”
exit 1
}

# 8. Re-seal WinRE (Disable + Enable Cycle for BitLocker Trust Chain)
# PS Version: All | Admin: Yes | System Requirements: reagentc.exe, BitLocker
try {
if (-not $changesMade) {
Write-Host “[8/8] Re-seal WinRE: Skipped (no changes made)” -ForegroundColor Green
} else {
$disableOutput = & reagentc /disable 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Warning “reagentc /disable returned non-zero: $disableOutput”
} else {
Write-Host ” WinRE disabled.”
}

$enableOutput = & reagentc /enable 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Host “[8/8] Re-seal WinRE: FAILED” -ForegroundColor Red
Write-Warning “reagentc /enable output: $enableOutput”
Write-Host ” WinRE may need manual recovery. Run: reagentc /enable”
exit 1
}

Write-Host “[8/8] WinRE re-sealed (disable + enable cycle)” -ForegroundColor Green
}
} catch {
Write-Warning “Error during WinRE re-seal: $_”
Write-Host ” Run manually: reagentc /enable”
exit 1
}

Write-Host “”
Write-Host ” COMPLETE: ‘$EntryToRemove’ removed from WinRE BootExecute” -ForegroundColor Green

# Cleanup: remove mount directory if we created it
if ($mountCreated -and (Test-Path $MountPath)) {
Remove-Item -Path $MountPath -Recurse -Force -ErrorAction SilentlyContinue
}

exit 0

Warum TPM + PIN jetzt wichtiger wird

TPM (Trusted Platform Module) ist ein Sicherheitschip im Gerät, der Verschlüsselungsschlüssel geschützt speichert und den sicheren Systemstart unterstützt. Microsoft weist ausdrücklich darauf hin, dass die bekannte Angriffsmethode nicht funktioniert, wenn BitLocker mit TPM + PIN eingesetzt wird.

Unternehmen sollten daher prüfen, für welche Geräte eine zusätzliche Pre-Boot-Authentifizierung sinnvoll ist. Besonders bei mobilen oder erhöht gefährdeten Geräten bietet TPM + PIN eine zusätzliche Schutzschicht gegen physische Angriffe.

Gleichzeitig sollte diese Maßnahme bewusst bewertet werden. Die Einführung von TPM + PIN bedeutet immer eine Abwägung zwischen Benutzererfahrung und zusätzlichem Sicherheitsgewinn. Durch die zusätzliche PIN-Eingabe verändert sich der Anmeldeprozess für Anwender spürbar. Daher ist TPM + PIN insbesondere für besonders schützenswerte oder risikobehaftete Geräte sinnvoll, stellt jedoch nicht in jedem Szenario die optimale Lösung dar.

Fazit

CVE-2026-45585 ist ein gutes Beispiel dafür, dass „physischer Zugriff“ nicht automatisch „geringes Risiko“ bedeutet. Vor allem nicht in Zeiten mobiler Arbeit. Entscheidend ist, dass der Angriff eine Schwäche im Recovery-/Pre-Boot-Pfad ausnutzt und damit genau dort ansetzt, wo Bitlocker seine stärkste Schutzwirkung entfalten soll. Wer Bitlocker als Schutz bei Geräteverlust in Richtlinien, Audits oder Kundenanforderungen nutzt, sollte „YellowKey“ daher als Anlass nehmen, WinRE gezielt zu härten und die Bitlocker-Strategie insbesondere für High-Risk-Geräte durch den Einsatz von TPM+PIN zu überprüfen.

Jetzt kostenlose Erstberatung buchen!

Sie möchten prüfen, ob Ihre BitLocker- und Intune-Konfiguration ausreichend gegen Angriffsszenarien abgesichert ist? Wir unterstützen Sie dabei, bestehende Sicherheitskonfigurationen zu bewerten und notwendige Schutzmaßnahmen umzusetzen.

Wird geladen

Häufige Fragen zu Microsoft Copilot und Sicherheit

Was ist die BitLocker-Schwachstelle „YellowKey“?

„YellowKey“ bezeichnet die Sicherheitslücke CVE-2026-45585. Dabei wird nicht die BitLocker-Verschlüsselung selbst gebrochen, sondern ein Ablauf innerhalb der Windows Recovery Environment (WinRE) ausgenutzt.

Welche Systeme sind von „YellowKey“ betroffen?

Betroffen sind Windows 11 sowie Windows Server 2025, wenn BitLocker ohne zusätzliche Pre-Boot-Authentifizierung beziehungsweise PIN eingesetzt wird.

Ist für den Angriff physischer Zugriff notwendig?

Ja. Der Angriff setzt voraus, dass eine Person direkten Zugriff auf das Gerät besitzt und in die Wiederherstellungsumgebung booten kann.

Welche Schutzmaßnahmen empfiehlt Microsoft?

Microsoft empfiehlt aktuell eine Mitigation innerhalb von WinRE sowie den Einsatz zusätzlicher Schutzmechanismen wie TPM+PIN.

Warum ist TPM+PIN wichtig?

Durch die zusätzliche PIN-Abfrage vor dem Systemstart kann die aktuell bekannte Ausnutzung der Schwachstelle verhindert werden.

Wie lässt sich die Mitigation zentral ausrollen?

Das von Microsoft bereitgestellte Skript kann über Microsoft Intune verteilt werden – beispielsweise über Remediation Skripte oder Platform Skripte.

Weitere News zu diesem Thema

SharePoint-Freigaben: „E-Mail OTP“ classic wird auf Entra ID Authentifizierung umgestellt

SharePoint-Freigaben: „E-Mail OTP“ classic wird auf Entra ID Authentifizierung umgestellt

Alle News, News Microsoft Microsoft 365, News Microsoft SharePoint, News Unternehmen, Unsere Top-News
Weiterlesen
2026-05-11
SharePoint Alerts werden eingestellt – die beste Alternative mit Power Automate

SharePoint Alerts werden eingestellt – die beste Alternative mit Power Automate

Alle News, News IT-Betrieb, News Kompetenzen, News Microsoft Microsoft 365, News Microsoft SharePoint, News Security, Unsere Top-News
Weiterlesen
2026-01-16
Effiziente Dokumentenlenkung mit SharePoint & Power Automate

Effiziente Dokumentenlenkung mit SharePoint & Power Automate

Alle News, News Kompetenzen, News Microsoft Power Platform, News Microsoft SharePoint, News Social Intranet, Unsere Top-News
Weiterlesen
2025-06-17
Seite 1 von 12123›»

Pressekontakt

Aysel Nixdorf, Marketing Managerin bei Net at Work.
Gerne stehe ich Ihnen bei Fragen zu Net at Work und unserem Angebot jederzeit zur Verfügung. Sprechen Sie mich an.

Aysel Nixdorf
Marketing & PR
Telefon +49 5251 304627

Kostenfreier Beratungstermin

Wird geladen

Newsletter

Jetzt abonnieren

Jetzt Beitrag teilen!

  • teilen 
  • teilen 
  • teilen 
  • E-Mail 

Unternehmen

  • Profil
  • Kontakt
  • Karriere
  • Impressum
  • Datenschutzerklärung
  • Allgemeine Geschäftsbedingungen (AGB)
  • Datenschutzinformation für Geschäftspartner und Bewerber

Kompetenzen

  • Microsoft 365
  • Microsoft 365 Change Management
  • Managed Services Provider
  • Microsoft Teams
  • Microsoft Teams Telefonie
  • Microsoft Teams Contact Center
  • Microsoft 365 Security
  • Microsoft Copilot
  • Microsoft Azure
  • Microsoft SharePoint
  • Microsoft Exchange
  • Microsoft Power Platform
  • Informationsmanagement
  • Intranet
  • E-Mail-Sicherheit

Microsoft Solutions Partner Modern Work

Microsoft Solutions Partner Security

News

  • Newsletter abonnieren
  • Kompetenzen
  • Unternehmen
  • Termine
  • Alle News

Letzte News

  • Neue BitLocker-Schwachstelle „YellowKey“ – notwendige Gegenmaßnahmen und Handlungsempfehlungen
    Neue BitLocker-Schwachstelle „YellowKey“ – notwendige Gegenmaßnahmen und Handlungsempfehlungen2026-05-28 - 15:32
  • Microsoft 365 Copilot sicher einführen – warum Berechtigungen und Governance entscheidend sind
    Microsoft 365 Copilot sicher einführen – warum Berechtigungen und Governance entscheidend sind2026-05-21 - 7:57
  • SharePoint-Freigaben: „E-Mail OTP“ classic wird auf Entra ID Authentifizierung umgestellt
    SharePoint-Freigaben: „E-Mail OTP“ classic wird auf Entra ID Authentifizierung umgestellt2026-05-11 - 14:04
IMPRESSUM • Datenschutzerklärung •  • © 2026 Net at Work GmbH
  • Link zu X
  • Link zu Xing
  • Link zu LinkedIn
  • Link zu Instagram
  • Link zu Youtube
Nach oben scrollen Nach oben scrollen Nach oben scrollen