You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Plugin DLLs are now loaded in isolated wslpluginhost.exe processes
instead of directly in wslservice.exe via LoadLibrary. This prevents
a buggy or malicious plugin from crashing the WSL service.
Architecture:
- New IWslPluginHost/IWslPluginHostCallback COM interfaces
(WslPluginHost.idl) for cross-process plugin lifecycle management
- New wslpluginhost.exe: COM local server (REGCLS_SINGLEUSE), one
per plugin, loads the plugin DLL and dispatches notifications
- Refactored PluginManager: CoCreateInstance replaces LoadLibrary,
PluginError returned via [out] parameter, crash recovery via
IsHostCrash() detecting RPC_E_DISCONNECTED/SERVER_DIED
Callback safety:
- Plugin callbacks (MountFolder, ExecuteBinary) arrive on a different
COM RPC thread and use std::shared_lock(m_callbackLock) instead of
m_instanceLock to avoid re-entrancy deadlocks
- _VmTerminate takes exclusive m_callbackLock before destroying the
VM, blocking until in-flight callbacks complete
- Lock ordering: m_instanceLock -> m_callbackLock (never reverse)
- All writes to m_runningInstances take m_callbackLock exclusive to
prevent data races with concurrent callback reads
Security:
- COM AppID with SYSTEM-only launch/access permissions
- Plugin signature validation (ValidateFileSignature) keeps the file
handle open until after LoadLibrary to prevent TOCTOU attacks
- Plugin host processes use minimal access rights for handles
Process lifecycle:
- Plugin hosts added to a job object with KILL_ON_JOB_CLOSE for
automatic cleanup if wslservice exits
- g_pluginHost is process-wide (REGCLS_SINGLEUSE guarantees one
plugin per process), nulled on destruction to prevent UAF
- std::call_once for thread-safe initialization and job creation
Packaging:
- WslPluginHost.idl compiled into existing wslserviceproxystub.dll
- MSI: COM class/interface registration, AppID security, proxy/stub
- wslpluginhost.exe added to build/signing pipeline, WER crash dump
list, LSP registration, and test validation
Plugins are not loaded for WSL1-only sessions since all plugin hooks
require a WSL2 VM. WslPluginApi.h is unchanged - existing plugin DLLs
work unmodified.
0 commit comments