[REQ-END-187] Administrative Templates: Block Custom SSPs and APs from Loading into LSASS
Target Scope
- Applicable Systems: Tier 2 client workstations and member servers. (For Tier 0 Privileged Access Workstations, refer to tightened baseline REQ-PAW-176; for complementary LSA Protection, refer to REQ-END-007).
- Operating Systems: Windows 10 (1903 and above) Enterprise/Professional, Windows 11 Enterprise/Pro, Windows Server 2019, 2022, and 2025.
Implementation Details
- Priority: High
- GPO Path / Registry Location:
- Allow Custom SSPs and APs to be loaded into LSASS:
- GPO Path:
Computer Configuration\Policies\Administrative Templates\System\Local Security Authority\Allow Custom SSPs and APs to be loaded into LSASS-> Disabled - Registry Path:
HKLM\SOFTWARE\Policies\Microsoft\Windows\System - Value Name:
AllowCustomSSPsAPs - Value Type:
REG_DWORD - Value Data:
0(Disabled / Prohibit custom SSP and AP loading)
- GPO Path:
- Allow Custom SSPs and APs to be loaded into LSASS:
Rationale
The Local Security Authority Subsystem Service (lsass.exe) is the central authentication authority in the Windows operating system, responsible for credential validation, token creation, and interactive logons. Security Support Providers (SSPs) and Authentication Packages (APs) execute as dynamic link libraries (DLLs) directly inside the lsass.exe memory space.
1. The Custom SSP/AP Persistence and Credential Theft Threat Vector
Adversaries with administrative access frequently target the LSA subsystem for persistent credential harvesting:
- In-Memory Credential Interception: Threat actors register custom SSP DLLs (e.g., Mimikatz
memsspor custom malicious security packages) by adding their names toHKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security PackagesorAuthentication Packages. - Execution Inside LSASS: During system boot or upon explicit dynamic loading,
lsass.exeloads the registered DLL into its process address space. Because the custom SSP receives plaintext user credentials, Kerberos tickets, and NTLM hashes during logon processing, it can log cleartext credentials to an unencrypted file or exfiltrate them across the network. - Persistent Evasion: Unlike transient LSASS memory scraping tools (which trigger EDR memory read alerts), a registered SSP operates legitimately within the authentication pipeline, surviving system reboots and operating with full system privileges.
2. Mandatory Prohibition of Third-Party LSA Extension Libraries
Setting AllowCustomSSPsAPs = 0 (by configuring the GPO "Allow Custom SSPs and APs to be loaded into LSASS" to Disabled) enforces strict inbox validation:
- The Local Security Authority kernel loader strictly refuses to load any custom or third-party SSP or AP DLL into
lsass.exe, even if registered by an administrator or malware in the registry. - Only core, Microsoft-signed inbox security providers (such as
msv1_0.dll,kerberos.dll,schannel.dll, andcloudAP.dll) are permitted to execute within LSASS. - When combined with LSA Protection / RunAsPPL (REQ-END-007), this control completely neutralizes SSP-based DLL injection and persistent credential theft.
3. MITRE ATT&CK Mapping
- T1547.005 - Boot or Logon Autostart Execution: Security Support Provider: Adversaries registering malicious SSP/AP DLLs in the LSA registry.
- T1003.001 - OS Credential Dumping: LSASS Memory: Intercepting in-memory plaintext credentials during logon events.
- T1556.002 - Modify Authentication Process: Password Filter DLL: Tampering with authentication packages to log credentials.
Legacy Impact & Compatibility
- Modern Authentication Platforms: Modern enterprise multi-factor authentication (MFA) agents, smart card middleware, and FIDO2 authentication solutions integrate with Windows via the Credential Provider architecture (
ICredentialProvider), which operates inwinlogon.exeand does not require injecting custom SSPs intolsass.exe. - Legacy Smart Card and Biometric Drivers: Obsolete third-party authentication solutions developed prior to Windows 10 that rely on custom in-process LSASS AP DLLs will fail to initialize. Organizations must upgrade to modern Credential Providers or native Windows Hello for Business infrastructure.
Implementation Steps
Option A: Group Policy Object (GPO) Configuration (Preferred)
- Open the Group Policy Management Console (
gpmc.msc). - Edit or create the target GPO linked to workstations and member servers (e.g.,
GPO_Hardening_Endpoints). Configure the following policies:
Navigate to:
Computer Configuration\Policies\Administrative Templates\System\Local Security Authority- Allow Custom SSPs and APs to be loaded into LSASS: Set to
Disabled
- Allow Custom SSPs and APs to be loaded into LSASS: Set to
Link the GPO to the appropriate Organizational Unit and verify policy enforcement using
gpupdate /force.
Option B: PowerShell & Registry Configuration (Remediation / Non-GPO)
Run the following script locally to configure the administrative template registry values:
Download Script: Configure-EndAtLsaCustomSsps.ps1
#Configure-EndAtLsaCustomSsps.ps1
# Description: Configures Administrative Templates: Block Custom SSPs and APs from Loading into LSASS.
Write-Host "Configuring Administrative Templates: Block Custom SSPs and APs from Loading into LSASS..." -ForegroundColor Cyan
if (-not (Test-Path -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System")) {
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Force | Out-Null
}
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "AllowCustomSSPsAPs" -Value 0 -Type DWord -Force
Write-Host "[+] Administrative Templates: Block Custom SSPs and APs from Loading into LSASS applied successfully." -ForegroundColor Green
To verify the configuration:
Download Script: Get-EndAtLsaCustomSspsStatus.ps1
#Get-EndAtLsaCustomSspsStatus.ps1
# Description: Audits Administrative Templates: Block Custom SSPs and APs from Loading into LSASS.
Write-Host "--- Auditing Administrative Templates: Block Custom SSPs and APs from Loading into LSASS ---" -ForegroundColor Cyan
$script:Vulnerable = $false
$TargetKey = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System"
$ValueName = "AllowCustomSSPsAPs"
$ExpectedValue = 0
if (Test-Path -Path $TargetKey) {
$Prop = Get-ItemProperty -Path $TargetKey -Name $ValueName -ErrorAction SilentlyContinue
if ($null -ne $Prop) {
$Actual = $Prop.$ValueName
if ($Actual -eq $ExpectedValue) {
Write-Host " [+] $ValueName = $($Actual) (Secure)" -ForegroundColor Green
} else {
Write-Host " [!] MISMATCH: $ValueName = $($Actual) (Expected: $($ExpectedValue))" -ForegroundColor Red
$script:Vulnerable = $true
}
} else {
Write-Host " [!] MISSING VALUE: $ValueName (Expected: $($ExpectedValue))" -ForegroundColor Red
$script:Vulnerable = $true
}
} else {
Write-Host " [!] MISSING KEY: $TargetKey" -ForegroundColor Red
$script:Vulnerable = $true
}
if ($script:Vulnerable) {
Write-Host "Audit Result: VULNERABLE" -ForegroundColor Red
exit 1
} else {
Write-Host "Audit Result: SECURE" -ForegroundColor Green
exit 0
}
Sources & Compliance References
- CIS Benchmark: CIS Microsoft Windows 10 Enterprise Benchmark: Section 18.9.35.1; CIS Microsoft Windows 11 Enterprise Benchmark: Section 18.9.35.1; CIS Windows Server Benchmark: Section 18.9.35.1
- DISA STIG: Windows 10 STIG Rule WN10-CC-000290, Windows 11 STIG Rule WN11-CC-000290
- ANSSI Active Directory Hardening Guide: Recommendation R30 (Protection of the Local Security Authority subsystem)
- Microsoft Security Baseline: Local Security Authority Subsystem Security Policy Recommendations